Skip to content

Commit c28145d

Browse files
committed
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.
1 parent c131bdc commit c28145d

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

src/bootstrap/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,8 @@ pub struct Build {
280280
struct Crate {
281281
name: Interned<String>,
282282
version: String,
283-
deps: Vec<Interned<String>>,
283+
deps: HashSet<Interned<String>>,
284+
id: String,
284285
path: PathBuf,
285286
doc_step: String,
286287
build_step: String,

src/bootstrap/metadata.rs

+31-23
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use std::collections::HashMap;
1212
use std::process::Command;
1313
use std::path::PathBuf;
14+
use std::collections::HashSet;
1415

1516
use build_helper::output;
1617
use serde_json;
@@ -45,12 +46,34 @@ struct ResolveNode {
4546
}
4647

4748
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+
}
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

Comments
 (0)