Skip to content

Commit e07e335

Browse files
committed
add coverage for llvm-config path resolution
Signed-off-by: onur-ozkan <[email protected]>
1 parent 4b8b18f commit e07e335

File tree

2 files changed

+127
-3
lines changed

2 files changed

+127
-3
lines changed

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

+16-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,12 +128,17 @@ pub fn prebuilt_llvm_config(
120128
let root = "src/llvm-project/llvm";
121129
let out_dir = builder.llvm_out(target);
122130

123-
let build_llvm_config = if target == 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 {
124139
let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
125140
llvm_config_ret_dir.push("bin");
126141
llvm_config_ret_dir.join(exe("llvm-config", builder.config.build))
127-
} else {
128-
builder.ensure(Llvm { target: builder.config.build }).llvm_config
129142
};
130143

131144
let llvm_cmake_dir = out_dir.join("lib/cmake/llvm");

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;
@@ -861,3 +863,112 @@ 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+
// Removes Windows disk prefix if present
881+
fn drop_win_disk_prefix_if_present(path: PathBuf) -> PathBuf {
882+
let path_str = path.to_str().unwrap();
883+
if let Some((_, without_prefix)) = path_str.split_once(":/") {
884+
return PathBuf::from(format!("/{}", without_prefix));
885+
}
886+
887+
path
888+
}
889+
890+
let config = configure(
891+
r#"
892+
[llvm]
893+
download-ci-llvm = false
894+
895+
[build]
896+
build = "x86_64-unknown-linux-gnu"
897+
host = ["arm-unknown-linux-gnueabihf"]
898+
target = ["arm-unknown-linux-gnueabihf"]
899+
900+
[target.x86_64-unknown-linux-gnu]
901+
llvm-config = "/some/path/to/llvm-config"
902+
903+
[target.arm-unknown-linux-gnueabihf]
904+
cc = "arm-linux-gnueabihf-gcc"
905+
cxx = "arm-linux-gnueabihf-g++"
906+
"#,
907+
);
908+
909+
let build = Build::new(config);
910+
let builder = Builder::new(&build);
911+
912+
let expected = PathBuf::from("/some/path/to/llvm-config");
913+
914+
let actual = prebuilt_llvm_config(
915+
&builder,
916+
TargetSelection::from_user("arm-unknown-linux-gnueabihf"),
917+
false,
918+
)
919+
.llvm_result()
920+
.llvm_config
921+
.clone();
922+
let actual = drop_win_disk_prefix_if_present(actual);
923+
assert_eq!(expected, actual);
924+
925+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
926+
.llvm_result()
927+
.llvm_config
928+
.clone();
929+
let actual = drop_win_disk_prefix_if_present(actual);
930+
assert_eq!(expected, actual);
931+
assert_eq!(expected, actual);
932+
933+
let config = configure(
934+
r#"
935+
[llvm]
936+
download-ci-llvm = false
937+
"#,
938+
);
939+
940+
let build = Build::new(config.clone());
941+
let builder = Builder::new(&build);
942+
943+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
944+
.llvm_result()
945+
.llvm_config
946+
.clone();
947+
let expected = builder
948+
.out
949+
.join(builder.config.build)
950+
.join("llvm/bin")
951+
.join(exe("llvm-config", builder.config.build));
952+
assert_eq!(expected, actual);
953+
954+
let config = configure(
955+
r#"
956+
[llvm]
957+
download-ci-llvm = true
958+
"#,
959+
);
960+
961+
let build = Build::new(config.clone());
962+
let builder = Builder::new(&build);
963+
964+
let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
965+
.llvm_result()
966+
.llvm_config
967+
.clone();
968+
let expected = builder
969+
.out
970+
.join(builder.config.build)
971+
.join("ci-llvm/bin")
972+
.join(exe("llvm-config", builder.config.build));
973+
assert_eq!(expected, actual);
974+
}

0 commit comments

Comments
 (0)