Skip to content

Commit d33c57c

Browse files
authored
Rollup merge of rust-lang#76625 - jyn514:default-stages, r=Mark-Simulacrum
Make the default stage for x.py configurable This also allows configuring each sub-command individually. Possibly rust-lang#76617 should land before this? I don't feel strongly either way, I don't mind waiting. Closes rust-lang#76165. r? @Mark-Simulacrum
2 parents ca2db9e + 328c61c commit d33c57c

File tree

4 files changed

+79
-42
lines changed

4 files changed

+79
-42
lines changed

config.toml.example

+17
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,23 @@
126126
# General build configuration options
127127
# =============================================================================
128128
[build]
129+
# The default stage to use for the `doc` subcommand
130+
#doc-stage = 0
131+
132+
# The default stage to use for the `build` subcommand
133+
#build-stage = 1
134+
135+
# The default stage to use for the `test` subcommand
136+
#test-stage = 1
137+
138+
# The default stage to use for the `dist` subcommand
139+
#dist-stage = 2
140+
141+
# The default stage to use for the `install` subcommand
142+
#install-stage = 2
143+
144+
# The default stage to use for the `bench` subcommand
145+
#bench-stage = 2
129146

130147
# Build triple for the original snapshot compiler. This must be a compiler that
131148
# nightlies are already produced for. The current platform must be able to run

src/bootstrap/builder.rs

+2-29
Original file line numberDiff line numberDiff line change
@@ -526,23 +526,9 @@ impl<'a> Builder<'a> {
526526
}
527527

528528
fn new_internal(build: &Build, kind: Kind, paths: Vec<PathBuf>) -> Builder<'_> {
529-
let top_stage = if let Some(explicit_stage) = build.config.stage {
530-
explicit_stage
531-
} else {
532-
// See https://github.com/rust-lang/compiler-team/issues/326
533-
match kind {
534-
Kind::Doc => 0,
535-
Kind::Build | Kind::Test => 1,
536-
Kind::Bench | Kind::Dist | Kind::Install => 2,
537-
// These are all bootstrap tools, which don't depend on the compiler.
538-
// The stage we pass shouldn't matter, but use 0 just in case.
539-
Kind::Check | Kind::Clippy | Kind::Fix | Kind::Run | Kind::Format => 0,
540-
}
541-
};
542-
543529
Builder {
544530
build,
545-
top_stage,
531+
top_stage: build.config.stage,
546532
kind,
547533
cache: Cache::new(),
548534
stack: RefCell::new(Vec::new()),
@@ -566,20 +552,7 @@ impl<'a> Builder<'a> {
566552
Subcommand::Format { .. } | Subcommand::Clean { .. } => panic!(),
567553
};
568554

569-
let this = Self::new_internal(build, kind, paths.to_owned());
570-
571-
// CI should always run stage 2 builds, unless it specifically states otherwise
572-
#[cfg(not(test))]
573-
if build.config.stage.is_none() && build.ci_env != crate::CiEnv::None {
574-
match kind {
575-
Kind::Test | Kind::Doc | Kind::Build | Kind::Bench | Kind::Dist | Kind::Install => {
576-
assert_eq!(this.top_stage, 2)
577-
}
578-
Kind::Check | Kind::Clippy | Kind::Fix | Kind::Run | Kind::Format => {}
579-
}
580-
}
581-
582-
this
555+
Self::new_internal(build, kind, paths.to_owned())
583556
}
584557

