about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-03-31 01:22:07 +0000
committerbors <bors@rust-lang.org>2019-03-31 01:22:07 +0000
commitcee58fdc12bea8cc373366bd84fc786277729b1c (patch)
tree165131d98929eda0d6f449b8c72986a93ee29217
parentb0fcfa7d6135ecfdfebd325683890ae6dcf5eb18 (diff)
parent49b65e683dbf7b710deaede48a66211ce924c851 (diff)
downloadrust-cee58fdc12bea8cc373366bd84fc786277729b1c.tar.gz
rust-cee58fdc12bea8cc373366bd84fc786277729b1c.zip
Auto merge of #59566 - cuviper:llvm-rebuild-sha, r=Mark-Simulacrum
Use the existing LLVM GitInfo for checking rebuilds

Fixes #59565
-rw-r--r--src/bootstrap/channel.rs19
-rw-r--r--src/bootstrap/lib.rs20
-rw-r--r--src/bootstrap/native.rs36
-rw-r--r--src/bootstrap/tool.rs2
4 files changed, 34 insertions, 43 deletions
diff --git a/src/bootstrap/channel.rs b/src/bootstrap/channel.rs
index aa683161b65..e42b073322e 100644
--- a/src/bootstrap/channel.rs
+++ b/src/bootstrap/channel.rs
@@ -11,7 +11,6 @@ use std::process::Command;
 use build_helper::output;
 
 use crate::Build;
-use crate::config::Config;
 
 // The version number
 pub const CFG_RELEASE_NUM: &str = "1.35.0";
