mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +00:00
check host's libstdc++ version when using ci llvm
Signed-off-by: onur-ozkan <work@onurozkan.dev>
This commit is contained in:
parent
3a70a810d5
commit
73ff1d4b25
@ -10,6 +10,7 @@ use crate::core::builder::{Builder, Cargo as CargoCommand, RunConfig, ShouldRun,
|
||||
use crate::core::config::TargetSelection;
|
||||
use crate::utils::channel::GitInfo;
|
||||
use crate::utils::exec::BootstrapCommand;
|
||||
use crate::utils::helpers::output;
|
||||
use crate::utils::helpers::{add_dylib_path, exe, t};
|
||||
use crate::Compiler;
|
||||
use crate::Mode;
|
||||
@ -804,6 +805,59 @@ impl Step for LlvmBitcodeLinker {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
|
||||
pub struct LibcxxVersionTool {
|
||||
pub target: TargetSelection,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum LibcxxVersion {
|
||||
Gnu(usize),
|
||||
#[allow(dead_code)]
|
||||
Llvm(usize),
|
||||
}
|
||||
|
||||
impl Step for LibcxxVersionTool {
|
||||
type Output = LibcxxVersion;
|
||||
const DEFAULT: bool = false;
|
||||
const ONLY_HOSTS: bool = true;
|
||||
|
||||
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
|
||||
run.never()
|
||||
}
|
||||
|
||||
fn run(self, builder: &Builder<'_>) -> LibcxxVersion {
|
||||
let out_dir = builder.out.join(self.target.to_string()).join("libcxx-version");
|
||||
let _ = fs::remove_dir_all(&out_dir);
|
||||
t!(fs::create_dir_all(&out_dir));
|
||||
|
||||
let compiler = builder.cxx(self.target).unwrap();
|
||||
let mut cmd = Command::new(compiler);
|
||||
|
||||
let executable = out_dir.join("libcxx-version");
|
||||
cmd.arg("-o").arg(&executable).arg(builder.src.join("src/tools/libcxx-version/main.cpp"));
|
||||
|
||||
builder.run_cmd(&mut cmd);
|
||||
|
||||
if !executable.exists() {
|
||||
panic!("Something went wrong. {} is not present", executable.display());
|
||||
}
|
||||
|
||||
let version_output = output(&mut Command::new(executable));
|
||||
|
||||
let version_str = version_output.split_once("version:").unwrap().1;
|
||||
let version = version_str.trim().parse::<usize>().unwrap();
|
||||
|
||||
if version_output.starts_with("libstdc++") {
|
||||
LibcxxVersion::Gnu(version)
|
||||
} else if version_output.starts_with("libc++") {
|
||||
LibcxxVersion::Llvm(version)
|
||||
} else {
|
||||
panic!("Coudln't recognize the standard library version.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! tool_extended {
|
||||
(($sel:ident, $builder:ident),
|
||||
$($name:ident,
|
||||
|
@ -18,7 +18,8 @@ use std::process::Command;
|
||||
#[cfg(not(feature = "bootstrap-self-test"))]
|
||||
use std::collections::HashSet;
|
||||
|
||||
use crate::builder::Kind;
|
||||
use crate::builder::{Builder, Kind};
|
||||
use crate::core::build_steps::tool;
|
||||
use crate::core::config::Target;
|
||||
use crate::utils::helpers::output;
|
||||
use crate::Build;
|
||||
@ -38,6 +39,10 @@ const STAGE0_MISSING_TARGETS: &[&str] = &[
|
||||
// just a dummy comment so the list doesn't get onelined
|
||||
];
|
||||
|
||||
/// Minimum version threshold for libstdc++ required when using prebuilt LLVM
|
||||
/// from CI (with`llvm.download-ci-llvm` option).
|
||||
const LIBSTDCXX_MIN_VERSION_THRESHOLD: usize = 8;
|
||||
|
||||
impl Finder {
|
||||
pub fn new() -> Self {
|
||||
Self { cache: HashMap::new(), path: env::var_os("PATH").unwrap_or_default() }
|
||||
@ -102,6 +107,35 @@ pub fn check(build: &mut Build) {
|
||||
cmd_finder.must_have("git");
|
||||
}
|
||||
|
||||
// Ensure that a compatible version of libstdc++ is available on the system when using `llvm.download-ci-llvm`.
|
||||
if !build.config.dry_run() && !build.build.is_msvc() && build.config.llvm_from_ci {
|
||||
let builder = Builder::new(build);
|
||||
let libcxx_version = builder.ensure(tool::LibcxxVersionTool { target: build.build });
|
||||
|
||||
match libcxx_version {
|
||||
tool::LibcxxVersion::Gnu(version) => {
|
||||
if LIBSTDCXX_MIN_VERSION_THRESHOLD > version {
|
||||
eprintln!(
|
||||
"\nYour system's libstdc++ version is too old for the `llvm.download-ci-llvm` option."
|
||||
);
|
||||
eprintln!("Current version detected: '{}'", version);
|
||||
eprintln!("Minimum required version: '{}'", LIBSTDCXX_MIN_VERSION_THRESHOLD);
|
||||
eprintln!(
|
||||
"Consider upgrading libstdc++ or disabling the `llvm.download-ci-llvm` option."
|
||||
);
|
||||
crate::exit!(1);
|
||||
}
|
||||
}
|
||||
tool::LibcxxVersion::Llvm(_) => {
|
||||
eprintln!(
|
||||
"\nYour system is using libc++, which is incompatible with the `llvm.download-ci-llvm` option."
|
||||
);
|
||||
eprintln!("Disable `llvm.download-ci-llvm` or switch to libstdc++.");
|
||||
crate::exit!(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We need cmake, but only if we're actually building LLVM or sanitizers.
|
||||
let building_llvm = build
|
||||
.hosts
|
||||
|
Loading…
Reference in New Issue
Block a user