@@ -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