rustc_metadata: Cleanup crate search with exact paths

This commit is contained in:
Vadim Petrochenkov 2019-11-17 19:21:43 +03:00
parent 26f113e5b6
commit febde53fde

View File

@ -261,6 +261,7 @@ crate struct CrateLocator<'a> {
// Immutable per-search configuration.
crate_name: Symbol,
exact_paths: Vec<PathBuf>,
pub hash: Option<&'a Svh>,
pub host_hash: Option<&'a Svh>,
extra_filename: Option<&'a str>,
@ -277,7 +278,6 @@ crate struct CrateLocator<'a> {
rejected_via_kind: Vec<CrateMismatch>,
rejected_via_version: Vec<CrateMismatch>,
rejected_via_filename: Vec<CrateMismatch>,
should_match_name: bool,
}
crate struct CratePaths {
@ -326,6 +326,15 @@ impl<'a> CrateLocator<'a> {
sess,
metadata_loader,
crate_name,
exact_paths: if hash.is_none() {
sess.opts.externs.get(&crate_name.as_str()).into_iter()
.flat_map(|entry| entry.locations.iter())
.filter_map(|location| location.clone().map(PathBuf::from)).collect()
} else {
// SVH being specified means this is a transitive dependency,
// so `--extern` options do not apply.
Vec::new()
},
hash,
host_hash,
extra_filename,
@ -348,7 +357,6 @@ impl<'a> CrateLocator<'a> {
rejected_via_kind: Vec::new(),
rejected_via_version: Vec::new(),
rejected_via_filename: Vec::new(),
should_match_name: true,
}
}
@ -361,6 +369,9 @@ impl<'a> CrateLocator<'a> {
}
crate fn maybe_load_library_crate(&mut self) -> Option<Library> {
if !self.exact_paths.is_empty() {
return self.find_commandline_library();
}
let mut seen_paths = FxHashSet::default();
match self.extra_filename {
Some(s) => self.find_library_crate(s, &mut seen_paths)
@ -486,21 +497,6 @@ impl<'a> CrateLocator<'a> {
extra_prefix: &str,
seen_paths: &mut FxHashSet<PathBuf>)
-> Option<Library> {
// If an SVH is specified, then this is a transitive dependency that
// must be loaded via -L plus some filtering.
if self.hash.is_none() {
self.should_match_name = false;
if let Some(entry) = self.sess.opts.externs.get(&self.crate_name.as_str()) {
// Only use `--extern crate_name=path` here, not `--extern crate_name`.
if entry.locations.iter().any(|l| l.is_some()) {
return self.find_commandline_library(
entry.locations.iter().filter_map(|l| l.as_ref()),
);
}
}
self.should_match_name = true;
}
let dypair = self.dylibname();
let staticpair = self.staticlibname();
@ -777,7 +773,7 @@ impl<'a> CrateLocator<'a> {
}
}
if self.should_match_name {
if self.exact_paths.is_empty() {
if self.crate_name != root.name {
info!("Rejecting via crate name");
return None;
@ -824,9 +820,7 @@ impl<'a> CrateLocator<'a> {
(t.options.staticlib_prefix.clone(), t.options.staticlib_suffix.clone())
}
fn find_commandline_library<'b, LOCS>(&mut self, locs: LOCS) -> Option<Library>
where LOCS: Iterator<Item = &'b String>
{
fn find_commandline_library(&mut self) -> Option<Library> {
// First, filter out all libraries that look suspicious. We only accept
// files which actually exist that have the correct naming scheme for
// rlibs/dylibs.
@ -836,10 +830,12 @@ impl<'a> CrateLocator<'a> {
let mut rmetas = FxHashMap::default();
let mut dylibs = FxHashMap::default();
{
let locs = locs.map(|l| PathBuf::from(l)).filter(|loc| {
let crate_name = self.crate_name;
let rejected_via_filename = &mut self.rejected_via_filename;
let locs = self.exact_paths.iter().filter(|loc| {
if !loc.exists() {
sess.err(&format!("extern location for {} does not exist: {}",
self.crate_name,
crate_name,
loc.display()));
return false;
}
@ -847,7 +843,7 @@ impl<'a> CrateLocator<'a> {
Some(file) => file,
None => {
sess.err(&format!("extern location for {} is not a file: {}",
self.crate_name,
crate_name,
loc.display()));
return false;
}
@ -862,8 +858,8 @@ impl<'a> CrateLocator<'a> {
}
}
self.rejected_via_filename.push(CrateMismatch {
path: loc.clone(),
rejected_via_filename.push(CrateMismatch {
path: (*loc).clone(),
got: String::new(),
});