mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-07-25 12:15:32 +03:00
Use upstream triplets for now, rust doesn't seem to want to work with our triplets... See https://github.com/rust-lang/rust/issues/62447
100 lines
4.1 KiB
Diff
100 lines
4.1 KiB
Diff
From: Shiz <hi@shiz.me>
|
|
Date: Thu, 20 Aug 2017 01:44:12 +0200
|
|
Subject: [PATCH] Minimize generated RPATH in end products
|
|
|
|
By default, RPATH generation adds both the install prefix and the generated
|
|
relative path to the install prefix. This is unnecessary, so we add the install
|
|
prefix to a list of absolute paths to omit in the relative path generation,
|
|
and skip it there.
|
|
|
|
--- a/src/librustc_codegen_ssa/back/rpath.rs
|
|
+++ b/src/librustc_codegen_ssa/back/rpath.rs
|
|
@@ -59,13 +59,14 @@
|
|
debug!(" {:?}", libpath.display());
|
|
}
|
|
|
|
+ // The backup rpath is the global library location.
|
|
+ // We also omit this path from the relative rpaths.
|
|
+ let fallback_rpaths = vec![get_install_prefix_rpath(config)];
|
|
+
|
|
// Use relative paths to the libraries. Binaries can be moved
|
|
// as long as they maintain the relative relationship to the
|
|
// crates they depend on.
|
|
- let rel_rpaths = get_rpaths_relative_to_output(config, libs);
|
|
-
|
|
- // And a final backup rpath to the global library location.
|
|
- let fallback_rpaths = vec![get_install_prefix_rpath(config)];
|
|
+ let rel_rpaths = get_rpaths_relative_to_output(config, libs, &fallback_rpaths);
|
|
|
|
fn log_rpaths(desc: &str, rpaths: &[String]) {
|
|
debug!("{} rpaths:", desc);
|
|
@@ -87,11 +88,13 @@
|
|
}
|
|
|
|
fn get_rpaths_relative_to_output(config: &mut RPathConfig<'_>,
|
|
- libs: &[PathBuf]) -> Vec<String> {
|
|
- libs.iter().map(|a| get_rpath_relative_to_output(config, a)).collect()
|
|
+ libs: &[PathBuf],
|
|
+ omit: &Vec<String>) -> Vec<String> {
|
|
+ libs.iter().filter_map(|a| get_rpath_relative_to_output(config, a, omit)).collect()
|
|
}
|
|
|
|
-fn get_rpath_relative_to_output(config: &mut RPathConfig<'_>, lib: &Path) -> String {
|
|
+fn get_rpath_relative_to_output(config: &mut RPathConfig<'_>, lib: &Path,
|
|
+ omit: &Vec<String>) -> Option<String> {
|
|
// Mac doesn't appear to support $ORIGIN
|
|
let prefix = if config.is_like_osx {
|
|
"@loader_path"
|
|
@@ -105,10 +108,16 @@
|
|
let mut output = cwd.join(&config.out_filename);
|
|
output.pop(); // strip filename
|
|
let output = fs::canonicalize(&output).unwrap_or(output);
|
|
- let relative = path_relative_from(&lib, &output).unwrap_or_else(||
|
|
- panic!("couldn't create relative path from {:?} to {:?}", output, lib));
|
|
- // FIXME (#9639): This needs to handle non-utf8 paths
|
|
- format!("{}/{}", prefix, relative.to_str().expect("non-utf8 component in path"))
|
|
+ let libpath = lib.to_str().expect("non-utf8 component in path").to_string();
|
|
+ if omit.contains(&libpath) {
|
|
+ None
|
|
+ } else {
|
|
+ let relative = path_relative_from(&lib, &output)
|
|
+ .expect(&format!("couldn't create relative path from {:?} to {:?}", output, lib));
|
|
+ // FIXME (#9639): This needs to handle non-utf8 paths
|
|
+ Some(format!("{}/{}", prefix,
|
|
+ relative.to_str().expect("non-utf8 component in path")))
|
|
+ }
|
|
}
|
|
|
|
// This routine is adapted from the *old* Path's `path_relative_from`
|
|
--- a/src/librustc_codegen_ssa/back/rpath/tests.rs
|
|
+++ b/src/librustc_codegen_ssa/back/rpath/tests.rs
|
|
@@ -50,6 +50,8 @@
|
|
|
|
#[test]
|
|
fn test_rpath_relative() {
|
|
+ let omit = Vec::new();
|
|
+
|
|
if cfg!(target_os = "macos") {
|
|
let config = &mut RPathConfig {
|
|
used_crates: Vec::new(),
|
|
@@ -60,7 +62,8 @@
|
|
get_install_prefix_lib_path: &mut || panic!(),
|
|
};
|
|
let res = get_rpath_relative_to_output(config,
|
|
- Path::new("lib/libstd.so"));
|
|
+ Path::new("lib/libstd.so"),
|
|
+ &omit);
|
|
assert_eq!(res, "@loader_path/../lib");
|
|
} else {
|
|
let config = &mut RPathConfig {
|
|
@@ -72,7 +75,8 @@
|
|
linker_is_gnu: true,
|
|
};
|
|
let res = get_rpath_relative_to_output(config,
|
|
- Path::new("lib/libstd.so"));
|
|
+ Path::new("lib/libstd.so"),
|
|
+ &omit);
|
|
assert_eq!(res, "$ORIGIN/../lib");
|
|
}
|
|
}
|
|
|