mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Rollup merge of #129418 - petrochenkov:libsearch2, r=jieyouxu
rustc: Simplify getting sysroot library directory It was very non-obvious that `sess.target_tlib_path`, `make_target_lib_path(...)`, and `sess.target_filesearch(...).search_paths()` result in the same sysroot library directory paths. They are however, indeed the same, because `sess.target_tlib_path` is initialized to `make_target_lib_path(...)` on `Session` creation, and they are used interchangeably. There are still some redundant calls to `make_target_lib_path` and other inconsistent ways to obtain sysroot directories, but fixing that requires some behavior changes, while this PR is a pure refactoring. Some places in the compiler even disagree on the number of sysroots - 1 (explicit `--sysroot` *or* default sysroot), 2 (explicit `--sysroot` *and* default sysroot), or an unclear number of `sysroot_candidates` every of which is considered. The logic currently using `sess.target_tlib_path` or equivalents assumes one sysroot.
This commit is contained in:
commit
42cd3c60df
@ -1317,11 +1317,9 @@ fn link_sanitizer_runtime(
|
|||||||
name: &str,
|
name: &str,
|
||||||
) {
|
) {
|
||||||
fn find_sanitizer_runtime(sess: &Session, filename: &str) -> PathBuf {
|
fn find_sanitizer_runtime(sess: &Session, filename: &str) -> PathBuf {
|
||||||
let session_tlib =
|
let path = sess.target_tlib_path.dir.join(filename);
|
||||||
filesearch::make_target_lib_path(&sess.sysroot, sess.opts.target_triple.triple());
|
|
||||||
let path = session_tlib.join(filename);
|
|
||||||
if path.exists() {
|
if path.exists() {
|
||||||
return session_tlib;
|
return sess.target_tlib_path.dir.clone();
|
||||||
} else {
|
} else {
|
||||||
let default_sysroot =
|
let default_sysroot =
|
||||||
filesearch::get_or_default_sysroot().expect("Failed finding sysroot");
|
filesearch::get_or_default_sysroot().expect("Failed finding sysroot");
|
||||||
@ -1612,19 +1610,18 @@ fn print_native_static_libs(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> PathBuf {
|
fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> PathBuf {
|
||||||
let fs = sess.target_filesearch(PathKind::Native);
|
let file_path = sess.target_tlib_path.dir.join(name);
|
||||||
let file_path = fs.get_lib_path().join(name);
|
|
||||||
if file_path.exists() {
|
if file_path.exists() {
|
||||||
return file_path;
|
return file_path;
|
||||||
}
|
}
|
||||||
// Special directory with objects used only in self-contained linkage mode
|
// Special directory with objects used only in self-contained linkage mode
|
||||||
if self_contained {
|
if self_contained {
|
||||||
let file_path = fs.get_self_contained_lib_path().join(name);
|
let file_path = sess.target_tlib_path.dir.join("self-contained").join(name);
|
||||||
if file_path.exists() {
|
if file_path.exists() {
|
||||||
return file_path;
|
return file_path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for search_path in fs.search_paths() {
|
for search_path in sess.target_filesearch(PathKind::Native).search_paths() {
|
||||||
let file_path = search_path.dir.join(name);
|
let file_path = search_path.dir.join(name);
|
||||||
if file_path.exists() {
|
if file_path.exists() {
|
||||||
return file_path;
|
return file_path;
|
||||||
@ -2131,7 +2128,7 @@ fn add_library_search_dirs(
|
|||||||
| LinkSelfContainedComponents::UNWIND
|
| LinkSelfContainedComponents::UNWIND
|
||||||
| LinkSelfContainedComponents::MINGW,
|
| LinkSelfContainedComponents::MINGW,
|
||||||
) {
|
) {
|
||||||
let lib_path = sess.target_filesearch(PathKind::Native).get_self_contained_lib_path();
|
let lib_path = sess.target_tlib_path.dir.join("self-contained");
|
||||||
cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path));
|
cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2146,8 +2143,7 @@ fn add_library_search_dirs(
|
|||||||
|| sess.target.os == "fuchsia"
|
|| sess.target.os == "fuchsia"
|
||||||
|| sess.target.is_like_osx && !sess.opts.unstable_opts.sanitizer.is_empty()
|
|| sess.target.is_like_osx && !sess.opts.unstable_opts.sanitizer.is_empty()
|
||||||
{
|
{
|
||||||
let lib_path = sess.target_filesearch(PathKind::Native).get_lib_path();
|
cmd.include_path(&fix_windows_verbatim_for_gcc(&sess.target_tlib_path.dir));
|
||||||
cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mac Catalyst uses the macOS SDK, but to link to iOS-specific frameworks
|
// Mac Catalyst uses the macOS SDK, but to link to iOS-specific frameworks
|
||||||
@ -2859,15 +2855,14 @@ fn add_upstream_native_libraries(
|
|||||||
//
|
//
|
||||||
// The returned path will always have `fix_windows_verbatim_for_gcc()` applied to it.
|
// The returned path will always have `fix_windows_verbatim_for_gcc()` applied to it.
|
||||||
fn rehome_sysroot_lib_dir(sess: &Session, lib_dir: &Path) -> PathBuf {
|
fn rehome_sysroot_lib_dir(sess: &Session, lib_dir: &Path) -> PathBuf {
|
||||||
let sysroot_lib_path = sess.target_filesearch(PathKind::All).get_lib_path();
|
let sysroot_lib_path = &sess.target_tlib_path.dir;
|
||||||
let canonical_sysroot_lib_path =
|
let canonical_sysroot_lib_path =
|
||||||
{ try_canonicalize(&sysroot_lib_path).unwrap_or_else(|_| sysroot_lib_path.clone()) };
|
{ try_canonicalize(sysroot_lib_path).unwrap_or_else(|_| sysroot_lib_path.clone()) };
|
||||||
|
|
||||||
let canonical_lib_dir = try_canonicalize(lib_dir).unwrap_or_else(|_| lib_dir.to_path_buf());
|
let canonical_lib_dir = try_canonicalize(lib_dir).unwrap_or_else(|_| lib_dir.to_path_buf());
|
||||||
if canonical_lib_dir == canonical_sysroot_lib_path {
|
if canonical_lib_dir == canonical_sysroot_lib_path {
|
||||||
// This path, returned by `target_filesearch().get_lib_path()`, has
|
// This path already had `fix_windows_verbatim_for_gcc()` applied if needed.
|
||||||
// already had `fix_windows_verbatim_for_gcc()` applied if needed.
|
sysroot_lib_path.clone()
|
||||||
sysroot_lib_path
|
|
||||||
} else {
|
} else {
|
||||||
fix_windows_verbatim_for_gcc(lib_dir)
|
fix_windows_verbatim_for_gcc(lib_dir)
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,11 @@ use std::{env, fs};
|
|||||||
|
|
||||||
use rustc_fs_util::{fix_windows_verbatim_for_gcc, try_canonicalize};
|
use rustc_fs_util::{fix_windows_verbatim_for_gcc, try_canonicalize};
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
use tracing::debug;
|
|
||||||
|
|
||||||
use crate::search_paths::{PathKind, SearchPath};
|
use crate::search_paths::{PathKind, SearchPath};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct FileSearch<'a> {
|
pub struct FileSearch<'a> {
|
||||||
sysroot: &'a Path,
|
|
||||||
triple: &'a str,
|
|
||||||
cli_search_paths: &'a [SearchPath],
|
cli_search_paths: &'a [SearchPath],
|
||||||
tlib_path: &'a SearchPath,
|
tlib_path: &'a SearchPath,
|
||||||
kind: PathKind,
|
kind: PathKind,
|
||||||
@ -32,23 +29,12 @@ impl<'a> FileSearch<'a> {
|
|||||||
.chain(std::iter::once(self.tlib_path))
|
.chain(std::iter::once(self.tlib_path))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_lib_path(&self) -> PathBuf {
|
|
||||||
make_target_lib_path(self.sysroot, self.triple)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_self_contained_lib_path(&self) -> PathBuf {
|
|
||||||
self.get_lib_path().join("self-contained")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new(
|
pub fn new(
|
||||||
sysroot: &'a Path,
|
|
||||||
triple: &'a str,
|
|
||||||
cli_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);
|
FileSearch { cli_search_paths, tlib_path, kind }
|
||||||
FileSearch { sysroot, triple, cli_search_paths, tlib_path, kind }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,22 +440,10 @@ impl Session {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn target_filesearch(&self, kind: PathKind) -> filesearch::FileSearch<'_> {
|
pub fn target_filesearch(&self, kind: PathKind) -> filesearch::FileSearch<'_> {
|
||||||
filesearch::FileSearch::new(
|
filesearch::FileSearch::new(&self.opts.search_paths, &self.target_tlib_path, kind)
|
||||||
&self.sysroot,
|
|
||||||
self.opts.target_triple.triple(),
|
|
||||||
&self.opts.search_paths,
|
|
||||||
&self.target_tlib_path,
|
|
||||||
kind,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
pub fn host_filesearch(&self, kind: PathKind) -> filesearch::FileSearch<'_> {
|
pub fn host_filesearch(&self, kind: PathKind) -> filesearch::FileSearch<'_> {
|
||||||
filesearch::FileSearch::new(
|
filesearch::FileSearch::new(&self.opts.search_paths, &self.host_tlib_path, kind)
|
||||||
&self.sysroot,
|
|
||||||
config::host_triple(),
|
|
||||||
&self.opts.search_paths,
|
|
||||||
&self.host_tlib_path,
|
|
||||||
kind,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a list of directories where target-specific tool binaries are located. Some fallback
|
/// Returns a list of directories where target-specific tool binaries are located. Some fallback
|
||||||
|
Loading…
Reference in New Issue
Block a user