Make ./x.py <cmd> compiler/<crate>
aware of the crate's features
This commit is contained in:
parent
0d634185df
commit
39e3adda53
@ -228,7 +228,7 @@ impl Step for Rustc {
|
|||||||
self.override_build_kind.unwrap_or(builder.kind),
|
self.override_build_kind.unwrap_or(builder.kind),
|
||||||
);
|
);
|
||||||
|
|
||||||
rustc_cargo(builder, &mut cargo, target, &compiler);
|
rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates);
|
||||||
|
|
||||||
// For ./x.py clippy, don't run with --all-targets because
|
// For ./x.py clippy, don't run with --all-targets because
|
||||||
// linting tests and benchmarks can produce very noisy results
|
// linting tests and benchmarks can produce very noisy results
|
||||||
|
@ -197,7 +197,7 @@ impl Step for Rustc {
|
|||||||
Kind::Clippy,
|
Kind::Clippy,
|
||||||
);
|
);
|
||||||
|
|
||||||
rustc_cargo(builder, &mut cargo, target, &compiler);
|
rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates);
|
||||||
|
|
||||||
// Explicitly pass -p for all compiler crates -- this will force cargo
|
// Explicitly pass -p for all compiler crates -- this will force cargo
|
||||||
// to also lint the tests/benches/examples for these crates, rather
|
// to also lint the tests/benches/examples for these crates, rather
|
||||||
|
@ -983,7 +983,7 @@ impl Step for Rustc {
|
|||||||
Kind::Build,
|
Kind::Build,
|
||||||
);
|
);
|
||||||
|
|
||||||
rustc_cargo(builder, &mut cargo, target, &compiler);
|
rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates);
|
||||||
|
|
||||||
// NB: all RUSTFLAGS should be added to `rustc_cargo()` so they will be
|
// NB: all RUSTFLAGS should be added to `rustc_cargo()` so they will be
|
||||||
// consistently applied by check/doc/test modes too.
|
// consistently applied by check/doc/test modes too.
|
||||||
@ -1042,10 +1042,11 @@ pub fn rustc_cargo(
|
|||||||
cargo: &mut Cargo,
|
cargo: &mut Cargo,
|
||||||
target: TargetSelection,
|
target: TargetSelection,
|
||||||
compiler: &Compiler,
|
compiler: &Compiler,
|
||||||
|
crates: &[String],
|
||||||
) {
|
) {
|
||||||
cargo
|
cargo
|
||||||
.arg("--features")
|
.arg("--features")
|
||||||
.arg(builder.rustc_features(builder.kind, target))
|
.arg(builder.rustc_features(builder.kind, target, crates))
|
||||||
.arg("--manifest-path")
|
.arg("--manifest-path")
|
||||||
.arg(builder.src.join("compiler/rustc/Cargo.toml"));
|
.arg(builder.src.join("compiler/rustc/Cargo.toml"));
|
||||||
|
|
||||||
|
@ -826,7 +826,7 @@ impl Step for Rustc {
|
|||||||
// see https://github.com/rust-lang/rust/pull/122066#issuecomment-1983049222
|
// see https://github.com/rust-lang/rust/pull/122066#issuecomment-1983049222
|
||||||
// cargo.rustdocflag("--generate-link-to-definition");
|
// cargo.rustdocflag("--generate-link-to-definition");
|
||||||
|
|
||||||
compile::rustc_cargo(builder, &mut cargo, target, &compiler);
|
compile::rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates);
|
||||||
cargo.arg("-Zskip-rustdoc-fingerprint");
|
cargo.arg("-Zskip-rustdoc-fingerprint");
|
||||||
|
|
||||||
// Only include compiler crates, no dependencies of those, such as `libc`.
|
// Only include compiler crates, no dependencies of those, such as `libc`.
|
||||||
|
@ -2692,7 +2692,7 @@ impl Step for Crate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mode::Rustc => {
|
Mode::Rustc => {
|
||||||
compile::rustc_cargo(builder, &mut cargo, target, &compiler);
|
compile::rustc_cargo(builder, &mut cargo, target, &compiler, &self.crates);
|
||||||
}
|
}
|
||||||
_ => panic!("can only test libraries"),
|
_ => panic!("can only test libraries"),
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use std::collections::BTreeMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use serde_derive::Deserialize;
|
use serde_derive::Deserialize;
|
||||||
@ -21,6 +22,7 @@ struct Package {
|
|||||||
manifest_path: String,
|
manifest_path: String,
|
||||||
dependencies: Vec<Dependency>,
|
dependencies: Vec<Dependency>,
|
||||||
targets: Vec<Target>,
|
targets: Vec<Target>,
|
||||||
|
features: BTreeMap<String, Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For more information, see the output of
|
/// For more information, see the output of
|
||||||
@ -51,7 +53,13 @@ pub fn build(build: &mut Build) {
|
|||||||
.map(|dep| dep.name)
|
.map(|dep| dep.name)
|
||||||
.collect();
|
.collect();
|
||||||
let has_lib = package.targets.iter().any(|t| t.kind.iter().any(|k| k == "lib"));
|
let has_lib = package.targets.iter().any(|t| t.kind.iter().any(|k| k == "lib"));
|
||||||
let krate = Crate { name: name.clone(), deps, path, has_lib };
|
let krate = Crate {
|
||||||
|
name: name.clone(),
|
||||||
|
deps,
|
||||||
|
path,
|
||||||
|
has_lib,
|
||||||
|
features: package.features.keys().cloned().collect(),
|
||||||
|
};
|
||||||
let relative_path = krate.local_path(build);
|
let relative_path = krate.local_path(build);
|
||||||
build.crates.insert(name.clone(), krate);
|
build.crates.insert(name.clone(), krate);
|
||||||
let existing_path = build.crate_paths.insert(relative_path, name);
|
let existing_path = build.crate_paths.insert(relative_path, name);
|
||||||
|
@ -183,6 +183,7 @@ struct Crate {
|
|||||||
deps: HashSet<String>,
|
deps: HashSet<String>,
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
has_lib: bool,
|
has_lib: bool,
|
||||||
|
features: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Crate {
|
impl Crate {
|
||||||
@ -666,16 +667,24 @@ impl Build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the space-separated set of activated features for the compiler.
|
/// Gets the space-separated set of activated features for the compiler.
|
||||||
fn rustc_features(&self, kind: Kind, target: TargetSelection) -> String {
|
fn rustc_features(&self, kind: Kind, target: TargetSelection, crates: &[String]) -> String {
|
||||||
|
let possible_features_by_crates: HashSet<_> = crates
|
||||||
|
.iter()
|
||||||
|
.flat_map(|krate| &self.crates[krate].features)
|
||||||
|
.map(std::ops::Deref::deref)
|
||||||
|
.collect();
|
||||||
|
let check = |feature: &str| -> bool {
|
||||||
|
crates.is_empty() || possible_features_by_crates.contains(feature)
|
||||||
|
};
|
||||||
let mut features = vec![];
|
let mut features = vec![];
|
||||||
if self.config.jemalloc {
|
if self.config.jemalloc && check("jemalloc") {
|
||||||
features.push("jemalloc");
|
features.push("jemalloc");
|
||||||
}
|
}
|
||||||
if self.config.llvm_enabled(target) || kind == Kind::Check {
|
if (self.config.llvm_enabled(target) || kind == Kind::Check) && check("llvm") {
|
||||||
features.push("llvm");
|
features.push("llvm");
|
||||||
}
|
}
|
||||||
// keep in sync with `bootstrap/compile.rs:rustc_cargo_env`
|
// keep in sync with `bootstrap/compile.rs:rustc_cargo_env`
|
||||||
if self.config.rustc_parallel {
|
if self.config.rustc_parallel && check("rustc_use_parallel_compiler") {
|
||||||
features.push("rustc_use_parallel_compiler");
|
features.push("rustc_use_parallel_compiler");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,7 +693,7 @@ impl Build {
|
|||||||
// which is everything (including debug/trace/etc.)
|
// which is everything (including debug/trace/etc.)
|
||||||
// if its unset, if debug_assertions is on, then debug_logging will also be on
|
// if its unset, if debug_assertions is on, then debug_logging will also be on
|
||||||
// as well as tracing *ignoring* this feature when debug_assertions is on
|
// as well as tracing *ignoring* this feature when debug_assertions is on
|
||||||
if !self.config.rust_debug_logging {
|
if !self.config.rust_debug_logging && check("max_level_info") {
|
||||||
features.push("max_level_info");
|
features.push("max_level_info");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user