@@ -5,39 +5,28 @@ RUST_TEST_ARGS[doc] = "Arguments to give to the test binaries (e.g. --shuffle)"
# I didn't find a cleaner way to share data between compile and install tasks
CARGO_TEST_BINARIES_FILES ?= "${B}/test_binaries_list"
+CARGO_TEST_BUILD_JSON ?= "${B}/cargo_test_build.json"
+
+# Build the tests with the same environment as do_compile (oe_cargo_fix_env).
+cargo_ptest_build () {
+ oe_cargo_fix_env
+ export RUSTFLAGS="${RUSTFLAGS}"
+ bbnote "Building tests with cargo"
+ "${CARGO}" build --tests --message-format json-render-diagnostics ${CARGO_BUILD_FLAGS} ${PACKAGECONFIG_CONFARGS} > "${CARGO_TEST_BUILD_JSON}"
+}
# Sadly, generated test binaries have no deterministic names (https://github.com/rust-lang/cargo/issues/1924)
# This forces us to parse the cargo output in json format to find those test binaries.
python do_compile_ptest_cargo() {
- import subprocess
import json
- cargo = bb.utils.which(d.getVar("PATH"), d.getVar("CARGO"))
- cargo_build_flags = d.getVar("CARGO_BUILD_FLAGS")
- packageconfig_confargs = d.getVar("PACKAGECONFIG_CONFARGS")
- rust_flags = d.getVar("RUSTFLAGS")
manifest_path = d.getVar("CARGO_MANIFEST_PATH")
project_manifest_path = os.path.normpath(manifest_path)
manifest_dir = os.path.dirname(manifest_path)
- env = os.environ.copy()
- env['RUSTFLAGS'] = rust_flags
- cmd = f"{cargo} build --tests --message-format json {cargo_build_flags} {packageconfig_confargs}"
- bb.note(f"Building tests with cargo ({cmd})")
-
- try:
- proc = subprocess.Popen(cmd, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
- except subprocess.CalledProcessError as e:
- bb.fatal(f"Cannot build test with cargo: {e}")
-
- lines = []
- for line in proc.stdout:
- data = line.strip('\n')
- lines.append(data)
- bb.note(data)
- proc.communicate()
- if proc.returncode != 0:
- bb.fatal(f"Unable to compile test with cargo, '{cmd}' failed")
+ bb.build.exec_func("cargo_ptest_build", d)
+ with open(d.getVar("CARGO_TEST_BUILD_JSON")) as f:
+ lines = f.read().splitlines()
# Definition of the format: https://doc.rust-lang.org/cargo/reference/external-tools.html#json-messages
test_bins = []
do_compile runs oe_cargo_fix_env before invoking cargo. That function points cargo and the crate build scripts at the cross toolchain correctly. do_compile_ptest_cargo spawned cargo from python with only RUSTFLAGS set, so every build script that still had to run for the test build (e.g. dev-dependencies, test-only features, etc) saw the plain task environment. The test binaries were therefore built in a different, and for cross builds wrong, environment than the application. Run the test build through oe_cargo_fix_env as well so both builds share one environment. Co-authored-by: Patrick Wicki <patrick.wicki@siemens.com> Signed-off-by: Vasileios Anagnostopoulos <vasileios.anagnostopoulos@siemens.com> --- meta/classes-recipe/ptest-cargo.bbclass | 35 +++++++++---------------- 1 file changed, 12 insertions(+), 23 deletions(-)