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 10, 2025
2 parents 80c0919 + e07e335 commit f7625af
Show file tree
Hide file tree
Showing 2 changed files with 132 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
111 changes: 111 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 @@ -954,3 +956,112 @@ 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),
)
}

// Removes Windows disk prefix if present
fn drop_win_disk_prefix_if_present(path: PathBuf) -> PathBuf {
let path_str = path.to_str().unwrap();
if let Some((_, without_prefix)) = path_str.split_once(":/") {
return PathBuf::from(format!("/{}", without_prefix));
}

path
}

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();
let actual = drop_win_disk_prefix_if_present(actual);
assert_eq!(expected, actual);

let actual = prebuilt_llvm_config(&builder, builder.config.build, false)
.llvm_result()
.llvm_config
.clone();
let actual = drop_win_disk_prefix_if_present(actual);
assert_eq!(expected, 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")
.join(exe("llvm-config", builder.config.build));
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")
.join(exe("llvm-config", builder.config.build));
assert_eq!(expected, actual);
}

0 comments on commit f7625af

Please sign in to comment.