From 4b6a0278fe2d1c8d74a6bfe5b14c3022ca3b3c46 Mon Sep 17 00:00:00 2001 From: Federico Ponzi Date: Sat, 18 Jul 2020 00:01:27 +0200 Subject: [PATCH 1/2] fixes #67108 by using the external crate --- Cargo.lock | 7 ++++++ src/librustc_codegen_ssa/Cargo.toml | 1 + src/librustc_codegen_ssa/back/rpath.rs | 33 ++------------------------ 3 files changed, 10 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28ff6b3b1ebf2..3ee7d07900700 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2142,6 +2142,12 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "pathdiff" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877630b3de15c0b64cc52f659345724fbf6bdad9bd9566699fc53688f3c34a34" + [[package]] name = "percent-encoding" version = "1.0.1" @@ -3318,6 +3324,7 @@ dependencies = [ "log", "memmap", "num_cpus", + "pathdiff", "rustc_apfloat", "rustc_ast", "rustc_attr", diff --git a/src/librustc_codegen_ssa/Cargo.toml b/src/librustc_codegen_ssa/Cargo.toml index eeb6b4aabcf29..e100e0095c92a 100644 --- a/src/librustc_codegen_ssa/Cargo.toml +++ b/src/librustc_codegen_ssa/Cargo.toml @@ -18,6 +18,7 @@ log = "0.4.5" libc = "0.2.50" jobserver = "0.1.11" tempfile = "3.1" +pathdiff = "0.2.0" rustc_serialize = { path = "../librustc_serialize" } rustc_ast = { path = "../librustc_ast" } diff --git a/src/librustc_codegen_ssa/back/rpath.rs b/src/librustc_codegen_ssa/back/rpath.rs index c02e4f279b1fb..e1d649c6ed3de 100644 --- a/src/librustc_codegen_ssa/back/rpath.rs +++ b/src/librustc_codegen_ssa/back/rpath.rs @@ -2,6 +2,7 @@ use rustc_data_structures::fx::FxHashSet; use std::env; use std::fs; use std::path::{Path, PathBuf}; +use pathdiff::diff_paths; use rustc_hir::def_id::CrateNum; use rustc_middle::middle::cstore::LibSource; @@ -109,37 +110,7 @@ fn get_rpath_relative_to_output(config: &mut RPathConfig<'_>, lib: &Path) -> Str // In particular, this handles the case on unix where both paths are // absolute but with only the root as the common directory. fn path_relative_from(path: &Path, base: &Path) -> Option { - use std::path::Component; - - if path.is_absolute() != base.is_absolute() { - path.is_absolute().then(|| PathBuf::from(path)) - } else { - let mut ita = path.components(); - let mut itb = base.components(); - let mut comps: Vec> = vec![]; - loop { - match (ita.next(), itb.next()) { - (None, None) => break, - (Some(a), None) => { - comps.push(a); - comps.extend(ita.by_ref()); - break; - } - (None, _) => comps.push(Component::ParentDir), - (Some(a), Some(b)) if comps.is_empty() && a == b => (), - (Some(a), Some(b)) if b == Component::CurDir => comps.push(a), - (Some(_), Some(b)) if b == Component::ParentDir => return None, - (Some(a), Some(_)) => { - comps.push(Component::ParentDir); - comps.extend(itb.map(|_| Component::ParentDir)); - comps.push(a); - comps.extend(ita.by_ref()); - break; - } - } - } - Some(comps.iter().map(|c| c.as_os_str()).collect()) - } + diff_paths(path, base) } fn get_install_prefix_rpath(config: &mut RPathConfig<'_>) -> String { From 5702ce8962b37affa29d9acafeefdf379fdd1dcd Mon Sep 17 00:00:00 2001 From: Federico Ponzi Date: Sat, 18 Jul 2020 01:00:17 +0200 Subject: [PATCH 2/2] Allows pathdiff package --- src/tools/tidy/src/deps.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index b7d3d428cd283..559267a494f29 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -123,6 +123,7 @@ const PERMITTED_DEPENDENCIES: &[&str] = &[ "opaque-debug", "parking_lot", "parking_lot_core", + "pathdiff", "pkg-config", "polonius-engine", "ppv-lite86",