about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTyler Mandry <tmandry@google.com>2022-08-26 19:24:41 -0700
committerTyler Mandry <tmandry@google.com>2022-08-29 16:23:19 -0700
commite136e02fd97ac5207f1a0d1edd276ef22a1d24c1 (patch)
tree1f42d75d16f4838deb8ba3e7d0e1cf35e7f74c3f
parent03d488b48af9f66b91e9400387f781b82411fa82 (diff)
downloadrust-e136e02fd97ac5207f1a0d1edd276ef22a1d24c1.tar.gz
rust-e136e02fd97ac5207f1a0d1edd276ef22a1d24c1.zip
bootstrap: Add llvm-has-rust-patches target option
This is so you can check out an upstream commit in src/llvm-project and
have everything just work.
-rw-r--r--config.toml.example4
-rw-r--r--src/bootstrap/config.rs3
-rw-r--r--src/bootstrap/lib.rs12
3 files changed, 14 insertions, 5 deletions
diff --git a/config.toml.example b/config.toml.example
index b3284050f05..28ccc2c8f14 100644
--- a/config.toml.example
+++ b/config.toml.example
@@ -666,6 +666,10 @@ changelog-seen = 2
 # target.
 #llvm-config = <none> (path)
 
+# Override detection of whether this is a Rust-patched LLVM. This would be used
+# in conjunction with either an llvm-config or build.submodules = false.
+#llvm-has-rust-patches = if llvm-config { false } else { true }
+
 # Normally the build system can find LLVM's FileCheck utility, but if
 # not, you can specify an explicit file name for it.
 #llvm-filecheck = "/path/to/llvm-version/bin/FileCheck"
diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs
index ea0f78e2a6b..f98f07b8eba 100644
--- a/src/bootstrap/config.rs
+++ b/src/bootstrap/config.rs
@@ -388,6 +388,7 @@ impl PartialEq<&str> for TargetSelection {
 pub struct Target {
     /// Some(path to llvm-config) if using an external LLVM.
     pub llvm_config: Option<PathBuf>,
+    pub llvm_has_rust_patches: Option<bool>,
     /// Some(path to FileCheck) if one was specified.
     pub llvm_filecheck: Option<PathBuf>,
     pub llvm_libunwind: Option<LlvmLibunwind>,
@@ -729,6 +730,7 @@ define_config! {
         default_linker: Option<PathBuf> = "default-linker",
         linker: Option<String> = "linker",
         llvm_config: Option<String> = "llvm-config",
+        llvm_has_rust_patches: Option<bool> = "llvm-has-rust-patches",
         llvm_filecheck: Option<String> = "llvm-filecheck",
         llvm_libunwind: Option<String> = "llvm-libunwind",
         android_ndk: Option<String> = "android-ndk",
@@ -1140,6 +1142,7 @@ impl Config {
                 if let Some(ref s) = cfg.llvm_config {
                     target.llvm_config = Some(config.src.join(s));
                 }
+                target.llvm_has_rust_patches = cfg.llvm_has_rust_patches;
                 if let Some(ref s) = cfg.llvm_filecheck {
                     target.llvm_filecheck = Some(config.src.join(s));
                 }
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index cd421c249d8..751692b46f3 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -112,6 +112,7 @@ use std::path::{Path, PathBuf};
 use std::process::Command;
 use std::str;
 
+use config::Target;
 use filetime::FileTime;
 use once_cell::sync::OnceCell;
 
@@ -854,12 +855,13 @@ impl Build {
     ///
     /// If no custom `llvm-config` was specified then Rust's llvm will be used.
     fn is_rust_llvm(&self, target: TargetSelection) -> bool {
-        if self.config.llvm_from_ci && target == self.config.build {
-            return true;
-        }
-
         match self.config.target_config.get(&target) {
-            Some(ref c) => c.llvm_config.is_none(),
+            Some(Target { llvm_has_rust_patches: Some(patched), .. }) => *patched,
+            Some(Target { llvm_config, .. }) => {
+                // If the user set llvm-config we assume Rust is not patched,
+                // but first check to see if it was configured by llvm-from-ci.
+                (self.config.llvm_from_ci && target == self.config.build) || llvm_config.is_none()
+            }
             None => true,
         }
     }