From 1a01f977856ff61c9a3b3480de0075bbeb8bd4fb Mon Sep 17 00:00:00 2001 From: Matthew Healy Date: Thu, 19 Dec 2019 19:46:19 +0100 Subject: [PATCH 1/3] Document LLVM skip-rebuild config.toml option --- config.toml.example | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.toml.example b/config.toml.example index 5152a6c988582..f12ff76284589 100644 --- a/config.toml.example +++ b/config.toml.example @@ -14,6 +14,12 @@ # ============================================================================= [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 #optimize = true From 2297a8b1990930144c240743230f6860899b89f5 Mon Sep 17 00:00:00 2001 From: Matthew Healy Date: Thu, 19 Dec 2019 19:55:42 +0100 Subject: [PATCH 2/3] Parse llvm_skip_rebuild into Config --- src/bootstrap/config.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 11bfc7a47cc48..0970a50bee47a 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -67,6 +67,7 @@ pub struct Config { pub backtrace_on_ice: bool, // llvm codegen options + pub llvm_skip_rebuild: bool, pub llvm_assertions: bool, pub llvm_optimize: bool, pub llvm_thin_lto: bool, @@ -244,6 +245,7 @@ struct Install { #[derive(Deserialize, Default)] #[serde(deny_unknown_fields, rename_all = "kebab-case")] struct Llvm { + skip_rebuild: Option, optimize: Option, thin_lto: Option, release_debuginfo: Option, @@ -490,6 +492,7 @@ impl Config { // Store off these values as options because if they're not provided // we'll infer default values for them later + let mut llvm_skip_rebuild = None; let mut llvm_assertions = None; let mut debug = None; let mut debug_assertions = None; @@ -511,6 +514,7 @@ impl Config { } set(&mut config.ninja, llvm.ninja); llvm_assertions = llvm.assertions; + llvm_skip_rebuild = llvm.skip_rebuild; set(&mut config.llvm_optimize, llvm.optimize); set(&mut config.llvm_thin_lto, llvm.thin_lto); 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_cargo, build.cargo.map(PathBuf::from)); + config.llvm_skip_rebuild = llvm_skip_rebuild.unwrap_or(false); + let default = false; config.llvm_assertions = llvm_assertions.unwrap_or(default); From e44fc4577fdf5e269db0c7f574ac8d125067ccd8 Mon Sep 17 00:00:00 2001 From: Matthew Healy Date: Thu, 19 Dec 2019 20:42:01 +0100 Subject: [PATCH 3/3] Skip LLVM rebuild when skip-rebuild is true --- src/bootstrap/native.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index afee154fe7143..2a4e9903e5527 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -70,6 +70,15 @@ impl Step for Llvm { let done_stamp = out_dir.join("llvm-finished-building"); 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() { let done_contents = t!(fs::read(&done_stamp));