about summary refs log tree commit diff
path: root/src/bootstrap
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2017-10-15 21:39:16 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2017-10-15 23:23:28 +0300
commit89d9ce4ec3c134ab62e9eea18a9620face8f88b7 (patch)
tree896be050a00cdc09702c823891d2d2c0a116e0a2 /src/bootstrap
parent9e0fc5ccd050201e77483b1efb2e6c76f47496f6 (diff)
downloadrust-89d9ce4ec3c134ab62e9eea18a9620face8f88b7.tar.gz
rust-89d9ce4ec3c134ab62e9eea18a9620face8f88b7.zip
Don't use target's linker when linking build scripts
Diffstat (limited to 'src/bootstrap')
-rw-r--r--src/bootstrap/bin/rustc.rs17
-rw-r--r--src/bootstrap/bin/rustdoc.rs2
-rw-r--r--src/bootstrap/builder.rs12
-rw-r--r--src/bootstrap/check.rs13
-rw-r--r--src/bootstrap/lib.rs30
5 files changed, 33 insertions, 41 deletions
diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs
index e496ce27f50..aeeda85e924 100644
--- a/src/bootstrap/bin/rustc.rs
+++ b/src/bootstrap/bin/rustc.rs
@@ -120,6 +120,11 @@ fn main() {
             cmd.arg("-L").arg(&root);
         }
 
