Improve naming and path operations in crate loader

Simplify the path operation with `join`, clarify some of the names.
This commit is contained in:
Nilstrieb 2024-06-06 21:52:22 +02:00
parent 4c2b21a2ef
commit b4c439c3de
3 changed files with 14 additions and 18 deletions

View File

@ -12,7 +12,7 @@
pub struct FileSearch<'a> { pub struct FileSearch<'a> {
sysroot: &'a Path, sysroot: &'a Path,
triple: &'a str, triple: &'a str,
search_paths: &'a [SearchPath], cli_search_paths: &'a [SearchPath],
tlib_path: &'a SearchPath, tlib_path: &'a SearchPath,
kind: PathKind, kind: PathKind,
} }
@ -20,7 +20,7 @@ pub struct FileSearch<'a> {
impl<'a> FileSearch<'a> { impl<'a> FileSearch<'a> {
pub fn search_paths(&self) -> impl Iterator<Item = &'a SearchPath> { pub fn search_paths(&self) -> impl Iterator<Item = &'a SearchPath> {
let kind = self.kind; let kind = self.kind;
self.search_paths self.cli_search_paths
.iter() .iter()
.filter(move |sp| sp.kind.matches(kind)) .filter(move |sp| sp.kind.matches(kind))
.chain(std::iter::once(self.tlib_path)) .chain(std::iter::once(self.tlib_path))
@ -37,26 +37,26 @@ pub fn get_self_contained_lib_path(&self) -> PathBuf {
pub fn new( pub fn new(
sysroot: &'a Path, sysroot: &'a Path,
triple: &'a str, triple: &'a str,
search_paths: &'a [SearchPath], cli_search_paths: &'a [SearchPath],
tlib_path: &'a SearchPath, tlib_path: &'a SearchPath,
kind: PathKind, kind: PathKind,
) -> FileSearch<'a> { ) -> FileSearch<'a> {
debug!("using sysroot = {}, triple = {}", sysroot.display(), triple); debug!("using sysroot = {}, triple = {}", sysroot.display(), triple);
FileSearch { sysroot, triple, search_paths, tlib_path, kind } FileSearch { sysroot, triple, cli_search_paths, tlib_path, kind }
} }
} }
pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf { pub fn make_target_lib_path(sysroot: &Path, target_triple: &str) -> PathBuf {
let rustlib_path = rustc_target::target_rustlib_path(sysroot, target_triple); let rustlib_path = rustc_target::relative_target_rustlib_path(sysroot, target_triple);
PathBuf::from_iter([sysroot, Path::new(&rustlib_path), Path::new("lib")]) sysroot.join(rustlib_path).join("lib")
} }
/// Returns a path to the target's `bin` folder within its `rustlib` path in the sysroot. This is /// Returns a path to the target's `bin` folder within its `rustlib` path in the sysroot. This is
/// where binaries are usually installed, e.g. the self-contained linkers, lld-wrappers, LLVM tools, /// where binaries are usually installed, e.g. the self-contained linkers, lld-wrappers, LLVM tools,
/// etc. /// etc.
pub fn make_target_bin_path(sysroot: &Path, target_triple: &str) -> PathBuf { pub fn make_target_bin_path(sysroot: &Path, target_triple: &str) -> PathBuf {
let rustlib_path = rustc_target::target_rustlib_path(sysroot, target_triple); let rustlib_path = rustc_target::relative_target_rustlib_path(sysroot, target_triple);
PathBuf::from_iter([sysroot, Path::new(&rustlib_path), Path::new("bin")]) sysroot.join(rustlib_path).join("bin")
} }
#[cfg(unix)] #[cfg(unix)]
@ -275,7 +275,7 @@ fn from_env_args_next() -> Option<PathBuf> {
p.pop(); p.pop();
p.pop(); p.pop();
// Look for the target rustlib directory in the suspected sysroot. // Look for the target rustlib directory in the suspected sysroot.
let mut rustlib_path = rustc_target::target_rustlib_path(&p, "dummy"); let mut rustlib_path = rustc_target::relative_target_rustlib_path(&p, "dummy");
rustlib_path.pop(); // pop off the dummy target. rustlib_path.pop(); // pop off the dummy target.
rustlib_path.exists().then_some(p) rustlib_path.exists().then_some(p)
} }

View File

@ -41,17 +41,13 @@
/// ///
/// For example: `target_sysroot_path("/usr", "x86_64-unknown-linux-gnu")` => /// For example: `target_sysroot_path("/usr", "x86_64-unknown-linux-gnu")` =>
/// `"lib*/rustlib/x86_64-unknown-linux-gnu"`. /// `"lib*/rustlib/x86_64-unknown-linux-gnu"`.
pub fn target_rustlib_path(sysroot: &Path, target_triple: &str) -> PathBuf { pub fn relative_target_rustlib_path(sysroot: &Path, target_triple: &str) -> PathBuf {
let libdir = find_libdir(sysroot); let libdir = find_relative_libdir(sysroot);
PathBuf::from_iter([ Path::new(libdir.as_ref()).join(RUST_LIB_DIR).join(target_triple)
Path::new(libdir.as_ref()),
Path::new(RUST_LIB_DIR),
Path::new(target_triple),
])
} }
/// The name of the directory rustc expects libraries to be located. /// The name of the directory rustc expects libraries to be located.
fn find_libdir(sysroot: &Path) -> std::borrow::Cow<'static, str> { fn find_relative_libdir(sysroot: &Path) -> std::borrow::Cow<'static, str> {
// FIXME: This is a quick hack to make the rustc binary able to locate // FIXME: This is a quick hack to make the rustc binary able to locate
// Rust libraries in Linux environments where libraries might be installed // Rust libraries in Linux environments where libraries might be installed
// to lib64/lib32. This would be more foolproof by basing the sysroot off // to lib64/lib32. This would be more foolproof by basing the sysroot off

View File

@ -3367,7 +3367,7 @@ fn load_file(path: &Path) -> Result<(Target, TargetWarnings), String> {
// Additionally look in the sysroot under `lib/rustlib/<triple>/target.json` // Additionally look in the sysroot under `lib/rustlib/<triple>/target.json`
// as a fallback. // as a fallback.
let rustlib_path = crate::target_rustlib_path(sysroot, target_triple); let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_triple);
let p = PathBuf::from_iter([ let p = PathBuf::from_iter([
Path::new(sysroot), Path::new(sysroot),
Path::new(&rustlib_path), Path::new(&rustlib_path),