Skip to content

Commit 0546d11

Browse files
committed
Fix cross-compiling LLD to different platforms
Looks like the native build system isn't great a coping with this, so try to work around that with a few workarounds.
1 parent c7a7658 commit 0546d11

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/bootstrap/bin/llvm-config-wrapper.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ fn main() {
1010
let mut cmd = Command::new(real_llvm_config);
1111
cmd.args(env::args().skip(1)).stderr(Stdio::piped());
1212
let output = cmd.output().expect("failed to spawn llvm-config");
13-
let stdout = String::from_utf8_lossy(&output.stdout);
13+
let mut stdout = String::from_utf8_lossy(&output.stdout);
14+
15+
if let Ok(to_replace) = env::var("LLVM_CONFIG_SHIM_REPLACE") {
16+
if let Ok(replace_with) = env::var("LLVM_CONFIG_SHIM_REPLACE_WITH") {
17+
stdout = stdout.replace(&to_replace, &replace_with).into();
18+
}
19+
}
20+
1421
print!("{}", stdout.replace("\\", "/"));
1522
io::stdout().flush().unwrap();
1623
process::exit(output.status.code().unwrap_or(1));

src/bootstrap/native.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,29 @@ impl Step for Lld {
479479
let llvm_config_shim = env::current_exe().unwrap().with_file_name("llvm-config-wrapper");
480480
cfg.out_dir(&out_dir)
481481
.profile("Release")
482-
.env("LLVM_CONFIG_REAL", llvm_config)
482+
.env("LLVM_CONFIG_REAL", &llvm_config)
483483
.define("LLVM_CONFIG_PATH", llvm_config_shim)
484484
.define("LLVM_INCLUDE_TESTS", "OFF");
485485

486+
// While we're using this horrible workaround to shim the execution of
487+
// llvm-config, let's just pile on more. I can't seem to figure out how
488+
// to build LLD as a standalone project and also cross-compile it at the
489+
// same time. It wants a natively executable `llvm-config` to learn
490+
// about LLVM, but then it learns about all the host configuration of
491+
// LLVM and tries to link to host LLVM libraries.
492+
//
493+
// To work around that we tell our shim to replace anything with the
494+
// build target with the actual target instead. This'll break parts of
495+
// LLD though which try to execute host tools, such as llvm-tblgen, so
496+
// we specifically tell it where to find those. This is likely super
497+
// brittle and will break over time. If anyone knows better how to
498+
// cross-compile LLD it would be much appreciated to fix this!
499+
if target != builder.config.build {
500+
cfg.env("LLVM_CONFIG_SHIM_REPLACE", &builder.config.build)
501+
.env("LLVM_CONFIG_SHIM_REPLACE_WITH", &target)
502+
.define("LLVM_TABLEGEN_EXE", llvm_config.with_file_name("llvm-tblgen"));
503+
}
504+
486505
cfg.build();
487506

488507
t!(File::create(&done_stamp));

0 commit comments

Comments
 (0)