Skip to content

Commit f50c84c

Browse files
committed
Auto merge of rust-lang#136681 - onur-ozkan:132926, r=<try>
resolve `llvm-config` path properly on cross builds Fixes rust-lang#132926 try-job: x86_64-mingw-2
2 parents 43ca9d1 + a6511b8 commit f50c84c

File tree

2 files changed

+115
-3
lines changed

2 files changed

+115
-3
lines changed

src/bootstrap/src/core/build_steps/llvm.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ impl LlvmBuildStatus {
5454
LlvmBuildStatus::ShouldBuild(_) => true,
5555
}
5656
}
57+
58+
#[cfg(test)]
59+
pub fn llvm_result(&self) -> &LlvmResult {
60+
match self {
61+
LlvmBuildStatus::AlreadyBuilt(res) => res,
62+
LlvmBuildStatus::ShouldBuild(meta) => &meta.res,
63+
}
64+
}
5765
}
5866

5967
/// Linker flags to pass to LLVM's CMake invocation.
@@ -120,9 +128,19 @@ pub fn prebuilt_llvm_config(
120128
let root = "src/llvm-project/llvm";
121129
let out_dir = builder.llvm_out(target);
122130

123-
let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
124-
llvm_config_ret_dir.push("bin");
125-
let build_llvm_config = llvm_config_ret_dir.join(exe("llvm-config", builder.config.build));
131+
let build_llvm_config = if let Some(build_llvm_config) = builder
132+
.config
133+
.target_config
134+
.get(&builder.config.build)
135+
.and_then(|config| config.llvm_config.clone())
136+
{
137+
build_llvm_config
138+
} else {
139+
let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
140+
llvm_config_ret_dir.push("bin");
141+
llvm_config_ret_dir.join(exe("llvm-config", builder.config.build))
142+
};
143+
126144
let llvm_cmake_dir = out_dir.join("lib/cmake/llvm");
127145
let res = LlvmResult { llvm_config: build_llvm_config, llvm_cmake_dir };
128146

src/bootstrap/src/core/builder/tests.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::thread;
22

3+
use llvm::prebuilt_llvm_config;
4+
35
use super::*;
46
use crate::Flags;
57
use crate::core::build_steps::doc::DocumentationFormat;
@@ -861,3 +863,95 @@ fn test_test_coverage() {
861863
assert_eq!(modes, expected);
862864
}
863865
}
866+
867+
#[test]
868+
fn test_prebuilt_llvm_config_path_resolution() {
869+
fn configure(config: &str) -> Config {
870+
Config::parse_inner(
871+
Flags::parse(&[
872+
"build".to_string(),
873+
"--dry-run".to_string(),
874+
"--config=/does/not/exist".to_string(),
875+
]),
876+
|&_| toml::from_str(&config),
877+
)
878+
}
879+
880+
let config = configure(
881+
r#"
882+
[llvm]
883+
download-ci-llvm = false
884+
885+
[build]
886+
build = "x86_64-unknown-linux-gnu"
887+
host = ["arm-unknown-linux-gnueabihf"]
888+
target = ["arm-unknown-linux-gnueabihf"]
889+
890+
[target.x86_64-unknown-linux-gnu]
891+
llvm-config = "/some/path/to/llvm-config"
892+
893+
[target.arm-unknown-linux-gnueabihf]
894+
cc = "arm-linux-gnueabihf-gcc"
895+
cxx = "arm-linux-gnueabihf-g++"
896+
"#,
897+
);
898+
899+
let build = Build::new(config);
900+
let builder = Builder::new(&build);
901+
902+
let expected = PathBuf::from("/some/path/to/llvm-config");
903+
904+
let actual = prebuilt_llvm_config(
905+
&builder,
906+
TargetSelection::from_user("arm-unknown-linux-gnueabihf"),
907+
false,
908+
)
909+
.llvm_result()
910+
.llvm_config
911+
.clone();
912+
// removes Windows drive prefix if present
913+
let actual = actual.strip_prefix(":").unwrap_or(&actual);
914+
assert_eq!(expected, actual);
915+
916+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
917+
.llvm_result()
918+
.llvm_config
919+
.clone();
920+
// removes Windows drive prefix if present
921+
let actual = actual.strip_prefix(":").unwrap_or(&actual);
922+
assert_eq!(expected, actual);
923+
924+
let config = configure(
925+
r#"
926+
[llvm]
927+
download-ci-llvm = false
928+
"#,
929+
);
930+
931+
let build = Build::new(config.clone());
932+
let builder = Builder::new(&build);
933+
934+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
935+
.llvm_result()
936+
.llvm_config
937+
.clone();
938+
let expected = builder.out.join(builder.config.build).join("llvm/bin/llvm-config");
939+
assert_eq!(expected, actual);
940+
941+
let config = configure(
942+
r#"
943+
[llvm]
944+
download-ci-llvm = true
945+
"#,
946+
);
947+
948+
let build = Build::new(config.clone());
949+
let builder = Builder::new(&build);
950+
951+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
952+
.llvm_result()
953+
.llvm_config
954+
.clone();
955+
let expected = builder.out.join(builder.config.build).join("ci-llvm/bin/llvm-config");
956+
assert_eq!(expected, actual);
957+
}

0 commit comments

Comments
 (0)