From 46407375d07e45e2ae1b801a57d566d60793120d Mon Sep 17 00:00:00 2001 From: Valentin Haudiquet Date: Fri, 25 Sep 2026 20:54:06 +0200 Subject: [PATCH] deb/cross: stop exporting PKG_CONFIG_LIBDIR for cross builds dpkg-buildpackage and sbuild export no pkg-config redirection: the environment is the package's to set. Pointing the whole build at the target multiarch pkgconfig dirs makes every pkg-config-consuming tool resolve against the target libraries, the host-side tools of the same build included: the host linker is then handed target-arch -L paths (the kernel's resolve_btfids logging 'skipping incompatible /usr/lib/aarch64-linux-gnu/libelf.so') and only survives through fallbacks when the build-architecture libraries happen to be installed too. Packages whose cross builds need target pkg-config data must arrange for it themselves, the way the kernel packaging builds rtla statically against no target system libraries. --- src/deb/cross.rs | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/src/deb/cross.rs b/src/deb/cross.rs index 62c9283..a911c2b 100644 --- a/src/deb/cross.rs +++ b/src/deb/cross.rs @@ -62,20 +62,6 @@ pub fn setup_environment( .map_err(|e| format!("Invalid UTF-8 in dpkg-architecture output: {e}"))?; parse_dpkg_architecture_output(&dpkg_architecture, env); - // In-tree tools locate their libraries with the *host* pkg-config during - // cross builds (the kernel's tools/build feature checks derive their - // cflags/ldflags from `pkg-config --cflags/--libs`), whose search path - // only covers the build architecture's pkgconfig dirs. Point it at the - // target's so `libtraceevent` & co resolve to target-arch libraries: - // linux-riscv cross builds die in rtla's Makefile.config otherwise, even - // with the target -dev packages installed. - if let Some(multiarch) = env.get("DEB_HOST_MULTIARCH").cloned() { - env.insert( - "PKG_CONFIG_LIBDIR".to_string(), - format!("/usr/lib/{multiarch}/pkgconfig:/usr/share/pkgconfig"), - ); - } - env.insert("DEB_BUILD_PROFILES".to_string(), "cross".to_string()); Ok(()) @@ -304,21 +290,18 @@ mod tests { assert!(cross_suites("noble", None, "not-a-distro").is_err()); } - /// setup_environment exports the target multiarch pkg-config libdir: - /// tools' feature checks run the *host* pkg-config, which must find the - /// target's .pc files (rtla hard-errors on libtraceevent otherwise, - /// failing linux-riscv cross builds despite the target -dev packages - /// being installed). + /// setup_environment exports the dpkg cross variables and the 'cross' + /// build profile, and nothing beyond what dpkg-buildpackage exports: + /// no pkg-config redirection (the environment is the package's to + /// set, and target-arch pkgconfig paths would also poison the + /// host-side tools of the same build). #[test] - fn test_setup_environment_exports_cross_pkg_config_libdir() { + fn test_setup_environment_exports_dpkg_cross_variables_only() { let mut env = HashMap::new(); let ctx = Arc::new(Context::new(crate::context::ContextConfig::Local).unwrap()); setup_environment(&mut env, "riscv64", ctx).unwrap(); - assert_eq!( - env.get("PKG_CONFIG_LIBDIR").map(String::as_str), - Some("/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig") - ); + assert!(!env.contains_key("PKG_CONFIG_LIBDIR")); assert_eq!( env.get("DEB_BUILD_PROFILES").map(String::as_str), Some("cross")