diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 8f076ad914d..3a256bb50f2 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -301,7 +301,9 @@ pub struct Build { ar: HashMap, ranlib: HashMap, // Miscellaneous + // allow bidirectional lookups: both name -> path and path -> name crates: HashMap, Crate>, + crate_paths: HashMap>, is_sudo: bool, ci_env: CiEnv, delayed_failures: RefCell>, @@ -491,6 +493,7 @@ impl Build { ar: HashMap::new(), ranlib: HashMap::new(), crates: HashMap::new(), + crate_paths: HashMap::new(), is_sudo, ci_env: CiEnv::current(), delayed_failures: RefCell::new(Vec::new()), diff --git a/src/bootstrap/metadata.rs b/src/bootstrap/metadata.rs index 59dc50be47f..e193e70a0c4 100644 --- a/src/bootstrap/metadata.rs +++ b/src/bootstrap/metadata.rs @@ -49,7 +49,11 @@ pub fn build(build: &mut Build) { .filter(|dep| dep.source.is_none()) .map(|dep| INTERNER.intern_string(dep.name)) .collect(); - build.crates.insert(name, Crate { name, deps, path }); + let krate = Crate { name, deps, path }; + let relative_path = krate.local_path(build); + build.crates.insert(name, krate); + let existing_path = build.crate_paths.insert(relative_path, name); + assert!(existing_path.is_none(), "multiple crates with the same path"); } } } diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index c8b76809aba..83561ffdb36 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -21,7 +21,6 @@ use crate::native; use crate::tool::{self, SourceType, Tool}; use crate::toolstate::ToolState; use crate::util::{self, add_link_lib_path, dylib_path, dylib_path_var, output, t}; -use crate::Crate as CargoCrate; use crate::{envify, CLang, DocTests, GitRepo, Mode}; const ADB_TEST_DIR: &str = "/data/tmp/work"; @@ -1901,19 +1900,10 @@ impl Step for CrateLibrustc { fn make_run(run: RunConfig<'_>) { let builder = run.builder; let compiler = builder.compiler(builder.top_stage, run.build_triple()); + let krate = builder.crate_paths[&run.path]; + let test_kind = builder.kind.into(); - for krate in builder.in_tree_crates("rustc-main", Some(run.target)) { - if krate.path.ends_with(&run.path) { - let test_kind = builder.kind.into(); - - builder.ensure(CrateLibrustc { - compiler, - target: run.target, - test_kind, - krate: krate.name, - }); - } - } + builder.ensure(CrateLibrustc { compiler, target: run.target, test_kind, krate }); } fn run(self, builder: &Builder<'_>) { @@ -1947,24 +1937,10 @@ impl Step for Crate { fn make_run(run: RunConfig<'_>) { let builder = run.builder; let compiler = builder.compiler(builder.top_stage, run.build_triple()); + let test_kind = builder.kind.into(); + let krate = builder.crate_paths[&run.path]; - let make = |mode: Mode, krate: &CargoCrate| { - let test_kind = builder.kind.into(); - - builder.ensure(Crate { - compiler, - target: run.target, - mode, - test_kind, - krate: krate.name, - }); - }; - - for krate in builder.in_tree_crates("test", Some(run.target)) { - if krate.path.ends_with(&run.path) { - make(Mode::Std, krate); - } - } + builder.ensure(Crate { compiler, target: run.target, mode: Mode::Std, test_kind, krate }); } /// Runs all unit tests plus documentation tests for a given crate defined