Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare the bootstrap tool for the new check-cfg syntax #116983

Merged
merged 3 commits into from Oct 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/bootstrap/src/bin/rustdoc.rs
Expand Up @@ -70,7 +70,9 @@ fn main() {
cmd.arg("--cfg=bootstrap");
}
cmd.arg("-Zunstable-options");
// #[cfg(bootstrap)]
cmd.arg("--check-cfg=values(bootstrap)");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if this should be also gated for local rebuilds, but I don't think we can even set a custom rustdoc in config.toml, so it probably doesn't matter.

// cmd.arg("--check-cfg=cfg(bootstrap)");

if verbose > 1 {
eprintln!(
Expand Down
34 changes: 26 additions & 8 deletions src/bootstrap/src/core/builder.rs
Expand Up @@ -1401,19 +1401,28 @@ impl<'a> Builder<'a> {
rustflags.arg("-Zunstable-options");
}

// Enable cfg checking of cargo features for everything but std and also enable cfg
// checking of names and values.
// #[cfg(bootstrap)]
let use_new_check_cfg_syntax = self.local_rebuild;

// Enable compile-time checking of `cfg` names, values and Cargo `features`.
//
// 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"
if use_new_check_cfg_syntax {
cargo.arg("-Zcheck-cfg");
if mode == Mode::Std {
rustflags.arg("--check-cfg=cfg(feature,values(any()))");
}
} else {
"-Zcheck-cfg=names,values,output"
});
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
//
Expand All @@ -1433,7 +1442,12 @@ impl<'a> Builder<'a> {
.collect::<String>(),
None => String::new(),
};
rustflags.arg(&format!("--check-cfg=values({name}{values})"));
if use_new_check_cfg_syntax {
let values = values.strip_prefix(",").unwrap_or(&values); // remove the first `,`
rustflags.arg(&format!("--check-cfg=cfg({name},values({values}))"));
} else {
rustflags.arg(&format!("--check-cfg=values({name}{values})"));
}
}
}

Expand All @@ -1449,7 +1463,11 @@ impl<'a> Builder<'a> {
// We also declare that the flag is expected, which we need to do to not
// get warnings about it being unexpected.
hostflags.arg("-Zunstable-options");
hostflags.arg("--check-cfg=values(bootstrap)");
if use_new_check_cfg_syntax {
hostflags.arg("--check-cfg=cfg(bootstrap)");
} else {
hostflags.arg("--check-cfg=values(bootstrap)");
}

// FIXME: It might be better to use the same value for both `RUSTFLAGS` and `RUSTDOCFLAGS`,
// but this breaks CI. At the very least, stage0 `rustdoc` needs `--cfg bootstrap`. See
Expand Down
7 changes: 6 additions & 1 deletion src/tools/opt-dist/src/tests.rs
Expand Up @@ -24,10 +24,11 @@ pub fn run_tests(env: &Environment) -> anyhow::Result<()> {
let host_triple = env.host_triple();
let version = find_dist_version(&dist_dir)?;

// Extract rustc, libstd and src archives to create the optimized sysroot
// Extract rustc, libstd, cargo and src archives to create the optimized sysroot
let rustc_dir = extract_dist_dir(&format!("rustc-{version}-{host_triple}"))?.join("rustc");
let libstd_dir = extract_dist_dir(&format!("rust-std-{version}-{host_triple}"))?
.join(format!("rust-std-{host_triple}"));
let cargo_dir = extract_dist_dir(&format!("cargo-{version}-{host_triple}"))?.join("cargo");
let extracted_src_dir = extract_dist_dir(&format!("rust-src-{version}"))?.join("rust-src");

// We need to manually copy libstd to the extracted rustc sysroot
Expand All @@ -46,6 +47,8 @@ pub fn run_tests(env: &Environment) -> anyhow::Result<()> {

let rustc_path = rustc_dir.join("bin").join(format!("rustc{}", executable_extension()));
assert!(rustc_path.is_file());
let cargo_path = cargo_dir.join("bin").join(format!("cargo{}", executable_extension()));
assert!(cargo_path.is_file());

// Specify path to a LLVM config so that LLVM is not rebuilt.
// It doesn't really matter which LLVM config we choose, because no sysroot will be compiled.
Expand All @@ -62,11 +65,13 @@ change-id = 115898

[build]
rustc = "{rustc}"
cargo = "{cargo}"

[target.{host_triple}]
llvm-config = "{llvm_config}"
"#,
rustc = rustc_path.to_string().replace('\\', "/"),
cargo = cargo_path.to_string().replace('\\', "/"),
llvm_config = llvm_config.to_string().replace('\\', "/")
);
log::info!("Using following `config.toml` for running tests:\n{config_content}");
Expand Down