@@ -69,7 +69,7 @@ impl Step for Std {
6969 return ;
7070 }
7171
72- builder. ensure ( StartupObjects { compiler, target } ) ;
72+ let mut target_deps = builder. ensure ( StartupObjects { compiler, target } ) ;
7373
7474 let compiler_to_use = builder. compiler_for ( compiler. stage , compiler. host , target) ;
7575 if compiler_to_use != compiler {
@@ -91,7 +91,7 @@ impl Step for Std {
9191 return ;
9292 }
9393
94- copy_third_party_objects ( builder, & compiler, target) ;
94+ target_deps . extend ( copy_third_party_objects ( builder, & compiler, target) . into_iter ( ) ) ;
9595
9696 let mut cargo = builder. cargo ( compiler, Mode :: Std , target, "build" ) ;
9797 std_cargo ( builder, & compiler, target, & mut cargo) ;
@@ -102,6 +102,7 @@ impl Step for Std {
102102 cargo,
103103 vec ! [ ] ,
104104 & libstd_stamp ( builder, compiler, target) ,
105+ target_deps,
105106 false ) ;
106107
107108 builder. ensure ( StdLink {
@@ -113,29 +114,36 @@ impl Step for Std {
113114}
114115
115116/// Copies third pary objects needed by various targets.
116- fn copy_third_party_objects ( builder : & Builder < ' _ > , compiler : & Compiler , target : Interned < String > ) {
117+ fn copy_third_party_objects ( builder : & Builder < ' _ > , compiler : & Compiler , target : Interned < String > )
118+ -> Vec < PathBuf >
119+ {
117120 let libdir = builder. sysroot_libdir ( * compiler, target) ;
118121
122+ let mut target_deps = vec ! [ ] ;
123+
124+ let mut copy_and_stamp = |sourcedir : & Path , name : & str | {
125+ let target = libdir. join ( name) ;
126+ builder. copy (
127+ & sourcedir. join ( name) ,
128+ & target,
129+ ) ;
130+ target_deps. push ( target) ;
131+ } ;
132+
119133 // Copies the crt(1,i,n).o startup objects
120134 //
121135 // Since musl supports fully static linking, we can cross link for it even
122136 // with a glibc-targeting toolchain, given we have the appropriate startup
123137 // files. As those shipped with glibc won't work, copy the ones provided by
124138 // musl so we have them on linux-gnu hosts.
125139 if target. contains ( "musl" ) {
140+ let srcdir = builder. musl_root ( target) . unwrap ( ) . join ( "lib" ) ;
126141 for & obj in & [ "crt1.o" , "crti.o" , "crtn.o" ] {
127- builder. copy (
128- & builder. musl_root ( target) . unwrap ( ) . join ( "lib" ) . join ( obj) ,
129- & libdir. join ( obj) ,
130- ) ;
142+ copy_and_stamp ( & srcdir, obj) ;
131143 }
132144 } else if target. ends_with ( "-wasi" ) {
133- for & obj in & [ "crt1.o" ] {
134- builder. copy (
135- & builder. wasi_root ( target) . unwrap ( ) . join ( "lib/wasm32-wasi" ) . join ( obj) ,
136- & libdir. join ( obj) ,
137- ) ;
138- }
145+ let srcdir = builder. wasi_root ( target) . unwrap ( ) . join ( "lib/wasm32-wasi" ) ;
146+ copy_and_stamp ( & srcdir, "crt1.o" ) ;
139147 }
140148
141149 // Copies libunwind.a compiled to be linked wit x86_64-fortanix-unknown-sgx.
@@ -145,11 +153,11 @@ fn copy_third_party_objects(builder: &Builder<'_>, compiler: &Compiler, target:
145153 // which is provided by std for this target.
146154 if target == "x86_64-fortanix-unknown-sgx" {
147155 let src_path_env = "X86_FORTANIX_SGX_LIBS" ;
148- let obj = "libunwind.a" ;
149156 let src = env:: var ( src_path_env) . expect ( & format ! ( "{} not found in env" , src_path_env) ) ;
150- let src = Path :: new ( & src) . join ( obj) ;
151- builder. copy ( & src, & libdir. join ( obj) ) ;
157+ copy_and_stamp ( Path :: new ( & src) , "libunwind.a" ) ;
152158 }
159+
160+ target_deps
153161}
154162
155163/// Configure cargo to compile the standard library, adding appropriate env vars
@@ -307,7 +315,7 @@ pub struct StartupObjects {
307315}
308316
309317impl Step for StartupObjects {
310- type Output = ( ) ;
318+ type Output = Vec < PathBuf > ;
311319
312320 fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
313321 run. path ( "src/rtstartup" )
@@ -326,13 +334,15 @@ impl Step for StartupObjects {
326334 /// They don't require any library support as they're just plain old object
327335 /// files, so we just use the nightly snapshot compiler to always build them (as
328336 /// no other compilers are guaranteed to be available).
329- fn run ( self , builder : & Builder < ' _ > ) {
337+ fn run ( self , builder : & Builder < ' _ > ) -> Vec < PathBuf > {
330338 let for_compiler = self . compiler ;
331339 let target = self . target ;
332340 if !target. contains ( "windows-gnu" ) {
333- return
341+ return vec ! [ ]
334342 }
335343
344+ let mut target_deps = vec ! [ ] ;
345+
336346 let src_dir = & builder. src . join ( "src/rtstartup" ) ;
337347 let dst_dir = & builder. native_dir ( target) . join ( "rtstartup" ) ;
338348 let sysroot_dir = & builder. sysroot_libdir ( for_compiler, target) ;
@@ -351,16 +361,22 @@ impl Step for StartupObjects {
351361 . arg ( src_file) ) ;
352362 }
353363
354- builder. copy ( dst_file, & sysroot_dir. join ( file. to_string ( ) + ".o" ) ) ;
364+ let target = sysroot_dir. join ( file. to_string ( ) + ".o" ) ;
365+ builder. copy ( dst_file, & target) ;
366+ target_deps. push ( target) ;
355367 }
356368
357369 for obj in [ "crt2.o" , "dllcrt2.o" ] . iter ( ) {
358370 let src = compiler_file ( builder,
359371 builder. cc ( target) ,
360372 target,
361373 obj) ;
362- builder. copy ( & src, & sysroot_dir. join ( obj) ) ;
374+ let target = sysroot_dir. join ( obj) ;
375+ builder. copy ( & src, & target) ;
376+ target_deps. push ( target) ;
363377 }
378+
379+ target_deps
364380 }
365381}
366382
@@ -438,6 +454,7 @@ impl Step for Rustc {
438454 cargo,
439455 vec ! [ ] ,
440456 & librustc_stamp ( builder, compiler, target) ,
457+ vec ! [ ] ,
441458 false ) ;
442459
443460 builder. ensure ( RustcLink {
@@ -586,7 +603,7 @@ impl Step for CodegenBackend {
586603
587604 let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
588605
589- let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, false ) ;
606+ let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, vec ! [ ] , false ) ;
590607 if builder. config . dry_run {
591608 return ;
592609 }
@@ -954,6 +971,7 @@ pub fn run_cargo(builder: &Builder<'_>,
954971 cargo : Cargo ,
955972 tail_args : Vec < String > ,
956973 stamp : & Path ,
974+ additional_target_deps : Vec < PathBuf > ,
957975 is_check : bool )
958976 -> Vec < PathBuf >
959977{
@@ -1070,6 +1088,7 @@ pub fn run_cargo(builder: &Builder<'_>,
10701088 deps. push ( ( path_to_add. into ( ) , false ) ) ;
10711089 }
10721090
1091+ deps. extend ( additional_target_deps. into_iter ( ) . map ( |d| ( d, false ) ) ) ;
10731092 deps. sort ( ) ;
10741093 let mut new_contents = Vec :: new ( ) ;
10751094 for ( dep, proc_macro) in deps. iter ( ) {
0 commit comments