Skip to content

Commit

Permalink
Auto merge of rust-lang#136681 - onur-ozkan:132926, r=<try>
Browse files Browse the repository at this point in the history
resolve `llvm-config` path properly on cross builds

Fixes rust-lang#132926

try-job: x86_64-mingw-2
  • Loading branch information
bors committed Feb 9, 2025
2 parents 43ca9d1 + a6511b8 commit f50c84c
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 3 deletions.
24 changes: 21 additions & 3 deletions src/bootstrap/src/core/build_steps/llvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ impl LlvmBuildStatus {
LlvmBuildStatus::ShouldBuild(_) => true,
}
}

#[cfg(test)]
pub fn llvm_result(&self) -> &LlvmResult {
match self {
LlvmBuildStatus::AlreadyBuilt(res) => res,
LlvmBuildStatus::ShouldBuild(meta) => &meta.res,
}
}
}

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

let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
llvm_config_ret_dir.push("bin");
let build_llvm_config = llvm_config_ret_dir.join(exe("llvm-config", builder.config.build));
let build_llvm_config = if let Some(build_llvm_config) = builder
.config
.target_config
.get(&builder.config.build)
.and_then(|config| config.llvm_config.clone())
{
build_llvm_config
} else {
let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
llvm_config_ret_dir.push("bin");
llvm_config_ret_dir.join(exe("llvm-config", builder.config.build))
};

let llvm_cmake_dir = out_dir.join("lib/cmake/llvm");
let res = LlvmResult { llvm_config: build_llvm_config, llvm_cmake_dir };

Expand Down
94 changes: 94 additions & 0 deletions src/bootstrap/src/core/builder/tests.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use std::thread;

use llvm::prebuilt_llvm_config;

use super::*;
use crate::Flags;
use crate::core::build_steps::doc::DocumentationFormat;
Expand Down Expand Up @@ -861,3 +863,95 @@ fn test_test_coverage() {
assert_eq!(modes, expected);
}
}

#[test]
fn test_prebuilt_llvm_config_path_resolution() {
fn configure(config: &str) -> Config {
Config::parse_inner(
Flags::parse(&[
"build".to_string(),
"--dry-run".to_string(),
"--config=/does/not/exist".to_string(),
]),
|&_| toml::from_str(&config),
)
}

let config = configure(
r#"
[llvm]
download-ci-llvm = false
[build]
build = "x86_64-unknown-linux-gnu"
host = ["arm-unknown-linux-gnueabihf"]
target = ["arm-unknown-linux-gnueabihf"]
[target.x86_64-unknown-linux-gnu]
llvm-config = "/some/path/to/llvm-config"
[target.arm-unknown-linux-gnueabihf]
cc = "arm-linux-gnueabihf-gcc"
cxx = "arm-linux-gnueabihf-g++"
"#,
);

let build = Build::new(config);
let builder = Builder::new(&build);

let expected = PathBuf::from("/some/path/to/llvm-config");

let actual = prebuilt_llvm_config(
&builder,
TargetSelection::from_user("arm-unknown-linux-gnueabihf"),
false,
)
.llvm_result()
.llvm_config
.clone();
// removes Windows drive prefix if present
let actual = actual.strip_prefix(":").unwrap_or(&actual);
assert_eq!(expected, actual);

let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
.llvm_result()
.llvm_config
.clone();
// removes Windows drive prefix if present
let actual = actual.strip_prefix(":").unwrap_or(&actual);
assert_eq!(expected, actual);

let config = configure(
r#"
[llvm]
download-ci-llvm = false
"#,
);

let build = Build::new(config.clone());
let builder = Builder::new(&build);

let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
.llvm_result()
.llvm_config
.clone();
let expected = builder.out.join(builder.config.build).join("llvm/bin/llvm-config");
assert_eq!(expected, actual);

let config = configure(
r#"
[llvm]
download-ci-llvm = true
"#,
);

let build = Build::new(config.clone());
let builder = Builder::new(&build);

let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
.llvm_result()
.llvm_config
.clone();
let expected = builder.out.join(builder.config.build).join("ci-llvm/bin/llvm-config");
assert_eq!(expected, actual);
}

0 comments on commit f50c84c

Please sign in to comment.