Hi Richard,CAUTION: This email comes from a non Wind River email account! Do not click links or open attachments unless you recognize the sender and know the content is safe. On Fri, 2026-08-07 at 02:31 -0700, Sadineni, Harish via lists.openembedded.org wrote:From: Harish Sadineni <Harish.Sadineni@windriver.com> YOCTO [#15061] Fixes 32-bit Cargo build failures when using multilib-enabled SDKs. Store the generated environment setup script in a target-specific subdirectory so that sourcing the SDK environment always loads the matching script for the selected target, avoiding accidental reuse of the 64-bit configuration when building for a 32-bit target. Also update `CARGO_TARGET_<TRIPLE>_RUSTFLAGS` to add an explicit `-L` search path to the target `rustlib` directory inside the sysroot. This ensures Cargo can locate the correct target-specific Rust libraries during cross-compilation with the cross-canadian toolchain. Signed-off-by: Harish Sadineni <Harish.Sadineni@windriver.com> --- meta/recipes-devtools/rust/rust-cross-canadian.inc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/meta/recipes-devtools/rust/rust-cross-canadian.inc b/meta/recipes-devtools/rust/rust-cross-canadian.inc index f083bcda82..bdc63e221f 100644 --- a/meta/recipes-devtools/rust/rust-cross-canadian.inc +++ b/meta/recipes-devtools/rust/rust-cross-canadian.inc @@ -51,15 +51,17 @@ do_install () { chmod +x "$outfile" create_sdk_wrapper "${SYS_BINDIR}/target-rust-ccld-wrapper" "CC" - ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d - mkdir "${ENV_SETUP_DIR}" + ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d/${TARGET_SYS} + mkdir -p "${ENV_SETUP_DIR}" RUST_ENV_SETUP_SH="${ENV_SETUP_DIR}/${RUST_TARGET_SYS}_rust.sh" RUST_TARGET_TRIPLE=`echo ${RUST_TARGET_SYS} | tr '[:lower:]' '[:upper:]' | sed 's/-/_/g'` cat <<- EOF > "${RUST_ENV_SETUP_SH}" - export CARGO_TARGET_${RUST_TARGET_TRIPLE}_RUSTFLAGS="--sysroot=\$OECORE_TARGET_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT" - export CARGO_BUILD_TARGET="${RUST_TARGET_SYS}" + export RUST_TARGET_SYS_VALUE="${RUST_TARGET_SYS}" + LIB_PATH="\$OECORE_TARGET_SYSROOT/usr/${baselib}/rustlib/${RUST_TARGET_SYS}/lib" + export CARGO_TARGET_${RUST_TARGET_TRIPLE}_RUSTFLAGS="--sysroot=\$OECORE_TARGET_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT -L \$LIB_PATH" + export CARGO_BUILD_TARGET="${RUST_TARGET_SYS}" export RUST_TARGET_PATH="\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib" EOFI'm a bit confused here. The script in question already has ${RUST_TARGET_SYS} in its name, so it is already target specific. Why do we need to move it to a target specific directory?
Even though the script filename includes ${RUST_TARGET_SYS}, for multilib SDKs both the 32-bit and 64-bit scripts end up in the same environment-setup directory.
The SDK's environment-sourcing logic sources every '*.sh' file in that directory, so both scripts get sourced regardless of which target you're building for. Since 'CARGO_TARGET_<TRIPLE>_RUSTFLAGS' and 'CARGO_BUILD_TARGET' are set unconditionally in each script, whichever one is sourced last wins and that can silently override the 32-bit settings with the 64-bit ones (or vice versa). That's what causes the 32-bit Cargo build to fail.
Putting each script in a target-specific subdirectory
(environment-setup.d/${TARGET_SYS}/) ensures only the script
matching the selected target gets sourced, so the two
configurations no longer clobber each other.
Thanks,
Harish
Cheers, Richard