Replace FileSearch::for_each_lib_search_path with search_paths.
Returning an iterator leads to nicer code all around.
This commit is contained in:
parent
2bfe32cc93
commit
95a6262df1
3 changed files with 22 additions and 32 deletions
|
|
@ -29,23 +29,19 @@ pub enum FileMatch {
|
|||
// A module for searching for libraries
|
||||
|
||||
pub struct FileSearch<'a> {
|
||||
pub sysroot: &'a Path,
|
||||
pub triple: &'a str,
|
||||
pub search_paths: &'a [SearchPath],
|
||||
pub tlib_path: &'a SearchPath,
|
||||
pub kind: PathKind,
|
||||
sysroot: &'a Path,
|
||||
triple: &'a str,
|
||||
search_paths: &'a [SearchPath],
|
||||
tlib_path: &'a SearchPath,
|
||||
kind: PathKind,
|
||||
}
|
||||
|
||||
impl<'a> FileSearch<'a> {
|
||||
pub fn for_each_lib_search_path<F>(&self, mut f: F) where
|
||||
F: FnMut(&SearchPath)
|
||||
{
|
||||
let iter = self.search_paths.iter().filter(|sp| sp.kind.matches(self.kind));
|
||||
for search_path in iter {
|
||||
f(search_path);
|
||||
}
|
||||
|
||||
f(self.tlib_path);
|
||||
pub fn search_paths(&self) -> impl Iterator<Item = &'a SearchPath> {
|
||||
let kind = self.kind;
|
||||
self.search_paths.iter()
|
||||
.filter(move |sp| sp.kind.matches(kind))
|
||||
.chain(std::iter::once(self.tlib_path))
|
||||
}
|
||||
|
||||
pub fn get_lib_path(&self) -> PathBuf {
|
||||
|
|
@ -55,7 +51,7 @@ impl<'a> FileSearch<'a> {
|
|||
pub fn search<F>(&self, mut pick: F)
|
||||
where F: FnMut(&Path, PathKind) -> FileMatch
|
||||
{
|
||||
self.for_each_lib_search_path(|search_path| {
|
||||
for search_path in self.search_paths() {
|
||||
debug!("searching {}", search_path.dir.display());
|
||||
fn is_rlib(p: &Path) -> bool {
|
||||
p.extension() == Some("rlib".as_ref())
|
||||
|
|
@ -78,7 +74,7 @@ impl<'a> FileSearch<'a> {
|
|||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new(sysroot: &'a Path,
|
||||
|
|
@ -97,13 +93,11 @@ impl<'a> FileSearch<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
// Returns a list of directories where target-specific dylibs might be located.
|
||||
pub fn get_dylib_search_paths(&self) -> Vec<PathBuf> {
|
||||
let mut paths = Vec::new();
|
||||
self.for_each_lib_search_path(|search_path| {
|
||||
paths.push(search_path.dir.to_path_buf());
|
||||
});
|
||||
paths
|
||||
// Returns just the directories within the search paths.
|
||||
pub fn search_path_dirs(&self) -> Vec<PathBuf> {
|
||||
self.search_paths()
|
||||
.map(|sp| sp.dir.to_path_buf())
|
||||
.collect()
|
||||
}
|
||||
|
||||
// Returns a list of directories where target-specific tool binaries are located.
|
||||
|
|
|
|||
|
|
@ -212,12 +212,7 @@ fn link_binary_output(sess: &Session,
|
|||
}
|
||||
|
||||
fn archive_search_paths(sess: &Session) -> Vec<PathBuf> {
|
||||
let mut search = Vec::new();
|
||||
sess.target_filesearch(PathKind::Native).for_each_lib_search_path(|search_path| {
|
||||
search.push(search_path.dir.to_path_buf());
|
||||
});
|
||||
|
||||
search
|
||||
sess.target_filesearch(PathKind::Native).search_path_dirs()
|
||||
}
|
||||
|
||||
fn archive_config<'a>(sess: &'a Session,
|
||||
|
|
@ -1067,12 +1062,13 @@ fn link_args(cmd: &mut dyn Linker,
|
|||
fn add_local_native_libraries(cmd: &mut dyn Linker,
|
||||
sess: &Session,
|
||||
codegen_results: &CodegenResults) {
|
||||
sess.target_filesearch(PathKind::All).for_each_lib_search_path(|search_path| {
|
||||
let filesearch = sess.target_filesearch(PathKind::All);
|
||||
for search_path in filesearch.search_paths() {
|
||||
match search_path.kind {
|
||||
PathKind::Framework => { cmd.framework_path(&search_path.dir); }
|
||||
_ => { cmd.include_path(&fix_windows_verbatim_for_gcc(&search_path.dir)); }
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let relevant_libs = codegen_results.crate_info.used_libraries.iter().filter(|l| {
|
||||
relevant_lib(sess, l)
|
||||
|
|
|
|||
|
|
@ -975,7 +975,7 @@ where
|
|||
let mut old_path = OsString::new();
|
||||
if cfg!(windows) {
|
||||
old_path = env::var_os("PATH").unwrap_or(old_path);
|
||||
let mut new_path = sess.host_filesearch(PathKind::All).get_dylib_search_paths();
|
||||
let mut new_path = sess.host_filesearch(PathKind::All).search_path_dirs();
|
||||
for path in env::split_paths(&old_path) {
|
||||
if !new_path.contains(&path) {
|
||||
new_path.push(path);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue