mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #108376 - liushuyu:fix-sysroot-infer-103660, r=ozkanonur
compiler/rustc_session: fix sysroot detection logic This pull request fixes the sysroot detection logic on systems where `/usr/lib` contains a multi-arch structure (e.g. installs `rustc_driver` into `/usr/lib/x86_64-linux-gnu` folder). This fixes a regression for various Linux systems introduced in #103660. On Debian and Ubuntu systems, the logic in the pull request, as mentioned earlier, will resolve the sysroot to `/usr/lib`, making `rustc --print target-libdir` to return `/usr/lib/lib/rustlib/x86_64-unknown-linux-gnu/lib` (notice the extra `lib` at the beginning). The fix is not very "clean" according to the standard. If you have any suggestions on improving the logic, you are more than welcome to comment below!
This commit is contained in:
commit
0dfbce1bb0
@ -182,7 +182,17 @@ pub fn get_or_default_sysroot() -> Result<PathBuf, String> {
|
||||
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`
|
||||
.and_then(|p| {
|
||||
// chop off `lib` (this could be also $arch dir if the host sysroot uses a
|
||||
// multi-arch layout like Debian or Ubuntu)
|
||||
match p.parent() {
|
||||
Some(p) => match p.file_name() {
|
||||
Some(f) if f == "lib" => p.parent(), // first chop went for $arch, so chop again for `lib`
|
||||
_ => Some(p),
|
||||
},
|
||||
None => None,
|
||||
}
|
||||
})
|
||||
.map(|s| s.to_owned())
|
||||
.ok_or(format!(
|
||||
"Could not move 3 levels upper using `parent()` on {}",
|
||||
|
Loading…
Reference in New Issue
Block a user