@@ -263,7 +263,7 @@ impl Step for Cargotest {
263263
264264 let _time = helpers:: timeit ( builder) ;
265265 let mut cmd = builder. tool_cmd ( Tool :: CargoTest ) ;
266- cmd. arg ( & cargo)
266+ cmd. arg ( & cargo. tool_path )
267267 . arg ( & out_dir)
268268 . args ( builder. config . test_args ( ) )
269269 . env ( "RUSTC" , builder. rustc ( compiler) )
@@ -298,9 +298,16 @@ impl Step for Cargo {
298298
299299 /// Runs `cargo test` for `cargo` packaged with Rust.
300300 fn run ( self , builder : & Builder < ' _ > ) {
301+ if self . stage < 2 {
302+ eprintln ! ( "WARNING: cargo tests on stage {} may not behave well." , self . stage) ;
303+ eprintln ! ( "HELP: consider using stage 2" ) ;
304+ }
305+
301306 let compiler = builder. compiler ( self . stage , self . host ) ;
302307
303- builder. ensure ( tool:: Cargo { compiler, target : self . host } ) ;
308+ let cargo = builder. ensure ( tool:: Cargo { compiler, target : self . host } ) ;
309+ let compiler = cargo. build_compiler ;
310+
304311 let cargo = tool:: prepare_tool_cargo (
305312 builder,
306313 compiler,
@@ -367,6 +374,7 @@ impl Step for RustAnalyzer {
367374 let stage = self . stage ;
368375 let host = self . host ;
369376 let compiler = builder. compiler ( stage, host) ;
377+ let compiler = tool:: get_tool_rustc_compiler ( builder, compiler) ;
370378
371379 // We don't need to build the whole Rust Analyzer for the proc-macro-srv test suite,
372380 // but we do need the standard library to be present.
@@ -427,7 +435,8 @@ impl Step for Rustfmt {
427435 let host = self . host ;
428436 let compiler = builder. compiler ( stage, host) ;
429437
430- builder. ensure ( tool:: Rustfmt { compiler, target : self . host } ) ;
438+ let tool_result = builder. ensure ( tool:: Rustfmt { compiler, target : self . host } ) ;
439+ let compiler = tool_result. build_compiler ;
431440
432441 let mut cargo = tool:: prepare_tool_cargo (
433442 builder,
@@ -522,16 +531,11 @@ impl Step for Miri {
522531
523532 // This compiler runs on the host, we'll just use it for the target.
524533 let target_compiler = builder. compiler ( stage, host) ;
525- // Similar to `compile::Assemble`, build with the previous stage's compiler. Otherwise
526- // we'd have stageN/bin/rustc and stageN/bin/rustdoc be effectively different stage
527- // compilers, which isn't what we want. Rustdoc should be linked in the same way as the
528- // rustc compiler it's paired with, so it must be built with the previous stage compiler.
529- let host_compiler = builder. compiler ( stage - 1 , host) ;
530534
531535 // Build our tools.
532- let miri = builder. ensure ( tool:: Miri { compiler : host_compiler , target : host } ) ;
536+ let miri = builder. ensure ( tool:: Miri { compiler : target_compiler , target : host } ) ;
533537 // the ui tests also assume cargo-miri has been built
534- builder. ensure ( tool:: CargoMiri { compiler : host_compiler , target : host } ) ;
538+ builder. ensure ( tool:: CargoMiri { compiler : target_compiler , target : host } ) ;
535539
536540 // We also need sysroots, for Miri and for the host (the latter for build scripts).
537541 // This is for the tests so everything is done with the target compiler.
@@ -542,7 +546,8 @@ impl Step for Miri {
542546 // Miri has its own "target dir" for ui test dependencies. Make sure it gets cleared when
543547 // the sysroot gets rebuilt, to avoid "found possibly newer version of crate `std`" errors.
544548 if !builder. config . dry_run ( ) {
545- let ui_test_dep_dir = builder. stage_out ( host_compiler, Mode :: ToolStd ) . join ( "miri_ui" ) ;
549+ let ui_test_dep_dir =
550+ builder. stage_out ( miri. build_compiler , Mode :: ToolStd ) . join ( "miri_ui" ) ;
546551 // The mtime of `miri_sysroot` changes when the sysroot gets rebuilt (also see
547552 // <https://github.com/RalfJung/rustc-build-sysroot/commit/10ebcf60b80fe2c3dc765af0ff19fdc0da4b7466>).
548553 // We can hence use that directly as a signal to clear the ui test dir.
@@ -553,7 +558,7 @@ impl Step for Miri {
553558 // This is with the Miri crate, so it uses the host compiler.
554559 let mut cargo = tool:: prepare_tool_cargo (
555560 builder,
556- host_compiler ,
561+ miri . build_compiler ,
557562 Mode :: ToolRustc ,
558563 host,
559564 Kind :: Test ,
@@ -571,7 +576,7 @@ impl Step for Miri {
571576 // miri tests need to know about the stage sysroot
572577 cargo. env ( "MIRI_SYSROOT" , & miri_sysroot) ;
573578 cargo. env ( "MIRI_HOST_SYSROOT" , & host_sysroot) ;
574- cargo. env ( "MIRI" , & miri) ;
579+ cargo. env ( "MIRI" , & miri. tool_path ) ;
575580
576581 // Set the target.
577582 cargo. env ( "MIRI_TEST_TARGET" , target. rustc_target_arg ( ) ) ;
@@ -743,7 +748,13 @@ impl Step for Clippy {
743748 let host = self . host ;
744749 let compiler = builder. compiler ( stage, host) ;
745750
746- builder. ensure ( tool:: Clippy { compiler, target : self . host } ) ;
751+ if stage < 2 {
752+ eprintln ! ( "WARNING: clippy tests on stage {stage} may not behave well." ) ;
753+ eprintln ! ( "HELP: consider using stage 2" ) ;
754+ }
755+
756+ let tool_result = builder. ensure ( tool:: Clippy { compiler, target : self . host } ) ;
757+ let compiler = tool_result. build_compiler ;
747758 let mut cargo = tool:: prepare_tool_cargo (
748759 builder,
749760 compiler,
@@ -1728,18 +1739,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
17281739 // If we're using `--stage 0`, we should provide the bootstrap cargo.
17291740 builder. initial_cargo . clone ( )
17301741 } else {
1731- // We need to properly build cargo using the suitable stage compiler.
1732-
1733- let compiler = builder. download_rustc ( ) . then_some ( compiler) . unwrap_or_else ( ||
1734- // HACK: currently tool stages are off-by-one compared to compiler stages, i.e. if
1735- // you give `tool::Cargo` a stage 1 rustc, it will cause stage 2 rustc to be built
1736- // and produce a cargo built with stage 2 rustc. To fix this, we need to chop off
1737- // the compiler stage by 1 to align with expected `./x test run-make --stage N`
1738- // behavior, i.e. we need to pass `N - 1` compiler stage to cargo. See also Miri
1739- // which does a similar hack.
1740- builder. compiler ( builder. top_stage - 1 , compiler. host ) ) ;
1741-
1742- builder. ensure ( tool:: Cargo { compiler, target : compiler. host } )
1742+ builder. ensure ( tool:: Cargo { compiler, target : compiler. host } ) . tool_path
17431743 } ;
17441744
17451745 cmd. arg ( "--cargo-path" ) . arg ( cargo_path) ;
@@ -1760,9 +1760,10 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
17601760 // Use the beta compiler for jsondocck
17611761 let json_compiler = compiler. with_stage ( 0 ) ;
17621762 cmd. arg ( "--jsondocck-path" )
1763- . arg ( builder. ensure ( tool:: JsonDocCk { compiler : json_compiler, target } ) ) ;
1764- cmd. arg ( "--jsondoclint-path" )
1765- . arg ( builder. ensure ( tool:: JsonDocLint { compiler : json_compiler, target } ) ) ;
1763+ . arg ( builder. ensure ( tool:: JsonDocCk { compiler : json_compiler, target } ) . tool_path ) ;
1764+ cmd. arg ( "--jsondoclint-path" ) . arg (
1765+ builder. ensure ( tool:: JsonDocLint { compiler : json_compiler, target } ) . tool_path ,
1766+ ) ;
17661767 }
17671768
17681769 if matches ! ( mode, "coverage-map" | "coverage-run" ) {
@@ -2999,12 +3000,15 @@ impl Step for RemoteCopyLibs {
29993000
30003001 builder. info ( & format ! ( "REMOTE copy libs to emulator ({target})" ) ) ;
30013002
3002- let server = builder. ensure ( tool:: RemoteTestServer { compiler, target } ) ;
3003+ let remote_test_server = builder. ensure ( tool:: RemoteTestServer { compiler, target } ) ;
30033004
30043005 // Spawn the emulator and wait for it to come online
30053006 let tool = builder. tool_exe ( Tool :: RemoteTestClient ) ;
30063007 let mut cmd = command ( & tool) ;
3007- cmd. arg ( "spawn-emulator" ) . arg ( target. triple ) . arg ( & server) . arg ( builder. tempdir ( ) ) ;
3008+ cmd. arg ( "spawn-emulator" )
3009+ . arg ( target. triple )
3010+ . arg ( & remote_test_server. tool_path )
3011+ . arg ( builder. tempdir ( ) ) ;
30083012 if let Some ( rootfs) = builder. qemu_rootfs ( target) {
30093013 cmd. arg ( rootfs) ;
30103014 }
0 commit comments