@@ -27,20 +26,20 @@ struct Info {
 }
 
 impl GitInfo {
-    pub fn new(config: &Config, dir: &Path) -> GitInfo {
+    pub fn new(ignore_git: bool, dir: &Path) -> GitInfo {
         // See if this even begins to look like a git dir
-        if config.ignore_git || !dir.join(".git").exists() {
+        if ignore_git || !dir.join(".git").exists() {
             return GitInfo { inner: None }
         }
 
         // Make sure git commands work
-        let out = Command::new("git")
-                          .arg("rev-parse")
-                          .current_dir(dir)
-                          .output()
-                          .expect("failed to spawn git");
-        if !out.status.success() {
-            return GitInfo { inner: None }
+        match Command::new("git")
+            .arg("rev-parse")
+            .current_dir(dir)
+            .output()
+        {
+            Ok(ref out) if out.status.success() => {}
+            _ => return GitInfo { inner: None },
         }
 
         // Ok, let's scrape some info
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 167455af1f2..2394ae7fb79 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -360,14 +360,18 @@ impl Build {
             }
             None => false,
         };
-        let rust_info = channel::GitInfo::new(&config, &src);
-        let cargo_info = channel::GitInfo::new(&config, &src.join("src/tools/cargo"));
-        let rls_info = channel::GitInfo::new(&config, &src.join("src/tools/rls"));
-        let clippy_info = channel::GitInfo::new(&config, &src.join("src/tools/clippy"));
-        let miri_info = channel::GitInfo::new(&config, &src.join("src/tools/miri"));
-        let rustfmt_info = channel::GitInfo::new(&config, &src.join("src/tools/rustfmt"));
-        let in_tree_llvm_info = channel::GitInfo::new(&config, &src.join("src/llvm-project"));
-        let emscripten_llvm_info = channel::GitInfo::new(&config, &src.join("src/llvm-emscripten"));
+
+        let ignore_git = config.ignore_git;
+        let rust_info = channel::GitInfo::new(ignore_git, &src);
+        let cargo_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/cargo"));
+        let rls_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/rls"));
+        let clippy_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/clippy"));
+        let miri_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/miri"));
+        let rustfmt_info = channel::GitInfo::new(ignore_git, &src.join("src/tools/rustfmt"));
+
+        // we always try to use git for LLVM builds
+        let in_tree_llvm_info = channel::GitInfo::new(false, &src.join("src/llvm-project"));
+        let emscripten_llvm_info = channel::GitInfo::new(false, &src.join("src/llvm-emscripten"));
 
         let mut build = Build {
             initial_rustc: config.initial_rustc.clone(),
diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs
index d93b0f2e0d4..fde40b0d1b4 100644
--- a/src/bootstrap/native.rs
+++ b/src/bootstrap/native.rs
@@ -67,45 +67,38 @@ impl Step for Llvm {
             }
         }
 
-        let (submodule, root, out_dir, llvm_config_ret_dir) = if emscripten {
+        let (llvm_info, root, out_dir, llvm_config_ret_dir) = if emscripten {
+            let info = &builder.emscripten_llvm_info;
             let dir = builder.emscripten_llvm_out(target);
             let config_dir = dir.join("bin");
-            ("src/llvm-emscripten", "src/llvm-emscripten", dir, config_dir)
+            (info, "src/llvm-emscripten", dir, config_dir)
         } else {
+            let info = &builder.in_tree_llvm_info;
             let mut dir = builder.llvm_out(builder.config.build);
             if !builder.config.build.contains("msvc") || builder.config.ninja {
                 dir.push("build");
             }
-            ("src/llvm-project", "src/llvm-project/llvm", builder.llvm_out(target), dir.join("bin"))
+            (info, "src/llvm-project/llvm", builder.llvm_out(target), dir.join("bin"))
         };
 
-        let git_output = t!(Command::new("git")
-            .args(&["rev-parse", "--verify", &format!("@:./{}", submodule)])
-            .current_dir(&builder.src)
-            .output());
-
-        let llvm_commit = if git_output.status.success() {
-            Some(git_output.stdout)
-        } else {
+        if !llvm_info.is_git() {
             println!(
-                "git could not determine the LLVM submodule commit hash ({}). \
+                "git could not determine the LLVM submodule commit hash. \
                 Assuming that an LLVM build is necessary.",
-                String::from_utf8_lossy(&git_output.stderr),
             );
-            None
-        };
+        }
 
         let build_llvm_config = llvm_config_ret_dir
             .join(exe("llvm-config", &*builder.config.build));
         let done_stamp = out_dir.join("llvm-finished-building");
 
-        if let Some(llvm_commit) = &llvm_commit {
+        if let Some(llvm_commit) = llvm_info.sha() {
             if done_stamp.exists() {
                 let done_contents = t!(fs::read(&done_stamp));
 
                 // If LLVM was already built previously and the submodule's commit didn't change
                 // from the previous build, then no action is required.
-                if done_contents == llvm_commit.as_slice() {
+                if done_contents == llvm_commit.as_bytes() {
                     return build_llvm_config
                 }
             }
@@ -258,11 +251,6 @@ impl Step for Llvm {
                 channel::CFG_RELEASE_NUM,
                 builder.config.channel,
             );
-            let llvm_info = if self.emscripten {
-                &builder.emscripten_llvm_info
-            } else {
-                &builder.in_tree_llvm_info
-            };
             if let Some(sha) = llvm_info.sha_short() {
                 default_suffix.push_str("-");
                 default_suffix.push_str(sha);
@@ -295,8 +283,8 @@ impl Step for Llvm {
 
         cfg.build();
 
-        if let Some(llvm_commit) = llvm_commit {
-            t!(fs::write(&done_stamp, &llvm_commit));
+        if let Some(llvm_commit) = llvm_info.sha() {
+            t!(fs::write(&done_stamp, llvm_commit));
         }
 
         build_llvm_config
diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs
index 35e0e240146..23775a91e4c 100644
--- a/src/bootstrap/tool.rs
+++ b/src/bootstrap/tool.rs
@@ -235,7 +235,7 @@ pub fn prepare_tool_cargo(
     cargo.env("CFG_VERSION", builder.rust_version());
     cargo.env("CFG_RELEASE_NUM", channel::CFG_RELEASE_NUM);
 
-    let info = GitInfo::new(&builder.config, &dir);
+    let info = GitInfo::new(builder.config.ignore_git, &dir);
     if let Some(sha) = info.sha() {
         cargo.env("CFG_COMMIT_HASH", sha);
     }