Skip to content

Commit

Permalink
Auto merge of rust-lang#98843 - Urgau:check-cfg-stage0, r=Mark-Simula…
Browse files Browse the repository at this point in the history
…crum

Enable check-cfg in stage0

Now that the bootstrap cargo supports `rustc-check-cfg` we can now enable it with `-Zcheck-cfg=output` and use it in `rustc_llvm` to unblock `--check-cfg` support in stage0.

r? `@Mark-Simulacrum`
  • Loading branch information
bors committed Jul 20, 2022
2 parents f426146 + f818872 commit 03d488b
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 71 deletions.
62 changes: 29 additions & 33 deletions compiler/rustc_llvm/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,29 @@ use std::fmt::Display;
use std::path::{Path, PathBuf};
use std::process::{Command, Stdio};

const OPTIONAL_COMPONENTS: &[&str] = &[
"x86",
"arm",
"aarch64",
"amdgpu",
"avr",
"m68k",
"mips",
"powerpc",
"systemz",
"jsbackend",
"webassembly",
"msp430",
"sparc",
"nvptx",
"hexagon",
"riscv",
"bpf",
];

const REQUIRED_COMPONENTS: &[&str] =
&["ipo", "bitreader", "bitwriter", "linker", "asmparser", "lto", "coverage", "instrumentation"];

fn detect_llvm_link() -> (&'static str, &'static str) {
// Force the link mode we want, preferring static by default, but
// possibly overridden by `configure --enable-llvm-link-shared`.
Expand Down Expand Up @@ -76,6 +99,10 @@ fn output(cmd: &mut Command) -> String {
}

fn main() {
for component in REQUIRED_COMPONENTS.iter().chain(OPTIONAL_COMPONENTS.iter()) {
println!("cargo:rustc-check-cfg=values(llvm_component,\"{}\")", component);
}

if tracked_env_var_os("RUST_CHECK").is_some() {
// If we're just running `check`, there's no need for LLVM to be built.
return;
Expand Down Expand Up @@ -131,42 +158,11 @@ fn main() {
let host = env::var("HOST").expect("HOST was not set");
let is_crossed = target != host;

let optional_components = &[
"x86",
"arm",
"aarch64",
"amdgpu",
"avr",
"m68k",
"mips",
"powerpc",
"systemz",
"jsbackend",
"webassembly",
"msp430",
"sparc",
"nvptx",
"hexagon",
"riscv",
"bpf",
];

let required_components = &[
"ipo",
"bitreader",
"bitwriter",
"linker",
"asmparser",
"lto",
"coverage",
"instrumentation",
];

let components = output(Command::new(&llvm_config).arg("--components"));
let mut components = components.split_whitespace().collect::<Vec<_>>();
components.retain(|c| optional_components.contains(c) || required_components.contains(c));
components.retain(|c| OPTIONAL_COMPONENTS.contains(c) || REQUIRED_COMPONENTS.contains(c));

for component in required_components {
for component in REQUIRED_COMPONENTS {
if !components.contains(component) {
panic!("require llvm component {} but wasn't found", component);
}
Expand Down
70 changes: 32 additions & 38 deletions src/bootstrap/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1468,45 +1468,39 @@ impl<'a> Builder<'a> {
rustflags.arg("-Zunstable-options");
}

// FIXME(Urgau): This a hack as it shouldn't be gated on stage 0 but until `rustc_llvm`
// is made to work with `--check-cfg` which is currently not easly possible until cargo
// get some support for setting `--check-cfg` within build script, it's the least invasive
// hack that still let's us have cfg checking for the vast majority of the codebase.
if stage != 0 {
// Enable cfg checking of cargo features for everything but std and also enable cfg
// checking of names and values.
//
// Note: `std`, `alloc` and `core` imports some dependencies by #[path] (like
// backtrace, core_simd, std_float, ...), those dependencies have their own
// features but cargo isn't involved in the #[path] process and so cannot pass the
// complete list of features, so for that reason we don't enable checking of
// features for std crates.
cargo.arg(if mode != Mode::Std {
"-Zcheck-cfg=names,values,features"
} else {
"-Zcheck-cfg=names,values"
});
// Enable cfg checking of cargo features for everything but std and also enable cfg
// checking of names and values.
//
// Note: `std`, `alloc` and `core` imports some dependencies by #[path] (like
// backtrace, core_simd, std_float, ...), those dependencies have their own
// features but cargo isn't involved in the #[path] process and so cannot pass the
// complete list of features, so for that reason we don't enable checking of
// features for std crates.
cargo.arg(if mode != Mode::Std {
"-Zcheck-cfg=names,values,output,features"
} else {
"-Zcheck-cfg=names,values,output"
});

// Add extra cfg not defined in/by rustc
//
// Note: Altrough it would seems that "-Zunstable-options" to `rustflags` is useless as
// cargo would implicitly add it, it was discover that sometimes bootstrap only use
// `rustflags` without `cargo` making it required.
rustflags.arg("-Zunstable-options");
for (restricted_mode, name, values) in EXTRA_CHECK_CFGS {
if *restricted_mode == None || *restricted_mode == Some(mode) {
// Creating a string of the values by concatenating each value:
// ',"tvos","watchos"' or '' (nothing) when there are no values
let values = match values {
Some(values) => values
.iter()
.map(|val| [",", "\"", val, "\""])
.flatten()
.collect::<String>(),
None => String::new(),
};
rustflags.arg(&format!("--check-cfg=values({name}{values})"));
}
// Add extra cfg not defined in/by rustc
//
// Note: Altrough it would seems that "-Zunstable-options" to `rustflags` is useless as
// cargo would implicitly add it, it was discover that sometimes bootstrap only use
// `rustflags` without `cargo` making it required.
rustflags.arg("-Zunstable-options");
for (restricted_mode, name, values) in EXTRA_CHECK_CFGS {
if *restricted_mode == None || *restricted_mode == Some(mode) {
// Creating a string of the values by concatenating each value:
// ',"tvos","watchos"' or '' (nothing) when there are no values
let values = match values {
Some(values) => values
.iter()
.map(|val| [",", "\"", val, "\""])
.flatten()
.collect::<String>(),
None => String::new(),
};
rustflags.arg(&format!("--check-cfg=values({name}{values})"));
}
}

Expand Down

0 comments on commit 03d488b

Please sign in to comment.