@@ -263,7 +263,7 @@ impl Step for Cargotest {
263
263
264
264
let _time = helpers:: timeit ( builder) ;
265
265
let mut cmd = builder. tool_cmd ( Tool :: CargoTest ) ;
266
- cmd. arg ( & cargo)
266
+ cmd. arg ( & cargo. tool_path )
267
267
. arg ( & out_dir)
268
268
. args ( builder. config . test_args ( ) )
269
269
. env ( "RUSTC" , builder. rustc ( compiler) )
@@ -298,9 +298,16 @@ impl Step for Cargo {
298
298
299
299
/// Runs `cargo test` for `cargo` packaged with Rust.
300
300
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
+
301
306
let compiler = builder. compiler ( self . stage , self . host ) ;
302
307
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
+
304
311
let cargo = tool:: prepare_tool_cargo (
305
312
builder,
306
313
compiler,
@@ -367,6 +374,7 @@ impl Step for RustAnalyzer {
367
374
let stage = self . stage ;
368
375
let host = self . host ;
369
376
let compiler = builder. compiler ( stage, host) ;
377
+ let compiler = tool:: get_tool_rustc_compiler ( builder, compiler) ;
370
378
371
379
// We don't need to build the whole Rust Analyzer for the proc-macro-srv test suite,
372
380
// but we do need the standard library to be present.
@@ -427,7 +435,8 @@ impl Step for Rustfmt {
427
435
let host = self . host ;
428
436
let compiler = builder. compiler ( stage, host) ;
429
437
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 ;
431
440
432
441
let mut cargo = tool:: prepare_tool_cargo (
433
442
builder,
@@ -522,16 +531,11 @@ impl Step for Miri {
522
531
523
532
// This compiler runs on the host, we'll just use it for the target.
524
533
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) ;
530
534
531
535
// 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 } ) ;
533
537
// 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 } ) ;
535
539
536
540
// We also need sysroots, for Miri and for the host (the latter for build scripts).
537
541
// This is for the tests so everything is done with the target compiler.
@@ -542,7 +546,8 @@ impl Step for Miri {
542
546
// Miri has its own "target dir" for ui test dependencies. Make sure it gets cleared when
543
547
// the sysroot gets rebuilt, to avoid "found possibly newer version of crate `std`" errors.
544
548
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" ) ;
546
551
// The mtime of `miri_sysroot` changes when the sysroot gets rebuilt (also see
547
552
// <https://github.com/RalfJung/rustc-build-sysroot/commit/10ebcf60b80fe2c3dc765af0ff19fdc0da4b7466>).
548
553
// We can hence use that directly as a signal to clear the ui test dir.
@@ -553,7 +558,7 @@ impl Step for Miri {
553
558
// This is with the Miri crate, so it uses the host compiler.
554
559
let mut cargo = tool:: prepare_tool_cargo (
555
560
builder,
556
- host_compiler ,
561
+ miri . build_compiler ,
557
562
Mode :: ToolRustc ,
558
563
host,
559
564
Kind :: Test ,
@@ -571,7 +576,7 @@ impl Step for Miri {
571
576
// miri tests need to know about the stage sysroot
572
577
cargo. env ( "MIRI_SYSROOT" , & miri_sysroot) ;
573
578
cargo. env ( "MIRI_HOST_SYSROOT" , & host_sysroot) ;
574
- cargo. env ( "MIRI" , & miri) ;
579
+ cargo. env ( "MIRI" , & miri. tool_path ) ;
575
580
576
581
// Set the target.
577
582
cargo. env ( "MIRI_TEST_TARGET" , target. rustc_target_arg ( ) ) ;
@@ -743,7 +748,13 @@ impl Step for Clippy {
743
748
let host = self . host ;
744
749
let compiler = builder. compiler ( stage, host) ;
745
750
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 ;
747
758
let mut cargo = tool:: prepare_tool_cargo (
748
759
builder,
749
760
compiler,
@@ -1728,18 +1739,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
1728
1739
// If we're using `--stage 0`, we should provide the bootstrap cargo.
1729
1740
builder. initial_cargo . clone ( )
1730
1741
} 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
1743
1743
} ;
1744
1744
1745
1745
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
1760
1760
// Use the beta compiler for jsondocck
1761
1761
let json_compiler = compiler. with_stage ( 0 ) ;
1762
1762
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
+ ) ;
1766
1767
}
1767
1768
1768
1769
if matches ! ( mode, "coverage-map" | "coverage-run" ) {
@@ -2999,12 +3000,15 @@ impl Step for RemoteCopyLibs {
2999
3000
3000
3001
builder. info ( & format ! ( "REMOTE copy libs to emulator ({target})" ) ) ;
3001
3002
3002
- let server = builder. ensure ( tool:: RemoteTestServer { compiler, target } ) ;
3003
+ let remote_test_server = builder. ensure ( tool:: RemoteTestServer { compiler, target } ) ;
3003
3004
3004
3005
// Spawn the emulator and wait for it to come online
3005
3006
let tool = builder. tool_exe ( Tool :: RemoteTestClient ) ;
3006
3007
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 ( ) ) ;
3008
3012
if let Some ( rootfs) = builder. qemu_rootfs ( target) {
3009
3013
cmd. arg ( rootfs) ;
3010
3014
}
0 commit comments