From a7195c97c196fee7ea330f3279b420339a812067 Mon Sep 17 00:00:00 2001 From: Debian Rust Maintainers Date: Sun, 10 Sep 2023 18:22:53 +0100 Subject: [PATCH] Fix sysroot detection which would result in /usr/lib/lib/rustlib Bug: https://github.com/rust-lang/rust/issues/109994 This patch is a mixture of two upstream fix attempts. The first from https://github.com/rust-lang/rust/pull/108376 didn't actually solve the problem in Debian's case. After reporting that in $Bug, a second attempt is made at https://github.com/rust-lang/rust/pull/110281, which worked. Gbp-Pq: Name u-fix-sysroot-detection-logic.patch --- compiler/rustc_session/src/filesearch.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs index b6a328908c..b7251a3f84 100644 --- a/compiler/rustc_session/src/filesearch.rs +++ b/compiler/rustc_session/src/filesearch.rs @@ -179,18 +179,29 @@ pub fn get_or_default_sysroot() -> Result { ))?; // if `dir` points target's dir, move up to the sysroot - if dir.ends_with(crate::config::host_triple()) { + let mut sysroot_dir = if dir.ends_with(crate::config::host_triple()) { dir.parent() // chop off `$target` .and_then(|p| p.parent()) // chop off `rustlib` .and_then(|p| p.parent()) // chop off `lib` .map(|s| s.to_owned()) - .ok_or(format!( - "Could not move 3 levels upper using `parent()` on {}", - dir.display() - )) + .ok_or_else(|| { + format!("Could not move 3 levels upper using `parent()` on {}", dir.display()) + })? } else { - Ok(dir.to_owned()) + dir.to_owned() + }; + + // On multiarch linux systems, there will be multiarch directory named + // with the architecture(e.g `x86_64-linux-gnu`) under the `lib` directory. + // Which cause us to mistakenly end up in the lib directory instead of the sysroot directory. + if sysroot_dir.ends_with("lib") { + sysroot_dir = + sysroot_dir.parent().map(|real_sysroot| real_sysroot.to_owned()).ok_or_else( + || format!("Could not move to parent path of {}", sysroot_dir.display()), + )? } + + Ok(sysroot_dir) } // Use env::args().next() to get the path of the executable without -- 2.30.2