+        // Override linker if necessary.
+        if let Ok(target_linker) = env::var("RUSTC_TARGET_LINKER") {
+            cmd.arg(format!("-Clinker={}", target_linker));
+        }
+
         // Pass down incremental directory, if any.
         if let Ok(dir) = env::var("RUSTC_INCREMENTAL") {
             cmd.arg(format!("-Zincremental={}", dir));
@@ -246,13 +251,11 @@ fn main() {
         if env::var_os("RUSTC_FORCE_UNSTABLE").is_some() {
             cmd.arg("-Z").arg("force-unstable-if-unmarked");
         }
-    }
-
-    // Pass down extra flags, commonly used to configure `-Clinker`.
-    // Linker options should be set for build scripts as well,
-    // can't link a build script executable without a linker!
-    if let Ok(s) = env::var("RUSTC_FLAGS") {
-        cmd.args(&s.split(" ").filter(|s| !s.is_empty()).collect::<Vec<_>>());
+    } else {
+        // Override linker if necessary.
+        if let Ok(host_linker) = env::var("RUSTC_HOST_LINKER") {
+            cmd.arg(format!("-Clinker={}", host_linker));
+        }
     }
 
     let color = match env::var("RUSTC_COLOR") {
diff --git a/src/bootstrap/bin/rustdoc.rs b/src/bootstrap/bin/rustdoc.rs
index 2105797a830..4e975adc972 100644
--- a/src/bootstrap/bin/rustdoc.rs
+++ b/src/bootstrap/bin/rustdoc.rs
@@ -47,7 +47,7 @@ fn main() {
     if env::var_os("RUSTC_FORCE_UNSTABLE").is_some() {
         cmd.arg("-Z").arg("force-unstable-if-unmarked");
     }
-    if let Some(linker) = env::var_os("RUSTDOC_LINKER") {
+    if let Some(linker) = env::var_os("RUSTC_TARGET_LINKER") {
         cmd.arg("--linker").arg(linker).arg("-Z").arg("unstable-options");
     }
 
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index ef4f8f78b0d..6480b5a619c 100644
--- a/src/bootstrap/builder.rs
+++ b/src/bootstrap/builder.rs
@@ -420,7 +420,7 @@ impl<'a> Builder<'a> {
            .env("RUSTDOC_REAL", self.rustdoc(host))
            .env("RUSTDOC_CRATE_VERSION", self.build.rust_version());
         if let Some(linker) = self.build.linker(host) {
-            cmd.env("RUSTDOC_LINKER", linker);
+            cmd.env("RUSTC_TARGET_LINKER", linker);
         }
         cmd
     }
@@ -484,11 +484,13 @@ impl<'a> Builder<'a> {
              } else {
                  PathBuf::from("/path/to/nowhere/rustdoc/not/required")
              })
-             .env("TEST_MIRI", self.config.test_miri.to_string())
-             .env("RUSTC_FLAGS", self.rustc_flags(target).join(" "));
+             .env("TEST_MIRI", self.config.test_miri.to_string());
 
-        if let Some(linker) = self.build.linker(target) {
-            cargo.env("RUSTDOC_LINKER", linker);
+        if let Some(host_linker) = self.build.linker(compiler.host) {
+            cargo.env("RUSTC_HOST_LINKER", host_linker);
+        }
+        if let Some(target_linker) = self.build.linker(target) {
+            cargo.env("RUSTC_TARGET_LINKER", target_linker);
         }
 
         if mode != Mode::Tool {
diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs
index d9b0ff4c7a4..d9ee63eef8c 100644
--- a/src/bootstrap/check.rs
+++ b/src/bootstrap/check.rs
@@ -725,9 +725,6 @@ impl Step for Compiletest {
         // Avoid depending on rustdoc when we don't need it.
         if mode == "rustdoc" || mode == "run-make" {
             cmd.arg("--rustdoc-path").arg(builder.rustdoc(compiler.host));
-            if let Some(linker) = build.linker(target) {
-                cmd.arg("--linker").arg(linker);
-            }
         }
 
         cmd.arg("--src-base").arg(build.src.join("src/test").join(suite));
@@ -750,12 +747,14 @@ impl Step for Compiletest {
             flags.push("-g".to_string());
         }
 
-        let mut hostflags = build.rustc_flags(compiler.host);
-        hostflags.extend(flags.clone());
+        if let Some(linker) = build.linker(target) {
+            cmd.arg("--linker").arg(linker);
+        }
+
+        let hostflags = flags.clone();
         cmd.arg("--host-rustcflags").arg(hostflags.join(" "));
 
-        let mut targetflags = build.rustc_flags(target);
-        targetflags.extend(flags);
+        let mut targetflags = flags.clone();
         targetflags.push(format!("-Lnative={}",
                                  build.test_helpers_out(target).display()));
         cmd.arg("--target-rustcflags").arg(targetflags.join(" "));
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 7c599f91838..63dc17910f0 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -649,10 +649,6 @@ impl Build {
         self.ar.get(&target).map(|p| &**p)
     }
 
-    fn linker(&self, target: Interned<String>) -> Option<&Path> {
-        self.config.target_config.get(&target).and_then(|c| c.linker.as_ref().map(|p| &**p))
-    }
-
     /// Returns the path to the C++ compiler for the target specified.
     fn cxx(&self, target: Interned<String>) -> Result<&Path, String> {
         match self.cxx.get(&target) {
@@ -663,24 +659,16 @@ impl Build {
         }
     }
 
-    /// Returns flags to pass to the compiler to generate code for `target`.
-    fn rustc_flags(&self, target: Interned<String>) -> Vec<String> {
-        // New flags should be added here with great caution!
-        //
-        // It's quite unfortunate to **require** flags to generate code for a
-        // target, so it should only be passed here if absolutely necessary!
-        // Most default configuration should be done through target specs rather
-        // than an entry here.
-
-        let mut base = Vec::new();
-        if let Some(linker) = self.linker(target) {
-            // If linker was explictly provided, force it on all the compiled Rust code.
-            base.push(format!("-Clinker={}", linker.display()));
-        } else if target != self.config.build && !target.contains("msvc") &&
-            !target.contains("emscripten") {
-            base.push(format!("-Clinker={}", self.cc(target).display()));
+    /// Returns the path to the linker for the given target if it needs to be overriden.
+    fn linker(&self, target: Interned<String>) -> Option<&Path> {
+        if let Some(config) = self.config.target_config.get(&target) {
+            config.linker.as_ref().map(|p| &**p)
+        } else if target != self.config.build &&
+                  !target.contains("msvc") && !target.contains("emscripten") {
+            Some(self.cc(target))
+        } else {
+            None
         }
-        base
     }
 
     /// Returns if this target should statically link the C runtime, if specified