@@ -8,9 +8,6 @@ import infra.basetest
class TestRustBase(infra.basetest.BRTest):
- target = 'armv7-unknown-linux-gnueabihf'
- crate = 'hello-world'
-
def login(self):
img = os.path.join(self.builddir, "images", "rootfs.cpio")
self.emulator.boot(arch="armv7",
@@ -18,43 +15,6 @@ class TestRustBase(infra.basetest.BRTest):
options=["-initrd", img])
self.emulator.login()
- def build_test_prog(self):
- hostdir = os.path.join(self.builddir, 'host')
- env = os.environ.copy()
- env["USER"] = "br-user"
- env["PATH"] = "{}:".format(os.path.join(hostdir, 'bin')) + env["PATH"]
- env["CARGO_HOME"] = os.path.join(hostdir, 'usr', 'share', 'cargo')
- env["RUST_TARGET_PATH"] = os.path.join(hostdir, 'etc', 'rustc')
- cargo = os.path.join(hostdir, 'bin', 'cargo')
- workdir = os.path.join(tempfile.mkdtemp(suffix='-br2-testing-rust'),
- self.crate)
- manifest = os.path.join(workdir, 'Cargo.toml')
- prog = os.path.join(workdir, 'target', self.target, 'debug', self.crate)
-
- cmd = [cargo, 'init', '--bin', '--vcs', 'none', '-vv', workdir]
- ret = subprocess.call(cmd,
- stdout=self.b.logfile,
- stderr=self.b.logfile,
- env=env)
- if ret != 0:
- raise SystemError("Cargo init failed")
-
- cmd = [
- cargo, 'build', '-vv', '--target', self.target,
- '--manifest-path', manifest
- ]
- ret = subprocess.call(cmd,
- stdout=self.b.logfile,
- stderr=self.b.logfile,
- env=env)
- if ret != 0:
- raise SystemError("Cargo build failed")
-
- shutil.copy(prog, os.path.join(self.builddir, 'target', 'usr', 'bin'))
- self.b.build()
- shutil.rmtree(workdir)
-
-
class TestRustBin(TestRustBase):
config = \
"""
@@ -68,12 +28,12 @@ class TestRustBin(TestRustBase):
BR2_TARGET_ROOTFS_CPIO=y
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PACKAGE_HOST_RUSTC=y
+ BR2_PACKAGE_RIPGREP=y
"""
def test_run(self):
- self.build_test_prog()
self.login()
- self.assertRunOk(self.crate)
+ self.assertRunOk("rg Buildroot /etc/issue")
class TestRust(TestRustBase):
@@ -90,9 +50,9 @@ class TestRust(TestRustBase):
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PACKAGE_HOST_RUSTC=y
BR2_PACKAGE_HOST_RUST=y
+ BR2_PACKAGE_RIPGREP=y
"""
def test_run(self):
- self.build_test_prog()
self.login()
- self.assertRunOk(self.crate)
+ self.assertRunOk("rg Buildroot /etc/issue")
TestRust and TestRustBin has been introduced at the time when there was no cargo package infrastructure or any package using rust compiler (Buildroot 2018.02). Since then the ripgrep package has been introduced, initially using the generic package infrastructure and converted later to the cargo package infrastructure. Due a recent change in rust/cargo removing the cargo config file [1] the test TestRust and TestRustBin now fail to compile since they build an hello-world crate outside of the cargo package infrastructure without the correct environment for cross-compiling. Replace the 'hello-world' crate by ripgrep package and check if it can run properly in Qemu. Fixes tests.package.test_rust.TestRustBin: https://gitlab.com/buildroot.org/buildroot/-/jobs/2116202545 But doesn't fixes tests.package.test_rust.TestRust due another bug: https://gitlab.com/buildroot.org/buildroot/-/jobs/2116202544 [1] b6378631c2609742382984f6f7b93c1d9d2cdb78 Signed-off-by: Romain Naour <romain.naour@gmail.com> --- Using ripgrep or bat package trigger an issue while using rustc: error[E0514]: found crate `core` compiled by an incompatible version of rustc | = help: please recompile that crate using this compiler (rustc 1.58.1) (consider running `cargo clean` first) = note: the following crate versions were found: crate `core` compiled by rustc 1.58.1 (db9d1b20b 2022-01-20): TestRust/host/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-6cfcec236d576603.rlib error[E0514]: found crate `std` compiled by an incompatible version of rustc The problem is not really a cross-compilation issue (we are building for an armv7 on x86_64 host) but a problem with rustc libraries (rlib). We can notice that "rustc 1.58.1 (db9d1b20b 2022-01-20)" is the same version as the prebuilt rustc: TestRust/host/bin/rustc --version rustc 1.58.1 TestRustBin/host/bin/rustc --version rustc 1.58.1 (db9d1b20b 2022-01-20) Indeed we are using host-rust-bin to bootstrap the host-rust compiler package built by Buildroot. The problem is that the libcore-6cfcec236d576603.rlib file come from host-rust-bin and is not removed before installing host-rust built by Buildroot. We notice that host-rust can't override libcore-6cfcec236d576603.rlib because it use another hash libcore-79e5699dd357edbd.rlib To fixes the ripgrep build we have to copy manually (for now) all rlib files from TestRust/build/tmp/tarball/rust-std/x86_64-unknown-linux-gnu/image/lib/rustlib/x86_64-unknown-linux-gnu/lib to TestRust/host/lib/rustlib/x86_64-unknown-linux-gnu/lib (Indeed we spent a lot of time to build host-rust and some important libraries are not installed to HOST_DIR) When Buildroot build its rust compiler we probably need to avoid installing in HOST_DIR the rust compiler used to bootstrap. --- support/testing/tests/package/test_rust.py | 48 ++-------------------- 1 file changed, 4 insertions(+), 44 deletions(-)