@@ -35,49 +35,24 @@ struct ResolveNode {
3535}
3636
3737pub fn build ( build : & mut Build ) {
38- let mut resolves = Vec :: new ( ) ;
39- build_krate ( & build. std_features ( ) , build, & mut resolves, "src/libstd" ) ;
40- build_krate ( "" , build, & mut resolves, "src/libtest" ) ;
41- build_krate ( & build. rustc_features ( ) , build, & mut resolves, "src/rustc" ) ;
42-
43- let mut id2name = HashMap :: with_capacity ( build. crates . len ( ) ) ;
44- for ( name, krate) in build. crates . iter ( ) {
45- id2name. insert ( krate. id . clone ( ) , name. clone ( ) ) ;
46- }
47-
48- for node in resolves {
49- let name = match id2name. get ( & node. id ) {
50- Some ( name) => name,
51- None => continue ,
52- } ;
53-
54- let krate = build. crates . get_mut ( name) . unwrap ( ) ;
55- for dep in node. dependencies . iter ( ) {
56- let dep = match id2name. get ( dep) {
57- Some ( dep) => dep,
58- None => continue ,
59- } ;
60- krate. deps . insert ( * dep) ;
61- }
62- }
63- }
64-
65- fn build_krate ( features : & str , build : & mut Build , resolves : & mut Vec < ResolveNode > , krate : & str ) {
6638 // Run `cargo metadata` to figure out what crates we're testing.
67- //
68- // Down below we're going to call `cargo test`, but to test the right set
69- // of packages we're going to have to know what `-p` arguments to pass it
70- // to know what crates to test. Here we run `cargo metadata` to learn about
71- // the dependency graph and what `-p` arguments there are.
39+ let features: Vec < _ > = build
40+ . std_features ( )
41+ . split_whitespace ( )
42+ . map ( |f| format ! ( "test/{}" , f) )
43+ . chain ( build. rustc_features ( ) . split_whitespace ( ) . map ( |f| format ! ( "rustc-main/{}" , f) ) )
44+ . collect ( ) ;
7245 let mut cargo = Command :: new ( & build. initial_cargo ) ;
7346 cargo
7447 . arg ( "metadata" )
7548 . arg ( "--format-version" )
7649 . arg ( "1" )
7750 . arg ( "--features" )
78- . arg ( features)
51+ . arg ( features. join ( "," ) )
52+ . arg ( "-Zpackage-features" )
7953 . arg ( "--manifest-path" )
80- . arg ( build. src . join ( krate) . join ( "Cargo.toml" ) ) ;
54+ . arg ( build. src . join ( "Cargo.toml" ) )
55+ . env ( "RUSTC_BOOTSTRAP" , "1" ) ;
8156 let output = output ( & mut cargo) ;
8257 let output: Output = serde_json:: from_str ( & output) . unwrap ( ) ;
8358 for package in output. packages {
@@ -88,5 +63,23 @@ fn build_krate(features: &str, build: &mut Build, resolves: &mut Vec<ResolveNode
8863 build. crates . insert ( name, Crate { name, id : package. id , deps : HashSet :: new ( ) , path } ) ;
8964 }
9065 }
91- resolves. extend ( output. resolve . nodes ) ;
66+
67+ let id2name: HashMap < _ , _ > =
68+ build. crates . iter ( ) . map ( |( name, krate) | ( krate. id . clone ( ) , name. clone ( ) ) ) . collect ( ) ;
69+
70+ for node in output. resolve . nodes {
71+ let name = match id2name. get ( & node. id ) {
72+ Some ( name) => name,
73+ None => continue ,
74+ } ;
75+
76+ let krate = build. crates . get_mut ( name) . unwrap ( ) ;
77+ for dep in node. dependencies . iter ( ) {
78+ let dep = match id2name. get ( dep) {
79+ Some ( dep) => dep,
80+ None => continue ,
81+ } ;
82+ krate. deps . insert ( * dep) ;
83+ }
84+ }
9285}
0 commit comments