@@ -465,49 +465,20 @@ pub struct Miri {
465465    target :  TargetSelection , 
466466} 
467467
468- impl  Step  for  Miri  { 
469-     type  Output  = ( ) ; 
470-     const  ONLY_HOSTS :  bool  = false ; 
471- 
472-     fn  should_run ( run :  ShouldRun < ' _ > )  -> ShouldRun < ' _ >  { 
473-         run. path ( "src/tools/miri" ) 
474-     } 
475- 
476-     fn  make_run ( run :  RunConfig < ' _ > )  { 
477-         run. builder . ensure ( Miri  { 
478-             stage :  run. builder . top_stage , 
479-             host :  run. build_triple ( ) , 
480-             target :  run. target , 
481-         } ) ; 
482-     } 
483- 
484-     /// Runs `cargo test` for miri. 
485- fn  run ( self ,  builder :  & Builder < ' _ > )  { 
486-         let  stage = self . stage ; 
487-         let  host = self . host ; 
488-         let  target = self . target ; 
489-         let  compiler = builder. compiler ( stage,  host) ; 
490-         // We need the stdlib for the *next* stage, as it was built with this compiler that also built Miri. 
491-         // Except if we are at stage 2, the bootstrap loop is complete and we can stick with our current stage. 
492-         let  compiler_std = builder. compiler ( if  stage < 2  {  stage + 1  }  else  {  stage } ,  host) ; 
493- 
494-         let  miri = builder
495-             . ensure ( tool:: Miri  {  compiler,  target :  self . host ,  extra_features :  Vec :: new ( )  } ) 
496-             . expect ( "in-tree tool" ) ; 
497-         let  _cargo_miri = builder
498-             . ensure ( tool:: CargoMiri  {  compiler,  target :  self . host ,  extra_features :  Vec :: new ( )  } ) 
499-             . expect ( "in-tree tool" ) ; 
500-         // The stdlib we need might be at a different stage. And just asking for the 
501-         // sysroot does not seem to populate it, so we do that first. 
502-         builder. ensure ( compile:: Std :: new ( compiler_std,  host) ) ; 
503-         let  sysroot = builder. sysroot ( compiler_std) ; 
504- 
505-         // # Run `cargo miri setup` for the given target. 
468+ impl  Miri  { 
469+     /// Run `cargo miri setup` for the given target, return where the Miri sysroot was put. 
470+ pub  fn  build_miri_sysroot ( 
471+         builder :  & Builder < ' _ > , 
472+         compiler :  Compiler , 
473+         miri :  & Path , 
474+         target :  TargetSelection , 
475+     )  -> String  { 
476+         let  miri_sysroot = builder. out . join ( compiler. host . triple ) . join ( "miri-sysrot" ) ; 
506477        let  mut  cargo = tool:: prepare_tool_cargo ( 
507478            builder, 
508479            compiler, 
509480            Mode :: ToolRustc , 
510-             host, 
481+             compiler . host , 
511482            "run" , 
512483            "src/tools/miri/cargo-miri" , 
513484            SourceType :: InTree , 
@@ -521,6 +492,8 @@ impl Step for Miri {
521492        cargo. env ( "MIRI_LIB_SRC" ,  builder. src . join ( "library" ) ) ; 
522493        // Tell it where to find Miri. 
523494        cargo. env ( "MIRI" ,  & miri) ; 
495+         // Tell it where to put the sysroot. 
496+         cargo. env ( "MIRI_SYSROOT" ,  & miri_sysroot) ; 
524497        // Debug things. 
525498        cargo. env ( "RUST_BACKTRACE" ,  "1" ) ; 
526499
@@ -535,7 +508,7 @@ impl Step for Miri {
535508        cargo. arg ( "--print-sysroot" ) ; 
536509
537510        // FIXME: Is there a way in which we can re-use the usual `run` helpers? 
538-         let  miri_sysroot =  if  builder. config . dry_run  { 
511+         if  builder. config . dry_run  { 
539512            String :: new ( ) 
540513        }  else  { 
541514            builder. verbose ( & format ! ( "running: {:?}" ,  cargo) ) ; 
@@ -548,7 +521,48 @@ impl Step for Miri {
548521            let  sysroot = stdout. trim_end ( ) ; 
549522            builder. verbose ( & format ! ( "`cargo miri setup --print-sysroot` said: {:?}" ,  sysroot) ) ; 
550523            sysroot. to_owned ( ) 
551-         } ; 
524+         } 
525+     } 
526+ } 
527+ 
528+ impl  Step  for  Miri  { 
529+     type  Output  = ( ) ; 
530+     const  ONLY_HOSTS :  bool  = false ; 
531+ 
532+     fn  should_run ( run :  ShouldRun < ' _ > )  -> ShouldRun < ' _ >  { 
533+         run. path ( "src/tools/miri" ) 
534+     } 
535+ 
536+     fn  make_run ( run :  RunConfig < ' _ > )  { 
537+         run. builder . ensure ( Miri  { 
538+             stage :  run. builder . top_stage , 
539+             host :  run. build_triple ( ) , 
540+             target :  run. target , 
541+         } ) ; 
542+     } 
543+ 
544+     /// Runs `cargo test` for miri. 
545+ fn  run ( self ,  builder :  & Builder < ' _ > )  { 
546+         let  stage = self . stage ; 
547+         let  host = self . host ; 
548+         let  target = self . target ; 
549+         let  compiler = builder. compiler ( stage,  host) ; 
550+         // We need the stdlib for the *next* stage, as it was built with this compiler that also built Miri. 
551+         // Except if we are at stage 2, the bootstrap loop is complete and we can stick with our current stage. 
552+         let  compiler_std = builder. compiler ( if  stage < 2  {  stage + 1  }  else  {  stage } ,  host) ; 
553+ 
554+         let  miri = builder
555+             . ensure ( tool:: Miri  {  compiler,  target :  self . host ,  extra_features :  Vec :: new ( )  } ) 
556+             . expect ( "in-tree tool" ) ; 
557+         let  _cargo_miri = builder
558+             . ensure ( tool:: CargoMiri  {  compiler,  target :  self . host ,  extra_features :  Vec :: new ( )  } ) 
559+             . expect ( "in-tree tool" ) ; 
560+         // The stdlib we need might be at a different stage. And just asking for the 
561+         // sysroot does not seem to populate it, so we do that first. 
562+         builder. ensure ( compile:: Std :: new ( compiler_std,  host) ) ; 
563+         let  sysroot = builder. sysroot ( compiler_std) ; 
564+         // We also need a Miri sysroot. 
565+         let  miri_sysroot = Miri :: build_miri_sysroot ( builder,  compiler,  & miri,  target) ; 
552566
553567        // # Run `cargo test`. 
554568        let  mut  cargo = tool:: prepare_tool_cargo ( 
@@ -566,7 +580,6 @@ impl Step for Miri {
566580        // miri tests need to know about the stage sysroot 
567581        cargo. env ( "MIRI_SYSROOT" ,  & miri_sysroot) ; 
568582        cargo. env ( "MIRI_HOST_SYSROOT" ,  sysroot) ; 
569-         cargo. env ( "RUSTC_LIB_PATH" ,  builder. rustc_libdir ( compiler) ) ; 
570583        cargo. env ( "MIRI" ,  & miri) ; 
571584        // propagate --bless 
572585        if  builder. config . cmd . bless ( )  { 
@@ -607,7 +620,6 @@ impl Step for Miri {
607620        // Tell `cargo miri` where to find things. 
608621        cargo. env ( "MIRI_SYSROOT" ,  & miri_sysroot) ; 
609622        cargo. env ( "MIRI_HOST_SYSROOT" ,  sysroot) ; 
610-         cargo. env ( "RUSTC_LIB_PATH" ,  builder. rustc_libdir ( compiler) ) ; 
611623        cargo. env ( "MIRI" ,  & miri) ; 
612624        // Debug things. 
613625        cargo. env ( "RUST_BACKTRACE" ,  "1" ) ; 
0 commit comments