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.
This commit is contained in:
parent
c7a7658c6d
commit
0546d11528
@ -10,7 +10,14 @@ fn main() {
|
|||||||
let mut cmd = Command::new(real_llvm_config);
|
let mut cmd = Command::new(real_llvm_config);
|
||||||
cmd.args(env::args().skip(1)).stderr(Stdio::piped());
|
cmd.args(env::args().skip(1)).stderr(Stdio::piped());
|
||||||
let output = cmd.output().expect("failed to spawn llvm-config");
|
let output = cmd.output().expect("failed to spawn llvm-config");
|
||||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
let mut stdout = String::from_utf8_lossy(&output.stdout);
|
||||||
|
|
||||||
|
if let Ok(to_replace) = env::var("LLVM_CONFIG_SHIM_REPLACE") {
|
||||||
|
if let Ok(replace_with) = env::var("LLVM_CONFIG_SHIM_REPLACE_WITH") {
|
||||||
|
stdout = stdout.replace(&to_replace, &replace_with).into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
print!("{}", stdout.replace("\\", "/"));
|
print!("{}", stdout.replace("\\", "/"));
|
||||||
io::stdout().flush().unwrap();
|
io::stdout().flush().unwrap();
|
||||||
process::exit(output.status.code().unwrap_or(1));
|
process::exit(output.status.code().unwrap_or(1));
|
||||||
|
@ -479,10 +479,29 @@ impl Step for Lld {
|
|||||||
let llvm_config_shim = env::current_exe().unwrap().with_file_name("llvm-config-wrapper");
|
let llvm_config_shim = env::current_exe().unwrap().with_file_name("llvm-config-wrapper");
|
||||||
cfg.out_dir(&out_dir)
|
cfg.out_dir(&out_dir)
|
||||||
.profile("Release")
|
.profile("Release")
|
||||||
.env("LLVM_CONFIG_REAL", llvm_config)
|
.env("LLVM_CONFIG_REAL", &llvm_config)
|
||||||
.define("LLVM_CONFIG_PATH", llvm_config_shim)
|
.define("LLVM_CONFIG_PATH", llvm_config_shim)
|
||||||
.define("LLVM_INCLUDE_TESTS", "OFF");
|
.define("LLVM_INCLUDE_TESTS", "OFF");
|
||||||
|
|
||||||
|
// While we're using this horrible workaround to shim the execution of
|
||||||
|
// llvm-config, let's just pile on more. I can't seem to figure out how
|
||||||
|
// to build LLD as a standalone project and also cross-compile it at the
|
||||||
|
// same time. It wants a natively executable `llvm-config` to learn
|
||||||
|
// about LLVM, but then it learns about all the host configuration of
|
||||||
|
// LLVM and tries to link to host LLVM libraries.
|
||||||
|
//
|
||||||
|
// To work around that we tell our shim to replace anything with the
|
||||||
|
// build target with the actual target instead. This'll break parts of
|
||||||
|
// LLD though which try to execute host tools, such as llvm-tblgen, so
|
||||||
|
// we specifically tell it where to find those. This is likely super
|
||||||
|
// brittle and will break over time. If anyone knows better how to
|
||||||
|
// cross-compile LLD it would be much appreciated to fix this!
|
||||||
|
if target != builder.config.build {
|
||||||
|
cfg.env("LLVM_CONFIG_SHIM_REPLACE", &builder.config.build)
|
||||||
|
.env("LLVM_CONFIG_SHIM_REPLACE_WITH", &target)
|
||||||
|
.define("LLVM_TABLEGEN_EXE", llvm_config.with_file_name("llvm-tblgen"));
|
||||||
|
}
|
||||||
|
|
||||||
cfg.build();
|
cfg.build();
|
||||||
|
|
||||||
t!(File::create(&done_stamp));
|
t!(File::create(&done_stamp));
|
||||||
|
Loading…
Reference in New Issue
Block a user