1111use std:: collections:: HashMap ;
1212use std:: process:: Command ;
1313use std:: path:: PathBuf ;
14+ use std:: collections:: HashSet ;
1415
1516use build_helper:: output;
1617use serde_json;
@@ -45,12 +46,34 @@ struct ResolveNode {
4546}
4647
4748pub 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+ }
5174}
5275
53- fn build_krate ( build : & mut Build , krate : & str ) {
76+ fn build_krate ( features : & str , build : & mut Build , resolves : & mut Vec < ResolveNode > , krate : & str ) {
5477 // Run `cargo metadata` to figure out what crates we're testing.
5578 //
5679 // 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) {
6083 let mut cargo = Command :: new ( & build. initial_cargo ) ;
6184 cargo. arg ( "metadata" )
6285 . arg ( "--format-version" ) . arg ( "1" )
86+ . arg ( "--features" ) . arg ( features)
6387 . arg ( "--manifest-path" ) . arg ( build. src . join ( krate) . join ( "Cargo.toml" ) ) ;
6488 let output = output ( & mut cargo) ;
6589 let output: Output = serde_json:: from_str ( & output) . unwrap ( ) ;
66- let mut id2name = HashMap :: new ( ) ;
6790 for package in output. packages {
6891 if package. source . is_none ( ) {
6992 let name = INTERNER . intern_string ( package. name ) ;
70- id2name. insert ( package. id , name) ;
7193 let mut path = PathBuf :: from ( package. manifest_path ) ;
7294 path. pop ( ) ;
7395 build. crates . insert ( name, Crate {
@@ -77,25 +99,11 @@ fn build_krate(build: &mut Build, krate: &str) {
7799 bench_step : format ! ( "bench-crate-{}" , name) ,
78100 name,
79101 version : package. version ,
80- deps : Vec :: new ( ) ,
102+ id : package. id ,
103+ deps : HashSet :: new ( ) ,
81104 path,
82105 } ) ;
83106 }
84107 }
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 ) ;
101109}
0 commit comments