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