Skip to content

Commit 89d9ce4

Browse files
committed
Don't use target's linker when linking build scripts
1 parent 9e0fc5c commit 89d9ce4

File tree

6 files changed

+36
-41
lines changed

6 files changed

+36
-41
lines changed

src/bootstrap/bin/rustc.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ fn main() {
120120
cmd.arg("-L").arg(&root);
121121
}
122122

123+
// Override linker if necessary.
124+
if let Ok(target_linker) = env::var("RUSTC_TARGET_LINKER") {
125+
cmd.arg(format!("-Clinker={}", target_linker));
126+
}
127+
123128
// Pass down incremental directory, if any.
124129
if let Ok(dir) = env::var("RUSTC_INCREMENTAL") {
125130
cmd.arg(format!("-Zincremental={}", dir));
@@ -246,13 +251,11 @@ fn main() {
246251
if env::var_os("RUSTC_FORCE_UNSTABLE").is_some() {
247252
cmd.arg("-Z").arg("force-unstable-if-unmarked");
248253
}
249-
}
250-
251-
// Pass down extra flags, commonly used to configure `-Clinker`.
252-
// Linker options should be set for build scripts as well,
253-
// can't link a build script executable without a linker!
254-
if let Ok(s) = env::var("RUSTC_FLAGS") {
255-
cmd.args(&s.split(" ").filter(|s| !s.is_empty()).collect::<Vec<_>>());
254+
} else {
255+
// Override linker if necessary.
256+
if let Ok(host_linker) = env::var("RUSTC_HOST_LINKER") {
257+
cmd.arg(format!("-Clinker={}", host_linker));
258+
}
256259
}
257260

258261
let color = match env::var("RUSTC_COLOR") {

src/bootstrap/bin/rustdoc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ fn main() {
4747
if env::var_os("RUSTC_FORCE_UNSTABLE").is_some() {
4848
cmd.arg("-Z").arg("force-unstable-if-unmarked");
4949
}
50-
if let Some(linker) = env::var_os("RUSTDOC_LINKER") {
50+
if let Some(linker) = env::var_os("RUSTC_TARGET_LINKER") {
5151
cmd.arg("--linker").arg(linker).arg("-Z").arg("unstable-options");
5252
}
5353

src/bootstrap/builder.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ impl<'a> Builder<'a> {
420420
.env("RUSTDOC_REAL", self.rustdoc(host))
421421
.env("RUSTDOC_CRATE_VERSION", self.build.rust_version());
422422
if let Some(linker) = self.build.linker(host) {
423-
cmd.env("RUSTDOC_LINKER", linker);
423+
cmd.env("RUSTC_TARGET_LINKER", linker);
424424
}
425425
cmd
426426
}
@@ -484,11 +484,13 @@ impl<'a> Builder<'a> {
484484
} else {
485485
PathBuf::from("/path/to/nowhere/rustdoc/not/required")
486486
})
487-
.env("TEST_MIRI", self.config.test_miri.to_string())
488-
.env("RUSTC_FLAGS", self.rustc_flags(target).join(" "));
487+
.env("TEST_MIRI", self.config.test_miri.to_string());
489488

490-
if let Some(linker) = self.build.linker(target) {
491-
cargo.env("RUSTDOC_LINKER", linker);
489+
if let Some(host_linker) = self.build.linker(compiler.host) {
490+
cargo.env("RUSTC_HOST_LINKER", host_linker);
491+
}
492+
if let Some(target_linker) = self.build.linker(target) {
493+
cargo.env("RUSTC_TARGET_LINKER", target_linker);
492494
}
493495

494496
if mode != Mode::Tool {

src/bootstrap/check.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -725,9 +725,6 @@ impl Step for Compiletest {
725725
// Avoid depending on rustdoc when we don't need it.
726726
if mode == "rustdoc" || mode == "run-make" {
727727
cmd.arg("--rustdoc-path").arg(builder.rustdoc(compiler.host));
728-
if let Some(linker) = build.linker(target) {
729-
cmd.arg("--linker").arg(linker);
730-
}
731728
}
732729

733730
cmd.arg("--src-base").arg(build.src.join("src/test").join(suite));
@@ -750,12 +747,14 @@ impl Step for Compiletest {
750747
flags.push("-g".to_string());
751748
}
752749

753-
let mut hostflags = build.rustc_flags(compiler.host);
754-
hostflags.extend(flags.clone());
750+
if let Some(linker) = build.linker(target) {
751+
cmd.arg("--linker").arg(linker);
752+
}
753+
754+
let hostflags = flags.clone();
755755
cmd.arg("--host-rustcflags").arg(hostflags.join(" "));
756756

757-
let mut targetflags = build.rustc_flags(target);
758-
targetflags.extend(flags);
757+
let mut targetflags = flags.clone();
759758
targetflags.push(format!("-Lnative={}",
760759
build.test_helpers_out(target).display()));
761760
cmd.arg("--target-rustcflags").arg(targetflags.join(" "));

src/bootstrap/lib.rs

+9-21
Original file line numberDiff line numberDiff line change
@@ -649,10 +649,6 @@ impl Build {
649649
self.ar.get(&target).map(|p| &**p)
650650
}
651651

652-
fn linker(&self, target: Interned<String>) -> Option<&Path> {
653-
self.config.target_config.get(&target).and_then(|c| c.linker.as_ref().map(|p| &**p))
654-
}
655-
656652
/// Returns the path to the C++ compiler for the target specified.
657653
fn cxx(&self, target: Interned<String>) -> Result<&Path, String> {
658654
match self.cxx.get(&target) {
@@ -663,24 +659,16 @@ impl Build {
663659
}
664660
}
665661

666-
/// Returns flags to pass to the compiler to generate code for `target`.
667-
fn rustc_flags(&self, target: Interned<String>) -> Vec<String> {
668-
// New flags should be added here with great caution!
669-
//
670-
// It's quite unfortunate to **require** flags to generate code for a
671-
// target, so it should only be passed here if absolutely necessary!
672-
// Most default configuration should be done through target specs rather
673-
// than an entry here.
674-
675-
let mut base = Vec::new();
676-
if let Some(linker) = self.linker(target) {
677-
// If linker was explictly provided, force it on all the compiled Rust code.
678-
base.push(format!("-Clinker={}", linker.display()));
679-
} else if target != self.config.build && !target.contains("msvc") &&
680-
!target.contains("emscripten") {
681-
base.push(format!("-Clinker={}", self.cc(target).display()));
662+
/// Returns the path to the linker for the given target if it needs to be overriden.
663+
fn linker(&self, target: Interned<String>) -> Option<&Path> {
664+
if let Some(config) = self.config.target_config.get(&target) {
665+
config.linker.as_ref().map(|p| &**p)
666+
} else if target != self.config.build &&
667+
!target.contains("msvc") && !target.contains("emscripten") {
668+
Some(self.cc(target))
669+
} else {
670+
None
682671
}
683-
base
684672
}
685673

686674
/// Returns if this target should statically link the C runtime, if specified

src/tools/compiletest/src/runtest.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,9 @@ actual:\n\
14441444
} else {
14451445
rustc.args(self.split_maybe_args(&self.config.target_rustcflags));
14461446
}
1447+
if let Some(ref linker) = self.config.linker {
1448+
rustc.arg(format!("-Clinker={}", linker));
1449+
}
14471450

14481451
rustc.args(&self.props.compile_flags);
14491452

0 commit comments

Comments
 (0)