From: Sunil Dora Date: Fri, 13 Mar 2026 16:01:33 +0000 (-0700) Subject: rust: enable dynamic LLVM linking by default X-Git-Tag: yocto-6.0_M3~336 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0671c3dad87a063b3a41dd07cde89b5684e692c;p=thirdparty%2Fopenembedded%2Fopenembedded-core.git rust: enable dynamic LLVM linking by default Fixes [YOCTO #16058] Enable dynamic linking with LLVM (link-shared) for all rust variants (native, nativesdk and target) via a PACKAGECONFIG option, enabled by default. This prevents segmentation faults when reusing sstate artifacts built with different host toolchains. Update multilib library symlinking to include shared libraries and adjust the rust selftest to install llvm so the dynamically linked compiler can run correctly. Suggested-by: Alexander Kanavin Signed-off-by: Sunil Dora Signed-off-by: Richard Purdie --- diff --git a/meta/lib/oeqa/selftest/cases/rust.py b/meta/lib/oeqa/selftest/cases/rust.py index 3ae1946e43..7614941661 100644 --- a/meta/lib/oeqa/selftest/cases/rust.py +++ b/meta/lib/oeqa/selftest/cases/rust.py @@ -47,7 +47,7 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase): bitbake("{} -c test_compile".format(recipe)) builddir = get_bb_var("RUSTSRC", "rust") # build core-image-minimal with required packages - default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp", "libzstd", "openssl"] + default_installed_packages = ["libgcc", "libstdc++", "libatomic", "libgomp", "libzstd", "llvm", "openssl"] features = [] features.append('IMAGE_FEATURES += "ssh-server-dropbear"') features.append('CORE_IMAGE_EXTRA_INSTALL += "{0}"'.format(" ".join(default_installed_packages))) diff --git a/meta/recipes-devtools/rust/rust_1.94.0.bb b/meta/recipes-devtools/rust/rust_1.94.0.bb index faafc63c96..3eb2a36406 100644 --- a/meta/recipes-devtools/rust/rust_1.94.0.bb +++ b/meta/recipes-devtools/rust/rust_1.94.0.bb @@ -15,6 +15,9 @@ DEPENDS:append:class-nativesdk = " cargo-native rust-native" RDEPENDS:${PN}:append:class-target = " gcc g++ binutils" +PACKAGECONFIG ??= "llvm-shared" +PACKAGECONFIG[llvm-shared] = ",,," + # 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 @@ -124,8 +127,7 @@ python do_configure() { # [llvm] config.add_section("llvm") - if d.getVar('PN') == "rust-native": - config.set("llvm", "link-shared", e(True)) + config.set("llvm", "link-shared", e(bb.utils.contains('PACKAGECONFIG', 'llvm-shared', True, False, d))) config.set("llvm", "static-libstdcpp", e(False)) config.set("llvm", "download-ci-llvm", e(False)) if "llvm" in (d.getVar('TC_CXX_RUNTIME') or ""): @@ -190,7 +192,7 @@ python do_configure() { bb.build.exec_func("setup_cargo_environment", d) } -# llvm-config expects static libraries to be in the 'lib' directory rather than 'lib64' when +# llvm-config expects static/dynamic libraries to be in the 'lib' directory rather than 'lib64' when # multilibs enabled. Since we are copying the natively built llvm-config into the target sysroot # and executing it there, it will default to searching in 'lib', as it is unaware of the 'lib64' # directory. To ensure llvm-config can locate the necessary libraries, create a symlink from 'lib' @@ -207,7 +209,7 @@ do_compile:append:class-target() { # Only do per-file symlinking if lib is a real directory (not symlink) if [ -d "$lib_dir" ] && [ ! -L "$lib_dir" ]; then - for lib64_file in "${lib64_dir}"/libLLVM*.a; do + for lib64_file in "${lib64_dir}"/libLLVM*.a "${lib64_dir}"/libLLVM*.so*; do if [ -e "$lib64_file" ]; then lib_name=$(basename "${lib64_file}") target_link="${lib_dir}/${lib_name}"