diff --git a/src/bootstrap/src/core/build_steps/check.rs b/src/bootstrap/src/core/build_steps/check.rs index 8bbd03ac3afa9..14f2e582581cc 100644 --- a/src/bootstrap/src/core/build_steps/check.rs +++ b/src/bootstrap/src/core/build_steps/check.rs @@ -330,7 +330,7 @@ impl Step for Rustc { } fn make_run(run: RunConfig<'_>) { - let crates = run.make_run_crates(Alias::Compiler); + let crates = run.expand_alias(Alias::Compiler); run.builder.ensure(Rustc::new(run.builder, run.target, crates)); } diff --git a/src/bootstrap/src/core/build_steps/clippy.rs b/src/bootstrap/src/core/build_steps/clippy.rs index 9e5bfd2e60e9c..7563ae59ca505 100644 --- a/src/bootstrap/src/core/build_steps/clippy.rs +++ b/src/bootstrap/src/core/build_steps/clippy.rs @@ -266,7 +266,7 @@ impl Step for Rustc { fn make_run(run: RunConfig<'_>) { let builder = run.builder; - let crates = run.make_run_crates(Alias::Compiler); + let crates = run.expand_alias(Alias::Compiler); let config = LintConfig::new(run.builder); run.builder.ensure(Rustc::new(builder, run.target, config, crates)); } diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs index 405ab9f6eaa2d..9a3ca4972e1b2 100644 --- a/src/bootstrap/src/core/build_steps/compile.rs +++ b/src/bootstrap/src/core/build_steps/compile.rs @@ -472,7 +472,7 @@ fn copy_self_contained_objects( /// Resolves standard library crates for `Std::run_make` for any build kind (like check, doc, /// build, clippy, etc.). pub fn std_crates_for_run_make(run: &RunConfig<'_>) -> Vec { - let mut crates = run.make_run_crates(builder::Alias::Library); + let mut crates = run.expand_alias(builder::Alias::Library); // For no_std targets, we only want to check core and alloc // Regardless of core/alloc being selected explicitly or via the "library" default alias, diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 61015a141e461..d2bae9b360060 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -41,7 +41,7 @@ use crate::utils::helpers::{ linker_args, linker_flags, t, target_supports_cranelift_backend, up_to_date, }; use crate::utils::render_tests::{add_flags_and_try_run_tests, try_run_tests}; -use crate::{CLang, CodegenBackendKind, DocTests, GitRepo, Mode, PathSet, envify}; +use crate::{CLang, CodegenBackendKind, DocTests, GitRepo, Mode, StepSelectors, envify}; mod compiletest; @@ -1697,7 +1697,7 @@ impl Step for Coverage { // determine which modes to run in. for path in &run.paths { match path { - PathSet::Set(_) => { + StepSelectors::Set(_) => { for &mode in Self::ALL_MODES { if path.assert_single_path().path == Path::new(mode.as_str()) { modes.push(mode); @@ -1705,7 +1705,7 @@ impl Step for Coverage { } } } - PathSet::Suite(_) => { + StepSelectors::TestSuite(_) => { modes.extend_from_slice(Self::ALL_MODES); break; } @@ -2867,7 +2867,7 @@ impl Step for CrateLibrustc { let builder = run.builder; let host = run.build_triple(); let build_compiler = builder.compiler(builder.top_stage - 1, host); - let crates = run.make_run_crates(Alias::Compiler); + let crates = run.expand_alias(Alias::Compiler); builder.ensure(CrateLibrustc { build_compiler, target: run.target, crates }); } @@ -3816,7 +3816,7 @@ impl Step for CodegenCranelift { const IS_HOST: bool = true; fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { - run.paths(&["compiler/rustc_codegen_cranelift"]) + run.path("compiler/rustc_codegen_cranelift") } fn is_default_step(_builder: &Builder<'_>) -> bool { @@ -3937,7 +3937,7 @@ impl Step for CodegenGCC { const IS_HOST: bool = true; fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { - run.paths(&["compiler/rustc_codegen_gcc"]) + run.path("compiler/rustc_codegen_gcc") } fn is_default_step(_builder: &Builder<'_>) -> bool { diff --git a/src/bootstrap/src/core/build_steps/tool.rs b/src/bootstrap/src/core/build_steps/tool.rs index d86159d3cc7e9..6bcd67e895f90 100644 --- a/src/bootstrap/src/core/build_steps/tool.rs +++ b/src/bootstrap/src/core/build_steps/tool.rs @@ -1089,6 +1089,7 @@ impl Step for RustAnalyzerProcMacroSrv { // Allow building `rust-analyzer-proc-macro-srv` both as part of the `rust-analyzer` and as a stand-alone tool. run.path("src/tools/rust-analyzer") .path("src/tools/rust-analyzer/crates/proc-macro-srv-cli") + .alias("rust-analyzer-proc-macro-srv") } fn is_default_step(builder: &Builder<'_>) -> bool { diff --git a/src/bootstrap/src/core/builder/cli_paths.rs b/src/bootstrap/src/core/builder/cli_paths.rs deleted file mode 100644 index 1b0caa980e1de..0000000000000 --- a/src/bootstrap/src/core/builder/cli_paths.rs +++ /dev/null @@ -1,249 +0,0 @@ -//! Various pieces of code for dealing with "paths" passed to bootstrap on the -//! command-line, extracted from `core/builder/mod.rs` because that file is -//! large and hard to navigate. - -use std::fmt::{self, Debug}; -use std::path::PathBuf; - -use crate::core::builder::{Builder, Kind, PathSet, ShouldRun, StepDescription}; - -#[cfg(test)] -mod tests; - -pub(crate) const PATH_REMAP: &[(&str, &[&str])] = &[ - // bootstrap.toml uses `rust-analyzer-proc-macro-srv`, but the - // actual path is `proc-macro-srv-cli` - ("rust-analyzer-proc-macro-srv", &["src/tools/rust-analyzer/crates/proc-macro-srv-cli"]), - // Make `x test tests` function the same as `x t tests/*` - ( - "tests", - &[ - // tidy-alphabetical-start - "tests/assembly-llvm", - "tests/build-std", - "tests/codegen-llvm", - "tests/codegen-units", - "tests/coverage", - "tests/coverage-run-rustdoc", - "tests/crashes", - "tests/debuginfo", - "tests/incremental", - "tests/mir-opt", - "tests/pretty", - "tests/run-make", - "tests/run-make-cargo", - "tests/rustdoc-gui", - "tests/rustdoc-html", - "tests/rustdoc-js", - "tests/rustdoc-js-std", - "tests/rustdoc-json", - "tests/rustdoc-ui", - "tests/ui", - "tests/ui-fulldeps", - // tidy-alphabetical-end - ], - ), -]; - -pub(crate) fn remap_paths(paths: &mut Vec) { - let mut remove = vec![]; - let mut add = vec![]; - for (i, path) in paths.iter().enumerate().filter_map(|(i, path)| path.to_str().map(|s| (i, s))) - { - for &(search, replace) in PATH_REMAP { - // Remove leading and trailing slashes so `tests/` and `tests` are equivalent - if path.trim_matches(std::path::is_separator) == search { - remove.push(i); - add.extend(replace.iter().map(PathBuf::from)); - break; - } - } - } - remove.sort(); - remove.dedup(); - for idx in remove.into_iter().rev() { - paths.remove(idx); - } - paths.append(&mut add); -} - -#[derive(Clone, PartialEq)] -pub(crate) struct CLIStepPath { - pub(crate) path: PathBuf, - pub(crate) will_be_executed: bool, -} - -#[cfg(test)] -impl CLIStepPath { - pub(crate) fn will_be_executed(mut self, will_be_executed: bool) -> Self { - self.will_be_executed = will_be_executed; - self - } -} - -impl Debug for CLIStepPath { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.path.display()) - } -} - -impl From for CLIStepPath { - fn from(path: PathBuf) -> Self { - Self { path, will_be_executed: false } - } -} - -/// Combines a `StepDescription` with its corresponding `ShouldRun`. -struct StepExtra<'a> { - desc: &'a StepDescription, - should_run: ShouldRun<'a>, -} - -struct StepToRun<'a> { - sort_index: usize, - desc: &'a StepDescription, - pathsets: Vec, -} - -pub(crate) fn match_paths_to_steps_and_run( - builder: &Builder<'_>, - step_descs: &[StepDescription], - paths: &[PathBuf], -) { - // Obtain `ShouldRun` information for each step, so that we know which - // paths to match it against. - let steps = step_descs - .iter() - .map(|desc| StepExtra { - desc, - should_run: (desc.should_run)(ShouldRun::new(builder, desc.kind)), - }) - .collect::>(); - - // FIXME(Zalathar): This particular check isn't related to path-to-step - // matching, and should probably be hoisted to somewhere much earlier. - if builder.download_rustc() && (builder.kind == Kind::Dist || builder.kind == Kind::Install) { - eprintln!( - "ERROR: '{}' subcommand is incompatible with `rust.download-rustc`.", - builder.kind.as_str() - ); - crate::exit!(1); - } - - // sanity checks on rules - for StepExtra { desc, should_run } in &steps { - assert!(!should_run.paths.is_empty(), "{:?} should have at least one pathset", desc.name); - } - - if paths.is_empty() || builder.config.include_default_paths { - for StepExtra { desc, should_run } in &steps { - if (desc.is_default_step_fn)(builder) { - desc.maybe_run(builder, should_run.paths.iter().cloned().collect()); - } - } - } - - // Attempt to resolve paths to be relative to the builder source directory. - let mut paths: Vec = paths - .iter() - .map(|original_path| { - let mut path = original_path.clone(); - - // Someone could run `x ` from a different repository than the source - // directory. - // In that case, we should not try to resolve the paths relative to the working - // directory, but rather relative to the source directory. - // So we forcefully "relocate" the path to the source directory here. - if !path.is_absolute() { - path = builder.src.join(path); - } - - // If the path does not exist, it may represent the name of a Step, such as `tidy` in `x test tidy` - if !path.exists() { - // Use the original path here - return original_path.clone(); - } - - // Make the path absolute, strip the prefix, and convert to a PathBuf. - match std::path::absolute(&path) { - Ok(p) => p.strip_prefix(&builder.src).unwrap_or(&p).to_path_buf(), - Err(e) => { - eprintln!("ERROR: {e:?}"); - panic!("Due to the above error, failed to resolve path: {path:?}"); - } - } - }) - .collect(); - - remap_paths(&mut paths); - - // Handle all test suite paths. - // (This is separate from the loop below to avoid having to handle multiple paths in `is_suite_path` somehow.) - paths.retain(|path| { - for StepExtra { desc, should_run } in &steps { - if let Some(suite) = should_run.is_suite_path(path) { - desc.maybe_run(builder, vec![suite.clone()]); - return false; - } - } - true - }); - - if paths.is_empty() { - return; - } - - let mut paths: Vec = paths.into_iter().map(|p| p.into()).collect(); - let mut path_lookup: Vec<(CLIStepPath, bool)> = - paths.clone().into_iter().map(|p| (p, false)).collect(); - - // Before actually running (non-suite) steps, collect them into a list of structs - // so that we can then sort the list to preserve CLI order as much as possible. - let mut steps_to_run = vec![]; - - for StepExtra { desc, should_run } in &steps { - let pathsets = should_run.pathset_for_paths_removing_matches(&mut paths, desc.kind); - - // This value is used for sorting the step execution order. - // By default, `usize::MAX` is used as the index for steps to assign them the lowest priority. - // - // If we resolve the step's path from the given CLI input, this value will be updated with - // the step's actual index. - let mut closest_index = usize::MAX; - - // Find the closest index from the original list of paths given by the CLI input. - for (index, (path, is_used)) in path_lookup.iter_mut().enumerate() { - if !*is_used && !paths.contains(path) { - closest_index = index; - *is_used = true; - break; - } - } - - steps_to_run.push(StepToRun { sort_index: closest_index, desc, pathsets }); - } - - // Sort the steps before running them to respect the CLI order. - steps_to_run.sort_by_key(|step| step.sort_index); - - // Handle all PathSets. - for StepToRun { sort_index: _, desc, pathsets } in steps_to_run { - if !pathsets.is_empty() { - desc.maybe_run(builder, pathsets); - } - } - - paths.retain(|p| !p.will_be_executed); - - if !paths.is_empty() { - eprintln!("ERROR: no `{}` rules matched {:?}", builder.kind.as_str(), paths); - eprintln!( - "HELP: run `x.py {} --help --verbose` to show a list of available paths", - builder.kind.as_str() - ); - eprintln!( - "NOTE: if you are adding a new Step to bootstrap itself, make sure you register it with `describe!`" - ); - crate::exit!(1); - } -} diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_ui.snap b/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_ui.snap deleted file mode 100644 index 5c764959cdaef..0000000000000 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_ui.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs -expression: test ui ---- -[Test] test::Ui - targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs index a995f5c8a219e..86a14246d09f2 100644 --- a/src/bootstrap/src/core/builder/mod.rs +++ b/src/bootstrap/src/core/builder/mod.rs @@ -1,7 +1,6 @@ use std::any::{Any, type_name}; use std::cell::{Cell, RefCell}; -use std::collections::BTreeSet; -use std::fmt::{Debug, Write}; +use std::fmt::Debug; use std::hash::Hash; use std::ops::Deref; use std::path::{Path, PathBuf}; @@ -10,6 +9,7 @@ use std::time::{Duration, Instant}; use std::{env, fs}; use clap::ValueEnum; +pub use selectors::{Alias, ShouldRun, StepSelectors, crate_description}; #[cfg(feature = "tracing")] use tracing::instrument; @@ -20,17 +20,16 @@ use crate::core::build_steps::tool::RustcPrivateCompilers; use crate::core::build_steps::{ check, clean, clippy, compile, dist, doc, gcc, install, llvm, run, setup, test, tool, vendor, }; -use crate::core::builder::cli_paths::CLIStepPath; +use crate::core::config::TargetSelection; use crate::core::config::flags::Subcommand; -use crate::core::config::{DryRun, TargetSelection}; use crate::utils::build_stamp::BuildStamp; use crate::utils::cache::Cache; use crate::utils::exec::{BootstrapCommand, ExecutionContext, command}; use crate::utils::helpers::{self, LldThreads, add_dylib_path, exe, libdir, linker_args, t}; -use crate::{Build, Crate, trace}; +use crate::{Build, trace}; mod cargo; -mod cli_paths; +mod selectors; #[cfg(test)] mod tests; @@ -71,7 +70,17 @@ pub struct Builder<'a> { /// executed to be logged instead. Used by snapshot tests of command-line /// paths-to-steps handling. #[expect(clippy::type_complexity)] - log_cli_step_for_tests: Option>, + log_cli_step_for_tests: + Option>, +} + +struct StepDescription { + is_host: bool, + should_run: fn(ShouldRun<'_>) -> ShouldRun<'_>, + is_default_step_fn: fn(&Builder<'_>) -> bool, + make_run: fn(RunConfig<'_>), + name: &'static str, + kind: Kind, } impl Deref for Builder<'_> { @@ -242,399 +251,13 @@ impl StepMetadata { pub struct RunConfig<'a> { pub builder: &'a Builder<'a>, pub target: TargetSelection, - pub paths: Vec, + pub paths: Vec, } impl RunConfig<'_> { pub fn build_triple(&self) -> TargetSelection { self.builder.build.host_target } - - /// Return a list of crate names selected by `run.paths`. - #[track_caller] - pub fn cargo_crates_in_set(&self) -> Vec { - let mut crates = Vec::new(); - for krate in &self.paths { - let path = &krate.assert_single_path().path; - - let crate_name = self - .builder - .crate_paths - .get(path) - .unwrap_or_else(|| panic!("missing crate for path {}", path.display())); - - crates.push(crate_name.to_string()); - } - crates - } - - /// Given an `alias` selected by the `Step` and the paths passed on the command line, - /// return a list of the crates that should be built. - /// - /// Normally, people will pass *just* `library` if they pass it. - /// But it's possible (although strange) to pass something like `library std core`. - /// Build all crates anyway, as if they hadn't passed the other args. - pub fn make_run_crates(&self, alias: Alias) -> Vec { - let has_alias = - self.paths.iter().any(|set| set.assert_single_path().path.ends_with(alias.as_str())); - if !has_alias { - return self.cargo_crates_in_set(); - } - - let crates = match alias { - Alias::Library => self.builder.in_tree_crates("sysroot", Some(self.target)), - Alias::Compiler => self.builder.in_tree_crates("rustc-main", Some(self.target)), - }; - - crates.into_iter().map(|krate| krate.name.to_string()).collect() - } -} - -#[derive(Debug, Copy, Clone)] -pub enum Alias { - Library, - Compiler, -} - -impl Alias { - fn as_str(self) -> &'static str { - match self { - Alias::Library => "library", - Alias::Compiler => "compiler", - } - } -} - -/// A description of the crates in this set, suitable for passing to `builder.info`. -/// -/// `crates` should be generated by [`RunConfig::cargo_crates_in_set`]. -pub fn crate_description(crates: &[impl AsRef]) -> String { - if crates.is_empty() { - return "".into(); - } - - let mut descr = String::from("{"); - descr.push_str(crates[0].as_ref()); - for krate in &crates[1..] { - descr.push_str(", "); - descr.push_str(krate.as_ref()); - } - descr.push('}'); - descr -} - -struct StepDescription { - is_host: bool, - should_run: fn(ShouldRun<'_>) -> ShouldRun<'_>, - is_default_step_fn: fn(&Builder<'_>) -> bool, - make_run: fn(RunConfig<'_>), - name: &'static str, - kind: Kind, -} - -#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)] -pub struct TaskPath { - pub path: PathBuf, - pub kind: Option, -} - -impl Debug for TaskPath { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(kind) = &self.kind { - write!(f, "{}::", kind.as_str())?; - } - write!(f, "{}", self.path.display()) - } -} - -/// Collection of paths used to match a task rule. -#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq)] -pub enum PathSet { - /// A collection of individual paths or aliases. - /// - /// These are generally matched as a path suffix. For example, a - /// command-line value of `std` will match if `library/std` is in the - /// set. - /// - /// NOTE: the paths within a set should always be aliases of one another. - /// For example, `src/librustdoc` and `src/tools/rustdoc` should be in the same set, - /// but `library/core` and `library/std` generally should not, unless there's no way (for that Step) - /// to build them separately. - Set(BTreeSet), - /// A "suite" of paths. - /// - /// These can match as a path suffix (like `Set`), or as a prefix. For - /// example, a command-line value of `tests/ui/abi/variadic-ffi.rs` - /// will match `tests/ui`. A command-line value of `ui` would also - /// match `tests/ui`. - Suite(TaskPath), -} - -impl PathSet { - fn empty() -> PathSet { - PathSet::Set(BTreeSet::new()) - } - - fn one>(path: P, kind: Kind) -> PathSet { - let mut set = BTreeSet::new(); - set.insert(TaskPath { path: path.into(), kind: Some(kind) }); - PathSet::Set(set) - } - - fn has(&self, needle: &Path, module: Kind) -> bool { - match self { - PathSet::Set(set) => set.iter().any(|p| Self::check(p, needle, module)), - PathSet::Suite(suite) => Self::check(suite, needle, module), - } - } - - // internal use only - fn check(p: &TaskPath, needle: &Path, module: Kind) -> bool { - let check_path = || { - // This order is important for retro-compatibility, as `starts_with` was introduced later. - p.path.ends_with(needle) || p.path.starts_with(needle) - }; - if let Some(p_kind) = &p.kind { check_path() && *p_kind == module } else { check_path() } - } - - /// Return all `TaskPath`s in `Self` that contain any of the `needles`, removing the - /// matched needles. - /// - /// This is used for `StepDescription::krate`, which passes all matching crates at once to - /// `Step::make_run`, rather than calling it many times with a single crate. - /// See `tests.rs` for examples. - fn intersection_removing_matches(&self, needles: &mut [CLIStepPath], module: Kind) -> PathSet { - let mut check = |p| { - let mut result = false; - for n in needles.iter_mut() { - let matched = Self::check(p, &n.path, module); - if matched { - n.will_be_executed = true; - result = true; - } - } - result - }; - match self { - PathSet::Set(set) => PathSet::Set(set.iter().filter(|&p| check(p)).cloned().collect()), - PathSet::Suite(suite) => { - if check(suite) { - self.clone() - } else { - PathSet::empty() - } - } - } - } - - /// A convenience wrapper for Steps which know they have no aliases and all their sets contain only a single path. - /// - /// This can be used with [`ShouldRun::crate_or_deps`], [`ShouldRun::path`], or [`ShouldRun::alias`]. - #[track_caller] - pub fn assert_single_path(&self) -> &TaskPath { - match self { - PathSet::Set(set) => { - assert_eq!(set.len(), 1, "called assert_single_path on multiple paths"); - set.iter().next().unwrap() - } - PathSet::Suite(_) => unreachable!("called assert_single_path on a Suite path"), - } - } -} - -impl StepDescription { - fn from(kind: Kind) -> StepDescription { - StepDescription { - is_host: S::IS_HOST, - should_run: S::should_run, - is_default_step_fn: S::is_default_step, - make_run: S::make_run, - name: std::any::type_name::(), - kind, - } - } - - fn maybe_run(&self, builder: &Builder<'_>, mut pathsets: Vec) { - pathsets.retain(|set| !self.is_excluded(builder, set)); - - if pathsets.is_empty() { - return; - } - - // Determine the targets participating in this rule. - let targets = if self.is_host { &builder.hosts } else { &builder.targets }; - - // Log the step that's about to run, for snapshot tests. - if let Some(ref log_cli_step) = builder.log_cli_step_for_tests { - log_cli_step(self, &pathsets, targets); - // Return so that the step won't actually run in snapshot tests. - return; - } - - for target in targets { - let run = RunConfig { builder, paths: pathsets.clone(), target: *target }; - (self.make_run)(run); - } - } - - fn is_excluded(&self, builder: &Builder<'_>, pathset: &PathSet) -> bool { - if builder.config.skip.iter().any(|e| pathset.has(e, builder.kind)) { - if !matches!(builder.config.get_dry_run(), DryRun::SelfCheck) { - println!("Skipping {pathset:?} because it is excluded"); - } - return true; - } - - if !builder.config.skip.is_empty() - && !matches!(builder.config.get_dry_run(), DryRun::SelfCheck) - { - builder.do_if_verbose(|| { - println!( - "{:?} not skipped for {:?} -- not in {:?}", - pathset, self.name, builder.config.skip - ) - }); - } - false - } -} - -/// Builder that allows steps to register command-line paths/aliases that -/// should cause those steps to be run. -/// -/// For example, if the user invokes `./x test compiler` or `./x doc unstable-book`, -/// this allows bootstrap to determine what steps "compiler" or "unstable-book" -/// correspond to. -pub struct ShouldRun<'a> { - pub builder: &'a Builder<'a>, - kind: Kind, - - // use a BTreeSet to maintain sort order - paths: BTreeSet, -} - -impl<'a> ShouldRun<'a> { - fn new(builder: &'a Builder<'_>, kind: Kind) -> ShouldRun<'a> { - ShouldRun { builder, kind, paths: BTreeSet::new() } - } - - /// Indicates it should run if the command-line selects the given crate or - /// any of its (local) dependencies. - /// - /// `make_run` will be called a single time with all matching command-line paths. - pub fn crate_or_deps(self, name: &str) -> Self { - let crates = self.builder.in_tree_crates(name, None); - self.crates(crates) - } - - /// Indicates it should run if the command-line selects any of the given crates. - /// - /// `make_run` will be called a single time with all matching command-line paths. - /// - /// Prefer [`ShouldRun::crate_or_deps`] to this function where possible. - pub(crate) fn crates(mut self, crates: Vec<&Crate>) -> Self { - for krate in crates { - let path = krate.local_path(self.builder); - self.paths.insert(PathSet::one(path, self.kind)); - } - self - } - - // single alias, which does not correspond to any on-disk path - pub fn alias(mut self, alias: &str) -> Self { - // exceptional case for `Kind::Setup` because its `library` - // and `compiler` options would otherwise naively match with - // `compiler` and `library` folders respectively. - assert!( - self.kind == Kind::Setup || !self.builder.src.join(alias).exists(), - "use `builder.path()` for real paths: {alias}" - ); - self.paths.insert(PathSet::Set( - std::iter::once(TaskPath { path: alias.into(), kind: Some(self.kind) }).collect(), - )); - self - } - - /// single, non-aliased path - /// - /// Must be an on-disk path; use `alias` for names that do not correspond to on-disk paths. - pub fn path(self, path: &str) -> Self { - self.paths(&[path]) - } - - /// Multiple aliases for the same job. - /// - /// This differs from [`path`] in that multiple calls to path will end up calling `make_run` - /// multiple times, whereas a single call to `paths` will only ever generate a single call to - /// `make_run`. - /// - /// This is analogous to `all_krates`, although `all_krates` is gone now. Prefer [`path`] where possible. - /// - /// [`path`]: ShouldRun::path - pub fn paths(mut self, paths: &[&str]) -> Self { - let submodules_paths = self.builder.submodule_paths(); - - self.paths.insert(PathSet::Set( - paths - .iter() - .map(|p| { - // assert only if `p` isn't submodule - if !submodules_paths.iter().any(|sm_p| p.contains(sm_p)) { - assert!( - self.builder.src.join(p).exists(), - "`should_run.paths` should correspond to real on-disk paths - use `alias` if there is no relevant path: {p}" - ); - } - - TaskPath { path: p.into(), kind: Some(self.kind) } - }) - .collect(), - )); - self - } - - /// Handles individual files (not directories) within a test suite. - fn is_suite_path(&self, requested_path: &Path) -> Option<&PathSet> { - self.paths.iter().find(|pathset| match pathset { - PathSet::Suite(suite) => requested_path.starts_with(&suite.path), - PathSet::Set(_) => false, - }) - } - - pub fn suite_path(mut self, suite: &str) -> Self { - self.paths.insert(PathSet::Suite(TaskPath { path: suite.into(), kind: Some(self.kind) })); - self - } - - // allows being more explicit about why should_run in Step returns the value passed to it - pub fn never(mut self) -> ShouldRun<'a> { - self.paths.insert(PathSet::empty()); - self - } - - /// Given a set of requested paths, return the subset which match the Step for this `ShouldRun`, - /// removing the matches from `paths`. - /// - /// NOTE: this returns multiple PathSets to allow for the possibility of multiple units of work - /// within the same step. For example, `test::Crate` allows testing multiple crates in the same - /// cargo invocation, which are put into separate sets because they aren't aliases. - /// - /// The reason we return PathSet instead of PathBuf is to allow for aliases that mean the same thing - /// (for now, just `all_krates` and `paths`, but we may want to add an `aliases` function in the future?) - fn pathset_for_paths_removing_matches( - &self, - paths: &mut [CLIStepPath], - kind: Kind, - ) -> Vec { - let mut sets = vec![]; - for pathset in &self.paths { - let subset = pathset.intersection_removing_matches(paths, kind); - if subset != PathSet::empty() { - sets.push(subset); - } - } - sets - } } #[derive(Debug, Copy, Clone, Eq, Hash, PartialEq, PartialOrd, Ord, ValueEnum)] @@ -1041,40 +664,6 @@ impl<'a> Builder<'a> { } } - pub fn get_help(build: &Build, kind: Kind) -> Option { - let step_descriptions = Builder::get_step_descriptions(kind); - if step_descriptions.is_empty() { - return None; - } - - let builder = Self::new_internal(build, kind, vec![]); - let builder = &builder; - // The "build" kind here is just a placeholder, it will be replaced with something else in - // the following statement. - let mut should_run = ShouldRun::new(builder, Kind::Build); - for desc in step_descriptions { - should_run.kind = desc.kind; - should_run = (desc.should_run)(should_run); - } - let mut help = String::from("Available paths:\n"); - let mut add_path = |path: &Path| { - t!(write!(help, " ./x.py {} {}\n", kind.as_str(), path.display())); - }; - for pathset in should_run.paths { - match pathset { - PathSet::Set(set) => { - for path in set { - add_path(&path.path); - } - } - PathSet::Suite(path) => { - add_path(&path.path.join("...")); - } - } - } - Some(help) - } - fn new_internal(build: &Build, kind: Kind, paths: Vec) -> Builder<'_> { Builder { build, @@ -1138,7 +727,7 @@ impl<'a> Builder<'a> { } fn run_step_descriptions(&self, v: &[StepDescription], paths: &[PathBuf]) { - cli_paths::match_paths_to_steps_and_run(self, v, paths); + selectors::match_paths_to_steps_and_run(self, v, paths); } /// Returns if `std` should be statically linked into `rustc_driver`. @@ -1622,47 +1211,6 @@ Alternatively, you can set `build.local-rebuild=true` and use a stage0 compiler out } - /// Ensure that a given step is built *only if it's supposed to be built by default*, returning - /// its output. This will cache the step, so it's safe (and good!) to call this as often as - /// needed to ensure that all dependencies are build. - pub(crate) fn ensure_if_default>( - &'a self, - step: S, - kind: Kind, - ) -> Option { - let desc = StepDescription::from::(kind); - let should_run = (desc.should_run)(ShouldRun::new(self, desc.kind)); - - // Avoid running steps contained in --skip - for pathset in &should_run.paths { - if desc.is_excluded(self, pathset) { - return None; - } - } - - // Only execute if it's supposed to run as default - if (desc.is_default_step_fn)(self) { Some(self.ensure(step)) } else { None } - } - - /// Checks if any of the "should_run" paths is in the `Builder` paths. - pub(crate) fn was_invoked_explicitly(&'a self, kind: Kind) -> bool { - let desc = StepDescription::from::(kind); - let should_run = (desc.should_run)(ShouldRun::new(self, desc.kind)); - - for path in &self.paths { - if should_run.paths.iter().any(|s| s.has(path, desc.kind)) - && !desc.is_excluded( - self, - &PathSet::Suite(TaskPath { path: path.clone(), kind: Some(desc.kind) }), - ) - { - return true; - } - } - - false - } - pub(crate) fn maybe_open_in_browser(&self, path: impl AsRef) { if self.was_invoked_explicitly::(Kind::Doc) { self.open_in_browser(path); diff --git a/src/bootstrap/src/core/builder/selectors.rs b/src/bootstrap/src/core/builder/selectors.rs new file mode 100644 index 0000000000000..5c020233b8e73 --- /dev/null +++ b/src/bootstrap/src/core/builder/selectors.rs @@ -0,0 +1,724 @@ +//! Various pieces of code for dealing with "paths" passed to bootstrap on the +//! command-line, extracted from `core/builder/mod.rs` because that file is +//! large and hard to navigate. + +use std::collections::BTreeSet; +use std::fmt::{self, Debug, Write}; +use std::path::{Path, PathBuf}; + +use crate::core::builder::{Builder, Kind, RunConfig, Step, StepDescription}; +use crate::core::config::DryRun; +use crate::{Build, Crate, t}; + +#[cfg(test)] +mod tests; + +pub(crate) const PATH_REMAP: &[(&str, &[&str])] = &[ + // Make `x test tests` function the same as `x t tests/*` + ( + "tests", + &[ + // tidy-alphabetical-start + "tests/assembly-llvm", + "tests/build-std", + "tests/codegen-llvm", + "tests/codegen-units", + "tests/coverage", + "tests/coverage-run-rustdoc", + "tests/crashes", + "tests/debuginfo", + "tests/incremental", + "tests/mir-opt", + "tests/pretty", + "tests/run-make", + "tests/run-make-cargo", + "tests/rustdoc-gui", + "tests/rustdoc-html", + "tests/rustdoc-js", + "tests/rustdoc-js-std", + "tests/rustdoc-json", + "tests/rustdoc-ui", + "tests/ui", + "tests/ui-fulldeps", + // tidy-alphabetical-end + ], + ), +]; + +pub(crate) fn remap_paths(paths: &mut Vec) { + let mut remove = vec![]; + let mut add = vec![]; + for (i, path) in paths.iter().enumerate().filter_map(|(i, path)| path.to_str().map(|s| (i, s))) + { + for &(search, replace) in PATH_REMAP { + // Remove leading and trailing slashes so `tests/` and `tests` are equivalent + if path.trim_matches(std::path::is_separator) == search { + remove.push(i); + add.extend(replace.iter().map(PathBuf::from)); + break; + } + } + } + remove.sort(); + remove.dedup(); + for idx in remove.into_iter().rev() { + paths.remove(idx); + } + paths.append(&mut add); +} + +#[derive(Clone, PartialEq)] +pub(crate) struct CLIStepPath { + pub(crate) path: PathBuf, + pub(crate) will_be_executed: bool, +} + +#[cfg(test)] +impl CLIStepPath { + pub(crate) fn will_be_executed(mut self, will_be_executed: bool) -> Self { + self.will_be_executed = will_be_executed; + self + } +} + +impl Debug for CLIStepPath { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.path.display()) + } +} + +impl From for CLIStepPath { + fn from(path: PathBuf) -> Self { + Self { path, will_be_executed: false } + } +} + +/// Combines a `StepDescription` with its corresponding `ShouldRun`. +struct StepExtra<'a> { + desc: &'a StepDescription, + should_run: ShouldRun<'a>, +} + +struct StepToRun<'a> { + sort_index: usize, + desc: &'a StepDescription, + pathsets: Vec, +} + +pub(crate) fn match_paths_to_steps_and_run( + builder: &Builder<'_>, + step_descs: &[StepDescription], + paths: &[PathBuf], +) { + // Obtain `ShouldRun` information for each step, so that we know which + // paths to match it against. + let steps = step_descs + .iter() + .map(|desc| StepExtra { + desc, + should_run: (desc.should_run)(ShouldRun::new(builder, desc.kind)), + }) + .collect::>(); + + // FIXME(Zalathar): This particular check isn't related to path-to-step + // matching, and should probably be hoisted to somewhere much earlier. + if builder.download_rustc() && (builder.kind == Kind::Dist || builder.kind == Kind::Install) { + eprintln!( + "ERROR: '{}' subcommand is incompatible with `rust.download-rustc`.", + builder.kind.as_str() + ); + crate::exit!(1); + } + + // sanity checks on rules + for StepExtra { desc, should_run } in &steps { + assert!(!should_run.paths.is_empty(), "{:?} should have at least one pathset", desc.name); + } + + if paths.is_empty() || builder.config.include_default_paths { + for StepExtra { desc, should_run } in &steps { + if (desc.is_default_step_fn)(builder) { + desc.maybe_run(builder, should_run.paths.iter().cloned().collect()); + } + } + } + + // Attempt to resolve paths to be relative to the builder source directory. + let mut paths: Vec = paths + .iter() + .map(|original_path| { + let mut path = original_path.clone(); + + // Someone could run `x ` from a different repository than the source + // directory. + // In that case, we should not try to resolve the paths relative to the working + // directory, but rather relative to the source directory. + // So we forcefully "relocate" the path to the source directory here. + if !path.is_absolute() { + path = builder.src.join(path); + } + + // If the path does not exist, it may represent the name of a Step, such as `tidy` in `x test tidy` + if !path.exists() { + // Use the original path here + return original_path.clone(); + } + + // Make the path absolute, strip the prefix, and convert to a PathBuf. + match std::path::absolute(&path) { + Ok(p) => p.strip_prefix(&builder.src).unwrap_or(&p).to_path_buf(), + Err(e) => { + eprintln!("ERROR: {e:?}"); + panic!("Due to the above error, failed to resolve path: {path:?}"); + } + } + }) + .collect(); + + remap_paths(&mut paths); + + // Handle all test suite paths. + // (This is separate from the loop below to avoid having to handle multiple paths in `is_suite_path` somehow.) + paths.retain(|path| { + for StepExtra { desc, should_run } in &steps { + if let Some(suite) = should_run.is_suite_path(path) { + desc.maybe_run(builder, vec![suite.clone()]); + return false; + } + } + true + }); + + if paths.is_empty() { + return; + } + + let mut paths: Vec = paths.into_iter().map(|p| p.into()).collect(); + let mut path_lookup: Vec<(CLIStepPath, bool)> = + paths.clone().into_iter().map(|p| (p, false)).collect(); + + // Before actually running (non-suite) steps, collect them into a list of structs + // so that we can then sort the list to preserve CLI order as much as possible. + let mut steps_to_run = vec![]; + + for StepExtra { desc, should_run } in &steps { + let pathsets = should_run.pathset_for_paths_removing_matches(&mut paths, desc.kind); + + // This value is used for sorting the step execution order. + // By default, `usize::MAX` is used as the index for steps to assign them the lowest priority. + // + // If we resolve the step's path from the given CLI input, this value will be updated with + // the step's actual index. + let mut closest_index = usize::MAX; + + // Find the closest index from the original list of paths given by the CLI input. + for (index, (path, is_used)) in path_lookup.iter_mut().enumerate() { + if !*is_used && !paths.contains(path) { + closest_index = index; + *is_used = true; + break; + } + } + + steps_to_run.push(StepToRun { sort_index: closest_index, desc, pathsets }); + } + + // Sort the steps before running them to respect the CLI order. + steps_to_run.sort_by_key(|step| step.sort_index); + + // Handle all PathSets. + for StepToRun { sort_index: _, desc, pathsets } in steps_to_run { + if !pathsets.is_empty() { + desc.maybe_run(builder, pathsets); + } + } + + paths.retain(|p| !p.will_be_executed); + + if !paths.is_empty() { + eprintln!("ERROR: no `{}` rules matched {:?}", builder.kind.as_str(), paths); + eprintln!( + "HELP: run `x.py {} --help --verbose` to show a list of available paths", + builder.kind.as_str() + ); + eprintln!( + "NOTE: if you are adding a new Step to bootstrap itself, make sure you register it with `describe!`" + ); + crate::exit!(1); + } +} + +#[derive(Debug, Copy, Clone)] +pub enum Alias { + Library, + Compiler, +} + +impl Alias { + fn as_str(self) -> &'static str { + match self { + Alias::Library => "library", + Alias::Compiler => "compiler", + } + } +} + +impl RunConfig<'_> { + /// Return a list of crate names selected by `run.paths`. + #[track_caller] + pub fn cargo_crates_in_set(&self) -> Vec { + let mut crates = Vec::new(); + for krate in &self.paths { + let path = &krate.assert_single_path().path; + + let crate_name = self + .builder + .crate_paths + .get(path) + .unwrap_or_else(|| panic!("missing crate for path {}", path.display())); + + crates.push(crate_name.to_string()); + } + crates + } + + /// Given an `alias` selected by the `Step` and the paths passed on the command line, + /// return a list of the crates that should be built. + /// + /// Normally, people will pass *just* `library` if they pass it. + /// But it's possible (although strange) to pass something like `library std core`. + /// Build all crates anyway, as if they hadn't passed the other args. + pub fn expand_alias(&self, alias: Alias) -> Vec { + let has_alias = + self.paths.iter().any(|set| set.assert_single_path().path.ends_with(alias.as_str())); + if !has_alias { + return self.cargo_crates_in_set(); + } + + let crates = match alias { + Alias::Library => self.builder.in_tree_crates("sysroot", Some(self.target)), + Alias::Compiler => self.builder.in_tree_crates("rustc-main", Some(self.target)), + }; + + crates.into_iter().map(|krate| krate.name.to_string()).collect() + } +} + +/// A description of the crates in this set, suitable for passing to `builder.info`. +/// +/// `crates` should be generated by [`RunConfig::cargo_crates_in_set`]. +pub fn crate_description(crates: &[impl AsRef]) -> String { + if crates.is_empty() { + return "".into(); + } + + let mut descr = String::from("{"); + descr.push_str(crates[0].as_ref()); + for krate in &crates[1..] { + descr.push_str(", "); + descr.push_str(krate.as_ref()); + } + descr.push('}'); + descr +} + +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)] +pub struct StepSelection { + pub path: PathBuf, + pub kind: Option, +} + +impl Debug for StepSelection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(cmd) = &self.kind { + write!(f, "{}::", cmd.as_str())?; + } + write!(f, "{}", self.path.display()) + } +} + +/// Collection of paths used to match a task rule. +#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq)] +pub enum StepSelectors { + /// A collection of individual paths or aliases. + /// + /// These are generally matched as a path suffix. For example, a + /// command-line value of `std` will match if `library/std` is in the + /// set. + /// + /// NOTE: the paths within a set should always be aliases of one another. + /// For example, `src/librustdoc` and `src/tools/rustdoc` should be in the same set, + /// but `library/core` and `library/std` generally should not, unless there's no way (for that Step) + /// to build them separately. + Set(BTreeSet), + /// A "suite" of paths. + /// + /// These can match as a path suffix (like `Set`), or as a prefix. For + /// example, a command-line value of `tests/ui/abi/variadic-ffi.rs` + /// will match `tests/ui`. A command-line value of `ui` would also + /// match `tests/ui`. + TestSuite(StepSelection), +} + +impl StepSelectors { + fn empty() -> StepSelectors { + StepSelectors::Set(BTreeSet::new()) + } + + fn one>(path: P, kind: Kind) -> StepSelectors { + let mut set = BTreeSet::new(); + set.insert(StepSelection { path: path.into(), kind: Some(kind) }); + StepSelectors::Set(set) + } + + fn has(&self, needle: &Path, module: Kind) -> bool { + match self { + StepSelectors::Set(set) => set.iter().any(|p| Self::check(p, needle, module)), + StepSelectors::TestSuite(suite) => Self::check(suite, needle, module), + } + } + + // internal use only + fn check(p: &StepSelection, needle: &Path, module: Kind) -> bool { + let check_path = || { + // This order is important for retro-compatibility, as `starts_with` was introduced later. + p.path.ends_with(needle) || p.path.starts_with(needle) + }; + if let Some(p_kind) = &p.kind { check_path() && *p_kind == module } else { check_path() } + } + + /// Return all `TaskPath`s in `Self` that contain any of the `needles`, removing the + /// matched needles. + /// + /// This is used for `StepDescription::krate`, which passes all matching crates at once to + /// `Step::make_run`, rather than calling it many times with a single crate. + /// See `tests.rs` for examples. + fn intersection_removing_matches( + &self, + needles: &mut [CLIStepPath], + module: Kind, + ) -> StepSelectors { + let mut check = |p| { + let mut result = false; + for n in needles.iter_mut() { + let matched = Self::check(p, &n.path, module); + if matched { + n.will_be_executed = true; + result = true; + } + } + result + }; + match self { + StepSelectors::Set(set) => { + StepSelectors::Set(set.iter().filter(|&p| check(p)).cloned().collect()) + } + StepSelectors::TestSuite(suite) => { + if check(suite) { + self.clone() + } else { + StepSelectors::empty() + } + } + } + } + + /// A convenience wrapper for Steps which know they have no aliases and all their sets contain only a single path. + /// + /// This can be used with [`ShouldRun::crate_or_deps`], [`ShouldRun::path`], or [`ShouldRun::alias`]. + #[track_caller] + pub fn assert_single_path(&self) -> &StepSelection { + match self { + StepSelectors::Set(set) => { + assert_eq!(set.len(), 1, "called assert_single_path on multiple paths"); + set.iter().next().unwrap() + } + StepSelectors::TestSuite(_) => { + unreachable!("called assert_single_path on a Suite path") + } + } + } +} + +impl StepDescription { + pub(crate) fn from(kind: Kind) -> StepDescription { + StepDescription { + is_host: S::IS_HOST, + should_run: S::should_run, + is_default_step_fn: S::is_default_step, + make_run: S::make_run, + name: std::any::type_name::(), + kind, + } + } + + fn maybe_run(&self, builder: &Builder<'_>, mut pathsets: Vec) { + pathsets.retain(|set| !self.is_excluded(builder, set)); + + if pathsets.is_empty() { + return; + } + + // Determine the targets participating in this rule. + let targets = if self.is_host { &builder.hosts } else { &builder.targets }; + + // Log the step that's about to run, for snapshot tests. + if let Some(ref log_cli_step) = builder.log_cli_step_for_tests { + log_cli_step(self, &pathsets, targets); + // Return so that the step won't actually run in snapshot tests. + return; + } + + for target in targets { + let run = RunConfig { builder, paths: pathsets.clone(), target: *target }; + (self.make_run)(run); + } + } + + fn is_excluded(&self, builder: &Builder<'_>, pathset: &StepSelectors) -> bool { + if builder.config.skip.iter().any(|e| pathset.has(e, builder.kind)) { + if !matches!(builder.config.get_dry_run(), DryRun::SelfCheck) { + println!("Skipping {pathset:?} because it is excluded"); + } + return true; + } + + if !builder.config.skip.is_empty() + && !matches!(builder.config.get_dry_run(), DryRun::SelfCheck) + { + builder.do_if_verbose(|| { + println!( + "{:?} not skipped for {:?} -- not in {:?}", + pathset, self.name, builder.config.skip + ) + }); + } + false + } +} + +/// Builder that allows steps to register command-line paths/aliases that +/// should cause those steps to be run. +/// +/// For example, if the user invokes `./x test compiler` or `./x doc unstable-book`, +/// this allows bootstrap to determine what steps "compiler" or "unstable-book" +/// correspond to. +pub struct ShouldRun<'a> { + pub builder: &'a Builder<'a>, + kind: Kind, + + // use a BTreeSet to maintain sort order + paths: BTreeSet, +} + +impl<'a> ShouldRun<'a> { + fn new(builder: &'a Builder<'_>, kind: Kind) -> ShouldRun<'a> { + ShouldRun { builder, kind, paths: BTreeSet::new() } + } + + /// Indicates it should run if the command-line selects the given crate or + /// any of its (local) dependencies. + /// + /// `make_run` will be called a single time with all matching command-line paths. + pub fn crate_or_deps(self, name: &str) -> Self { + let crates = self.builder.in_tree_crates(name, None); + self.crates(crates) + } + + /// Indicates it should run if the command-line selects any of the given crates. + /// + /// `make_run` will be called a single time with all matching command-line paths. + /// + /// Prefer [`ShouldRun::crate_or_deps`] to this function where possible. + pub(crate) fn crates(mut self, crates: Vec<&Crate>) -> Self { + for krate in crates { + let path = krate.local_path(self.builder); + self.paths.insert(StepSelectors::one(path, self.kind)); + } + self + } + + // single alias, which does not correspond to any on-disk path + pub fn alias(mut self, alias: &str) -> Self { + // exceptional case for `Kind::Setup` because its `library` + // and `compiler` options would otherwise naively match with + // `compiler` and `library` folders respectively. + assert!( + self.kind == Kind::Setup || !self.builder.src.join(alias).exists(), + "use `builder.path()` for real paths: {alias}" + ); + self.paths.insert(StepSelectors::Set( + std::iter::once(StepSelection { path: alias.into(), kind: Some(self.kind) }).collect(), + )); + self + } + + /// single, non-aliased path + /// + /// Must be an on-disk path; use `alias` for names that do not correspond to on-disk paths. + pub fn path(self, path: &str) -> Self { + self.paths(&[path]) + } + + /// Multiple aliases for the same job. + /// + /// This differs from [`path`] in that multiple calls to path will end up calling `make_run` + /// multiple times, whereas a single call to `paths` will only ever generate a single call to + /// `make_run`. + /// + /// This is analogous to `all_krates`, although `all_krates` is gone now. Prefer [`path`] where possible. + /// + /// [`path`]: ShouldRun::path + pub fn paths(mut self, paths: &[&str]) -> Self { + let submodules_paths = self.builder.submodule_paths(); + + self.paths.insert(StepSelectors::Set( + paths + .iter() + .map(|p| { + // assert only if `p` isn't submodule + if !submodules_paths.iter().any(|sm_p| p.contains(sm_p)) { + assert!( + self.builder.src.join(p).exists(), + "`should_run.paths` should correspond to real on-disk paths - use `alias` if there is no relevant path: {p}" + ); + } + + StepSelection { path: p.into(), kind: Some(self.kind) } + }) + .collect(), + )); + self + } + + /// Handles individual files (not directories) within a test suite. + fn is_suite_path(&self, requested_path: &Path) -> Option<&StepSelectors> { + self.paths.iter().find(|pathset| match pathset { + StepSelectors::TestSuite(suite) => requested_path.starts_with(&suite.path), + StepSelectors::Set(_) => false, + }) + } + + pub fn suite_path(mut self, suite: &str) -> Self { + self.paths.insert(StepSelectors::TestSuite(StepSelection { + path: suite.into(), + kind: Some(self.kind), + })); + self + } + + // allows being more explicit about why should_run in Step returns the value passed to it + pub fn never(mut self) -> ShouldRun<'a> { + self.paths.insert(StepSelectors::empty()); + self + } + + /// Given a set of requested paths, return the subset which match the Step for this `ShouldRun`, + /// removing the matches from `paths`. + /// + /// NOTE: this returns multiple PathSets to allow for the possibility of multiple units of work + /// within the same step. For example, `test::Crate` allows testing multiple crates in the same + /// cargo invocation, which are put into separate sets because they aren't aliases. + /// + /// The reason we return PathSet instead of PathBuf is to allow for aliases that mean the same thing + /// (for now, just `all_krates` and `paths`, but we may want to add an `aliases` function in the future?) + fn pathset_for_paths_removing_matches( + &self, + paths: &mut [CLIStepPath], + kind: Kind, + ) -> Vec { + let mut sets = vec![]; + for pathset in &self.paths { + let subset = pathset.intersection_removing_matches(paths, kind); + if subset != StepSelectors::empty() { + sets.push(subset); + } + } + sets + } +} + +impl<'a> Builder<'a> { + pub fn get_help(build: &Build, kind: Kind) -> Option { + let step_descriptions = Builder::get_step_descriptions(kind); + if step_descriptions.is_empty() { + return None; + } + + let builder = Self::new_internal(build, kind, vec![]); + let builder = &builder; + // The "build" cmd here is just a placeholder, it will be replaced with something else in + // the following statement. + let mut should_run = ShouldRun::new(builder, Kind::Build); + for desc in step_descriptions { + should_run.kind = desc.kind; + should_run = (desc.should_run)(should_run); + } + let mut help = String::from("Available paths:\n"); + let mut add_path = |path: &Path| { + t!(write!(help, " ./x.py {} {}\n", kind.as_str(), path.display())); + }; + for pathset in should_run.paths { + match pathset { + StepSelectors::Set(set) => { + for path in set { + add_path(&path.path); + } + } + StepSelectors::TestSuite(path) => { + add_path(&path.path.join("...")); + } + } + } + Some(help) + } + + /// Ensure that a given step is built *only if it's supposed to be built by default*, returning + /// its output. This will cache the step, so it's safe (and good!) to call this as often as + /// needed to ensure that all dependencies are build. + pub(crate) fn ensure_if_default>( + &'a self, + step: S, + kind: Kind, + ) -> Option { + let desc = StepDescription::from::(kind); + let should_run = (desc.should_run)(ShouldRun::new(self, desc.kind)); + + // Avoid running steps contained in --skip + for pathset in &should_run.paths { + if desc.is_excluded(self, pathset) { + return None; + } + } + + // Only execute if it's supposed to run as default + if (desc.is_default_step_fn)(self) { Some(self.ensure(step)) } else { None } + } + + /// Checks if any of the "should_run" paths is in the `Builder` paths. + pub(crate) fn was_invoked_explicitly(&'a self, kind: Kind) -> bool { + let desc = StepDescription::from::(kind); + let should_run = (desc.should_run)(ShouldRun::new(self, desc.kind)); + + for path in &self.paths { + if should_run.paths.iter().any(|s| s.has(path, desc.kind)) + && !desc.is_excluded( + self, + &StepSelectors::TestSuite(StepSelection { + path: path.clone(), + kind: Some(desc.kind), + }), + ) + { + return true; + } + } + + false + } +} + +#[cfg(test)] +mod test { + use super::*; +} diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_bench.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_bench.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_bench.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_bench.snap index 8a7815487913e..63b6552655fda 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_bench.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_bench.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: bench --- [Bench] test::Crate diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build.snap similarity index 92% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build.snap index f8c6deccb3bcb..b59b943de26dd 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build --- [Build] compile::Std diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiler.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiler.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiler.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiler.snap index 721ecaf4c487e..7e9017397cbe4 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiler.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiler.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build compiler --- [Build] compile::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiletest.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiletest.snap similarity index 71% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiletest.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiletest.snap index 97f60bfa0370b..3106d6e17371f 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_compiletest.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_compiletest.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build compiletest --- [Build] tool::Compiletest diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_library.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_library.snap similarity index 92% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_library.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_library.snap index 3fccd99850b8e..79e28570468df 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_library.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_library.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build library --- [Build] compile::Std diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_llvm.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_llvm.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_llvm.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_llvm.snap index f4764a5279a71..ba7ad40b60812 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_llvm.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_llvm.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build llvm --- [Build] llvm::Llvm diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc.snap index a6d3d13154ed4..0ca61684cec1b 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build rustc --- [Build] compile::Assemble diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc_llvm.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc_llvm.snap similarity index 70% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc_llvm.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc_llvm.snap index 30f598ddb7816..39a819eba1165 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustc_llvm.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustc_llvm.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build rustc_llvm --- [Build] compile::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustdoc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustdoc.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustdoc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustdoc.snap index 9a98092d714f4..c5ba97c8914f7 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_rustdoc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_rustdoc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build rustdoc --- [Build] tool::Rustdoc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_sysroot.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_sysroot.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_sysroot.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_build_sysroot.snap index a397095800a78..31a54bbae26a4 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_build_sysroot.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_build_sysroot.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: build sysroot --- [Build] compile::Std diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check.snap index 0fe26fac57fc5..ac549921107d6 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check --- [Check] check::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_bootstrap.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_bootstrap.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_bootstrap.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_bootstrap.snap index a746783b3909c..54466c3f2f321 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_bootstrap.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_bootstrap.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check bootstrap --- [Check] check::Bootstrap diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiler.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiler.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiler.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiler.snap index 71d9c0fafb809..f97fa1edf19d8 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiler.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiler.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check compiler --- [Check] check::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest.snap similarity index 71% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest.snap index 8f772bc55b82b..d9e2987ae3c31 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check compiletest --- [Check] check::Compiletest diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest_include_default_paths.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest_include_default_paths.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest_include_default_paths.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest_include_default_paths.snap index dae515c67ec6d..2d150e1f6d0dc 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_compiletest_include_default_paths.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_compiletest_include_default_paths.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check compiletest --include-default-paths --- [Check] check::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_library.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_library.snap similarity index 92% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_library.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_library.snap index 1a41aa98555b6..da6015b5b5288 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_library.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_library.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check library --- [Check] check::Std diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustc.snap similarity index 68% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustc.snap index 9aed81d2c22d6..adbd15cd845e6 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check rustc --- [Check] check::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustdoc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustdoc.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustdoc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustdoc.snap index 0a6b84f803c13..23baad8aec1dd 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_check_rustdoc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_check_rustdoc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: check rustdoc --- [Check] check::Rustdoc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_clean.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_clean.snap similarity index 64% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_clean.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_clean.snap index 71f12ecd501a7..864bbe214fd2b 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_clean.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_clean.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: clean --- [Clean] clean::CleanAll diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_clippy.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_clippy.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_clippy.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_clippy.snap index fe83346412857..e467d510202ee 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_clippy.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_clippy.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: clippy --- [Clippy] clippy::Std diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_dist.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_dist.snap similarity index 94% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_dist.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_dist.snap index 7fae0b24df94d..3b54aa4b8b1b9 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_dist.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_dist.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: dist --- [Dist] dist::Docs diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_doc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_doc.snap similarity index 97% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_doc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_doc.snap index 610a71ab70cf3..8fca27591f7b6 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_doc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_doc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: doc --- [Doc] doc::UnstableBook diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_fix.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_fix.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_fix.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_fix.snap index 222c0ffb40503..3718a0a8783b7 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_fix.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_fix.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: fix --- [Fix] check::Rustc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_fmt.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_fmt.snap similarity index 100% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_fmt.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_fmt.snap diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_install.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_install.snap similarity index 87% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_install.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_install.snap index 3aca9bc2c9eef..1f9be2777857f 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_install.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_install.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: install --- [Install] install::Docs diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_miri.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_miri.snap similarity index 91% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_miri.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_miri.snap index 552697b378bcc..df6949ad29ee7 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_miri.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_miri.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: miri --- [Miri] test::Crate diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_run.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_run.snap similarity index 100% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_run.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_run.snap diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_setup.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_setup.snap similarity index 89% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_setup.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_setup.snap index e0b93e1fe7a1d..53d41a3e1a8dd 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_setup.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_setup.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: setup --- [Setup] setup::Profile diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test.snap similarity index 89% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test.snap index 4ab84c3cabc1a..040279392341c 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test --- [Test] test::Tidy @@ -7,45 +7,45 @@ expression: test - Set({test::src/tools/tidy}) [Test] test::Ui targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) + - TestSuite(test::tests/ui) [Test] test::Crashes targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/crashes) + - TestSuite(test::tests/crashes) [Test] test::Coverage targets: [aarch64-unknown-linux-gnu] - Set({test::coverage-map}) - Set({test::coverage-run}) - - Suite(test::tests/coverage) + - TestSuite(test::tests/coverage) [Test] test::MirOpt targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/mir-opt) + - TestSuite(test::tests/mir-opt) [Test] test::CodegenLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-llvm) + - TestSuite(test::tests/codegen-llvm) [Test] test::CodegenUnits targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-units) + - TestSuite(test::tests/codegen-units) [Test] test::AssemblyLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/assembly-llvm) + - TestSuite(test::tests/assembly-llvm) [Test] test::Incremental targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/incremental) + - TestSuite(test::tests/incremental) [Test] test::Debuginfo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/debuginfo) + - TestSuite(test::tests/debuginfo) [Test] test::UiFullDeps targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/ui-fulldeps) + - TestSuite(test::tests/ui-fulldeps) [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) [Test] test::CoverageRunRustdoc targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/coverage-run-rustdoc) + - TestSuite(test::tests/coverage-run-rustdoc) [Test] test::Pretty targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/pretty) + - TestSuite(test::tests/pretty) [Test] test::CodegenCranelift targets: [x86_64-unknown-linux-gnu] - Set({test::compiler/rustc_codegen_cranelift}) @@ -185,19 +185,19 @@ expression: test - Set({test::src/doc/rustc}) [Test] test::RustdocJSStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js-std) + - TestSuite(test::tests/rustdoc-js-std) [Test] test::RustdocJSNotStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js) + - TestSuite(test::tests/rustdoc-js) [Test] test::RustdocTheme targets: [x86_64-unknown-linux-gnu] - Set({test::src/tools/rustdoc-themes}) [Test] test::RustdocUi targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-ui) + - TestSuite(test::tests/rustdoc-ui) [Test] test::RustdocJson targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-json) + - TestSuite(test::tests/rustdoc-json) [Test] test::HtmlCheck targets: [x86_64-unknown-linux-gnu] - Set({test::src/tools/html-checker}) @@ -209,7 +209,7 @@ expression: test - Set({test::src/tools/test-float-parse}) [Test] test::RunMake targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make) + - TestSuite(test::tests/run-make) [Test] test::RunMakeCargo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make-cargo) + - TestSuite(test::tests/run-make-cargo) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage.snap similarity index 50% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage.snap index 3b78d842dd704..1c0d78f33a357 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage.snap @@ -1,7 +1,7 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test coverage --- [Test] test::Coverage targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/coverage) + - TestSuite(test::tests/coverage) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_map.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_map.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_map.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_map.snap index fd79a0c8ad6ac..841431d88d133 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_map.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_map.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test coverage-map --- [Test] test::Coverage diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_run.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_run.snap similarity index 69% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_run.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_run.snap index 8ffadc424348e..5e937e6055dec 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_run.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_run.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test coverage-run --- [Test] test::Coverage diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_skip_coverage_run.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_skip_coverage_run.snap similarity index 54% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_skip_coverage_run.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_skip_coverage_run.snap index 76da4c82151ad..b89fdc012d286 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_coverage_skip_coverage_run.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_coverage_skip_coverage_run.snap @@ -1,7 +1,7 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test coverage --skip=coverage-run --- [Test] test::Coverage targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/coverage) + - TestSuite(test::tests/coverage) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_debuginfo.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_debuginfo.snap similarity index 50% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_debuginfo.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_debuginfo.snap index d462e1f7917d4..30f481e7abdc1 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_debuginfo.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_debuginfo.snap @@ -1,7 +1,7 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test debuginfo --- [Test] test::Debuginfo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/debuginfo) + - TestSuite(test::tests/debuginfo) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_library.snap similarity index 91% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_library.snap index dfc397597a877..defcd2dd0ba1d 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_library.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test library --- [Test] test::Crate diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc.snap similarity index 70% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc.snap index bd217dbe692a4..1de6eb9294d42 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test librustdoc --- [Test] test::CrateRustdoc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc_rustdoc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc_rustdoc.snap similarity index 100% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc_rustdoc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc_rustdoc.snap diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc_rustdoc_html.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc_rustdoc_html.snap similarity index 68% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc_rustdoc_html.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc_rustdoc_html.snap index 21acc1e460694..cf32b385a0c23 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_librustdoc_rustdoc_html.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_librustdoc_rustdoc_html.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test librustdoc rustdoc-html --- [Test] test::CrateRustdoc @@ -7,4 +7,4 @@ expression: test librustdoc rustdoc-html - Set({test::src/librustdoc}) [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc.snap similarity index 80% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc.snap index 897372dcd1c7a..79c73c50f9e07 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test rustdoc --- [Test] test::CrateRustdoc diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc_html.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc_html.snap similarity index 50% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc_html.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc_html.snap index a6a2a27c075ed..5e91341604977 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_rustdoc_html.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_rustdoc_html.snap @@ -1,7 +1,7 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test rustdoc-html --- [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_coverage.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_coverage.snap similarity index 90% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_coverage.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_coverage.snap index 2a4805e4fd687..b83a4220445b8 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_coverage.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_coverage.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test --skip=coverage --- [Test] test::Tidy @@ -7,44 +7,44 @@ expression: test --skip=coverage - Set({test::src/tools/tidy}) [Test] test::Ui targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) + - TestSuite(test::tests/ui) [Test] test::Crashes targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/crashes) + - TestSuite(test::tests/crashes) [Test] test::Coverage targets: [aarch64-unknown-linux-gnu] - Set({test::coverage-map}) - Set({test::coverage-run}) [Test] test::MirOpt targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/mir-opt) + - TestSuite(test::tests/mir-opt) [Test] test::CodegenLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-llvm) + - TestSuite(test::tests/codegen-llvm) [Test] test::CodegenUnits targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-units) + - TestSuite(test::tests/codegen-units) [Test] test::AssemblyLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/assembly-llvm) + - TestSuite(test::tests/assembly-llvm) [Test] test::Incremental targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/incremental) + - TestSuite(test::tests/incremental) [Test] test::Debuginfo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/debuginfo) + - TestSuite(test::tests/debuginfo) [Test] test::UiFullDeps targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/ui-fulldeps) + - TestSuite(test::tests/ui-fulldeps) [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) [Test] test::CoverageRunRustdoc targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/coverage-run-rustdoc) + - TestSuite(test::tests/coverage-run-rustdoc) [Test] test::Pretty targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/pretty) + - TestSuite(test::tests/pretty) [Test] test::CodegenCranelift targets: [x86_64-unknown-linux-gnu] - Set({test::compiler/rustc_codegen_cranelift}) @@ -184,19 +184,19 @@ expression: test --skip=coverage - Set({test::src/doc/rustc}) [Test] test::RustdocJSStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js-std) + - TestSuite(test::tests/rustdoc-js-std) [Test] test::RustdocJSNotStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js) + - TestSuite(test::tests/rustdoc-js) [Test] test::RustdocTheme targets: [x86_64-unknown-linux-gnu] - Set({test::src/tools/rustdoc-themes}) [Test] test::RustdocUi targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-ui) + - TestSuite(test::tests/rustdoc-ui) [Test] test::RustdocJson targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-json) + - TestSuite(test::tests/rustdoc-json) [Test] test::HtmlCheck targets: [x86_64-unknown-linux-gnu] - Set({test::src/tools/html-checker}) @@ -208,7 +208,7 @@ expression: test --skip=coverage - Set({test::src/tools/test-float-parse}) [Test] test::RunMake targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make) + - TestSuite(test::tests/run-make) [Test] test::RunMakeCargo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make-cargo) + - TestSuite(test::tests/run-make-cargo) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests.snap index 1468964c78189..e09340a9e2928 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests.snap @@ -1,6 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs -assertion_line: 68 +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test --skip=tests --- [Test] test::Tidy diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests_etc.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests_etc.snap similarity index 98% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests_etc.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests_etc.snap index 7ff6a201e77a2..0a4890ed609e8 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_skip_tests_etc.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_skip_tests_etc.snap @@ -1,6 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs -assertion_line: 68 +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test --skip=tests --skip=coverage-map --skip=coverage-run --skip=library --skip=tidyselftest --- [Test] test::Tidy diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests.snap similarity index 60% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests.snap index 65349a59a1e80..fbf802e4965ff 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests.snap @@ -1,67 +1,67 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test tests --- [Test] test::AssemblyLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/assembly-llvm) + - TestSuite(test::tests/assembly-llvm) [Test] test::BuildStd targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/build-std) + - TestSuite(test::tests/build-std) [Test] test::CodegenLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-llvm) + - TestSuite(test::tests/codegen-llvm) [Test] test::CodegenUnits targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-units) + - TestSuite(test::tests/codegen-units) [Test] test::Coverage targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/coverage) + - TestSuite(test::tests/coverage) [Test] test::CoverageRunRustdoc targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/coverage-run-rustdoc) + - TestSuite(test::tests/coverage-run-rustdoc) [Test] test::Crashes targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/crashes) + - TestSuite(test::tests/crashes) [Test] test::Debuginfo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/debuginfo) + - TestSuite(test::tests/debuginfo) [Test] test::Incremental targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/incremental) + - TestSuite(test::tests/incremental) [Test] test::MirOpt targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/mir-opt) + - TestSuite(test::tests/mir-opt) [Test] test::Pretty targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/pretty) + - TestSuite(test::tests/pretty) [Test] test::RunMake targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make) + - TestSuite(test::tests/run-make) [Test] test::RunMakeCargo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make-cargo) + - TestSuite(test::tests/run-make-cargo) [Test] test::RustdocGUI targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-gui) + - TestSuite(test::tests/rustdoc-gui) [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) [Test] test::RustdocJSNotStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js) + - TestSuite(test::tests/rustdoc-js) [Test] test::RustdocJSStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js-std) + - TestSuite(test::tests/rustdoc-js-std) [Test] test::RustdocJson targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-json) + - TestSuite(test::tests/rustdoc-json) [Test] test::RustdocUi targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-ui) + - TestSuite(test::tests/rustdoc-ui) [Test] test::Ui targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) + - TestSuite(test::tests/ui) [Test] test::UiFullDeps targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/ui-fulldeps) + - TestSuite(test::tests/ui-fulldeps) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_skip_coverage.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_skip_coverage.snap similarity index 60% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_skip_coverage.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_skip_coverage.snap index 694bb0672ee42..cb612db0e9399 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_skip_coverage.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_skip_coverage.snap @@ -1,64 +1,64 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test tests --skip=coverage --- [Test] test::AssemblyLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/assembly-llvm) + - TestSuite(test::tests/assembly-llvm) [Test] test::BuildStd targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/build-std) + - TestSuite(test::tests/build-std) [Test] test::CodegenLlvm targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-llvm) + - TestSuite(test::tests/codegen-llvm) [Test] test::CodegenUnits targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/codegen-units) + - TestSuite(test::tests/codegen-units) [Test] test::CoverageRunRustdoc targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/coverage-run-rustdoc) + - TestSuite(test::tests/coverage-run-rustdoc) [Test] test::Crashes targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/crashes) + - TestSuite(test::tests/crashes) [Test] test::Debuginfo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/debuginfo) + - TestSuite(test::tests/debuginfo) [Test] test::Incremental targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/incremental) + - TestSuite(test::tests/incremental) [Test] test::MirOpt targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/mir-opt) + - TestSuite(test::tests/mir-opt) [Test] test::Pretty targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/pretty) + - TestSuite(test::tests/pretty) [Test] test::RunMake targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make) + - TestSuite(test::tests/run-make) [Test] test::RunMakeCargo targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/run-make-cargo) + - TestSuite(test::tests/run-make-cargo) [Test] test::RustdocGUI targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-gui) + - TestSuite(test::tests/rustdoc-gui) [Test] test::RustdocHtml targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-html) + - TestSuite(test::tests/rustdoc-html) [Test] test::RustdocJSNotStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js) + - TestSuite(test::tests/rustdoc-js) [Test] test::RustdocJSStd targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-js-std) + - TestSuite(test::tests/rustdoc-js-std) [Test] test::RustdocJson targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-json) + - TestSuite(test::tests/rustdoc-json) [Test] test::RustdocUi targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/rustdoc-ui) + - TestSuite(test::tests/rustdoc-ui) [Test] test::Ui targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) + - TestSuite(test::tests/ui) [Test] test::UiFullDeps targets: [x86_64-unknown-linux-gnu] - - Suite(test::tests/ui-fulldeps) + - TestSuite(test::tests/ui-fulldeps) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_ui.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_ui.snap similarity index 50% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_ui.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_ui.snap index 1288af72fd5d2..d8373b4037a59 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tests_ui.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tests_ui.snap @@ -1,7 +1,7 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test tests/ui --- [Test] test::Ui targets: [aarch64-unknown-linux-gnu] - - Suite(test::tests/ui) + - TestSuite(test::tests/ui) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidy.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidy.snap similarity index 67% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidy.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidy.snap index b2bebf39e120c..ea2aaabd3d6fb 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidy.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidy.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test tidy --- [Test] test::Tidy diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidyselftest.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidyselftest.snap similarity index 70% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidyselftest.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidyselftest.snap index 945c82ef1cd02..525582453b3af 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_tidyselftest.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_tidyselftest.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: test tidyselftest --- [Test] test::CrateBootstrap diff --git a/src/bootstrap/src/core/builder/selectors/snapshots/x_test_ui.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_ui.snap new file mode 100644 index 0000000000000..3ff92f34a1222 --- /dev/null +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_test_ui.snap @@ -0,0 +1,7 @@ +--- +source: src/bootstrap/src/core/builder/selectors/tests.rs +expression: test ui +--- +[Test] test::Ui + targets: [aarch64-unknown-linux-gnu] + - TestSuite(test::tests/ui) diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_vendor.snap b/src/bootstrap/src/core/builder/selectors/snapshots/x_vendor.snap similarity index 68% rename from src/bootstrap/src/core/builder/cli_paths/snapshots/x_vendor.snap rename to src/bootstrap/src/core/builder/selectors/snapshots/x_vendor.snap index 57bfe51c2b8fa..3de091cac22be 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_vendor.snap +++ b/src/bootstrap/src/core/builder/selectors/snapshots/x_vendor.snap @@ -1,5 +1,5 @@ --- -source: src/bootstrap/src/core/builder/cli_paths/tests.rs +source: src/bootstrap/src/core/builder/selectors/tests.rs expression: vendor --- [Vendor] vendor::Vendor diff --git a/src/bootstrap/src/core/builder/cli_paths/tests.rs b/src/bootstrap/src/core/builder/selectors/tests.rs similarity index 78% rename from src/bootstrap/src/core/builder/cli_paths/tests.rs rename to src/bootstrap/src/core/builder/selectors/tests.rs index 39293abd4fb94..7ea8c3d745cf3 100644 --- a/src/bootstrap/src/core/builder/cli_paths/tests.rs +++ b/src/bootstrap/src/core/builder/selectors/tests.rs @@ -3,11 +3,61 @@ use std::fs; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; +use super::*; use crate::Build; -use crate::core::builder::cli_paths::match_paths_to_steps_and_run; use crate::core::builder::{Builder, StepDescription}; use crate::utils::tests::TestCtx; +#[test] +fn test_intersection() { + let set = |paths: &[&str]| { + StepSelectors::Set( + paths.into_iter().map(|p| StepSelection { path: p.into(), kind: None }).collect(), + ) + }; + let library_set = set(&["library/core", "library/alloc", "library/std"]); + let mut command_paths = vec![ + CLIStepPath::from(PathBuf::from("library/core")), + CLIStepPath::from(PathBuf::from("library/alloc")), + CLIStepPath::from(PathBuf::from("library/stdarch")), + ]; + let subset = library_set.intersection_removing_matches(&mut command_paths, Kind::Build); + assert_eq!(subset, set(&["library/core", "library/alloc"]),); + assert_eq!( + command_paths, + vec![ + CLIStepPath::from(PathBuf::from("library/core")).will_be_executed(true), + CLIStepPath::from(PathBuf::from("library/alloc")).will_be_executed(true), + CLIStepPath::from(PathBuf::from("library/stdarch")).will_be_executed(false), + ] + ); +} + +#[test] +fn test_resolve_parent_and_subpaths() { + let set = |paths: &[&str]| { + StepSelectors::Set( + paths.into_iter().map(|p| StepSelection { path: p.into(), kind: None }).collect(), + ) + }; + + let mut command_paths = vec![ + CLIStepPath::from(PathBuf::from("src/tools/miri")), + CLIStepPath::from(PathBuf::from("src/tools/miri/cargo-miri")), + ]; + + let library_set = set(&["src/tools/miri", "src/tools/miri/cargo-miri"]); + library_set.intersection_removing_matches(&mut command_paths, Kind::Build); + + assert_eq!( + command_paths, + vec![ + CLIStepPath::from(PathBuf::from("src/tools/miri")).will_be_executed(true), + CLIStepPath::from(PathBuf::from("src/tools/miri/cargo-miri")).will_be_executed(true), + ] + ); +} + fn render_steps_for_cli_args(args_str: &str) -> String { // Split a single string into a step kind and subsequent arguments. // E.g. "test ui" => ("test", &["ui"]) @@ -77,7 +127,7 @@ fn no_unused_snapshots_inner(known_test_names: &[&str]) { let mut unexpected_file_names = BTreeSet::new(); // FIXME(Zalathar): Is there a better way to locate the snapshots dir? - for entry in walkdir::WalkDir::new("src/core/builder/cli_paths/snapshots") + for entry in walkdir::WalkDir::new("src/core/builder/selectors/snapshots") .into_iter() .map(Result::unwrap) { diff --git a/src/bootstrap/src/core/builder/tests.rs b/src/bootstrap/src/core/builder/tests.rs index af26c2f87d026..fd6e6d8ff5a86 100644 --- a/src/bootstrap/src/core/builder/tests.rs +++ b/src/bootstrap/src/core/builder/tests.rs @@ -1,4 +1,5 @@ use std::env::VarError; +use std::fmt::Write; use std::{panic, thread}; use build_helper::stage0_parser::parse_stage0_file; @@ -7,7 +8,7 @@ use llvm::prebuilt_llvm_config; use super::*; use crate::Flags; use crate::core::build_steps::doc::DocumentationFormat; -use crate::core::builder::cli_paths::PATH_REMAP; +use crate::core::builder::selectors::{CLIStepPath, PATH_REMAP, StepSelection}; use crate::core::config::Config; use crate::utils::cache::ExecutedStep; use crate::utils::helpers::get_host_target; @@ -80,52 +81,6 @@ fn test_invalid() { check_cli(["test", "library/std", "x"]); } -#[test] -fn test_intersection() { - let set = |paths: &[&str]| { - PathSet::Set(paths.into_iter().map(|p| TaskPath { path: p.into(), kind: None }).collect()) - }; - let library_set = set(&["library/core", "library/alloc", "library/std"]); - let mut command_paths = vec![ - CLIStepPath::from(PathBuf::from("library/core")), - CLIStepPath::from(PathBuf::from("library/alloc")), - CLIStepPath::from(PathBuf::from("library/stdarch")), - ]; - let subset = library_set.intersection_removing_matches(&mut command_paths, Kind::Build); - assert_eq!(subset, set(&["library/core", "library/alloc"]),); - assert_eq!( - command_paths, - vec![ - CLIStepPath::from(PathBuf::from("library/core")).will_be_executed(true), - CLIStepPath::from(PathBuf::from("library/alloc")).will_be_executed(true), - CLIStepPath::from(PathBuf::from("library/stdarch")).will_be_executed(false), - ] - ); -} - -#[test] -fn test_resolve_parent_and_subpaths() { - let set = |paths: &[&str]| { - PathSet::Set(paths.into_iter().map(|p| TaskPath { path: p.into(), kind: None }).collect()) - }; - - let mut command_paths = vec![ - CLIStepPath::from(PathBuf::from("src/tools/miri")), - CLIStepPath::from(PathBuf::from("src/tools/miri/cargo-miri")), - ]; - - let library_set = set(&["src/tools/miri", "src/tools/miri/cargo-miri"]); - library_set.intersection_removing_matches(&mut command_paths, Kind::Build); - - assert_eq!( - command_paths, - vec![ - CLIStepPath::from(PathBuf::from("src/tools/miri")).will_be_executed(true), - CLIStepPath::from(PathBuf::from("src/tools/miri/cargo-miri")).will_be_executed(true), - ] - ); -} - #[test] fn validate_path_remap() { let build = Build::new(configure("test", &[TEST_TRIPLE_1], &[TEST_TRIPLE_1])); diff --git a/src/bootstrap/src/lib.rs b/src/bootstrap/src/lib.rs index dfa29b5aa3cd3..8c077f4d7067f 100644 --- a/src/bootstrap/src/lib.rs +++ b/src/bootstrap/src/lib.rs @@ -42,9 +42,9 @@ use crate::utils::helpers::{self, dir_is_empty, exe, libdir, set_file_times, spl mod core; mod utils; -pub use core::builder::PathSet; #[cfg(feature = "tracing")] pub use core::builder::STEP_SPAN_TARGET; +pub use core::builder::StepSelectors; pub use core::config::flags::{Flags, Subcommand}; pub use core::config::{ChangeId, Config};