Allow checking individual crates

This is useful for profiling metadata generation.

This comes very close to removing all_krates, but doesn't quite -
there's one last usage left in `doc`.
This commit is contained in:
jyn 2023-05-24 19:39:16 -05:00
parent c571558fd9
commit 564e3adfdf

View File

@ -1,6 +1,6 @@
//! Implementation of compiling the compiler and standard library, in "check"-based modes.
use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step};
use crate::builder::{crate_description, Builder, Kind, RunConfig, ShouldRun, Step};
use crate::cache::Interned;
use crate::compile::{add_to_sysroot, run_cargo, rustc_cargo, rustc_cargo_env, std_cargo};
use crate::config::TargetSelection;
@ -12,6 +12,12 @@ use std::path::{Path, PathBuf};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct Std {
pub target: TargetSelection,
/// Whether to build only a subset of crates.
///
/// This shouldn't be used from other steps; see the comment on [`compile::Rustc`].
///
/// [`compile::Rustc`]: crate::compile::Rustc
crates: Interned<Vec<String>>,
}
/// Returns args for the subcommand itself (not for cargo)
@ -66,16 +72,24 @@ fn cargo_subcommand(kind: Kind) -> &'static str {
}
}
impl Std {
pub fn new(target: TargetSelection) -> Self {
Self { target, crates: INTERNER.intern_list(vec![]) }
}
}
impl Step for Std {
type Output = ();
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.all_krates("sysroot").path("library")
let crates = run.builder.in_tree_crates("sysroot", None);
run.crates(crates).path("library")
}
fn make_run(run: RunConfig<'_>) {
run.builder.ensure(Std { target: run.target });
let crates = run.cargo_crates_in_set();
run.builder.ensure(Std { target: run.target, crates });
}
fn run(self, builder: &Builder<'_>) {
@ -97,7 +111,14 @@ impl Step for Std {
cargo.arg("--lib");
}
let _guard = builder.msg_check("library artifacts", target);
for krate in &*self.crates {
cargo.arg("-p").arg(krate);
}
let _guard = builder.msg_check(
format_args!("library artifacts{}", crate_description(&self.crates)),
target,
);
run_cargo(
builder,
cargo,
@ -117,7 +138,8 @@ impl Step for Std {
}
// don't run on std twice with x.py clippy
if builder.kind == Kind::Clippy {
// don't check test dependencies if we haven't built libtest
if builder.kind == Kind::Clippy || !self.crates.is_empty() {
return;
}
@ -147,8 +169,8 @@ impl Step for Std {
// Explicitly pass -p for all dependencies krates -- this will force cargo
// to also check the tests/benches/examples for these crates, rather
// than just the leaf crate.
for krate in builder.in_tree_crates("test", Some(target)) {
cargo.arg("-p").arg(krate.name);
for krate in &*self.crates {
cargo.arg("-p").arg(krate);
}
let _guard = builder.msg_check("library test/bench/example targets", target);
@ -167,6 +189,22 @@ impl Step for Std {
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct Rustc {
pub target: TargetSelection,
/// Whether to build only a subset of crates.
///
/// This shouldn't be used from other steps; see the comment on [`compile::Rustc`].
///
/// [`compile::Rustc`]: crate::compile::Rustc
crates: Interned<Vec<String>>,
}
impl Rustc {
pub fn new(target: TargetSelection, builder: &Builder<'_>) -> Self {
let mut crates = vec![];
for krate in builder.in_tree_crates("rustc-main", None) {
crates.push(krate.name.to_string());
}
Self { target, crates: INTERNER.intern_list(crates) }
}
}
impl Step for Rustc {
@ -175,11 +213,13 @@ impl Step for Rustc {
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.all_krates("rustc-main").path("compiler")
let crates = run.builder.in_tree_crates("rustc-main", None);
run.crates(crates).path("compiler")
}
fn make_run(run: RunConfig<'_>) {
run.builder.ensure(Rustc { target: run.target });
let crates = run.cargo_crates_in_set();
run.builder.ensure(Rustc { target: run.target, crates });
}
/// Builds the compiler.
@ -200,7 +240,7 @@ impl Step for Rustc {
builder.ensure(crate::compile::Std::new(compiler, compiler.host));
builder.ensure(crate::compile::Std::new(compiler, target));
} else {
builder.ensure(Std { target });
builder.ensure(Std::new(target));
}
let mut cargo = builder.cargo(
@ -218,14 +258,17 @@ impl Step for Rustc {
cargo.arg("--all-targets");
}
// Explicitly pass -p for all compiler krates -- this will force cargo
// Explicitly pass -p for all compiler crates -- this will force cargo
// to also check the tests/benches/examples for these crates, rather
// than just the leaf crate.
for krate in builder.in_tree_crates("rustc-main", Some(target)) {
cargo.arg("-p").arg(krate.name);
for krate in &*self.crates {
cargo.arg("-p").arg(krate);
}
let _guard = builder.msg_check("compiler artifacts", target);
let _guard = builder.msg_check(
format_args!("compiler artifacts{}", crate_description(&self.crates)),
target,
);
run_cargo(
builder,
cargo,
@ -268,7 +311,7 @@ impl Step for CodegenBackend {
let target = self.target;
let backend = self.backend;
builder.ensure(Rustc { target });
builder.ensure(Rustc::new(target, builder));
let mut cargo = builder.cargo(
compiler,
@ -318,7 +361,7 @@ impl Step for RustAnalyzer {
let compiler = builder.compiler(builder.top_stage, builder.config.build);
let target = self.target;
builder.ensure(Std { target });
builder.ensure(Std::new(target));
let mut cargo = prepare_tool_cargo(
builder,
@ -386,7 +429,7 @@ macro_rules! tool_check_step {
let compiler = builder.compiler(builder.top_stage, builder.config.build);
let target = self.target;
builder.ensure(Rustc { target });
builder.ensure(Rustc::new(target, builder));
let mut cargo = prepare_tool_cargo(
builder,