585558
pub fn execute_cli(&self) {

src/bootstrap/builder/tests.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use super::*;
22
use crate::config::{Config, TargetSelection};
33
use std::thread;
44

5-
fn configure(host: &[&str], target: &[&str]) -> Config {
6-
let mut config = Config::default_opts();
5+
fn configure(cmd: &str, host: &[&str], target: &[&str]) -> Config {
6+
let mut config = Config::parse(&[cmd.to_owned()]);
77
// don't save toolstates
88
config.save_toolstates = None;
99
config.skip_only_host_steps = false;
@@ -42,7 +42,7 @@ mod defaults {
4242

4343
#[test]
4444
fn build_default() {
45-
let build = Build::new(configure(&[], &[]));
45+
let build = Build::new(configure("build", &[], &[]));
4646
let mut builder = Builder::new(&build);
4747
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
4848

@@ -70,7 +70,7 @@ mod defaults {
7070

7171
#[test]
7272
fn build_stage_0() {
73-
let config = Config { stage: Some(0), ..configure(&[], &[]) };
73+
let config = Config { stage: 0, ..configure("build", &[], &[]) };
7474
let build = Build::new(config);
7575
let mut builder = Builder::new(&build);
7676
builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Build), &[]);
@@ -92,7 +92,7 @@ mod defaults {
9292

9393
#[test]
9494
fn doc_default() {
95-
let mut config = configure(&[], &[]);
95+
let mut config = configure("doc", &[], &[]);
9696
config.compiler_docs = true;
9797
config.cmd = Subcommand::Doc { paths: Vec::new(), open: false };
9898
let build = Build::new(config);
@@ -126,7 +126,7 @@ mod dist {
126126
use pretty_assertions::assert_eq;
127127

128128
fn configure(host: &[&str], target: &[&str]) -> Config {
129-
Config { stage: Some(2), ..super::configure(host, target) }
129+
Config { stage: 2, ..super::configure("dist", host, target) }
130130
}
131131

132132
#[test]
@@ -455,7 +455,7 @@ mod dist {
455455
#[test]
456456
fn test_with_no_doc_stage0() {
457457
let mut config = configure(&[], &[]);
458-
config.stage = Some(0);
458+
config.stage = 0;
459459
config.cmd = Subcommand::Test {
460460
paths: vec!["library/std".into()],
461461
test_args: vec![],

src/bootstrap/config.rs

+53-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use std::ffi::OsString;
1010
use std::fmt;
1111
use std::fs;
1212
use std::path::{Path, PathBuf};
13-
use std::process;
1413

1514
use crate::cache::{Interned, INTERNER};
1615
use crate::flags::Flags;
@@ -68,7 +67,7 @@ pub struct Config {
6867
pub skip_only_host_steps: bool,
6968

7069
pub on_fail: Option<String>,
71-
pub stage: Option<u32>,
70+
pub stage: u32,
7271
pub keep_stage: Vec<u32>,
7372
pub src: PathBuf,
7473
pub jobs: Option<u32>,
@@ -313,6 +312,12 @@ struct Build {
313312
configure_args: Option<Vec<String>>,
314313
local_rebuild: Option<bool>,
315314
print_step_timings: Option<bool>,
315+
doc_stage: Option<u32>,
316+
build_stage: Option<u32>,
317+
test_stage: Option<u32>,
318+
install_stage: Option<u32>,
319+
dist_stage: Option<u32>,
320+
bench_stage: Option<u32>,
316321
}
317322

318323
/// TOML representation of various global install decisions.
@@ -495,13 +500,11 @@ impl Config {
495500

496501
pub fn parse(args: &[String]) -> Config {
497502
let flags = Flags::parse(&args);
498-
let file = flags.config.clone();
499503
let mut config = Config::default_opts();
500504
config.exclude = flags.exclude;
501505
config.rustc_error_format = flags.rustc_error_format;
502506
config.json_output = flags.json_output;
503507
config.on_fail = flags.on_fail;
504-
config.stage = flags.stage;
505508
config.jobs = flags.jobs.map(threads_from_config);
506509
config.cmd = flags.cmd;
507510
config.incremental = flags.incremental;
@@ -518,8 +521,14 @@ impl Config {
518521
config.out = dir;
519522
}
520523

521-
let toml = file
524+
#[cfg(test)]
525+
let toml = TomlConfig::default();
526+
#[cfg(not(test))]
527+
let toml = flags
528+
.config
522529
.map(|file| {
530+
use std::process;
531+
523532
let contents = t!(fs::read_to_string(&file));
524533
match toml::from_str(&contents) {
525534
Ok(table) => table,
@@ -535,7 +544,7 @@ impl Config {
535544
})
536545
.unwrap_or_else(TomlConfig::default);
537546

538-
let build = toml.build.clone().unwrap_or_default();
547+
let build = toml.build.unwrap_or_default();
539548

540549
// If --target was specified but --host wasn't specified, don't run any host-only tests.
541550
let has_hosts = build.host.is_some() || flags.host.is_some();
@@ -579,6 +588,44 @@ impl Config {
579588
set(&mut config.configure_args, build.configure_args);
580589
set(&mut config.local_rebuild, build.local_rebuild);
581590
set(&mut config.print_step_timings, build.print_step_timings);
591+
592+
// See https://github.com/rust-lang/compiler-team/issues/326
593+
config.stage = match config.cmd {
594+
Subcommand::Doc { .. } => flags.stage.or(build.doc_stage).unwrap_or(0),
595+
Subcommand::Build { .. } => flags.stage.or(build.build_stage).unwrap_or(1),
596+
Subcommand::Test { .. } => flags.stage.or(build.test_stage).unwrap_or(1),
597+
Subcommand::Bench { .. } => flags.stage.or(build.bench_stage).unwrap_or(2),
598+
Subcommand::Dist { .. } => flags.stage.or(build.dist_stage).unwrap_or(2),
599+
Subcommand::Install { .. } => flags.stage.or(build.install_stage).unwrap_or(2),
600+
// These are all bootstrap tools, which don't depend on the compiler.
601+
// The stage we pass shouldn't matter, but use 0 just in case.
602+
Subcommand::Clean { .. }
603+
| Subcommand::Check { .. }
604+
| Subcommand::Clippy { .. }
605+
| Subcommand::Fix { .. }
606+
| Subcommand::Run { .. }
607+
| Subcommand::Format { .. } => flags.stage.unwrap_or(0),
608+
};
609+
610+
// CI should always run stage 2 builds, unless it specifically states otherwise
611+
#[cfg(not(test))]
612+
if flags.stage.is_none() && crate::CiEnv::current() != crate::CiEnv::None {
613+
match config.cmd {
614+
Subcommand::Test { .. }
615+
| Subcommand::Doc { .. }
616+
| Subcommand::Build { .. }
617+
| Subcommand::Bench { .. }
618+
| Subcommand::Dist { .. }
619+
| Subcommand::Install { .. } => assert_eq!(config.stage, 2),
620+
Subcommand::Clean { .. }
621+
| Subcommand::Check { .. }
622+
| Subcommand::Clippy { .. }
623+
| Subcommand::Fix { .. }
624+
| Subcommand::Run { .. }
625+
| Subcommand::Format { .. } => {}
626+
}
627+
}
628+
582629
config.verbose = cmp::max(config.verbose, flags.verbose);
583630

584631
if let Some(ref install) = toml.install {

0 commit comments

Comments
 (0)