Skip to content

Commit 2becd0b

Browse files
authored
Rollup merge of #136681 - onur-ozkan:132926, r=jieyouxu
resolve `llvm-config` path properly on cross builds Fixes #132926 try-job: x86_64-mingw-2
2 parents 111726c + e07e335 commit 2becd0b

File tree

2 files changed

+132
-3
lines changed

2 files changed

+132
-3
lines changed

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

+21-3
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

+111
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;
@@ -954,3 +956,112 @@ fn test_test_coverage() {
954956
assert_eq!(modes, expected);
955957
}
956958
}
959+
960+
#[test]
961+
fn test_prebuilt_llvm_config_path_resolution() {
962+
fn configure(config: &str) -> Config {
963+
Config::parse_inner(
964+
Flags::parse(&[
965+
"build".to_string(),
966+
"--dry-run".to_string(),
967+
"--config=/does/not/exist".to_string(),
968+
]),
969+
|&_| toml::from_str(&config),
970+
)
971+
}
972+
973+
// Removes Windows disk prefix if present
974+
fn drop_win_disk_prefix_if_present(path: PathBuf) -> PathBuf {
975+
let path_str = path.to_str().unwrap();
976+
if let Some((_, without_prefix)) = path_str.split_once(":/") {
977+
return PathBuf::from(format!("/{}", without_prefix));
978+
}
979+
980+
path
981+
}
982+
983+
let config = configure(
984+
r#"
985+
[llvm]
986+
download-ci-llvm = false
987+
988+
[build]
989+
build = "x86_64-unknown-linux-gnu"
990+
host = ["arm-unknown-linux-gnueabihf"]
991+
target = ["arm-unknown-linux-gnueabihf"]
992+
993+
[target.x86_64-unknown-linux-gnu]
994+
llvm-config = "/some/path/to/llvm-config"
995+
996+
[target.arm-unknown-linux-gnueabihf]
997+
cc = "arm-linux-gnueabihf-gcc"
998+
cxx = "arm-linux-gnueabihf-g++"
999+
"#,
1000+
);
1001+
1002+
let build = Build::new(config);
1003+
let builder = Builder::new(&build);
1004+
1005+
let expected = PathBuf::from("/some/path/to/llvm-config");
1006+
1007+
let actual = prebuilt_llvm_config(
1008+
&builder,
1009+
TargetSelection::from_user("arm-unknown-linux-gnueabihf"),
1010+
false,
1011+
)
1012+
.llvm_result()
1013+
.llvm_config
1014+
.clone();
1015+
let actual = drop_win_disk_prefix_if_present(actual);
1016+
assert_eq!(expected, actual);
1017+
1018+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
1019+
.llvm_result()
1020+
.llvm_config
1021+
.clone();
1022+
let actual = drop_win_disk_prefix_if_present(actual);
1023+
assert_eq!(expected, actual);
1024+
assert_eq!(expected, actual);
1025+
1026+
let config = configure(
1027+
r#"
1028+
[llvm]
1029+
download-ci-llvm = false
1030+
"#,
1031+
);
1032+
1033+
let build = Build::new(config.clone());
1034+
let builder = Builder::new(&build);
1035+
1036+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
1037+
.llvm_result()
1038+
.llvm_config
1039+
.clone();
1040+
let expected = builder
1041+
.out
1042+
.join(builder.config.build)
1043+
.join("llvm/bin")
1044+
.join(exe("llvm-config", builder.config.build));
1045+
assert_eq!(expected, actual);
1046+
1047+
let config = configure(
1048+
r#"
1049+
[llvm]
1050+
download-ci-llvm = true
1051+
"#,
1052+
);
1053+
1054+
let build = Build::new(config.clone());
1055+
let builder = Builder::new(&build);
1056+
1057+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
1058+
.llvm_result()
1059+
.llvm_config
1060+
.clone();
1061+
let expected = builder
1062+
.out
1063+
.join(builder.config.build)
1064+
.join("ci-llvm/bin")
1065+
.join(exe("llvm-config", builder.config.build));
1066+
assert_eq!(expected, actual);
1067+
}

0 commit comments

Comments
 (0)