Hi Alex, Sent patches as you requested. There are about 8 patches. Mailing list link from https://lists.openembedded.org/g/openembedded-core/message/150462 to https://lists.openembedded.org/g/openembedded-core/message/150469
The patches are on top of "rmacleod/rust-wip-2021-02-02" branch. $git clone git://git.yoctoproject.org/poky-contrib -b rmacleod/rust-wip-2021-02-02 Let me know in case of any more details needed. Regards, Vinay On Sat, Apr 10, 2021 at 3:20 PM Alexander Kanavin <[email protected]> wrote: > > There are a few unrelated changes all bundled together - please split it into > several commits and properly describe each. Particularly rust-test.inc is > huge, and does need a proper explanation of what is happening and why, in > both the commit message and inline comments. Do keep in mind: making the code > work is only half the job, the other half is explaining what happens to other > humans. > > Alex > > On Fri, 9 Apr 2021 at 13:59, Vinay Kumar <[email protected]> wrote: >> >> Signed-off-by: Vinay Kumar <[email protected]> >> --- >> meta/classes/rust-common.bbclass | 5 +- >> meta/conf/bitbake.conf | 2 +- >> meta/lib/oeqa/selftest/cases/rust.py | 41 ++ >> meta/lib/oeqa/utils/qemurunner.py | 8 +- >> meta/recipes-devtools/rust/rust-test.inc | 504 ++++++++++++++++++ >> .../recipes-devtools/rust/rust-test_1.46.0.bb | 12 + >> scripts/runqemu | 15 +- >> 7 files changed, 583 insertions(+), 4 deletions(-) >> create mode 100644 meta/lib/oeqa/selftest/cases/rust.py >> create mode 100644 meta/recipes-devtools/rust/rust-test.inc >> create mode 100644 meta/recipes-devtools/rust/rust-test_1.46.0.bb >> >> diff --git a/meta/classes/rust-common.bbclass >> b/meta/classes/rust-common.bbclass >> index ff7b9da8f3..fb75b07ba3 100644 >> --- a/meta/classes/rust-common.bbclass >> +++ b/meta/classes/rust-common.bbclass >> @@ -84,7 +84,10 @@ def rust_base_triple(d, thing): >> # This catches ARM targets and appends the necessary hard float bits >> if os == "linux-gnueabi" or os == "linux-musleabi": >> libc = bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', >> 'hf', '', d) >> - return arch + vendor + '-' + os + libc >> + if d.getVar('TARGET_ARCH') == 'mips64': >> + return arch + vendor + '-' + os + libc + 'abi64' >> + else: >> + return arch + vendor + '-' + os + libc >> >> # Naming explanation >> # Yocto >> diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf >> index 3438be92b7..83e1b68071 100644 >> --- a/meta/conf/bitbake.conf >> +++ b/meta/conf/bitbake.conf >> @@ -483,7 +483,7 @@ HOSTTOOLS_DIR = "${TMPDIR}/hosttools" >> HOSTTOOLS += " \ >> [ ar as awk basename bash bzip2 cat chgrp chmod chown chrpath cmp comm >> cp cpio \ >> cpp cut date dd diff diffstat dirname du echo egrep env expand expr >> false \ >> - fgrep file find flock g++ gawk gcc getconf getopt git grep gunzip gzip \ >> + fgrep file find flock g++ gawk gcc cc getconf getopt git grep gunzip >> gzip \ >> head hostname iconv id install ld ldd ln ls make md5sum mkdir mkfifo >> mknod \ >> mktemp mv nm objcopy objdump od patch perl pr printf pwd \ >> python3 ranlib readelf readlink realpath rm rmdir rpcgen sed seq sh \ >> diff --git a/meta/lib/oeqa/selftest/cases/rust.py >> b/meta/lib/oeqa/selftest/cases/rust.py >> new file mode 100644 >> index 0000000000..69a1a285a9 >> --- /dev/null >> +++ b/meta/lib/oeqa/selftest/cases/rust.py >> @@ -0,0 +1,41 @@ >> +# SPDX-License-Identifier: MIT >> +import os >> +from oeqa.core.decorator import OETestTag >> +from oeqa.core.case import OEPTestResultTestCase >> +from oeqa.selftest.case import OESelftestTestCase >> +from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runqemu, >> Command >> + >> +class RustSelfTestBase(OESelftestTestCase, OEPTestResultTestCase): >> + >> + def run_check(self, *suites, ssh = None): >> + # configure ssh target >> + features = [] >> + if ssh is not None: >> + features.append('TOOLCHAIN_TEST_TARGET = "ssh"') >> + features.append('TOOLCHAIN_TEST_HOST = >> "{0}"'.format(ssh)) >> + features.append('TOOLCHAIN_TEST_HOST_USER = "root"') >> + features.append('TOOLCHAIN_TEST_HOST_PORT = "22"') >> + self.write_config("\n".join(features)) >> + >> + recipe = "rust-test" >> + bitbake("{} -c check".format(recipe)) >> + >> + def run_check_emulated(self, *args, **kwargs): >> + # build remote-test-server before image build >> + recipe = "rust-test" >> + bitbake("{} -c compile".format(recipe)) >> + # build core-image-minimal with required packages >> + default_installed_packages = ["libgcc", "libstdc++", >> "libatomic", "libgomp"] >> + features = [] >> + features.append('IMAGE_FEATURES += "ssh-server-openssh"') >> + features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" >> ".join(default_installed_packages))) >> + self.write_config("\n".join(features)) >> + bitbake("core-image-minimal") >> + # wrap the execution with a qemu instance >> + with runqemu("core-image-minimal", runqemuparams = >> "nographic slirp") as qemu: >> + return self.run_check(*args, ssh=qemu.ip, **kwargs) >> + >> +@OETestTag("toolchain-system") >> +class RustSelfTestSystemEmulated(RustSelfTestBase): >> + def test_rust(self): >> + self.run_check_emulated("rust") >> diff --git a/meta/lib/oeqa/utils/qemurunner.py >> b/meta/lib/oeqa/utils/qemurunner.py >> index 77ec939ad7..aea7c624ec 100644 >> --- a/meta/lib/oeqa/utils/qemurunner.py >> +++ b/meta/lib/oeqa/utils/qemurunner.py >> @@ -184,7 +184,13 @@ class QemuRunner: >> # and analyze descendents in order to determine it. >> if os.path.exists(self.qemu_pidfile): >> os.remove(self.qemu_pidfile) >> - self.qemuparams = 'bootparams="{0}" qemuparams="-pidfile >> {1}"'.format(bootparams, self.qemu_pidfile) >> + >> + if "slirp" in launch_cmd: >> + self.use_slirp = True >> + self.qemuparams = 'bootparams="{0}" qemuparams="-pidfile {1} >> -monitor telnet:127.0.0.1:1234,server,nowait -serial mon:stdio -serial >> null"'.format(bootparams, self.qemu_pidfile) >> + else: >> + self.qemuparams = 'bootparams="{0}" qemuparams="-pidfile >> {1}"'.format(bootparams, self.qemu_pidfile) >> + >> if qemuparams: >> self.qemuparams = self.qemuparams[:-1] + " " + qemuparams + " " >> + '\"' >> >> diff --git a/meta/recipes-devtools/rust/rust-test.inc >> b/meta/recipes-devtools/rust/rust-test.inc >> new file mode 100644 >> index 0000000000..0a13b3e0d8 >> --- /dev/null >> +++ b/meta/recipes-devtools/rust/rust-test.inc >> @@ -0,0 +1,504 @@ >> +HOMEPAGE = "http://www.rust-lang.org" >> +SECTION = "devel" >> +LICENSE = "MIT | Apache-2.0" >> + >> +inherit rust >> +inherit cargo_common >> + >> +DEPENDS += "file-native python3-native" >> +DEPENDS_append_class-native = " rust-llvm-native" >> + >> +# In case of x86_64 target we setting this path to location of >> "x86_64-poky-linux.json". >> +# This is to differentiate cross target and build in config.toml file. >> +export RUST_TARGET_PATH = "${STAGING_LIBDIR_NATIVE}/rustlib" >> + >> +export FORCE_CRATE_HASH="${BB_TASKHASH}" >> + >> +#export YOCTO_ALTERNATE_EXE_PATH = >> "${STAGING_LIBDIR}/llvm-rust/bin/llvm-config" >> +export YOCTO_ALTERNATE_MULTILIB_NAME = "/${BASELIB}" >> + >> +# We don't want to use bitbakes vendoring because the rust sources do their >> +# own vendoring. >> +CARGO_DISABLE_BITBAKE_VENDORING = "1" >> + >> +# We can't use RUST_BUILD_SYS here because that may be "musl" if >> +# TCLIBC="musl". Snapshots are always -unknown-linux-gnu >> +SNAPSHOT_BUILD_SYS = "${BUILD_ARCH}-unknown-linux-gnu" >> +setup_cargo_environment () { >> + # The first step is to build bootstrap and some early stage tools, >> + # these are build for the same target as the snapshot, e.g. >> + # x86_64-unknown-linux-gnu. >> + # Later stages are build for the native target (i.e. >> target.x86_64-linux) >> + cargo_common_do_configure >> + >> + printf '[target.%s]\n' "${SNAPSHOT_BUILD_SYS}" >> ${CARGO_HOME}/config >> + 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 'aarch64' in feat: >> + f.append("+v8") >> + >> + if 'mips32' in feat: >> + f.append("+mips32") >> + >> + if 'mips32r2' in feat: >> + f.append("+mips32r2") >> + >> + v7=frozenset(['armv7a', 'armv7r', 'armv7m', 'armv7ve']) >> + if (not mach_overrides.isdisjoint(v7)) or (not feat.isdisjoint(v7)): >> + 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 (not mach_overrides.isdisjoint(v7)) or (not >> feat.isdisjoint(v7)): >> + 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") >> + >> + 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" >> + >> +## 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" >> + >> +## riscv32-unknown-linux-{gnu, musl} >> +DATA_LAYOUT[riscv32] = "e-m:e-p:64:64-i64:64-i128:128-n64-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 arch_for(d, thing): >> + return d.getVar('{}_ARCH'.format(thing)) >> + >> +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" >> + 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" >> + >> + 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): >> + import json >> + from distutils.version import LooseVersion >> + arch = arch_for(d, thing) >> + 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" >> + 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") >> + >> + # Don't use jemalloc as it doesn't work for many targets. >> + # https://github.com/rust-lang/rust/pull/37392 >> + # From 1.20.0 and forward, system allocator is the default. >> + if LooseVersion(d.getVar("PV")) < LooseVersion("1.20.0"): >> + tspec['exe-allocation-crate'] = "alloc_system" >> + tspec['lib-allocation-crate'] = "alloc_system" >> + >> + # 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/' >> + rust_gen_target(d, 'BUILD', wd, "", "generic") >> +} >> + >> +addtask rust_gen_targets after do_patch before do_compile >> +do_rust_gen_targets[dirs] += "${WORKDIR}/targets" >> + >> +do_rust_setup_snapshot () { >> + for installer in "${WORKDIR}/rust-snapshot-components/"*"/install.sh"; >> do >> + "${installer}" --prefix="${WORKDIR}/rust-snapshot" >> --disable-ldconfig >> + done >> + >> + # Some versions of rust (e.g. 1.18.0) tries to find cargo in >> stage0/bin/cargo >> + # and fail without it there. >> + mkdir -p ${RUSTSRC}/build/${BUILD_SYS} >> + ln -sf ${WORKDIR}/rust-snapshot/ ${RUSTSRC}/build/${BUILD_SYS}/stage0 >> +} >> +addtask rust_setup_snapshot after do_unpack before do_configure >> +do_rust_setup_snapshot[dirs] += "${WORKDIR}/rust-snapshot" >> + >> + >> +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-unknown-linux-gnu] >> + if( d.getVar('RUST_TARGET_SYS', True) != d.getVar('SNAPSHOT_BUILD_SYS', >> True)): >> + target_section = "target.{}".format(d.getVar('RUST_TARGET_SYS', >> True)) >> + else : >> + target_section = "target.{}".format(d.getVar('TARGET_SYS', True)) >> + >> + config.add_section(target_section) >> + >> + 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, "linker", e(d.expand("${RUST_TARGET_CCLD}"))) >> + >> + # 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, "cxx", e(d.expand("${RUST_BUILD_CXX}"))) >> + config.set(target_section, "cc", e(d.expand("${RUST_BUILD_CC}"))) >> + >> + # [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)) >> + >> + # Emits extraneous output from tests to ensure that failures of the test >> + # harness are debuggable just from logfiles >> + config.set("rust", "verbose-tests", 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)) >> + >> + if( d.getVar('RUST_TARGET_SYS', True) != d.getVar('SNAPSHOT_BUILD_SYS', >> True)): >> + targets = [d.getVar("RUST_TARGET_SYS", True)] >> + else: >> + targets = [d.getVar("TARGET_SYS", True)] >> + >> + config.set("build", "target", e(targets)) >> + >> + hosts = [d.getVar("SNAPSHOT_BUILD_SYS", 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))) >> + >> + with open("config.toml", "w") as f: >> + config.write(f) >> + >> + # set up ${WORKDIR}/cargo_home >> + bb.build.exec_func("setup_cargo_environment", d) >> +} >> + >> + >> +rust_runx () { >> + echo "COMPILE ${PN}" "$@" >> + >> + # CFLAGS, LDFLAGS, CXXFLAGS, CPPFLAGS are used by rust's build for a >> + # wide range of targets (not just TARGET). Yocto's settings for them >> will >> + # be inappropriate, avoid using. >> + unset CFLAGS >> + unset LDFLAGS >> + unset CXXFLAGS >> + unset CPPFLAGS >> + >> + oe_cargo_fix_env >> + >> + nativepython3 src/bootstrap/bootstrap.py >> ${@oe.utils.parallel_make_argument(d, '-j %d')} "$@" >> +} >> +rust_runx[vardepsexclude] += "PARALLEL_MAKE" >> + >> +do_compile () { >> + if [ "${SNAPSHOT_BUILD_SYS}" = "${RUST_TARGET_SYS}" ] >> + then >> + rust_runx build src/tools/remote-test-server --target "${TARGET_SYS}" >> + else >> + rust_runx build src/tools/remote-test-server --target >> "${RUST_TARGET_SYS}" >> + fi >> +} >> + >> +do_check[dirs] += "${B}" >> +do_check[nostamp] = "1" >> +do_check () { >> + scp -P 2222 -o StrictHostKeyChecking=no >> build/${SNAPSHOT_BUILD_SYS}/stage2-tools-bin/remote-test-server >> [email protected]:~/ >> + ssh -p 2222 -o StrictHostKeyChecking=no -f [email protected] >> "~/remote-test-server -v remote" >> + >> + >> + export TEST_DEVICE_ADDR="127.0.0.1:12345" >> + if [ "${SNAPSHOT_BUILD_SYS}" = "${RUST_TARGET_SYS}" ] >> + then >> + rust_runx test --no-fail-fast --bless --target "${TARGET_SYS}" > >> summary.txt 2> /dev/null >> + else >> + rust_runx test --no-fail-fast --target "${RUST_TARGET_SYS}" > >> summary.txt 2> /dev/null >> + fi >> + >> +} >> +addtask do_check after do_compile >> + >> diff --git a/meta/recipes-devtools/rust/rust-test_1.46.0.bb >> b/meta/recipes-devtools/rust/rust-test_1.46.0.bb >> new file mode 100644 >> index 0000000000..b724ea5eb0 >> --- /dev/null >> +++ b/meta/recipes-devtools/rust/rust-test_1.46.0.bb >> @@ -0,0 +1,12 @@ >> +require rust-test.inc >> +require rust-source-${PV}.inc >> +require rust-snapshot-${PV}.inc >> + >> +DEPENDS += "rust-llvm (=${PV})" >> + >> +# Otherwise we'll depend on what we provide >> +INHIBIT_DEFAULT_RUST_DEPS_class-native = "1" >> +# We don't need to depend on gcc-native because yocto assumes it exists >> +PROVIDES_class-native = "virtual/${TARGET_PREFIX}rust" >> + >> +BBCLASSEXTEND = "native" >> diff --git a/scripts/runqemu b/scripts/runqemu >> index dd92a64553..1a21a90add 100755 >> --- a/scripts/runqemu >> +++ b/scripts/runqemu >> @@ -1055,7 +1055,7 @@ class BaseConfig(object): >> logger.info("Network configuration:%s", netconf) >> self.kernel_cmdline_script += netconf >> # Port mapping >> - hostfwd = ",hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23" >> + hostfwd = >> ",hostfwd=tcp::12345-:12345,hostfwd=tcp::2323-:23,hostfwd=tcp::2222-:22" >> qb_slirp_opt_default = "-netdev user,id=net0%s,tftp=%s" % (hostfwd, >> self.get('DEPLOY_DIR_IMAGE')) >> qb_slirp_opt = self.get('QB_SLIRP_OPT') or qb_slirp_opt_default >> # Figure out the port >> @@ -1084,6 +1084,19 @@ class BaseConfig(object): >> mac += 1 >> if p != p_new: >> ports.append(p_new) >> + temp=__file__.split(os.path.basename(__file__))[0] >> + with >> open(temp+"../meta/recipes-devtools/rust/rust-test.inc", 'r+') as f: >> + text = f.readlines() >> + temp1=[] >> + for i in text: >> + temp = re.sub(r'(\S+\s)(-.)(\s\d+)( -o >> StrictHostKeyChecking=no .*)', r'\1\2 '+str(p_new)+'\\4', i) >> + temp1.append(temp) >> + temp2='' >> + for i in temp1: >> + temp2=temp2+i >> + f.seek(0) >> + f.write(temp2) >> + f.truncate() >> qb_slirp_opt = re.sub(':%s-' % p, ':%s-' % p_new, >> qb_slirp_opt) >> logger.info("Port forward changed: %s -> %s" % (p, p_new)) >> mac = "%s%02x" % (self.mac_slirp, mac) >> -- >> 2.17.1 >> >> >> >>
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#150476): https://lists.openembedded.org/g/openembedded-core/message/150476 Mute This Topic: https://lists.openembedded.org/mt/81966345/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
