Run rustc_codegen_gcc tests in the CI
This commit is contained in:
parent
b20f40dba9
commit
c6ace5c564
@ -45,15 +45,42 @@ pub struct Std {
|
||||
/// When using download-rustc, we need to use a new build of `std` for running unit tests of Std itself,
|
||||
/// but we need to use the downloaded copy of std for linking to rustdoc. Allow this to be overriden by `builder.ensure` from other steps.
|
||||
force_recompile: bool,
|
||||
extra_rust_args: &'static [&'static str],
|
||||
}
|
||||
|
||||
impl Std {
|
||||
pub fn new(compiler: Compiler, target: TargetSelection) -> Self {
|
||||
Self { target, compiler, crates: Default::default(), force_recompile: false }
|
||||
Self {
|
||||
target,
|
||||
compiler,
|
||||
crates: Default::default(),
|
||||
force_recompile: false,
|
||||
extra_rust_args: &[],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn force_recompile(compiler: Compiler, target: TargetSelection) -> Self {
|
||||
Self { target, compiler, crates: Default::default(), force_recompile: true }
|
||||
Self {
|
||||
target,
|
||||
compiler,
|
||||
crates: Default::default(),
|
||||
force_recompile: true,
|
||||
extra_rust_args: &[],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_with_extra_rust_args(
|
||||
compiler: Compiler,
|
||||
target: TargetSelection,
|
||||
extra_rust_args: &'static [&'static str],
|
||||
) -> Self {
|
||||
Self {
|
||||
target,
|
||||
compiler,
|
||||
crates: Default::default(),
|
||||
force_recompile: false,
|
||||
extra_rust_args,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -81,6 +108,7 @@ impl Step for Std {
|
||||
target: run.target,
|
||||
crates,
|
||||
force_recompile: false,
|
||||
extra_rust_args: &[],
|
||||
});
|
||||
}
|
||||
|
||||
@ -188,6 +216,9 @@ impl Step for Std {
|
||||
if target.is_synthetic() {
|
||||
cargo.env("RUSTC_BOOTSTRAP_SYNTHETIC_TARGET", "1");
|
||||
}
|
||||
for rustflag in self.extra_rust_args.into_iter() {
|
||||
cargo.rustflag(rustflag);
|
||||
}
|
||||
|
||||
let _guard = builder.msg(
|
||||
Kind::Build,
|
||||
|
@ -3094,3 +3094,130 @@ impl Step for CodegenCranelift {
|
||||
builder.run_cmd(BootstrapCommand::from(&mut cmd).fail_fast());
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct CodegenGCC {
|
||||
compiler: Compiler,
|
||||
target: TargetSelection,
|
||||
}
|
||||
|
||||
impl Step for CodegenGCC {
|
||||
type Output = ();
|
||||
const DEFAULT: bool = true;
|
||||
const ONLY_HOSTS: bool = true;
|
||||
|
||||
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
|
||||
run.paths(&["compiler/rustc_codegen_gcc"])
|
||||
}
|
||||
|
||||
fn make_run(run: RunConfig<'_>) {
|
||||
let builder = run.builder;
|
||||
let host = run.build_triple();
|
||||
let compiler = run.builder.compiler_for(run.builder.top_stage, host, host);
|
||||
|
||||
if builder.doc_tests == DocTests::Only {
|
||||
return;
|
||||
}
|
||||
|
||||
let triple = run.target.triple;
|
||||
let target_supported = if triple.contains("linux") {
|
||||
triple.contains("x86_64")
|
||||
|| triple.contains("aarch64")
|
||||
|| triple.contains("s390x")
|
||||
|| triple.contains("riscv64gc")
|
||||
} else if triple.contains("darwin") || triple.contains("windows") {
|
||||
triple.contains("x86_64")
|
||||
} else {
|
||||
false
|
||||
};
|
||||
if !target_supported {
|
||||
builder.info("target not supported by rustc_codegen_gcc. skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
if builder.remote_tested(run.target) {
|
||||
builder.info("remote testing is not supported by rustc_codegen_gcc. skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
if !builder.config.rust_codegen_backends.contains(&INTERNER.intern_str("gcc")) {
|
||||
builder.info("gcc not in rust.codegen-backends. skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
builder.ensure(CodegenGCC { compiler, target: run.target });
|
||||
}
|
||||
|
||||
fn run(self, builder: &Builder<'_>) {
|
||||
let compiler = self.compiler;
|
||||
let target = self.target;
|
||||
|
||||
builder.ensure(compile::Std::new_with_extra_rust_args(
|
||||
compiler,
|
||||
target,
|
||||
&["-Csymbol-mangling-version=v0", "-Cpanic=abort"],
|
||||
));
|
||||
|
||||
// If we're not doing a full bootstrap but we're testing a stage2
|
||||
// version of libstd, then what we're actually testing is the libstd
|
||||
// produced in stage1. Reflect that here by updating the compiler that
|
||||
// we're working with automatically.
|
||||
let compiler = builder.compiler_for(compiler.stage, compiler.host, target);
|
||||
|
||||
let build_cargo = || {
|
||||
let mut cargo = builder.cargo(
|
||||
compiler,
|
||||
Mode::Codegen, // Must be codegen to ensure dlopen on compiled dylibs works
|
||||
SourceType::InTree,
|
||||
target,
|
||||
"run",
|
||||
);
|
||||
cargo.current_dir(&builder.src.join("compiler/rustc_codegen_gcc"));
|
||||
cargo
|
||||
.arg("--manifest-path")
|
||||
.arg(builder.src.join("compiler/rustc_codegen_gcc/build_system/Cargo.toml"));
|
||||
compile::rustc_cargo_env(builder, &mut cargo, target, compiler.stage);
|
||||
|
||||
// Avoid incremental cache issues when changing rustc
|
||||
cargo.env("CARGO_BUILD_INCREMENTAL", "false");
|
||||
cargo.rustflag("-Cpanic=abort");
|
||||
|
||||
cargo
|
||||
};
|
||||
|
||||
builder.info(&format!(
|
||||
"{} GCC stage{} ({} -> {})",
|
||||
Kind::Test.description(),
|
||||
compiler.stage,
|
||||
&compiler.host,
|
||||
target
|
||||
));
|
||||
let _time = helpers::timeit(&builder);
|
||||
|
||||
/*
|
||||
let mut prepare_cargo = build_cargo();
|
||||
prepare_cargo.arg("--").arg("prepare");
|
||||
#[allow(deprecated)]
|
||||
builder.config.try_run(&mut prepare_cargo.into()).unwrap();
|
||||
*/
|
||||
|
||||
let mut cargo = build_cargo();
|
||||
|
||||
cargo
|
||||
.arg("--")
|
||||
.arg("test")
|
||||
.arg("--use-system-gcc")
|
||||
.arg("--use-backend")
|
||||
.arg("gcc")
|
||||
.arg("--out-dir")
|
||||
.arg(builder.stage_out(compiler, Mode::ToolRustc).join("cg_gcc"))
|
||||
.arg("--release")
|
||||
.arg("--no-default-features")
|
||||
.arg("--mini-tests")
|
||||
.arg("--std-tests");
|
||||
cargo.args(builder.config.test_args());
|
||||
|
||||
let mut cmd: Command = cargo.into();
|
||||
builder.run_cmd(BootstrapCommand::from(&mut cmd).fail_fast());
|
||||
}
|
||||
}
|
||||
|
@ -737,6 +737,7 @@ impl<'a> Builder<'a> {
|
||||
test::Debuginfo,
|
||||
test::UiFullDeps,
|
||||
test::CodegenCranelift,
|
||||
test::CodegenGCC,
|
||||
test::Rustdoc,
|
||||
test::RunCoverageRustdoc,
|
||||
test::Pretty,
|
||||
|
@ -127,7 +127,7 @@ else
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set rust.verify-llvm-ir"
|
||||
|
||||
# Test the Cranelift backend in CI. Bootstrap knows which targets to run tests on.
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set rust.codegen-backends=llvm,cranelift"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set rust.codegen-backends=llvm,cranelift,gcc"
|
||||
|
||||
# We enable this for non-dist builders, since those aren't trying to produce
|
||||
# fresh binaries. We currently don't entirely support distributing a fresh
|
||||
|
Loading…
x
Reference in New Issue
Block a user