@@ -637,6 +637,28 @@ impl Step for DebuggerScripts {
637637    } 
638638} 
639639
640+ fn  skip_host_target_lib ( builder :  & Builder < ' _ > ,  compiler :  Compiler )  -> bool  { 
641+     // The only true set of target libraries came from the build triple, so 
642+     // let's reduce redundant work by only producing archives from that host. 
643+     if  compiler. host  != builder. config . build  { 
644+         builder. info ( "\t skipping, not a build host" ) ; 
645+         true 
646+     }  else  { 
647+         false 
648+     } 
649+ } 
650+ 
651+ /// Copy stamped files into an image's `target/lib` directory. 
652+ fn  copy_target_libs ( builder :  & Builder < ' _ > ,  target :  & str ,  image :  & Path ,  stamp :  & Path )  { 
653+     let  dst = image. join ( "lib/rustlib" ) . join ( target) . join ( "lib" ) ; 
654+     t ! ( fs:: create_dir_all( & dst) ) ; 
655+     for  ( path,  host)  in  builder. read_stamp_file ( stamp)  { 
656+         if  !host || builder. config . build  == target { 
657+             builder. copy ( & path,  & dst. join ( path. file_name ( ) . unwrap ( ) ) ) ; 
658+         } 
659+     } 
660+ } 
661+ 
640662#[ derive( Debug ,  PartialOrd ,  Ord ,  Copy ,  Clone ,  Hash ,  PartialEq ,  Eq ) ]  
641663pub  struct  Std  { 
642664    pub  compiler :  Compiler , 
@@ -667,44 +689,19 @@ impl Step for Std {
667689        let  target = self . target ; 
668690
669691        let  name = pkgname ( builder,  "rust-std" ) ; 
670- 
671-         // The only true set of target libraries came from the build triple, so 
672-         // let's reduce redundant work by only producing archives from that host. 
673-         if  compiler. host  != builder. config . build  { 
674-             builder. info ( "\t skipping, not a build host" ) ; 
675-             return  distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" ,  name,  target) ) ; 
692+         let  archive = distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" ,  name,  target) ) ; 
693+         if  skip_host_target_lib ( builder,  compiler)  { 
694+             return  archive; 
676695        } 
677696
678-         // We want to package up as many target libraries as possible 
679-         // for the `rust-std` package, so if this is a host target we 
680-         // depend on librustc and otherwise we just depend on libtest. 
681-         if  builder. hosts . iter ( ) . any ( |t| t == target)  { 
682-             builder. ensure ( compile:: Rustc  {  compiler,  target } ) ; 
683-         }  else  { 
684-             builder. ensure ( compile:: Std  {  compiler,  target } ) ; 
685-         } 
697+         builder. ensure ( compile:: Std  {  compiler,  target } ) ; 
686698
687699        let  image = tmpdir ( builder) . join ( format ! ( "{}-{}-image" ,  name,  target) ) ; 
688700        let  _ = fs:: remove_dir_all ( & image) ; 
689701
690-         let  dst = image. join ( "lib/rustlib" ) . join ( target) ; 
691-         t ! ( fs:: create_dir_all( & dst) ) ; 
692-         let  mut  src = builder. sysroot_libdir ( compiler,  target) . to_path_buf ( ) ; 
693-         src. pop ( ) ;  // Remove the trailing /lib folder from the sysroot_libdir 
694-         builder. cp_filtered ( & src,  & dst,  & |path| { 
695-             if  let  Some ( name)  = path. file_name ( ) . and_then ( |s| s. to_str ( ) )  { 
696-                 if  name == builder. config . rust_codegen_backends_dir . as_str ( )  { 
697-                     return  false 
698-                 } 
699-                 if  name == "bin"  { 
700-                     return  false 
701-                 } 
702-                 if  name. contains ( "LLVM" )  { 
703-                     return  false 
704-                 } 
705-             } 
706-             true 
707-         } ) ; 
702+         let  compiler_to_use = builder. compiler_for ( compiler. stage ,  compiler. host ,  target) ; 
703+         let  stamp = compile:: libstd_stamp ( builder,  compiler_to_use,  target) ; 
704+         copy_target_libs ( builder,  & target,  & image,  & stamp) ; 
708705
709706        let  mut  cmd = rust_installer ( builder) ; 
710707        cmd. arg ( "generate" ) 
@@ -723,7 +720,73 @@ impl Step for Std {
723720        let  _time = timeit ( builder) ; 
724721        builder. run ( & mut  cmd) ; 
725722        builder. remove_dir ( & image) ; 
726-         distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" ,  name,  target) ) 
723+         archive
724+     } 
725+ } 
726+ 
727+ #[ derive( Debug ,  PartialOrd ,  Ord ,  Copy ,  Clone ,  Hash ,  PartialEq ,  Eq ) ]  
728+ pub  struct  RustcDev  { 
729+     pub  compiler :  Compiler , 
730+     pub  target :  Interned < String > , 
731+ } 
732+ 
733+ impl  Step  for  RustcDev  { 
734+     type  Output  = PathBuf ; 
735+     const  DEFAULT :  bool  = true ; 
736+     const  ONLY_HOSTS :  bool  = true ; 
737+ 
738+     fn  should_run ( run :  ShouldRun < ' _ > )  -> ShouldRun < ' _ >  { 
739+         run. path ( "rustc-dev" ) 
740+     } 
741+ 
742+     fn  make_run ( run :  RunConfig < ' _ > )  { 
743+         run. builder . ensure ( RustcDev  { 
744+             compiler :  run. builder . compiler_for ( 
745+                 run. builder . top_stage , 
746+                 run. builder . config . build , 
747+                 run. target , 
748+             ) , 
749+             target :  run. target , 
750+         } ) ; 
751+     } 
752+ 
753+     fn  run ( self ,  builder :  & Builder < ' _ > )  -> PathBuf  { 
754+         let  compiler = self . compiler ; 
755+         let  target = self . target ; 
756+ 
757+         let  name = pkgname ( builder,  "rustc-dev" ) ; 
758+         let  archive = distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" ,  name,  target) ) ; 
759+         if  skip_host_target_lib ( builder,  compiler)  { 
760+             return  archive; 
761+         } 
762+ 
763+         builder. ensure ( compile:: Rustc  {  compiler,  target } ) ; 
764+ 
765+         let  image = tmpdir ( builder) . join ( format ! ( "{}-{}-image" ,  name,  target) ) ; 
766+         let  _ = fs:: remove_dir_all ( & image) ; 
767+ 
768+         let  compiler_to_use = builder. compiler_for ( compiler. stage ,  compiler. host ,  target) ; 
769+         let  stamp = compile:: librustc_stamp ( builder,  compiler_to_use,  target) ; 
770+         copy_target_libs ( builder,  & target,  & image,  & stamp) ; 
771+ 
772+         let  mut  cmd = rust_installer ( builder) ; 
773+         cmd. arg ( "generate" ) 
774+            . arg ( "--product-name=Rust" ) 
775+            . arg ( "--rel-manifest-dir=rustlib" ) 
776+            . arg ( "--success-message=Rust-is-ready-to-develop." ) 
777+            . arg ( "--image-dir" ) . arg ( & image) 
778+            . arg ( "--work-dir" ) . arg ( & tmpdir ( builder) ) 
779+            . arg ( "--output-dir" ) . arg ( & distdir ( builder) ) 
780+            . arg ( format ! ( "--package-name={}-{}" ,  name,  target) ) 
781+            . arg ( format ! ( "--component-name=rustc-dev-{}" ,  target) ) 
782+            . arg ( "--legacy-manifest-dirs=rustlib,cargo" ) ; 
783+ 
784+         builder. info ( & format ! ( "Dist rustc-dev stage{} ({} -> {})" , 
785+             compiler. stage,  & compiler. host,  target) ) ; 
786+         let  _time = timeit ( builder) ; 
787+         builder. run ( & mut  cmd) ; 
788+         builder. remove_dir ( & image) ; 
789+         archive
727790    } 
728791} 
729792
0 commit comments