Auto merge of #67437 - matthew-healy:skip-llvm-rebuild, r=Mark-Simulacrum

Add LLVM `skip-rebuild` option to `x.py`

This PR reimplements parts of @Walther's work from #65848, and closes #65612.

I decided not to implement the [arguments to override this setting](https://github.com/rust-lang/rust/issues/65612#issuecomment-544247546) in this PR. If there's strong feeling that this change shouldn't be merged without the overrides then I'm happy to close this until I've had a chance to add them in. Otherwise I'll aim to submit a second PR with those this weekend.

I'd have liked to have tested the change in `native.rs`, but there didn't seem to be any existing test infrastructure. I ran this a few times manually and it _worked on my machine_ though... 😬
This commit is contained in:
bors 2019-12-27 10:58:57 +00:00
commit 41501a6b03
3 changed files with 21 additions and 0 deletions

View File

@ -14,6 +14,12 @@
# ============================================================================= # =============================================================================
[llvm] [llvm]
# Indicates whether LLVM rebuild should be skipped when running bootstrap. If
# this is `false` then the compiler's LLVM will be rebuilt whenever the built
# version doesn't have the correct hash. If it is `true` then LLVM will never
# be rebuilt. The default value is `false`.
#skip-rebuild = false
# Indicates whether the LLVM build is a Release or Debug build # Indicates whether the LLVM build is a Release or Debug build
#optimize = true #optimize = true

View File

@ -67,6 +67,7 @@ pub struct Config {
pub backtrace_on_ice: bool, pub backtrace_on_ice: bool,
// llvm codegen options // llvm codegen options
pub llvm_skip_rebuild: bool,
pub llvm_assertions: bool, pub llvm_assertions: bool,
pub llvm_optimize: bool, pub llvm_optimize: bool,
pub llvm_thin_lto: bool, pub llvm_thin_lto: bool,
@ -244,6 +245,7 @@ struct Install {
#[derive(Deserialize, Default)] #[derive(Deserialize, Default)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")] #[serde(deny_unknown_fields, rename_all = "kebab-case")]
struct Llvm { struct Llvm {
skip_rebuild: Option<bool>,
optimize: Option<bool>, optimize: Option<bool>,
thin_lto: Option<bool>, thin_lto: Option<bool>,
release_debuginfo: Option<bool>, release_debuginfo: Option<bool>,
@ -490,6 +492,7 @@ impl Config {
// Store off these values as options because if they're not provided // Store off these values as options because if they're not provided
// we'll infer default values for them later // we'll infer default values for them later
let mut llvm_skip_rebuild = None;
let mut llvm_assertions = None; let mut llvm_assertions = None;
let mut debug = None; let mut debug = None;
let mut debug_assertions = None; let mut debug_assertions = None;
@ -511,6 +514,7 @@ impl Config {
} }
set(&mut config.ninja, llvm.ninja); set(&mut config.ninja, llvm.ninja);
llvm_assertions = llvm.assertions; llvm_assertions = llvm.assertions;
llvm_skip_rebuild = llvm.skip_rebuild;
set(&mut config.llvm_optimize, llvm.optimize); set(&mut config.llvm_optimize, llvm.optimize);
set(&mut config.llvm_thin_lto, llvm.thin_lto); set(&mut config.llvm_thin_lto, llvm.thin_lto);
set(&mut config.llvm_release_debuginfo, llvm.release_debuginfo); set(&mut config.llvm_release_debuginfo, llvm.release_debuginfo);
@ -617,6 +621,8 @@ impl Config {
set(&mut config.initial_rustc, build.rustc.map(PathBuf::from)); set(&mut config.initial_rustc, build.rustc.map(PathBuf::from));
set(&mut config.initial_cargo, build.cargo.map(PathBuf::from)); set(&mut config.initial_cargo, build.cargo.map(PathBuf::from));
config.llvm_skip_rebuild = llvm_skip_rebuild.unwrap_or(false);
let default = false; let default = false;
config.llvm_assertions = llvm_assertions.unwrap_or(default); config.llvm_assertions = llvm_assertions.unwrap_or(default);

View File

@ -70,6 +70,15 @@ impl Step for Llvm {
let done_stamp = out_dir.join("llvm-finished-building"); let done_stamp = out_dir.join("llvm-finished-building");
if done_stamp.exists() { if done_stamp.exists() {
if builder.config.llvm_skip_rebuild {
builder.info(
"Warning: \
Using a potentially stale build of LLVM; \
This may not behave well.",
);
return build_llvm_config;
}
if let Some(llvm_commit) = llvm_info.sha() { if let Some(llvm_commit) = llvm_info.sha() {
let done_contents = t!(fs::read(&done_stamp)); let done_contents = t!(fs::read(&done_stamp));