@@ -35,49 +35,24 @@ struct ResolveNode {
35
35
}
36
36
37
37
pub 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 ) {
66
38
// 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 ( ) ;
72
45
let mut cargo = Command :: new ( & build. initial_cargo ) ;
73
46
cargo
74
47
. arg ( "metadata" )
75
48
. arg ( "--format-version" )
76
49
. arg ( "1" )
77
50
. arg ( "--features" )
78
- . arg ( features)
51
+ . arg ( features. join ( "," ) )
52
+ . arg ( "-Zpackage-features" )
79
53
. arg ( "--manifest-path" )
80
- . arg ( build. src . join ( krate) . join ( "Cargo.toml" ) ) ;
54
+ . arg ( build. src . join ( "Cargo.toml" ) )
55
+ . env ( "RUSTC_BOOTSTRAP" , "1" ) ;
81
56
let output = output ( & mut cargo) ;
82
57
let output: Output = serde_json:: from_str ( & output) . unwrap ( ) ;
83
58
for package in output. packages {
@@ -88,5 +63,23 @@ fn build_krate(features: &str, build: &mut Build, resolves: &mut Vec<ResolveNode
88
63
build. crates . insert ( name, Crate { name, id : package. id , deps : HashSet :: new ( ) , path } ) ;
89
64
}
90
65
}
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
+ }
92
85
}
0 commit comments