rustc: Tweak default linker selection

This commit refactors how the path to the linker that we're going to invoke is
selected. Previously all targets listed *both* a `LinkerFlavor` and a `linker`
(path) option, but this meant that whenever you changed one you had to change
the other. The purpose of this commit is to avoid coupling these where possible.

Target specifications now only unconditionally define the *flavor* of the linker
that they're using by default. If not otherwise specified each flavor now
implies a particular default linker to run. As a result, this means that if
you'd like to test out `ld` for example you should be able to do:

    rustc -Z linker-flavor=ld foo.rs

whereas previously you had to do

    rustc -Z linker-flavor=ld -C linker=ld foo.rs

This will hopefully make it a bit easier to tinker around with variants that
should otherwise be well known to work, for example with LLD, `ld` on OSX, etc.
This commit is contained in:
Alex Crichton
2018-02-10 12:09:25 -08:00
parent d69b24805b
commit 0129b01a41
26 changed files with 83 additions and 118 deletions

View File

@@ -208,7 +208,7 @@ impl Step for Llvm {
cfg.define("LLVM_NATIVE_BUILD", build.llvm_out(build.build).join("build"));
}
configure_cmake(build, target, &mut cfg);
configure_cmake(build, target, &mut cfg, false);
// FIXME: we don't actually need to build all LLVM tools and all LLVM
// libraries here, e.g. we just want a few components and a few
@@ -241,7 +241,8 @@ fn check_llvm_version(build: &Build, llvm_config: &Path) {
fn configure_cmake(build: &Build,
target: Interned<String>,
cfg: &mut cmake::Config) {
cfg: &mut cmake::Config,
building_dist_binaries: bool) {
if build.config.ninja {
cfg.generator("Ninja");
}
@@ -294,8 +295,10 @@ fn configure_cmake(build: &Build,
cfg.build_arg("-j").build_arg(build.jobs().to_string());
cfg.define("CMAKE_C_FLAGS", build.cflags(target).join(" "));
let mut cxxflags = build.cflags(target).join(" ");
if build.config.llvm_static_stdcpp && !target.contains("windows") {
cxxflags.push_str(" -static-libstdc++");
if building_dist_binaries {
if build.config.llvm_static_stdcpp && !target.contains("windows") {
cxxflags.push_str(" -static-libstdc++");
}
}
cfg.define("CMAKE_CXX_FLAGS", cxxflags);
if let Some(ar) = build.ar(target) {
@@ -350,7 +353,7 @@ impl Step for Lld {
t!(fs::create_dir_all(&out_dir));
let mut cfg = cmake::Config::new(build.src.join("src/tools/lld"));
configure_cmake(build, target, &mut cfg);
configure_cmake(build, target, &mut cfg, true);
cfg.out_dir(&out_dir)
.profile("Release")