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..d7cb033 --- /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..d05d048 --- /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-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/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..463ec00 --- /dev/null +++ b/recipes-devtools/rust/rust-cross-canadian.inc @@ -0,0 +1,224 @@ + +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" +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..b8807aa --- /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-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:" + 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: