@@ -455,12 +455,14 @@ macro_rules! tool_check_step {
455
455
// The part of this path after the final '/' is also used as a display name.
456
456
path: $path: literal
457
457
$( , alt_path: $alt_path: literal ) *
458
+ , mode: $mode: path
458
459
$( , default : $default: literal ) ?
459
460
$( , ) ?
460
461
}
461
462
) => {
462
463
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
463
464
pub struct $name {
465
+ pub build_compiler: Compiler ,
464
466
pub target: TargetSelection ,
465
467
}
466
468
@@ -475,16 +477,33 @@ macro_rules! tool_check_step {
475
477
}
476
478
477
479
fn make_run( run: RunConfig <' _>) {
478
- run. builder. ensure( $name { target: run. target } ) ;
480
+ let host = run. builder. config. host_target;
481
+ let target = run. target;
482
+ let build_compiler = match $mode {
483
+ Mode :: ToolBootstrap => run. builder. compiler( 0 , host) ,
484
+ Mode :: ToolStd => {
485
+ // A small number of tools rely on in-tree standard
486
+ // library crates (e.g. compiletest needs libtest).
487
+ let build_compiler = run. builder. compiler( run. builder. top_stage, host) ;
488
+ run. builder. std( build_compiler, host) ;
489
+ run. builder. std( build_compiler, target) ;
490
+ build_compiler
491
+ }
492
+ Mode :: ToolRustc => {
493
+ prepare_compiler_for_tool_rustc( run. builder, target)
494
+ }
495
+ _ => panic!( "unexpected mode for tool check step: {:?}" , $mode) ,
496
+ } ;
497
+ run. builder. ensure( $name { target, build_compiler } ) ;
479
498
}
480
499
481
500
fn run( self , builder: & Builder <' _>) {
482
- let Self { target } = self ;
483
- run_tool_check_step( builder, target, stringify! ( $name ) , $path ) ;
501
+ let Self { target, build_compiler } = self ;
502
+ run_tool_check_step( builder, build_compiler , target, $path , $mode ) ;
484
503
}
485
504
486
505
fn metadata( & self ) -> Option <StepMetadata > {
487
- Some ( StepMetadata :: check( stringify!( $name) , self . target) )
506
+ Some ( StepMetadata :: check( stringify!( $name) , self . target) . built_by ( self . build_compiler ) )
488
507
}
489
508
}
490
509
}
@@ -493,19 +512,17 @@ macro_rules! tool_check_step {
493
512
/// Used by the implementation of `Step::run` in `tool_check_step!`.
494
513
fn run_tool_check_step (
495
514
builder : & Builder < ' _ > ,
515
+ build_compiler : Compiler ,
496
516
target : TargetSelection ,
497
- step_type_name : & str ,
498
517
path : & str ,
518
+ mode : Mode ,
499
519
) {
500
520
let display_name = path. rsplit ( '/' ) . next ( ) . unwrap ( ) ;
501
- let compiler = builder. compiler ( builder. top_stage , builder. config . host_target ) ;
502
-
503
- builder. ensure ( Rustc :: new ( builder, compiler, target) ) ;
504
521
505
522
let mut cargo = prepare_tool_cargo (
506
523
builder,
507
- compiler ,
508
- Mode :: ToolRustc ,
524
+ build_compiler ,
525
+ mode ,
509
526
target,
510
527
builder. kind ,
511
528
path,
@@ -517,33 +534,56 @@ fn run_tool_check_step(
517
534
& [ ] ,
518
535
) ;
519
536
537
+ // FIXME: check bootstrap doesn't currently work with --all-targets
520
538
cargo. arg ( "--all-targets" ) ;
521
539
522
- let stamp = BuildStamp :: new ( & builder. cargo_out ( compiler, Mode :: ToolRustc , target) )
523
- . with_prefix ( & format ! ( "{}-check" , step_type_name. to_lowercase( ) ) ) ;
540
+ let stamp = BuildStamp :: new ( & builder. cargo_out ( build_compiler, mode, target) )
541
+ . with_prefix ( & format ! ( "{display_name}-check" ) ) ;
542
+
543
+ let stage = match mode {
544
+ // Mode::ToolRustc is included here because of how msg_sysroot_tool prints stages
545
+ Mode :: Std | Mode :: ToolRustc => build_compiler. stage ,
546
+ _ => build_compiler. stage + 1 ,
547
+ } ;
524
548
525
- let _guard = builder. msg_check ( format ! ( "{display_name} artifacts" ) , target, None ) ;
549
+ let _guard =
550
+ builder. msg_tool ( builder. kind , mode, display_name, stage, & build_compiler. host , & target) ;
526
551
run_cargo ( builder, cargo, builder. config . free_args . clone ( ) , & stamp, vec ! [ ] , true , false ) ;
527
552
}
528
553
529
- tool_check_step ! ( Rustdoc { path: "src/tools/rustdoc" , alt_path: "src/librustdoc" } ) ;
554
+ tool_check_step ! ( Rustdoc {
555
+ path: "src/tools/rustdoc" ,
556
+ alt_path: "src/librustdoc" ,
557
+ mode: Mode :: ToolRustc
558
+ } ) ;
530
559
// Clippy, miri and Rustfmt are hybrids. They are external tools, but use a git subtree instead
531
560
// of a submodule. Since the SourceType only drives the deny-warnings
532
561
// behavior, treat it as in-tree so that any new warnings in clippy will be
533
562
// rejected.
534
- tool_check_step ! ( Clippy { path: "src/tools/clippy" } ) ;
535
- tool_check_step ! ( Miri { path: "src/tools/miri" } ) ;
536
- tool_check_step ! ( CargoMiri { path: "src/tools/miri/cargo-miri" } ) ;
537
- tool_check_step ! ( Rustfmt { path: "src/tools/rustfmt" } ) ;
538
- tool_check_step ! ( MiroptTestTools { path: "src/tools/miropt-test-tools" } ) ;
539
- tool_check_step ! ( TestFloatParse { path: "src/tools/test-float-parse" } ) ;
540
- tool_check_step ! ( FeaturesStatusDump { path: "src/tools/features-status-dump" } ) ;
541
-
542
- tool_check_step ! ( Bootstrap { path: "src/bootstrap" , default : false } ) ;
563
+ tool_check_step ! ( Clippy { path: "src/tools/clippy" , mode: Mode :: ToolRustc } ) ;
564
+ tool_check_step ! ( Miri { path: "src/tools/miri" , mode: Mode :: ToolRustc } ) ;
565
+ tool_check_step ! ( CargoMiri { path: "src/tools/miri/cargo-miri" , mode: Mode :: ToolRustc } ) ;
566
+ tool_check_step ! ( Rustfmt { path: "src/tools/rustfmt" , mode: Mode :: ToolRustc } ) ;
567
+ tool_check_step ! ( MiroptTestTools {
568
+ path: "src/tools/miropt-test-tools" ,
569
+ mode: Mode :: ToolBootstrap
570
+ } ) ;
571
+ // We want to test the local std
572
+ tool_check_step ! ( TestFloatParse { path: "src/tools/test-float-parse" , mode: Mode :: ToolStd } ) ;
573
+ tool_check_step ! ( FeaturesStatusDump {
574
+ path: "src/tools/features-status-dump" ,
575
+ mode: Mode :: ToolBootstrap
576
+ } ) ;
577
+
578
+ tool_check_step ! ( Bootstrap { path: "src/bootstrap" , mode: Mode :: ToolBootstrap , default : false } ) ;
543
579
544
580
// `run-make-support` will be built as part of suitable run-make compiletest test steps, but support
545
581
// check to make it easier to work on.
546
- tool_check_step ! ( RunMakeSupport { path: "src/tools/run-make-support" , default : false } ) ;
582
+ tool_check_step ! ( RunMakeSupport {
583
+ path: "src/tools/run-make-support" ,
584
+ mode: Mode :: ToolBootstrap ,
585
+ default : false
586
+ } ) ;
547
587
548
588
/// Check step for the `coverage-dump` bootstrap tool. The coverage-dump tool
549
589
/// is used internally by coverage tests.
0 commit comments