@@ -10,7 +10,6 @@ use std::ffi::OsString;
1010use std:: fmt;
1111use std:: fs;
1212use std:: path:: { Path , PathBuf } ;
13- use std:: process;
1413
1514use crate :: cache:: { Interned , INTERNER } ;
1615use crate :: flags:: Flags ;
@@ -57,7 +56,7 @@ pub struct Config {
5756 pub skip_only_host_steps : bool ,
5857
5958 pub on_fail : Option < String > ,
60- pub stage : Option < u32 > ,
59+ pub stage : u32 ,
6160 pub keep_stage : Vec < u32 > ,
6261 pub src : PathBuf ,
6362 pub jobs : Option < u32 > ,
@@ -300,6 +299,12 @@ struct Build {
300299 configure_args : Option < Vec < String > > ,
301300 local_rebuild : Option < bool > ,
302301 print_step_timings : Option < bool > ,
302+ doc_stage : Option < u32 > ,
303+ build_stage : Option < u32 > ,
304+ test_stage : Option < u32 > ,
305+ install_stage : Option < u32 > ,
306+ dist_stage : Option < u32 > ,
307+ bench_stage : Option < u32 > ,
303308}
304309
305310/// TOML representation of various global install decisions.
@@ -480,13 +485,11 @@ impl Config {
480485
481486 pub fn parse ( args : & [ String ] ) -> Config {
482487 let flags = Flags :: parse ( & args) ;
483- let file = flags. config . clone ( ) ;
484488 let mut config = Config :: default_opts ( ) ;
485489 config. exclude = flags. exclude ;
486490 config. rustc_error_format = flags. rustc_error_format ;
487491 config. json_output = flags. json_output ;
488492 config. on_fail = flags. on_fail ;
489- config. stage = flags. stage ;
490493 config. jobs = flags. jobs . map ( threads_from_config) ;
491494 config. cmd = flags. cmd ;
492495 config. incremental = flags. incremental ;
@@ -503,8 +506,14 @@ impl Config {
503506 config. out = dir;
504507 }
505508
506- let toml = file
509+ #[ cfg( test) ]
510+ let toml = TomlConfig :: default ( ) ;
511+ #[ cfg( not( test) ) ]
512+ let toml = flags
513+ . config
507514 . map ( |file| {
515+ use std:: process;
516+
508517 let contents = t ! ( fs:: read_to_string( & file) ) ;
509518 match toml:: from_str ( & contents) {
510519 Ok ( table) => table,
@@ -520,7 +529,7 @@ impl Config {
520529 } )
521530 . unwrap_or_else ( TomlConfig :: default) ;
522531
523- let build = toml. build . clone ( ) . unwrap_or_default ( ) ;
532+ let build = toml. build . unwrap_or_default ( ) ;
524533
525534 // If --target was specified but --host wasn't specified, don't run any host-only tests.
526535 let has_hosts = build. host . is_some ( ) || flags. host . is_some ( ) ;
@@ -564,6 +573,44 @@ impl Config {
564573 set ( & mut config. configure_args , build. configure_args ) ;
565574 set ( & mut config. local_rebuild , build. local_rebuild ) ;
566575 set ( & mut config. print_step_timings , build. print_step_timings ) ;
576+
577+ // See https://github.com/rust-lang/compiler-team/issues/326
578+ config. stage = match config. cmd {
579+ Subcommand :: Doc { .. } => flags. stage . or ( build. doc_stage ) . unwrap_or ( 0 ) ,
580+ Subcommand :: Build { .. } => flags. stage . or ( build. build_stage ) . unwrap_or ( 1 ) ,
581+ Subcommand :: Test { .. } => flags. stage . or ( build. test_stage ) . unwrap_or ( 1 ) ,
582+ Subcommand :: Bench { .. } => flags. stage . or ( build. bench_stage ) . unwrap_or ( 2 ) ,
583+ Subcommand :: Dist { .. } => flags. stage . or ( build. dist_stage ) . unwrap_or ( 2 ) ,
584+ Subcommand :: Install { .. } => flags. stage . or ( build. install_stage ) . unwrap_or ( 2 ) ,
585+ // These are all bootstrap tools, which don't depend on the compiler.
586+ // The stage we pass shouldn't matter, but use 0 just in case.
587+ Subcommand :: Clean { .. }
588+ | Subcommand :: Check { .. }
589+ | Subcommand :: Clippy { .. }
590+ | Subcommand :: Fix { .. }
591+ | Subcommand :: Run { .. }
592+ | Subcommand :: Format { .. } => flags. stage . unwrap_or ( 0 ) ,
593+ } ;
594+
595+ // CI should always run stage 2 builds, unless it specifically states otherwise
596+ #[ cfg( not( test) ) ]
597+ if flags. stage . is_none ( ) && crate :: CiEnv :: current ( ) != crate :: CiEnv :: None {
598+ match config. cmd {
599+ Subcommand :: Test { .. }
600+ | Subcommand :: Doc { .. }
601+ | Subcommand :: Build { .. }
602+ | Subcommand :: Bench { .. }
603+ | Subcommand :: Dist { .. }
604+ | Subcommand :: Install { .. } => assert_eq ! ( config. stage, 2 ) ,
605+ Subcommand :: Clean { .. }
606+ | Subcommand :: Check { .. }
607+ | Subcommand :: Clippy { .. }
608+ | Subcommand :: Fix { .. }
609+ | Subcommand :: Run { .. }
610+ | Subcommand :: Format { .. } => { }
611+ }
612+ }
613+
567614 config. verbose = cmp:: max ( config. verbose , flags. verbose ) ;
568615
569616 if let Some ( ref install) = toml. install {
0 commit comments