-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Replace all uses of sysroot_candidates with get_or_default_sysroot #142089
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ | |
use std::path::{Path, PathBuf}; | ||
use std::{env, fs}; | ||
|
||
use rustc_fs_util::{fix_windows_verbatim_for_gcc, try_canonicalize}; | ||
use rustc_fs_util::try_canonicalize; | ||
use rustc_target::spec::Target; | ||
use smallvec::{SmallVec, smallvec}; | ||
|
||
|
@@ -87,7 +87,7 @@ fn current_dll_path() -> Result<PathBuf, String> { | |
}; | ||
let bytes = CStr::from_ptr(fname_ptr).to_bytes(); | ||
let os = OsStr::from_bytes(bytes); | ||
Ok(PathBuf::from(os)) | ||
try_canonicalize(Path::new(os)).map_err(|e| e.to_string()) | ||
} | ||
|
||
#[cfg(target_os = "aix")] | ||
|
@@ -122,7 +122,7 @@ fn current_dll_path() -> Result<PathBuf, String> { | |
if (data_base..data_end).contains(&addr) { | ||
let bytes = CStr::from_ptr(&(*current).ldinfo_filename[0]).to_bytes(); | ||
let os = OsStr::from_bytes(bytes); | ||
return Ok(PathBuf::from(os)); | ||
return try_canonicalize(Path::new(os)).map_err(|e| e.to_string()); | ||
} | ||
if (*current).ldinfo_next == 0 { | ||
break; | ||
|
@@ -169,45 +169,26 @@ fn current_dll_path() -> Result<PathBuf, String> { | |
|
||
filename.truncate(n); | ||
|
||
Ok(OsString::from_wide(&filename).into()) | ||
let path = try_canonicalize(OsString::from_wide(&filename)).map_err(|e| e.to_string())?; | ||
|
||
// See comments on this target function, but the gist is that | ||
// gcc chokes on verbatim paths which fs::canonicalize generates | ||
// so we try to avoid those kinds of paths. | ||
Ok(rustc_fs_util::fix_windows_verbatim_for_gcc(&path)) | ||
} | ||
|
||
#[cfg(target_os = "wasi")] | ||
fn current_dll_path() -> Result<PathBuf, String> { | ||
Err("current_dll_path is not supported on WASI".to_string()) | ||
} | ||
|
||
pub fn sysroot_candidates() -> SmallVec<[PathBuf; 2]> { | ||
let target = crate::config::host_tuple(); | ||
let mut sysroot_candidates: SmallVec<[PathBuf; 2]> = smallvec![get_or_default_sysroot()]; | ||
let path = current_dll_path().and_then(|s| try_canonicalize(s).map_err(|e| e.to_string())); | ||
if let Ok(dll) = path { | ||
// use `parent` twice to chop off the file name and then also the | ||
// directory containing the dll which should be either `lib` or `bin`. | ||
if let Some(path) = dll.parent().and_then(|p| p.parent()) { | ||
// The original `path` pointed at the `rustc_driver` crate's dll. | ||
// Now that dll should only be in one of two locations. The first is | ||
// in the compiler's libdir, for example `$sysroot/lib/*.dll`. The | ||
// other is the target's libdir, for example | ||
// `$sysroot/lib/rustlib/$target/lib/*.dll`. | ||
// | ||
// We don't know which, so let's assume that if our `path` above | ||
// ends in `$target` we *could* be in the target libdir, and always | ||
// assume that we may be in the main libdir. | ||
sysroot_candidates.push(path.to_owned()); | ||
|
||
if path.ends_with(target) { | ||
sysroot_candidates.extend( | ||
path.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()), | ||
); | ||
} | ||
} | ||
pub fn sysroot_with_fallback(sysroot: &Path) -> SmallVec<[PathBuf; 2]> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is an improvement, but it still feels a bit sub-optimal. struct Sysroot {
explicit: Option<PathBuf>,
default: PathBuf,
} with two methods for accessing either the main path or both, and then pass that structure around. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
let mut candidates = smallvec![sysroot.to_owned()]; | ||
let default_sysroot = get_or_default_sysroot(); | ||
if default_sysroot != sysroot { | ||
candidates.push(default_sysroot); | ||
} | ||
|
||
sysroot_candidates | ||
candidates | ||
} | ||
|
||
/// Returns the provided sysroot or calls [`get_or_default_sysroot`] if it's none. | ||
|
@@ -219,17 +200,8 @@ pub fn materialize_sysroot(maybe_sysroot: Option<PathBuf>) -> PathBuf { | |
/// This function checks if sysroot is found using env::args().next(), and if it | ||
/// is not found, finds sysroot from current rustc_driver dll. | ||
pub fn get_or_default_sysroot() -> PathBuf { | ||
// Follow symlinks. If the resolved path is relative, make it absolute. | ||
fn canonicalize(path: PathBuf) -> PathBuf { | ||
let path = try_canonicalize(&path).unwrap_or(path); | ||
// See comments on this target function, but the gist is that | ||
// gcc chokes on verbatim paths which fs::canonicalize generates | ||
// so we try to avoid those kinds of paths. | ||
fix_windows_verbatim_for_gcc(&path) | ||
} | ||
|
||
fn default_from_rustc_driver_dll() -> Result<PathBuf, String> { | ||
let dll = current_dll_path().map(|s| canonicalize(s))?; | ||
let dll = current_dll_path()?; | ||
|
||
// `dll` will be in one of the following two: | ||
// - compiler's libdir: $sysroot/lib/*.dll | ||
|
@@ -242,7 +214,7 @@ pub fn get_or_default_sysroot() -> PathBuf { | |
dll.display() | ||
))?; | ||
|
||
// if `dir` points target's dir, move up to the sysroot | ||
// if `dir` points to target's dir, move up to the sysroot | ||
let mut sysroot_dir = if dir.ends_with(crate::config::host_tuple()) { | ||
dir.parent() // chop off `$target` | ||
.and_then(|p| p.parent()) // chop off `rustlib` | ||
|
Uh oh!
There was an error while loading. Please reload this page.