18e7b46e2SPatrick WilliamsSUMMARY = "Rust compiler and runtime libaries (cross-canadian for ${TARGET_ARCH} target)" 2d159c7fbSAndrew GeisslerPN = "rust-cross-canadian-${TRANSLATED_TARGET_ARCH}" 3d159c7fbSAndrew Geissler 492b42cb3SPatrick Williamsinherit rust-target-config 592b42cb3SPatrick Williamsinherit rust-common 6d159c7fbSAndrew Geissler 792b42cb3SPatrick WilliamsLICENSE = "MIT" 892b42cb3SPatrick Williams 992b42cb3SPatrick WilliamsMODIFYTOS = "0" 1092b42cb3SPatrick Williams 11028142bdSAndrew GeisslerDEPENDS += "virtual/${SDK_PREFIX}gcc virtual/nativesdk-libc virtual/nativesdk-${SDK_PREFIX}compilerlibs" 1287f5cff0SAndrew Geissler 1387f5cff0SAndrew GeisslerSRC_URI += "file://target-rust-ccld.c" 1487f5cff0SAndrew GeisslerLIC_FILES_CHKSUM = "file://target-rust-ccld.c;md5=af4e0e29f81a34cffe05aa07c89e93e9;endline=7" 1587f5cff0SAndrew GeisslerS = "${WORKDIR}" 1687f5cff0SAndrew Geissler 1792b42cb3SPatrick Williams# Need to use our SDK's sh here, see #14878 1892b42cb3SPatrick Williamscreate_sdk_wrapper () { 1992b42cb3SPatrick Williams file="$1" 2092b42cb3SPatrick Williams shift 2192b42cb3SPatrick Williams cat <<- EOF > "${file}" 2287f5cff0SAndrew Geissler #!/bin/sh 2392b42cb3SPatrick Williams \$$1 \$@ 2492b42cb3SPatrick Williams EOF 2592b42cb3SPatrick Williams 2692b42cb3SPatrick Williams chmod +x "$file" 27d159c7fbSAndrew Geissler} 28d159c7fbSAndrew Geissler 29d159c7fbSAndrew Geisslerdo_install () { 30d159c7fbSAndrew Geissler # Rust requires /usr/lib to contain the libs. 31d159c7fbSAndrew Geissler # The required structure is retained for simplicity. 32d159c7fbSAndrew Geissler SYS_LIBDIR=$(dirname ${D}${libdir}) 33d159c7fbSAndrew Geissler SYS_BINDIR=$(dirname ${D}${bindir}) 34d159c7fbSAndrew Geissler RUSTLIB_DIR=${SYS_LIBDIR}/${TARGET_SYS}/rustlib 35d159c7fbSAndrew Geissler 3692b42cb3SPatrick Williams install -d ${RUSTLIB_DIR} 3792b42cb3SPatrick Williams install -m 0644 "${RUST_TARGETS_DIR}/${RUST_HOST_SYS}.json" "${RUSTLIB_DIR}" 3892b42cb3SPatrick Williams install -m 0644 "${RUST_TARGETS_DIR}/${RUST_TARGET_SYS}.json" "${RUSTLIB_DIR}" 39d159c7fbSAndrew Geissler 4092b42cb3SPatrick Williams # Uses SDK's CC as linker so linked binaries works out of box. 4187f5cff0SAndrew Geissler # We have a problem as rust sets LD_LIBRARY_PATH and this will break running host 4287f5cff0SAndrew Geissler # binaries (even /bin/sh) in the SDK as they detect a newer glibc from the SDK 4387f5cff0SAndrew Geissler # in those paths and we hit symbol errors. We saw particular problems with symbol 4487f5cff0SAndrew Geissler # mismatch on ubuntu1804 during development. To avoid this we have an SDK built 4587f5cff0SAndrew Geissler # binary which unsets LD_LIBRARY_PATH, which can then call the wrapper script 4687f5cff0SAndrew Geissler # where the context is easier to do the env maniupations needed 4792b42cb3SPatrick Williams install -d ${SYS_BINDIR} 4887f5cff0SAndrew Geissler outfile="${SYS_BINDIR}/target-rust-ccld" 4987f5cff0SAndrew Geissler ${CC} ${WORKDIR}/target-rust-ccld.c -o $outfile 5087f5cff0SAndrew Geissler chmod +x "$outfile" 5187f5cff0SAndrew Geissler create_sdk_wrapper "${SYS_BINDIR}/target-rust-ccld-wrapper" "CC" 52d159c7fbSAndrew Geissler 53d159c7fbSAndrew Geissler ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d 54d159c7fbSAndrew Geissler mkdir "${ENV_SETUP_DIR}" 5592b42cb3SPatrick Williams RUST_ENV_SETUP_SH="${ENV_SETUP_DIR}/rust.sh" 56d159c7fbSAndrew Geissler 57*ac13d5f3SPatrick Williams RUST_TARGET_TRIPLE=`echo ${RUST_TARGET_SYS} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g'` 58*ac13d5f3SPatrick Williams RUST_HOST_TRIPLE=`echo ${RUST_HOST_SYS} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g'` 59*ac13d5f3SPatrick Williams SDKLOADER=${@bb.utils.contains('SDK_ARCH', 'x86_64', 'ld-linux-x86-64.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'i686', 'ld-linux.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'aarch64', 'ld-linux-aarch64.so.1', '', d)}${@bb.utils.contains('SDK_ARCH', 'ppc64le', 'ld64.so.2', '', d)}${@bb.utils.contains('SDK_ARCH', 'riscv64', 'ld-linux-riscv64-lp64d.so.1', '', d)} 60*ac13d5f3SPatrick Williams 6192b42cb3SPatrick Williams cat <<- EOF > "${RUST_ENV_SETUP_SH}" 62*ac13d5f3SPatrick Williams export CARGO_TARGET_${RUST_TARGET_TRIPLE}_RUSTFLAGS="--sysroot=\$OECORE_TARGET_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT" 63*ac13d5f3SPatrick Williams export CARGO_TARGET_${RUST_HOST_TRIPLE}_RUNNER="\$OECORE_NATIVE_SYSROOT/lib/${SDKLOADER}" 64d159c7fbSAndrew Geissler export RUST_TARGET_PATH="\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib" 65d159c7fbSAndrew Geissler EOF 66d159c7fbSAndrew Geissler 67d159c7fbSAndrew Geissler chown -R root.root ${D} 6892b42cb3SPatrick Williams 6992b42cb3SPatrick Williams CARGO_ENV_SETUP_SH="${ENV_SETUP_DIR}/cargo.sh" 7092b42cb3SPatrick Williams cat <<- EOF > "${CARGO_ENV_SETUP_SH}" 7192b42cb3SPatrick Williams export CARGO_HOME="\$OECORE_TARGET_SYSROOT/home/cargo" 7292b42cb3SPatrick Williams mkdir -p "\$CARGO_HOME" 7392b42cb3SPatrick Williams # Init the default target once, it might be otherwise user modified. 7492b42cb3SPatrick Williams if [ ! -f "\$CARGO_HOME/config" ]; then 7592b42cb3SPatrick Williams touch "\$CARGO_HOME/config" 7692b42cb3SPatrick Williams echo "[build]" >> "\$CARGO_HOME/config" 7792b42cb3SPatrick Williams echo 'target = "'${RUST_TARGET_SYS}'"' >> "\$CARGO_HOME/config" 7892b42cb3SPatrick Williams echo '# TARGET_SYS' >> "\$CARGO_HOME/config" 7992b42cb3SPatrick Williams echo '[target.'${RUST_TARGET_SYS}']' >> "\$CARGO_HOME/config" 8092b42cb3SPatrick Williams echo 'linker = "target-rust-ccld"' >> "\$CARGO_HOME/config" 8192b42cb3SPatrick Williams fi 8292b42cb3SPatrick Williams 8392b42cb3SPatrick Williams # Keep the below off as long as HTTP/2 is disabled. 8492b42cb3SPatrick Williams export CARGO_HTTP_MULTIPLEXING=false 8592b42cb3SPatrick Williams 8692b42cb3SPatrick Williams export CARGO_HTTP_CAINFO="\$OECORE_NATIVE_SYSROOT/etc/ssl/certs/ca-certificates.crt" 8792b42cb3SPatrick Williams EOF 88d159c7fbSAndrew Geissler} 89d159c7fbSAndrew Geissler 9092b42cb3SPatrick WilliamsFILES:${PN} += "${base_prefix}/environment-setup.d" 91d159c7fbSAndrew Geissler 92