From 439dea866496e02a906b8350e9af0bf038543bb0 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 13 Feb 2021 21:15:40 +0000 Subject: [PATCH 1/5] nativesdk: Implement cross canadian support This addition closes #236 requesting the SDK support. The implementation consists on a yet minimum set of worky functionality; - Includes rustc, rustdoc and cargo. - Includes libstd and accompanying lib archives for host and for target. - Integrates with the standard environment setup script. - Integrates configurations automatically build for target. The supported build host is still AMD64 only. Note that there's no need on introducing crosssdk package as the official snapshot package serves same way as a non SDK build. Possible future directions: - Offline build: - Support pre-cached set of crates that can be vendored. - Support pre-filled cargo registry. - Support further tools like cargo-fmt, cargo-clippy, GDB support and so on. Signed-off-by: Anatol Belski --- classes/cargo_common.bbclass | 3 +- .../packagegroup-rust-cross-canadian.bb | 15 + .../cargo/cargo-cross-canadian.inc | 74 ++++ .../cargo/cargo-cross-canadian_1.49.0.bb | 6 + recipes-devtools/cargo/cargo.inc | 4 +- recipes-devtools/rust/rust-common.inc | 337 +++++++++++++++++ recipes-devtools/rust/rust-cross-canadian.inc | 225 +++++++++++ .../rust/rust-cross-canadian_1.49.0.bb | 9 + recipes-devtools/rust/rust.inc | 349 +----------------- 9 files changed, 673 insertions(+), 349 deletions(-) create mode 100644 recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb create mode 100644 recipes-devtools/cargo/cargo-cross-canadian.inc create mode 100644 recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb create mode 100644 recipes-devtools/rust/rust-common.inc create mode 100644 recipes-devtools/rust/rust-cross-canadian.inc create mode 100644 recipes-devtools/rust/rust-cross-canadian_1.49.0.bb diff --git a/classes/cargo_common.bbclass b/classes/cargo_common.bbclass index 5ed99b8..3283356 100644 --- a/classes/cargo_common.bbclass +++ b/classes/cargo_common.bbclass @@ -28,6 +28,7 @@ CARGO_DISABLE_BITBAKE_VENDORING ?= "0" # Used by libstd-rs to point to the vendor dir included in rustc src CARGO_VENDORING_DIRECTORY ?= "${CARGO_HOME}/bitbake" +CARGO_RUST_TARGET_CCLD ?= "${RUST_TARGET_CCLD}" cargo_common_do_configure () { mkdir -p ${CARGO_HOME}/bitbake @@ -74,7 +75,7 @@ cargo_common_do_configure () { # HOST_SYS [target.${HOST_SYS}] - linker = "${RUST_TARGET_CCLD}" + linker = "${CARGO_RUST_TARGET_CCLD}" EOF if [ "${HOST_SYS}" != "${BUILD_SYS}" ]; then diff --git a/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb b/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb new file mode 100644 index 0000000..de7078a --- /dev/null +++ b/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb @@ -0,0 +1,15 @@ +SUMMARY = "Host SDK package for Rust cross canadian toolchain" +PN = "packagegroup-rust-cross-canadian-${MACHINE}" + +inherit cross-canadian packagegroup + +PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1" + +RUST="rust-cross-canadian-${TRANSLATED_TARGET_ARCH}" +CARGO="cargo-cross-canadian-${TRANSLATED_TARGET_ARCH}" + +RDEPENDS_${PN} = " \ + ${@all_multilib_tune_values(d, 'RUST')} \ + ${@all_multilib_tune_values(d, 'CARGO')} \ +" + diff --git a/recipes-devtools/cargo/cargo-cross-canadian.inc b/recipes-devtools/cargo/cargo-cross-canadian.inc new file mode 100644 index 0000000..bdba874 --- /dev/null +++ b/recipes-devtools/cargo/cargo-cross-canadian.inc @@ -0,0 +1,74 @@ +SUMMARY = "Cargo, a package manager for Rust cross canadian flavor." + +RUST_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR_NATIVE}/llvm-rust/bin/llvm-config" + +HOST_SYS = "${HOST_ARCH}-unknown-linux-gnu" +CARGO_RUST_TARGET_CCLD = "${RUST_BUILD_CCLD}" + +require recipes-devtools/rust/rust-common.inc +require cargo.inc + +CARGO = "${WORKDIR}/${CARGO_SNAPSHOT}/bin/cargo" +BASEDEPENDS_remove = "cargo-native" + +export RUST_TARGET_PATH="${WORKDIR}/targets/" + +RUSTLIB = " \ + -L ${STAGING_DIR_NATIVE}/${SDKPATHNATIVE}/usr/lib/${TARGET_SYS}/rustlib/${HOST_SYS}/lib \ +" + +DEPENDS += "rust-native \ + rust-cross-canadian-${TRANSLATED_TARGET_ARCH} \ + virtual/nativesdk-${HOST_PREFIX}compilerlibs \ + nativesdk-openssl nativesdk-zlib \ + virtual/nativesdk-libc \ +" + +inherit cross-canadian + +PN = "cargo-cross-canadian-${TRANSLATED_TARGET_ARCH}" + +LLVM_TARGET[x86_64] = "${RUST_HOST_SYS}" + +python do_rust_gen_targets () { + wd = d.getVar('WORKDIR') + '/targets/' + + rust_gen_target(d, 'BUILD', wd, "", "generic", d.getVar('BUILD_ARCH')) + rust_gen_target(d, 'HOST', wd, "", "generic", d.getVar('HOST_ARCH')) +} + +do_compile_prepend () { + PKG_CONFIG_PATH="${RECIPE_SYSROOT_NATIVE}/usr/lib/pkgconfig:${PKG_CONFIG_PATH}" +} + +do_install () { + SYS_BINDIR=$(dirname ${D}${bindir}) + install -d "${SYS_BINDIR}" + install -m 755 "${B}/target/${CARGO_TARGET_SUBDIR}/cargo" "${SYS_BINDIR}" + for i in ${SYS_BINDIR}/*; do + chrpath -r "\$ORIGIN/../lib" ${i} + done + + ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d + mkdir "${ENV_SETUP_DIR}" + ENV_SETUP_SH="${ENV_SETUP_DIR}/cargo.sh" + cat <<- EOF > "${ENV_SETUP_SH}" + export CARGO_HOME="\$OECORE_TARGET_SYSROOT/home/cargo" + mkdir -p "\$CARGO_HOME" + # Init the default target once, it might be otherwise user modified. + if [ ! -f "\$CARGO_HOME/config" ]; then + touch "\$CARGO_HOME/config" + echo "[build]" >> "\$CARGO_HOME/config" + echo 'target = "'${TARGET_SYS}'"' >> "\$CARGO_HOME/config" + fi + + # Keep the below off as long as HTTP/2 is disabled. + export CARGO_HTTP_MULTIPLEXING=false + + export CARGO_HTTP_CAINFO="\$OECORE_NATIVE_SYSROOT/etc/ssl/certs/ca-certificates.crt" + EOF +} + +PKG_SYS_BINDIR = "${SDKPATHNATIVE}/usr/bin" +FILES_${PN} += "${base_prefix}/environment-setup.d ${PKG_SYS_BINDIR}" + diff --git a/recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb b/recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb new file mode 100644 index 0000000..56c6f62 --- /dev/null +++ b/recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb @@ -0,0 +1,6 @@ +require recipes-devtools/rust/rust-source-${PV}.inc +require recipes-devtools/rust/rust-snapshot-${PV}.inc + +FILESEXTRAPATHS_prepend := "${THISDIR}/cargo-${PV}:" + +require cargo-cross-canadian.inc diff --git a/recipes-devtools/cargo/cargo.inc b/recipes-devtools/cargo/cargo.inc index 9645b90..0204b77 100644 --- a/recipes-devtools/cargo/cargo.inc +++ b/recipes-devtools/cargo/cargo.inc @@ -1,4 +1,4 @@ -SUMMARY = "Cargo, a package manager for Rust." +SUMMARY ?= "Cargo, a package manager for Rust." HOMEPAGE = "https://crates.io" LICENSE = "MIT | Apache-2.0" SECTION = "devel" @@ -43,7 +43,7 @@ do_install () { # Needed for pkg-config to be used export LIBSSH2_SYS_USE_PKG_CONFIG = "1" -BBCLASSEXTEND = "native" +BBCLASSEXTEND = "native nativesdk" # When building cargo-native we don't have cargo-native to use and depend on, # so we must use the locally set up snapshot to bootstrap the build. diff --git a/recipes-devtools/rust/rust-common.inc b/recipes-devtools/rust/rust-common.inc new file mode 100644 index 0000000..ed4927c --- /dev/null +++ b/recipes-devtools/rust/rust-common.inc @@ -0,0 +1,337 @@ + +# Right now this is focused on arm-specific tune features. +# We get away with this for now as one can only use x86-64 as the build host +# (not arm). +# Note that TUNE_FEATURES is _always_ refering to the target, so we really +# don't want to use this for the host/build. +def llvm_features_from_tune(d): + f = [] + feat = d.getVar('TUNE_FEATURES') + if not feat: + return [] + feat = frozenset(feat.split()) + + mach_overrides = d.getVar('MACHINEOVERRIDES') + mach_overrides = frozenset(mach_overrides.split(':')) + + if 'vfpv4' in feat: + f.append("+vfp4") + if 'vfpv3' in feat: + f.append("+vfp3") + if 'vfpv3d16' in feat: + f.append("+d16") + + if 'vfpv2' in feat or 'vfp' in feat: + f.append("+vfp2") + + if 'neon' in feat: + f.append("+neon") + + if 'mips32' in feat: + f.append("+mips32") + + if 'mips32r2' in feat: + f.append("+mips32r2") + + if target_is_armv7(d): + f.append('+v7') + + if ('armv6' in mach_overrides) or ('armv6' in feat): + f.append("+v6") + + if 'dsp' in feat: + f.append("+dsp") + + if 'thumb' in feat: + if d.getVar('ARM_THUMB_OPT') is "thumb": + if target_is_armv7(d): + f.append('+thumb2') + f.append("+thumb-mode") + + if 'cortexa5' in feat: + f.append("+a5") + if 'cortexa7' in feat: + f.append("+a7") + if 'cortexa9' in feat: + f.append("+a9") + if 'cortexa15' in feat: + f.append("+a15") + if 'cortexa17' in feat: + f.append("+a17") + if ('riscv64' in feat) or ('riscv32' in feat): + f.append("+a,+c,+d,+f,+m") + return f + +# TARGET_CC_ARCH changes from build/cross/target so it'll do the right thing +# this should go away when https://github.com/rust-lang/rust/pull/31709 is +# stable (1.9.0?) +def llvm_features_from_cc_arch(d): + f = [] + feat = d.getVar('TARGET_CC_ARCH') + if not feat: + return [] + feat = frozenset(feat.split()) + + if '-mmmx' in feat: + f.append("+mmx") + if '-msse' in feat: + f.append("+sse") + if '-msse2' in feat: + f.append("+sse2") + if '-msse3' in feat: + f.append("+sse3") + if '-mssse3' in feat: + f.append("+ssse3") + if '-msse4.1' in feat: + f.append("+sse4.1") + if '-msse4.2' in feat: + f.append("+sse4.2") + if '-msse4a' in feat: + f.append("+sse4a") + if '-mavx' in feat: + f.append("+avx") + if '-mavx2' in feat: + f.append("+avx2") + + return f + +def llvm_features_from_target_fpu(d): + # TARGET_FPU can be hard or soft. +soft-float tell llvm to use soft float + # ABI. There is no option for hard. + + fpu = d.getVar('TARGET_FPU', True) + return ["+soft-float"] if fpu == "soft" else [] + +def llvm_features(d): + return ','.join(llvm_features_from_tune(d) + + llvm_features_from_cc_arch(d) + + llvm_features_from_target_fpu(d)) + + +## arm-unknown-linux-gnueabihf +DATA_LAYOUT[arm] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +LLVM_TARGET[arm] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[arm] = "little" +TARGET_POINTER_WIDTH[arm] = "32" +TARGET_C_INT_WIDTH[arm] = "32" +MAX_ATOMIC_WIDTH[arm] = "64" +FEATURES[arm] = "+v6,+vfp2" + +## armv7-unknown-linux-gnueabihf +DATA_LAYOUT[armv7] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +LLVM_TARGET[armv7] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[armv7] = "little" +TARGET_POINTER_WIDTH[armv7] = "32" +TARGET_C_INT_WIDTH[armv7] = "32" +MAX_ATOMIC_WIDTH[armv7] = "64" +FEATURES[armv7] = "+v7,+vfp2,+thumb2" + +## aarch64-unknown-linux-{gnu, musl} +DATA_LAYOUT[aarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +LLVM_TARGET[aarch64] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[aarch64] = "little" +TARGET_POINTER_WIDTH[aarch64] = "64" +TARGET_C_INT_WIDTH[aarch64] = "32" +MAX_ATOMIC_WIDTH[aarch64] = "128" + +## x86_64-unknown-linux-{gnu, musl} +DATA_LAYOUT[x86_64] = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +LLVM_TARGET[x86_64] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[x86_64] = "little" +TARGET_POINTER_WIDTH[x86_64] = "64" +TARGET_C_INT_WIDTH[x86_64] = "32" +MAX_ATOMIC_WIDTH[x86_64] = "64" + +## i686-unknown-linux-{gnu, musl} +DATA_LAYOUT[i686] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" +LLVM_TARGET[i686] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[i686] = "little" +TARGET_POINTER_WIDTH[i686] = "32" +TARGET_C_INT_WIDTH[i686] = "32" +MAX_ATOMIC_WIDTH[i686] = "64" + +## XXX: a bit of a hack so qemux86 builds, clone of i686-unknown-linux-{gnu, musl} above +DATA_LAYOUT[i586] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" +LLVM_TARGET[i586] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[i586] = "little" +TARGET_POINTER_WIDTH[i586] = "32" +TARGET_C_INT_WIDTH[i586] = "32" +MAX_ATOMIC_WIDTH[i586] = "64" + +## mips-unknown-linux-{gnu, musl} +DATA_LAYOUT[mips] = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" +LLVM_TARGET[mips] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[mips] = "big" +TARGET_POINTER_WIDTH[mips] = "32" +TARGET_C_INT_WIDTH[mips] = "32" +MAX_ATOMIC_WIDTH[mips] = "32" + +## mipsel-unknown-linux-{gnu, musl} +DATA_LAYOUT[mipsel] = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" +LLVM_TARGET[mipsel] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[mipsel] = "little" +TARGET_POINTER_WIDTH[mipsel] = "32" +TARGET_C_INT_WIDTH[mipsel] = "32" +MAX_ATOMIC_WIDTH[mipsel] = "32" + +## mips64-unknown-linux-{gnu, musl} +DATA_LAYOUT[mips64] = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128" +LLVM_TARGET[mips64] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[mips64] = "big" +TARGET_POINTER_WIDTH[mips64] = "64" +TARGET_C_INT_WIDTH[mips64] = "64" +MAX_ATOMIC_WIDTH[mips64] = "64" + +## mips64el-unknown-linux-{gnu, musl} +DATA_LAYOUT[mips64el] = "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128" +LLVM_TARGET[mips64el] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[mips64el] = "little" +TARGET_POINTER_WIDTH[mips64el] = "64" +TARGET_C_INT_WIDTH[mips64el] = "64" +MAX_ATOMIC_WIDTH[mips64el] = "64" + +## powerpc-unknown-linux-{gnu, musl} +DATA_LAYOUT[powerpc] = "E-m:e-p:32:32-i64:64-n32" +LLVM_TARGET[powerpc] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[powerpc] = "big" +TARGET_POINTER_WIDTH[powerpc] = "32" +TARGET_C_INT_WIDTH[powerpc] = "32" +MAX_ATOMIC_WIDTH[powerpc] = "32" + +## powerpc64le-unknown-linux-{gnu, musl} +DATA_LAYOUT[powerpc64le] = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" +LLVM_TARGET[powerpc64le] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[powerpc64le] = "little" +TARGET_POINTER_WIDTH[powerpc64le] = "64" +TARGET_C_INT_WIDTH[powerpc64le] = "64" +MAX_ATOMIC_WIDTH[powerpc64le] = "64" + +## riscv32-unknown-linux-{gnu, musl} +DATA_LAYOUT[riscv32] = "e-m:e-p:32:32-i64:64-n32-S128" +LLVM_TARGET[riscv32] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[riscv32] = "little" +TARGET_POINTER_WIDTH[riscv32] = "32" +TARGET_C_INT_WIDTH[riscv32] = "32" +MAX_ATOMIC_WIDTH[riscv32] = "32" + +## riscv64-unknown-linux-{gnu, musl} +DATA_LAYOUT[riscv64] = "e-m:e-p:64:64-i64:64-i128:128-n64-S128" +LLVM_TARGET[riscv64] = "${RUST_TARGET_SYS}" +TARGET_ENDIAN[riscv64] = "little" +TARGET_POINTER_WIDTH[riscv64] = "64" +TARGET_C_INT_WIDTH[riscv64] = "64" +MAX_ATOMIC_WIDTH[riscv64] = "64" + +def sys_for(d, thing): + return d.getVar('{}_SYS'.format(thing)) + +def prefix_for(d, thing): + return d.getVar('{}_PREFIX'.format(thing)) + +# Convert a normal arch (HOST_ARCH, TARGET_ARCH, BUILD_ARCH, etc) to something +# rust's internals won't choke on. +def arch_to_rust_target_arch(arch): + if arch == "i586" or arch == "i686": + return "x86" + elif arch == "mipsel": + return "mips" + elif arch == "mip64sel": + return "mips64" + elif arch == "armv7": + return "arm" + else: + return arch + +# generates our target CPU value +def llvm_cpu(d): + cpu = d.getVar('PACKAGE_ARCH') + target = d.getVar('TRANSLATED_TARGET_ARCH') + + trans = {} + trans['corei7-64'] = "corei7" + trans['core2-32'] = "core2" + trans['x86-64'] = "x86-64" + trans['i686'] = "i686" + trans['i586'] = "i586" + trans['powerpc'] = "powerpc" + trans['mips64'] = "mips64" + trans['mips64el'] = "mips64" + trans['riscv64'] = "generic-rv64" + trans['riscv32'] = "generic-rv32" + + if target in ["mips", "mipsel"]: + feat = frozenset(d.getVar('TUNE_FEATURES').split()) + if "mips32r2" in feat: + trans['mipsel'] = "mips32r2" + trans['mips'] = "mips32r2" + elif "mips32" in feat: + trans['mipsel'] = "mips32" + trans['mips'] = "mips32" + + try: + return trans[cpu] + except: + return trans.get(target, "generic") + +TARGET_LLVM_CPU="${@llvm_cpu(d)}" +TARGET_LLVM_FEATURES = "${@llvm_features(d)}" + +# class-native implies TARGET=HOST, and TUNE_FEATURES only describes the real +# (original) target. +TARGET_LLVM_FEATURES_class-native = "${@','.join(llvm_features_from_cc_arch(d))}" + +def rust_gen_target(d, thing, wd, features, cpu, arch): + import json + sys = sys_for(d, thing) + prefix = prefix_for(d, thing) + + features = features or d.getVarFlag('FEATURES', arch) or "" + features = features.strip() + + # build tspec + tspec = {} + tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch) + tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch) + tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch)) + tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch) + tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch) + tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch) + tspec['arch'] = arch_to_rust_target_arch(arch) + tspec['os'] = "linux" + if "musl" in tspec['llvm-target']: + tspec['env'] = "musl" + else: + tspec['env'] = "gnu" + if "riscv64" in tspec['llvm-target']: + tspec['llvm-abiname'] = "lp64d" + if "riscv32" in tspec['llvm-target']: + tspec['llvm-abiname'] = "ilp32d" + tspec['vendor'] = "unknown" + tspec['target-family'] = "unix" + tspec['linker'] = "{}{}gcc".format(d.getVar('CCACHE'), prefix) + tspec['ar'] = "{}ar".format(prefix) + tspec['cpu'] = cpu + if features is not "": + tspec['features'] = features + tspec['dynamic-linking'] = True + tspec['executables'] = True + tspec['linker-is-gnu'] = True + tspec['linker-flavor'] = "gcc" + tspec['has-rpath'] = True + tspec['has-elf-tls'] = True + tspec['position-independent-executables'] = True + tspec['panic-strategy'] = d.getVar("RUST_PANIC_STRATEGY") + + # write out the target spec json file + with open(wd + sys + '.json', 'w') as f: + json.dump(tspec, f, indent=4) + +python do_rust_gen_targets () { + wd = d.getVar('WORKDIR') + '/targets/' + build_arch = d.getVar('BUILD_ARCH') + rust_gen_target(d, 'BUILD', wd, "", "generic", build_arch) +} + +addtask rust_gen_targets after do_patch before do_compile +do_rust_gen_targets[dirs] += "${WORKDIR}/targets" + diff --git a/recipes-devtools/rust/rust-cross-canadian.inc b/recipes-devtools/rust/rust-cross-canadian.inc new file mode 100644 index 0000000..9e1f384 --- /dev/null +++ b/recipes-devtools/rust/rust-cross-canadian.inc @@ -0,0 +1,225 @@ + +RUST_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR_NATIVE}/llvm-rust/bin/llvm-config" + +require rust-target.inc + +inherit cross-canadian + +DEPENDS += " \ + virtual/${HOST_PREFIX}gcc-crosssdk \ + virtual/nativesdk-libc rust-llvm-native \ + virtual/${TARGET_PREFIX}compilerlibs \ + virtual/nativesdk-${HOST_PREFIX}compilerlibs \ + gcc-cross-${TARGET_ARCH} \ + " +RUSTLIB_TARGET_PN = "rust-cross-canadian-rustlib-target-${TRANSLATED_TARGET_ARCH}" +RUSTLIB_HOST_PN = "rust-cross-canadian-rustlib-host-${TRANSLATED_TARGET_ARCH}" +RUSTLIB_PKGS = "${RUSTLIB_TARGET_PN} ${RUSTLIB_HOST_PN}" +PN = "rust-cross-canadian-${TRANSLATED_TARGET_ARCH}" + +PACKAGES = "${RUSTLIB_PKGS} ${PN}" +RDEPENDS_${PN} += "${RUSTLIB_PKGS}" + +# The host tools are likely not to be able to do the necessary operation on +# the target architecturea. Alternatively one could check compatibility +# between host/target. +EXCLUDE_FROM_SHLIBS_${RUSTLIB_TARGET_PN} = "1" + +DEBUG_PREFIX_MAP = "-fdebug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \ + -fdebug-prefix-map=${STAGING_DIR_HOST}= \ + -fdebug-prefix-map=${STAGING_DIR_NATIVE}= \ + " + +LLVM_TARGET[x86_64] = "${RUST_HOST_SYS}" +python do_rust_gen_targets () { + wd = d.getVar('WORKDIR') + '/targets/' + rust_gen_target(d, 'TARGET', wd, d.getVar('TARGET_LLVM_FEATURES') or "", d.getVar('TARGET_LLVM_CPU'), d.getVar('TARGET_ARCH')) + rust_gen_target(d, 'HOST', wd, "", "generic", d.getVar('HOST_ARCH')) + rust_gen_target(d, 'BUILD', wd, "", "generic", d.getVar('BUILD_ARCH')) +} + +INHIBIT_DEFAULT_RUST_DEPS = "1" + +# The default behaviour of x.py changed in 1.47+ so now we need to +# explicitly ask for the stage 2 compiler to be assembled. +do_compile () { + rust_runx build --stage 2 +} + +export TARGET_CC = "${CCACHE}${TARGET_PREFIX}gcc --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}" +export TARGET_CXX = "${CCACHE}${TARGET_PREFIX}g++ --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}" +export TARGET_CCLD = "${TARGET_PREFIX}gcc --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}" +export TARGET_AR = "${TARGET_PREFIX}ar" + +do_rust_create_wrappers () { + mkdir -p "${WRAPPER_DIR}" + + # Yocto Build / Rust Host C compiler + create_wrapper "${RUST_BUILD_CC}" "${BUILD_CC}" + # Yocto Build / Rust Host C++ compiler + create_wrapper "${RUST_BUILD_CXX}" "${BUILD_CXX}" + # Yocto Build / Rust Host linker + create_wrapper "${RUST_BUILD_CCLD}" "${BUILD_CCLD}" "${BUILD_LDFLAGS}" + # Yocto Build / Rust Host archiver + create_wrapper "${RUST_BUILD_AR}" "${BUILD_AR}" + + # Yocto Target / Rust Target C compiler + create_wrapper "${RUST_TARGET_CC}" "${TARGET_CC}" + # Yocto Target / Rust Target C++ compiler + create_wrapper "${RUST_TARGET_CXX}" "${TARGET_CXX}" + # Yocto Target / Rust Target linker + create_wrapper "${RUST_TARGET_CCLD}" "${TARGET_CCLD}" "${TARGET_LDFLAGS}" + # Yocto Target / Rust Target archiver + create_wrapper "${RUST_TARGET_AR}" "${TARGET_AR}" +} + +python do_configure() { + import json + from distutils.version import LooseVersion + try: + import configparser + except ImportError: + import ConfigParser as configparser + + # toml is rather similar to standard ini like format except it likes values + # that look more JSON like. So for our purposes simply escaping all values + # as JSON seem to work fine. + + e = lambda s: json.dumps(s) + + config = configparser.RawConfigParser() + + # [target.ARCH-poky-linux] + target_section = "target.{}".format(d.getVar('TARGET_SYS', True)) + config.add_section(target_section) + + llvm_config = d.expand("${YOCTO_ALTERNATE_EXE_PATH}") + config.set(target_section, "llvm-config", e(llvm_config)) + + config.set(target_section, "cxx", e(d.expand("${RUST_TARGET_CXX}"))) + config.set(target_section, "cc", e(d.expand("${RUST_TARGET_CC}"))) + config.set(target_section, "ar", e(d.expand("${RUST_TARGET_AR}"))) + + # If we don't do this rust-native will compile it's own llvm for BUILD. + # [target.${BUILD_ARCH}-unknown-linux-gnu] + target_section = "target.{}".format(d.getVar('SNAPSHOT_BUILD_SYS', True)) + config.add_section(target_section) + + config.set(target_section, "llvm-config", e(llvm_config)) + + config.set(target_section, "cxx", e(d.expand("${RUST_BUILD_CXX}"))) + config.set(target_section, "cc", e(d.expand("${RUST_BUILD_CC}"))) + config.set(target_section, "ar", e(d.expand("${RUST_BUILD_AR}"))) + + # [rust] + config.add_section("rust") + config.set("rust", "rpath", e(True)) + config.set("rust", "channel", e("stable")) + + if LooseVersion(d.getVar("PV")) < LooseVersion("1.32.0"): + config.set("rust", "use-jemalloc", e(False)) + + # Whether or not to optimize the compiler and standard library + config.set("rust", "optimize", e(True)) + + # [build] + config.add_section("build") + config.set("build", "submodules", e(False)) + config.set("build", "docs", e(False)) + + rustc = d.expand("${WORKDIR}/rust-snapshot/bin/rustc") + config.set("build", "rustc", e(rustc)) + + cargo = d.expand("${WORKDIR}/rust-snapshot/bin/cargo") + config.set("build", "cargo", e(cargo)) + + config.set("build", "vendor", e(True)) + + targets = [d.getVar("TARGET_SYS", True), "{}-unknown-linux-gnu".format(d.getVar("HOST_ARCH", True))] + config.set("build", "target", e(targets)) + + hosts = ["{}-unknown-linux-gnu".format(d.getVar("HOST_ARCH", True))] + config.set("build", "host", e(hosts)) + + # We can't use BUILD_SYS since that is something the rust snapshot knows + # nothing about when trying to build some stage0 tools (like fabricate) + config.set("build", "build", e(d.getVar("SNAPSHOT_BUILD_SYS", True))) + + # [install] + config.add_section("install") + # ./x.py install doesn't have any notion of "destdir" + # but we can prepend ${D} to all the directories instead + config.set("install", "prefix", e(d.getVar("D", True) + d.getVar("prefix", True))) + config.set("install", "bindir", e(d.getVar("D", True) + d.getVar("bindir", True))) + config.set("install", "libdir", e(d.getVar("D", True) + d.getVar("libdir", True))) + config.set("install", "datadir", e(d.getVar("D", True) + d.getVar("datadir", True))) + config.set("install", "mandir", e(d.getVar("D", True) + d.getVar("mandir", True))) + + with open("config.toml", "w") as f: + f.write('changelog-seen = 2\n\n') + config.write(f) + + # set up ${WORKDIR}/cargo_home + bb.build.exec_func("setup_cargo_environment", d) +} + +do_install () { + # Rust requires /usr/lib to contain the libs. + # Similar story is with /usr/bin ruquiring `lib` to be at the same level. + # The required structure is retained for simplicity. + SYS_LIBDIR=$(dirname ${D}${libdir}) + SYS_BINDIR=$(dirname ${D}${bindir}) + RUSTLIB_DIR=${SYS_LIBDIR}/${TARGET_SYS}/rustlib + + install -d "${SYS_BINDIR}" + cp build/${SNAPSHOT_BUILD_SYS}/stage2/bin/* ${SYS_BINDIR} + for i in ${SYS_BINDIR}/*; do + chrpath -r "\$ORIGIN/../lib" ${i} + done + + install -d "${D}${libdir}" + cp -pRd build/${SNAPSHOT_BUILD_SYS}/stage2/lib/${TARGET_SYS}/*.so ${SYS_LIBDIR} + cp -pRd build/${SNAPSHOT_BUILD_SYS}/stage2/lib/${TARGET_SYS}/rustlib ${RUSTLIB_DIR} + + for i in ${SYS_LIBDIR}/*.so; do + chrpath -r "\$ORIGIN/../lib" ${i} + done + for i in ${RUSTLIB_DIR}/*/lib/*.so; do + chrpath -d ${i} + done + + install -m 0644 "${WORKDIR}/targets/${TARGET_SYS}.json" "${RUSTLIB_DIR}" + + # TODO package the sources. + + ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d + mkdir "${ENV_SETUP_DIR}" + ENV_SETUP_SH="${ENV_SETUP_DIR}/rust.sh" + + cat <<- EOF > "${ENV_SETUP_SH}" + export RUSTFLAGS="--sysroot=\$OECORE_NATIVE_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT -L\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib/${TARGET_SYS}/lib" + export RUST_TARGET_PATH="\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib" + EOF + + chown -R root.root ${D} +} + +INSANE_SKIP_${RUSTLIB_TARGET_PN} = "file-rdeps arch ldflags" +SKIP_FILEDEPS_${RUSTLIB_TARGET_PN} = "1" + +INHIBIT_PACKAGE_DEBUG_SPLIT = "1" +INHIBIT_PACKAGE_STRIP = "1" +INHIBIT_SYSROOT_STRIP = "1" + +PKG_SYS_LIBDIR = "${SDKPATHNATIVE}/usr/lib" +PKG_SYS_BINDIR = "${SDKPATHNATIVE}/usr/bin" +PKG_RUSTLIB_DIR = "${PKG_SYS_LIBDIR}/${TARGET_SYS}/rustlib" +FILES_${PN} = "${PKG_SYS_LIBDIR}/*.so ${PKG_SYS_BINDIR} ${base_prefix}/environment-setup.d" +FILES_${RUSTLIB_TARGET_PN} = "${PKG_RUSTLIB_DIR}/${TARGET_SYS} ${PKG_RUSTLIB_DIR}/${TARGET_SYS}.json" +# Check more regarding the rustlib symlink, it might not work everywhere. +FILES_${RUSTLIB_HOST_PN} = "${PKG_RUSTLIB_DIR}/${BUILD_ARCH}-unknown-linux-gnu" + +SUMMARY_${RUSTLIB_TARGET_PN} = "Rust cross canadian libaries for ${TARGET_SYS}" +SUMMARY_${RUSTLIB_HOST_PN} = "Rust cross canadian libaries for ${HOST_SYS}" +SUMMARY_${PN} = "Rust crost canadian compiler" + diff --git a/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb b/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb new file mode 100644 index 0000000..7a5a352 --- /dev/null +++ b/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb @@ -0,0 +1,9 @@ +require rust-cross-canadian.inc +require rust-source-${PV}.inc +require rust-snapshot-${PV}.inc + +FILESEXTRAPATHS_prepend := "${THISDIR}/rust:" + +SRC_URI += "\ + file://0001-rustc_target-Fix-dash-vs-underscore-mismatches-in-op.patch \ + " diff --git a/recipes-devtools/rust/rust.inc b/recipes-devtools/rust/rust.inc index 78ae18f..6f10054 100644 --- a/recipes-devtools/rust/rust.inc +++ b/recipes-devtools/rust/rust.inc @@ -20,7 +20,8 @@ export RUST_TARGET_PATH="${WORKDIR}/targets/" export FORCE_CRATE_HASH="${BB_TASKHASH}" -export YOCTO_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR}/llvm-rust/bin/llvm-config" +RUST_ALTERNATE_EXE_PATH ?= "${STAGING_LIBDIR}/llvm-rust/bin/llvm-config" +export YOCTO_ALTERNATE_EXE_PATH = "${RUST_ALTERNATE_EXE_PATH}" export YOCTO_ALTERNATE_MULTILIB_NAME = "/${BASELIB}" # We don't want to use bitbakes vendoring because the rust sources do their @@ -41,350 +42,7 @@ setup_cargo_environment () { printf "linker = '%s'\n" "${RUST_BUILD_CCLD}" >> ${CARGO_HOME}/config } -# Right now this is focused on arm-specific tune features. -# We get away with this for now as one can only use x86-64 as the build host -# (not arm). -# Note that TUNE_FEATURES is _always_ refering to the target, so we really -# don't want to use this for the host/build. -def llvm_features_from_tune(d): - f = [] - feat = d.getVar('TUNE_FEATURES') - if not feat: - return [] - feat = frozenset(feat.split()) - - mach_overrides = d.getVar('MACHINEOVERRIDES') - mach_overrides = frozenset(mach_overrides.split(':')) - - if 'vfpv4' in feat: - f.append("+vfp4") - if 'vfpv3' in feat: - f.append("+vfp3") - if 'vfpv3d16' in feat: - f.append("+d16") - - if 'vfpv2' in feat or 'vfp' in feat: - f.append("+vfp2") - - if 'neon' in feat: - f.append("+neon") - - if 'mips32' in feat: - f.append("+mips32") - - if 'mips32r2' in feat: - f.append("+mips32r2") - - if target_is_armv7(d): - f.append('+v7') - - if ('armv6' in mach_overrides) or ('armv6' in feat): - f.append("+v6") - - if 'dsp' in feat: - f.append("+dsp") - - if 'thumb' in feat: - if d.getVar('ARM_THUMB_OPT') is "thumb": - if target_is_armv7(d): - f.append('+thumb2') - f.append("+thumb-mode") - - if 'cortexa5' in feat: - f.append("+a5") - if 'cortexa7' in feat: - f.append("+a7") - if 'cortexa9' in feat: - f.append("+a9") - if 'cortexa15' in feat: - f.append("+a15") - if 'cortexa17' in feat: - f.append("+a17") - if ('riscv64' in feat) or ('riscv32' in feat): - f.append("+a,+c,+d,+f,+m") - return f - -# TARGET_CC_ARCH changes from build/cross/target so it'll do the right thing -# this should go away when https://github.com/rust-lang/rust/pull/31709 is -# stable (1.9.0?) -def llvm_features_from_cc_arch(d): - f = [] - feat = d.getVar('TARGET_CC_ARCH') - if not feat: - return [] - feat = frozenset(feat.split()) - - if '-mmmx' in feat: - f.append("+mmx") - if '-msse' in feat: - f.append("+sse") - if '-msse2' in feat: - f.append("+sse2") - if '-msse3' in feat: - f.append("+sse3") - if '-mssse3' in feat: - f.append("+ssse3") - if '-msse4.1' in feat: - f.append("+sse4.1") - if '-msse4.2' in feat: - f.append("+sse4.2") - if '-msse4a' in feat: - f.append("+sse4a") - if '-mavx' in feat: - f.append("+avx") - if '-mavx2' in feat: - f.append("+avx2") - - return f - -def llvm_features_from_target_fpu(d): - # TARGET_FPU can be hard or soft. +soft-float tell llvm to use soft float - # ABI. There is no option for hard. - - fpu = d.getVar('TARGET_FPU', True) - return ["+soft-float"] if fpu == "soft" else [] - -def llvm_features(d): - return ','.join(llvm_features_from_tune(d) + - llvm_features_from_cc_arch(d) + - llvm_features_from_target_fpu(d)) - -## arm-unknown-linux-gnueabihf -DATA_LAYOUT[arm] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -LLVM_TARGET[arm] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[arm] = "little" -TARGET_POINTER_WIDTH[arm] = "32" -TARGET_C_INT_WIDTH[arm] = "32" -MAX_ATOMIC_WIDTH[arm] = "64" -FEATURES[arm] = "+v6,+vfp2" - -## armv7-unknown-linux-gnueabihf -DATA_LAYOUT[armv7] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" -LLVM_TARGET[armv7] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[armv7] = "little" -TARGET_POINTER_WIDTH[armv7] = "32" -TARGET_C_INT_WIDTH[armv7] = "32" -MAX_ATOMIC_WIDTH[armv7] = "64" -FEATURES[armv7] = "+v7,+vfp2,+thumb2" - -## aarch64-unknown-linux-{gnu, musl} -DATA_LAYOUT[aarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" -LLVM_TARGET[aarch64] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[aarch64] = "little" -TARGET_POINTER_WIDTH[aarch64] = "64" -TARGET_C_INT_WIDTH[aarch64] = "32" -MAX_ATOMIC_WIDTH[aarch64] = "128" - -## x86_64-unknown-linux-{gnu, musl} -DATA_LAYOUT[x86_64] = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -LLVM_TARGET[x86_64] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[x86_64] = "little" -TARGET_POINTER_WIDTH[x86_64] = "64" -TARGET_C_INT_WIDTH[x86_64] = "32" -MAX_ATOMIC_WIDTH[x86_64] = "64" - -## i686-unknown-linux-{gnu, musl} -DATA_LAYOUT[i686] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" -LLVM_TARGET[i686] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[i686] = "little" -TARGET_POINTER_WIDTH[i686] = "32" -TARGET_C_INT_WIDTH[i686] = "32" -MAX_ATOMIC_WIDTH[i686] = "64" - -## XXX: a bit of a hack so qemux86 builds, clone of i686-unknown-linux-{gnu, musl} above -DATA_LAYOUT[i586] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" -LLVM_TARGET[i586] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[i586] = "little" -TARGET_POINTER_WIDTH[i586] = "32" -TARGET_C_INT_WIDTH[i586] = "32" -MAX_ATOMIC_WIDTH[i586] = "64" - -## mips-unknown-linux-{gnu, musl} -DATA_LAYOUT[mips] = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" -LLVM_TARGET[mips] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[mips] = "big" -TARGET_POINTER_WIDTH[mips] = "32" -TARGET_C_INT_WIDTH[mips] = "32" -MAX_ATOMIC_WIDTH[mips] = "32" - -## mipsel-unknown-linux-{gnu, musl} -DATA_LAYOUT[mipsel] = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" -LLVM_TARGET[mipsel] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[mipsel] = "little" -TARGET_POINTER_WIDTH[mipsel] = "32" -TARGET_C_INT_WIDTH[mipsel] = "32" -MAX_ATOMIC_WIDTH[mipsel] = "32" - -## mips64-unknown-linux-{gnu, musl} -DATA_LAYOUT[mips64] = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128" -LLVM_TARGET[mips64] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[mips64] = "big" -TARGET_POINTER_WIDTH[mips64] = "64" -TARGET_C_INT_WIDTH[mips64] = "64" -MAX_ATOMIC_WIDTH[mips64] = "64" - -## mips64el-unknown-linux-{gnu, musl} -DATA_LAYOUT[mips64el] = "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128" -LLVM_TARGET[mips64el] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[mips64el] = "little" -TARGET_POINTER_WIDTH[mips64el] = "64" -TARGET_C_INT_WIDTH[mips64el] = "64" -MAX_ATOMIC_WIDTH[mips64el] = "64" - -## powerpc-unknown-linux-{gnu, musl} -DATA_LAYOUT[powerpc] = "E-m:e-p:32:32-i64:64-n32" -LLVM_TARGET[powerpc] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[powerpc] = "big" -TARGET_POINTER_WIDTH[powerpc] = "32" -TARGET_C_INT_WIDTH[powerpc] = "32" -MAX_ATOMIC_WIDTH[powerpc] = "32" - -## powerpc64le-unknown-linux-{gnu, musl} -DATA_LAYOUT[powerpc64le] = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" -LLVM_TARGET[powerpc64le] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[powerpc64le] = "little" -TARGET_POINTER_WIDTH[powerpc64le] = "64" -TARGET_C_INT_WIDTH[powerpc64le] = "64" -MAX_ATOMIC_WIDTH[powerpc64le] = "64" - -## riscv32-unknown-linux-{gnu, musl} -DATA_LAYOUT[riscv32] = "e-m:e-p:32:32-i64:64-n32-S128" -LLVM_TARGET[riscv32] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[riscv32] = "little" -TARGET_POINTER_WIDTH[riscv32] = "32" -TARGET_C_INT_WIDTH[riscv32] = "32" -MAX_ATOMIC_WIDTH[riscv32] = "32" - -## riscv64-unknown-linux-{gnu, musl} -DATA_LAYOUT[riscv64] = "e-m:e-p:64:64-i64:64-i128:128-n64-S128" -LLVM_TARGET[riscv64] = "${RUST_TARGET_SYS}" -TARGET_ENDIAN[riscv64] = "little" -TARGET_POINTER_WIDTH[riscv64] = "64" -TARGET_C_INT_WIDTH[riscv64] = "64" -MAX_ATOMIC_WIDTH[riscv64] = "64" - -def sys_for(d, thing): - return d.getVar('{}_SYS'.format(thing)) - -def prefix_for(d, thing): - return d.getVar('{}_PREFIX'.format(thing)) - -# Convert a normal arch (HOST_ARCH, TARGET_ARCH, BUILD_ARCH, etc) to something -# rust's internals won't choke on. -def arch_to_rust_target_arch(arch): - if arch == "i586" or arch == "i686": - return "x86" - elif arch == "mipsel": - return "mips" - elif arch == "mip64sel": - return "mips64" - elif arch == "armv7": - return "arm" - else: - return arch - -# generates our target CPU value -def llvm_cpu(d): - # First check if TUNE_CCARGS gives us a specific CPU to build for (via -march). - # Translate that GCC -march flag to a Rust/LLVM CPU. - trans = {} - trans['btver2'] = "btver2" - trans['core2'] = "core2" - trans['mips32'] = "mips32" - trans['mips32r2'] = "mips32r2" - trans['nehalem'] = "nehalem" - trans['skylake'] = "skylake" - - for arg in (d.getVar('TUNE_CCARGS') or '').split(): - if arg.startswith('-march='): - march = arg[7:] - cpu = trans.get(march) - if cpu: - return cpu - - # If we don't have -march in TUNE_CCARGS, check TRANSLATED_TARGET_ARCH. - # This must also be translated into a Rust/LLVM CPU. - trans = {} - trans['i586'] = "i586" - trans['i686'] = "i686" - trans['mips64'] = "mips64" - trans['mips64el'] = "mips64" - trans['powerpc'] = "ppc" - trans['powerpc64'] = "ppc64" - trans['riscv32'] = "generic-rv32" - trans['riscv64'] = "generic-rv64" - trans['x86-64'] = "x86-64" - - target = d.getVar('TRANSLATED_TARGET_ARCH') - cpu = trans.get(target) - if cpu: - return cpu - - # If we still didn't get a target CPU, choose "generic". - # Further optimization can still happen via llvm_features. - return "generic" - -TARGET_LLVM_CPU="${@llvm_cpu(d)}" -TARGET_LLVM_FEATURES = "${@llvm_features(d)}" - -# class-native implies TARGET=HOST, and TUNE_FEATURES only describes the real -# (original) target. -TARGET_LLVM_FEATURES_class-native = "${@','.join(llvm_features_from_cc_arch(d))}" - -def rust_gen_target(d, thing, wd, features, cpu, arch): - import json - sys = sys_for(d, thing) - prefix = prefix_for(d, thing) - - features = features or d.getVarFlag('FEATURES', arch) or "" - features = features.strip() - - # build tspec - tspec = {} - tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch) - tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch) - tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch)) - tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch) - tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch) - tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch) - tspec['arch'] = arch_to_rust_target_arch(arch) - tspec['os'] = "linux" - if "musl" in tspec['llvm-target']: - tspec['env'] = "musl" - else: - tspec['env'] = "gnu" - if "riscv64" in tspec['llvm-target']: - tspec['llvm-abiname'] = "lp64d" - if "riscv32" in tspec['llvm-target']: - tspec['llvm-abiname'] = "ilp32d" - tspec['vendor'] = "unknown" - tspec['target-family'] = "unix" - tspec['linker'] = "{}{}gcc".format(d.getVar('CCACHE'), prefix) - tspec['ar'] = "{}ar".format(prefix) - tspec['cpu'] = cpu - if features is not "": - tspec['features'] = features - tspec['dynamic-linking'] = True - tspec['executables'] = True - tspec['linker-is-gnu'] = True - tspec['linker-flavor'] = "gcc" - tspec['has-rpath'] = True - tspec['has-elf-tls'] = True - tspec['position-independent-executables'] = True - tspec['panic-strategy'] = d.getVar("RUST_PANIC_STRATEGY") - - # write out the target spec json file - with open(wd + sys + '.json', 'w') as f: - json.dump(tspec, f, indent=4) - -python do_rust_gen_targets () { - wd = d.getVar('WORKDIR') + '/targets/' - build_arch = d.getVar('BUILD_ARCH') - rust_gen_target(d, 'BUILD', wd, "", "generic", build_arch) -} - -addtask rust_gen_targets after do_patch before do_compile -do_rust_gen_targets[dirs] += "${WORKDIR}/targets" +include rust-common.inc do_rust_setup_snapshot () { for installer in "${WORKDIR}/rust-snapshot-components/"*"/install.sh"; do @@ -399,7 +57,6 @@ do_rust_setup_snapshot () { addtask rust_setup_snapshot after do_unpack before do_configure do_rust_setup_snapshot[dirs] += "${WORKDIR}/rust-snapshot" - python do_configure() { import json try: From ae08e553b8ec21561d691df9ddb25eb50e54502d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 18 Feb 2021 12:26:01 +0000 Subject: [PATCH 2/5] rustc-cross-canadian: Remove obsolete comment --- recipes-devtools/rust/rust-cross-canadian.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes-devtools/rust/rust-cross-canadian.inc b/recipes-devtools/rust/rust-cross-canadian.inc index 9e1f384..bc7e886 100644 --- a/recipes-devtools/rust/rust-cross-canadian.inc +++ b/recipes-devtools/rust/rust-cross-canadian.inc @@ -216,7 +216,6 @@ PKG_SYS_BINDIR = "${SDKPATHNATIVE}/usr/bin" PKG_RUSTLIB_DIR = "${PKG_SYS_LIBDIR}/${TARGET_SYS}/rustlib" FILES_${PN} = "${PKG_SYS_LIBDIR}/*.so ${PKG_SYS_BINDIR} ${base_prefix}/environment-setup.d" FILES_${RUSTLIB_TARGET_PN} = "${PKG_RUSTLIB_DIR}/${TARGET_SYS} ${PKG_RUSTLIB_DIR}/${TARGET_SYS}.json" -# Check more regarding the rustlib symlink, it might not work everywhere. FILES_${RUSTLIB_HOST_PN} = "${PKG_RUSTLIB_DIR}/${BUILD_ARCH}-unknown-linux-gnu" SUMMARY_${RUSTLIB_TARGET_PN} = "Rust cross canadian libaries for ${TARGET_SYS}" From 2932b399a5ef294ed1299202742ae13a923da437 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 22 Feb 2021 13:28:13 +0000 Subject: [PATCH 3/5] packagegroup-rust-cross-canadian: Remove trailing WS --- .../packagegroups/packagegroup-rust-cross-canadian.bb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb b/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb index de7078a..d7cb033 100644 --- a/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb +++ b/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb @@ -3,12 +3,12 @@ PN = "packagegroup-rust-cross-canadian-${MACHINE}" inherit cross-canadian packagegroup -PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1" +PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1" RUST="rust-cross-canadian-${TRANSLATED_TARGET_ARCH}" CARGO="cargo-cross-canadian-${TRANSLATED_TARGET_ARCH}" -RDEPENDS_${PN} = " \ +RDEPENDS_${PN} = " \ ${@all_multilib_tune_values(d, 'RUST')} \ ${@all_multilib_tune_values(d, 'CARGO')} \ " From e492b2d86f352ce709942846aba483007f7a5cf1 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 22 Feb 2021 13:35:44 +0000 Subject: [PATCH 4/5] ident: Fix more WS issues --- recipes-devtools/cargo/cargo-cross-canadian.inc | 2 +- recipes-devtools/rust/rust-cross-canadian.inc | 12 ++++++------ recipes-devtools/rust/rust-cross-canadian_1.49.0.bb | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/recipes-devtools/cargo/cargo-cross-canadian.inc b/recipes-devtools/cargo/cargo-cross-canadian.inc index bdba874..d05d048 100644 --- a/recipes-devtools/cargo/cargo-cross-canadian.inc +++ b/recipes-devtools/cargo/cargo-cross-canadian.inc @@ -21,7 +21,7 @@ DEPENDS += "rust-native \ rust-cross-canadian-${TRANSLATED_TARGET_ARCH} \ virtual/nativesdk-${HOST_PREFIX}compilerlibs \ nativesdk-openssl nativesdk-zlib \ - virtual/nativesdk-libc \ + virtual/nativesdk-libc \ " inherit cross-canadian diff --git a/recipes-devtools/rust/rust-cross-canadian.inc b/recipes-devtools/rust/rust-cross-canadian.inc index bc7e886..463ec00 100644 --- a/recipes-devtools/rust/rust-cross-canadian.inc +++ b/recipes-devtools/rust/rust-cross-canadian.inc @@ -6,12 +6,12 @@ require rust-target.inc inherit cross-canadian DEPENDS += " \ - virtual/${HOST_PREFIX}gcc-crosssdk \ - virtual/nativesdk-libc rust-llvm-native \ - virtual/${TARGET_PREFIX}compilerlibs \ - virtual/nativesdk-${HOST_PREFIX}compilerlibs \ - gcc-cross-${TARGET_ARCH} \ - " + virtual/${HOST_PREFIX}gcc-crosssdk \ + virtual/nativesdk-libc rust-llvm-native \ + virtual/${TARGET_PREFIX}compilerlibs \ + virtual/nativesdk-${HOST_PREFIX}compilerlibs \ + gcc-cross-${TARGET_ARCH} \ + " RUSTLIB_TARGET_PN = "rust-cross-canadian-rustlib-target-${TRANSLATED_TARGET_ARCH}" RUSTLIB_HOST_PN = "rust-cross-canadian-rustlib-host-${TRANSLATED_TARGET_ARCH}" RUSTLIB_PKGS = "${RUSTLIB_TARGET_PN} ${RUSTLIB_HOST_PN}" diff --git a/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb b/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb index 7a5a352..b8807aa 100644 --- a/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb +++ b/recipes-devtools/rust/rust-cross-canadian_1.49.0.bb @@ -4,6 +4,6 @@ require rust-snapshot-${PV}.inc FILESEXTRAPATHS_prepend := "${THISDIR}/rust:" -SRC_URI += "\ - file://0001-rustc_target-Fix-dash-vs-underscore-mismatches-in-op.patch \ - " +SRC_URI += " \ + file://0001-rustc_target-Fix-dash-vs-underscore-mismatches-in-op.patch \ + " From c06069fdaafd9bb1011c7e655476134c9447b458 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 30 Mar 2021 15:13:28 +0000 Subject: [PATCH 5/5] cross-canadian: Sync with 1.51.0 addition for rustc and cargo Signed-off-by: Anatol Belski --- recipes-devtools/cargo/cargo-cross-canadian_1.51.0.bb | 6 ++++++ recipes-devtools/rust/rust-cross-canadian_1.51.0.bb | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 recipes-devtools/cargo/cargo-cross-canadian_1.51.0.bb create mode 100644 recipes-devtools/rust/rust-cross-canadian_1.51.0.bb diff --git a/recipes-devtools/cargo/cargo-cross-canadian_1.51.0.bb b/recipes-devtools/cargo/cargo-cross-canadian_1.51.0.bb new file mode 100644 index 0000000..56c6f62 --- /dev/null +++ b/recipes-devtools/cargo/cargo-cross-canadian_1.51.0.bb @@ -0,0 +1,6 @@ +require recipes-devtools/rust/rust-source-${PV}.inc +require recipes-devtools/rust/rust-snapshot-${PV}.inc + +FILESEXTRAPATHS_prepend := "${THISDIR}/cargo-${PV}:" + +require cargo-cross-canadian.inc diff --git a/recipes-devtools/rust/rust-cross-canadian_1.51.0.bb b/recipes-devtools/rust/rust-cross-canadian_1.51.0.bb new file mode 100644 index 0000000..ce799dc --- /dev/null +++ b/recipes-devtools/rust/rust-cross-canadian_1.51.0.bb @@ -0,0 +1,6 @@ +require rust-cross-canadian.inc +require rust-source-${PV}.inc +require rust-snapshot-${PV}.inc + +FILESEXTRAPATHS_prepend := "${THISDIR}/rust:" +