about summary refs log tree commit diff
path: root/src/bootstrap
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2018-06-08 16:47:16 +0200
committerest31 <MTest31@outlook.com>2018-06-08 16:50:56 +0200
commitc28145d1adbb32340897a102c43f0a8d2cb58ee2 (patch)
tree79e6b3ff34c8b3a844ab6a1c42f0afa7d6b3102b /src/bootstrap
parentc131bdcaff68d35f96e954baac4340206779335f (diff)
downloadrust-c28145d1adbb32340897a102c43f0a8d2cb58ee2.tar.gz
rust-c28145d1adbb32340897a102c43f0a8d2cb58ee2.zip
rustbuild: generate full list of dependencies for metadata
Previously, we didn't send --features to our cargo metadata invocations,
and thus missed some dependencies that we enable through the --features
mechanism.
Diffstat (limited to 'src/bootstrap')
-rw-r--r--src/bootstrap/lib.rs3
-rw-r--r--src/bootstrap/metadata.rs54
2 files changed, 33 insertions, 24 deletions
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index d16d7a52065..6e77413f061 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -280,7 +280,8 @@ pub struct Build {
 struct Crate {
     name: Interned<String>,
     version: String,
-    deps: Vec<Interned<String>>,
+    deps: HashSet<Interned<String>>,
+    id: String,
     path: PathBuf,
     doc_step: String,
     build_step: String,
diff --git a/src/bootstrap/metadata.rs b/src/bootstrap/metadata.rs
index 5f1df1d26e2..718a6da3637 100644
--- a/src/bootstrap/metadata.rs
+++ b/src/bootstrap/metadata.rs
@@ -11,6 +11,7 @@
 use std::collections::HashMap;
 use std::process::Command;
 use std::path::PathBuf;
+use std::collections::HashSet;
 
 use build_helper::output;
 use serde_json;
@@ -45,12 +46,34 @@ struct ResolveNode {
 }
 
 pub fn build(build: &mut Build) {
-    build_krate(build, "src/libstd");
-    build_krate(build, "src/libtest");
-    build_krate(build, "src/rustc");
+    let mut resolves = Vec::new();
+    build_krate(&build.std_features(), build, &mut resolves, "src/libstd");
+    build_krate("", build, &mut resolves, "src/libtest");
+    build_krate(&build.rustc_features(), build, &mut resolves, "src/rustc");
+
+    let mut id2name = HashMap::new();
+    for (name, krate) in build.crates.iter() {
+        id2name.insert(krate.id.clone(), name.clone());
+    }
+
+    for node in resolves {
+        let name = match id2name.get(&node.id) {
+            Some(name) => name,
+            None => continue,
+        };
+
+        let krate = build.crates.get_mut(name).unwrap();
+        for dep in node.dependencies.iter() {
+            let dep = match id2name.get(dep) {
+                Some(dep) => dep,
+                None => continue,
+            };
+            krate.deps.insert(*dep);
+        }
+    }
 }
 
-fn build_krate(build: &mut Build, krate: &str) {
+fn build_krate(features: &str, build: &mut Build, resolves: &mut Vec<ResolveNode>, krate: &str) {
     // Run `cargo metadata` to figure out what crates we're testing.
     //
     // 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) {
     let mut cargo = Command::new(&build.initial_cargo);
     cargo.arg("metadata")
          .arg("--format-version").arg("1")
+         .arg("--features").arg(features)
          .arg("--manifest-path").arg(build.src.join(krate).join("Cargo.toml"));
     let output = output(&mut cargo);
     let output: Output = serde_json::from_str(&output).unwrap();
-    let mut id2name = HashMap::new();
     for package in output.packages {
         if package.source.is_none() {
             let name = INTERNER.intern_string(package.name);
-            id2name.insert(package.id, name);
             let mut path = PathBuf::from(package.manifest_path);
             path.pop();
             build.crates.insert(name, Crate {
@@ -77,25 +99,11 @@ fn build_krate(build: &mut Build, krate: &str) {
                 bench_step: format!("bench-crate-{}", name),
                 name,
                 version: package.version,
-                deps: Vec::new(),
+                id: package.id,
+                deps: HashSet::new(),
                 path,
             });
         }
     }
-
-    for node in output.resolve.nodes {
-        let name = match id2name.get(&node.id) {
-            Some(name) => name,
-            None => continue,
-        };
-
-        let krate = build.crates.get_mut(name).unwrap();
-        for dep in node.dependencies.iter() {
-            let dep = match id2name.get(dep) {
-                Some(dep) => dep,
-                None => continue,
-            };
-            krate.deps.push(*dep);
-        }
-    }
+    resolves.extend(output.resolve.nodes);
 }