@@ -461,24 +461,30 @@ impl Step for RustDemangler {
461
461
pub struct Miri {
462
462
stage : u32 ,
463
463
host : TargetSelection ,
464
+ target : TargetSelection ,
464
465
}
465
466
466
467
impl Step for Miri {
467
468
type Output = ( ) ;
468
- const ONLY_HOSTS : bool = true ;
469
+ const ONLY_HOSTS : bool = false ;
469
470
470
471
fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
471
472
run. path ( "src/tools/miri" )
472
473
}
473
474
474
475
fn make_run ( run : RunConfig < ' _ > ) {
475
- run. builder . ensure ( Miri { stage : run. builder . top_stage , host : run. target } ) ;
476
+ run. builder . ensure ( Miri {
477
+ stage : run. builder . top_stage ,
478
+ host : run. build_triple ( ) ,
479
+ target : run. target ,
480
+ } ) ;
476
481
}
477
482
478
483
/// Runs `cargo test` for miri.
479
484
fn run ( self , builder : & Builder < ' _ > ) {
480
485
let stage = self . stage ;
481
486
let host = self . host ;
487
+ let target = self . target ;
482
488
let compiler = builder. compiler ( stage, host) ;
483
489
// We need the stdlib for the *next* stage, as it was built with this compiler that also built Miri.
484
490
// Except if we are at stage 2, the bootstrap loop is complete and we can stick with our current stage.
@@ -495,7 +501,7 @@ impl Step for Miri {
495
501
builder. ensure ( compile:: Std :: new ( compiler_std, host) ) ;
496
502
let sysroot = builder. sysroot ( compiler_std) ;
497
503
498
- // # Run `cargo miri setup`.
504
+ // # Run `cargo miri setup` for the given target .
499
505
let mut cargo = tool:: prepare_tool_cargo (
500
506
builder,
501
507
compiler,
@@ -508,6 +514,7 @@ impl Step for Miri {
508
514
) ;
509
515
cargo. add_rustc_lib_path ( builder, compiler) ;
510
516
cargo. arg ( "--" ) . arg ( "miri" ) . arg ( "setup" ) ;
517
+ cargo. arg ( "--target" ) . arg ( target. rustc_target_arg ( ) ) ;
511
518
512
519
// Tell `cargo miri setup` where to find the sources.
513
520
cargo. env ( "MIRI_LIB_SRC" , builder. src . join ( "library" ) ) ;
@@ -556,17 +563,54 @@ impl Step for Miri {
556
563
cargo. add_rustc_lib_path ( builder, compiler) ;
557
564
558
565
// miri tests need to know about the stage sysroot
559
- cargo. env ( "MIRI_SYSROOT" , miri_sysroot) ;
566
+ cargo. env ( "MIRI_SYSROOT" , & miri_sysroot) ;
560
567
cargo. env ( "MIRI_HOST_SYSROOT" , sysroot) ;
561
568
cargo. env ( "RUSTC_LIB_PATH" , builder. rustc_libdir ( compiler) ) ;
562
- cargo. env ( "MIRI" , miri) ;
569
+ cargo. env ( "MIRI" , & miri) ;
563
570
// propagate --bless
564
571
if builder. config . cmd . bless ( ) {
565
572
cargo. env ( "MIRI_BLESS" , "Gesundheit" ) ;
566
573
}
567
574
575
+ // Set the target.
576
+ cargo. env ( "MIRI_TEST_TARGET" , target. rustc_target_arg ( ) ) ;
577
+ // Forward test filters.
578
+ cargo. arg ( "--" ) . args ( builder. config . cmd . test_args ( ) ) ;
579
+
580
+ let mut cargo = Command :: from ( cargo) ;
581
+ builder. run ( & mut cargo) ;
582
+
583
+ // # Run `cargo miri test`.
584
+ // This is just a smoke test (Miri's own CI invokes this in a bunch of different ways and ensures
585
+ // that we get the desired output), but that is sufficient to make sure that the libtest harness
586
+ // itself executes properly under Miri.
587
+ let mut cargo = tool:: prepare_tool_cargo (
588
+ builder,
589
+ compiler,
590
+ Mode :: ToolRustc ,
591
+ host,
592
+ "run" ,
593
+ "src/tools/miri/cargo-miri" ,
594
+ SourceType :: Submodule ,
595
+ & [ ] ,
596
+ ) ;
597
+ cargo. add_rustc_lib_path ( builder, compiler) ;
598
+ cargo. arg ( "--" ) . arg ( "miri" ) . arg ( "test" ) ;
599
+ cargo
600
+ . arg ( "--manifest-path" )
601
+ . arg ( builder. src . join ( "src/tools/miri/test-cargo-miri/Cargo.toml" ) ) ;
602
+ cargo. arg ( "--target" ) . arg ( target. rustc_target_arg ( ) ) ;
603
+ cargo. arg ( "--tests" ) ; // don't run doctests, they are too confused by the staging
568
604
cargo. arg ( "--" ) . args ( builder. config . cmd . test_args ( ) ) ;
569
605
606
+ // Tell `cargo miri` where to find things.
607
+ cargo. env ( "MIRI_SYSROOT" , & miri_sysroot) ;
608
+ cargo. env ( "MIRI_HOST_SYSROOT" , sysroot) ;
609
+ cargo. env ( "RUSTC_LIB_PATH" , builder. rustc_libdir ( compiler) ) ;
610
+ cargo. env ( "MIRI" , & miri) ;
611
+ // Debug things.
612
+ cargo. env ( "RUST_BACKTRACE" , "1" ) ;
613
+
570
614
let mut cargo = Command :: from ( cargo) ;
571
615
builder. run ( & mut cargo) ;
572
616
}
0 commit comments