| From fb29a312143d2a271f7243c834f5b34281af523d Mon Sep 17 00:00:00 2001 |
| From: Daniel Verkamp <dverkamp@chromium.org> |
| Date: Mon, 22 Apr 2019 15:55:09 -0700 |
| Subject: [PATCH] Allow overriding system root via environment |
| |
| Use the PKG_CONFIG_SYSROOT_DIR (preferred) or SYSROOT (fallback) |
| environment variables to override the default path used to determine |
| whether a library is a system library or not (/usr). |
| |
| This enables cross-compilation scenarios where the system root is not a |
| subdirectory of /usr. Specifically, when building Rust packages in the |
| Chomium OS SDK, each board's sysroot is located in /build/$BOARD rather |
| than a subdirectory of /usr. Additionally, cros_sdk only specifies |
| SYSROOT (PKG_CONFIG_SYSROOT_DIR is set by the pkg-config-$BOARD cross |
| compilation helpers, but that isn't available in pkg-config-rs). |
| |
| This has only been tested on Linux, as I don't have a macOS machine |
| handy, but I believe the macOS path should work as before (it does not |
| consider the new sysroot variables). |
| |
| Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> |
| --- |
| src/lib.rs | 34 ++++++++++++++++++++-------------- |
| 1 file changed, 20 insertions(+), 14 deletions(-) |
| |
| diff --git a/src/lib.rs b/src/lib.rs |
| index d85dd98..bd7f800 100644 |
| --- a/src/lib.rs |
| +++ b/src/lib.rs |
| @@ -71,7 +71,7 @@ use std::error; |
| use std::ffi::{OsStr, OsString}; |
| use std::fmt; |
| use std::io; |
| -use std::path::{PathBuf, Path}; |
| +use std::path::PathBuf; |
| use std::process::{Command, Output}; |
| use std::str; |
| |
| @@ -470,6 +470,16 @@ impl Library { |
| } |
| |
| fn parse_libs_cflags(&mut self, name: &str, output: &[u8], config: &Config) { |
| + let system_roots = if cfg!(target_os = "macos") { |
| + vec![PathBuf::from("/Library"), PathBuf::from("/System")] |
| + } else { |
| + let sysroot = config |
| + .env_var("PKG_CONFIG_SYSROOT_DIR") |
| + .or_else(|_| config.env_var("SYSROOT")) |
| + .unwrap_or_else(|_| "/usr".to_owned()); |
| + vec![PathBuf::from(&sysroot)] |
| + }; |
| + |
| let words = split_flags(output); |
| let parts = words.iter() |
| .filter(|l| l.len() > 2) |
| @@ -496,7 +506,7 @@ impl Library { |
| } |
| "-l" => { |
| self.libs.push(val.to_string()); |
| - if statik && is_static_available(val, &dirs) { |
| + if statik && is_static_available(val, &system_roots, &dirs) { |
| let meta = format!("rustc-link-lib=static={}", val); |
| config.print_metadata(&meta); |
| } else { |
| @@ -542,13 +552,8 @@ fn envify(name: &str) -> String { |
| } |
| |
| /// System libraries should only be linked dynamically |
| -fn is_static_available(name: &str, dirs: &[PathBuf]) -> bool { |
| +fn is_static_available(name: &str, system_roots: &[PathBuf], dirs: &[PathBuf]) -> bool { |
| let libname = format!("lib{}.a", name); |
| - let system_roots = if cfg!(target_os = "macos") { |
| - vec![Path::new("/Library"), Path::new("/System")] |
| - } else { |
| - vec![Path::new("/usr")] |
| - }; |
| |
| dirs.iter().any(|dir| { |
| !system_roots.iter().any(|sys| dir.starts_with(sys)) && |
| @@ -616,19 +621,20 @@ fn split_flags(output: &[u8]) -> Vec<String> { |
| #[test] |
| #[cfg(target_os = "macos")] |
| fn system_library_mac_test() { |
| - assert!(!is_static_available("PluginManager", &[PathBuf::from("/Library/Frameworks")])); |
| - assert!(!is_static_available("python2.7", &[PathBuf::from("/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config")])); |
| - assert!(!is_static_available("ffi_convenience", &[PathBuf::from("/Library/Ruby/Gems/2.0.0/gems/ffi-1.9.10/ext/ffi_c/libffi-x86_64/.libs")])); |
| + let system_roots = vec![PathBuf::from("/Library"), PathBuf::from("/System")]; |
| + assert!(!is_static_available("PluginManager", &system_roots, &[PathBuf::from("/Library/Frameworks")])); |
| + assert!(!is_static_available("python2.7", &system_roots, &[PathBuf::from("/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config")])); |
| + assert!(!is_static_available("ffi_convenience", &system_roots, &[PathBuf::from("/Library/Ruby/Gems/2.0.0/gems/ffi-1.9.10/ext/ffi_c/libffi-x86_64/.libs")])); |
| |
| // Homebrew is in /usr/local, and it's not a part of the OS |
| if Path::new("/usr/local/lib/libpng16.a").exists() { |
| - assert!(is_static_available("png16", &[PathBuf::from("/usr/local/lib")])); |
| + assert!(is_static_available("png16", &system_roots, &[PathBuf::from("/usr/local/lib")])); |
| } |
| } |
| |
| #[test] |
| #[cfg(target_os = "linux")] |
| fn system_library_linux_test() { |
| - assert!(!is_static_available("util", &[PathBuf::from("/usr/lib/x86_64-linux-gnu")])); |
| - assert!(!is_static_available("dialog", &[PathBuf::from("/usr/lib")])); |
| + assert!(!is_static_available("util", &[PathBuf::from("/usr")], &[PathBuf::from("/usr/lib/x86_64-linux-gnu")])); |
| + assert!(!is_static_available("dialog", &[PathBuf::from("/usr")], &[PathBuf::from("/usr/lib")])); |
| } |
| -- |
| 2.21.0.593.g511ec345e18-goog |
| |