11
11
use std:: collections:: HashMap ;
12
12
use std:: process:: Command ;
13
13
use std:: path:: PathBuf ;
14
+ use std:: collections:: HashSet ;
14
15
15
16
use build_helper:: output;
16
17
use serde_json;
@@ -45,12 +46,34 @@ struct ResolveNode {
45
46
}
46
47
47
48
pub fn build ( build : & mut Build ) {
48
- build_krate ( build, "src/libstd" ) ;
49
- build_krate ( build, "src/libtest" ) ;
50
- build_krate ( build, "src/rustc" ) ;
49
+ let mut resolves = Vec :: new ( ) ;
50
+ build_krate ( & build. std_features ( ) , build, & mut resolves, "src/libstd" ) ;
51
+ build_krate ( "" , build, & mut resolves, "src/libtest" ) ;
52
+ build_krate ( & build. rustc_features ( ) , build, & mut resolves, "src/rustc" ) ;
53
+
54
+ let mut id2name = HashMap :: new ( ) ;
55
+ for ( name, krate) in build. crates . iter ( ) {
56
+ id2name. insert ( krate. id . clone ( ) , name. clone ( ) ) ;
57
+ }
58
+
59
+ for node in resolves {
60
+ let name = match id2name. get ( & node. id ) {
61
+ Some ( name) => name,
62
+ None => continue ,
63
+ } ;
64
+
65
+ let krate = build. crates . get_mut ( name) . unwrap ( ) ;
66
+ for dep in node. dependencies . iter ( ) {
67
+ let dep = match id2name. get ( dep) {
68
+ Some ( dep) => dep,
69
+ None => continue ,
70
+ } ;
71
+ krate. deps . insert ( * dep) ;
72
+ }
73
+ }
51
74
}
52
75
53
- fn build_krate ( build : & mut Build , krate : & str ) {
76
+ fn build_krate ( features : & str , build : & mut Build , resolves : & mut Vec < ResolveNode > , krate : & str ) {
54
77
// Run `cargo metadata` to figure out what crates we're testing.
55
78
//
56
79
// Down below we're going to call `cargo test`, but to test the right set
@@ -60,14 +83,13 @@ fn build_krate(build: &mut Build, krate: &str) {
60
83
let mut cargo = Command :: new ( & build. initial_cargo ) ;
61
84
cargo. arg ( "metadata" )
62
85
. arg ( "--format-version" ) . arg ( "1" )
86
+ . arg ( "--features" ) . arg ( features)
63
87
. arg ( "--manifest-path" ) . arg ( build. src . join ( krate) . join ( "Cargo.toml" ) ) ;
64
88
let output = output ( & mut cargo) ;
65
89
let output: Output = serde_json:: from_str ( & output) . unwrap ( ) ;
66
- let mut id2name = HashMap :: new ( ) ;
67
90
for package in output. packages {
68
91
if package. source . is_none ( ) {
69
92
let name = INTERNER . intern_string ( package. name ) ;
70
- id2name. insert ( package. id , name) ;
71
93
let mut path = PathBuf :: from ( package. manifest_path ) ;
72
94
path. pop ( ) ;
73
95
build. crates . insert ( name, Crate {
@@ -77,25 +99,11 @@ fn build_krate(build: &mut Build, krate: &str) {
77
99
bench_step : format ! ( "bench-crate-{}" , name) ,
78
100
name,
79
101
version : package. version ,
80
- deps : Vec :: new ( ) ,
102
+ id : package. id ,
103
+ deps : HashSet :: new ( ) ,
81
104
path,
82
105
} ) ;
83
106
}
84
107
}
85
-
86
- for node in output. resolve . nodes {
87
- let name = match id2name. get ( & node. id ) {
88
- Some ( name) => name,
89
- None => continue ,
90
- } ;
91
-
92
- let krate = build. crates . get_mut ( name) . unwrap ( ) ;
93
- for dep in node. dependencies . iter ( ) {
94
- let dep = match id2name. get ( dep) {
95
- Some ( dep) => dep,
96
- None => continue ,
97
- } ;
98
- krate. deps . push ( * dep) ;
99
- }
100
- }
108
+ resolves. extend ( output. resolve . nodes ) ;
101
109
}
0 commit comments