@@ -69,7 +69,7 @@ impl Step for Std {
69
69
return ;
70
70
}
71
71
72
- builder. ensure ( StartupObjects { compiler, target } ) ;
72
+ let mut target_deps = builder. ensure ( StartupObjects { compiler, target } ) ;
73
73
74
74
let compiler_to_use = builder. compiler_for ( compiler. stage , compiler. host , target) ;
75
75
if compiler_to_use != compiler {
@@ -91,7 +91,7 @@ impl Step for Std {
91
91
return ;
92
92
}
93
93
94
- copy_third_party_objects ( builder, & compiler, target) ;
94
+ target_deps . extend ( copy_third_party_objects ( builder, & compiler, target) . into_iter ( ) ) ;
95
95
96
96
let mut cargo = builder. cargo ( compiler, Mode :: Std , target, "build" ) ;
97
97
std_cargo ( builder, & compiler, target, & mut cargo) ;
@@ -102,6 +102,7 @@ impl Step for Std {
102
102
cargo,
103
103
vec ! [ ] ,
104
104
& libstd_stamp ( builder, compiler, target) ,
105
+ target_deps,
105
106
false ) ;
106
107
107
108
builder. ensure ( StdLink {
@@ -113,29 +114,36 @@ impl Step for Std {
113
114
}
114
115
115
116
/// 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
+ {
117
120
let libdir = builder. sysroot_libdir ( * compiler, target) ;
118
121
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
+
119
133
// Copies the crt(1,i,n).o startup objects
120
134
//
121
135
// Since musl supports fully static linking, we can cross link for it even
122
136
// with a glibc-targeting toolchain, given we have the appropriate startup
123
137
// files. As those shipped with glibc won't work, copy the ones provided by
124
138
// musl so we have them on linux-gnu hosts.
125
139
if target. contains ( "musl" ) {
140
+ let srcdir = builder. musl_root ( target) . unwrap ( ) . join ( "lib" ) ;
126
141
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) ;
131
143
}
132
144
} 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" ) ;
139
147
}
140
148
141
149
// 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:
145
153
// which is provided by std for this target.
146
154
if target == "x86_64-fortanix-unknown-sgx" {
147
155
let src_path_env = "X86_FORTANIX_SGX_LIBS" ;
148
- let obj = "libunwind.a" ;
149
156
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" ) ;
152
158
}
159
+
160
+ target_deps
153
161
}
154
162
155
163
/// Configure cargo to compile the standard library, adding appropriate env vars
@@ -307,7 +315,7 @@ pub struct StartupObjects {
307
315
}
308
316
309
317
impl Step for StartupObjects {
310
- type Output = ( ) ;
318
+ type Output = Vec < PathBuf > ;
311
319
312
320
fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
313
321
run. path ( "src/rtstartup" )
@@ -326,13 +334,15 @@ impl Step for StartupObjects {
326
334
/// They don't require any library support as they're just plain old object
327
335
/// files, so we just use the nightly snapshot compiler to always build them (as
328
336
/// no other compilers are guaranteed to be available).
329
- fn run ( self , builder : & Builder < ' _ > ) {
337
+ fn run ( self , builder : & Builder < ' _ > ) -> Vec < PathBuf > {
330
338
let for_compiler = self . compiler ;
331
339
let target = self . target ;
332
340
if !target. contains ( "windows-gnu" ) {
333
- return
341
+ return vec ! [ ]
334
342
}
335
343
344
+ let mut target_deps = vec ! [ ] ;
345
+
336
346
let src_dir = & builder. src . join ( "src/rtstartup" ) ;
337
347
let dst_dir = & builder. native_dir ( target) . join ( "rtstartup" ) ;
338
348
let sysroot_dir = & builder. sysroot_libdir ( for_compiler, target) ;
@@ -351,16 +361,22 @@ impl Step for StartupObjects {
351
361
. arg ( src_file) ) ;
352
362
}
353
363
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) ;
355
367
}
356
368
357
369
for obj in [ "crt2.o" , "dllcrt2.o" ] . iter ( ) {
358
370
let src = compiler_file ( builder,
359
371
builder. cc ( target) ,
360
372
target,
361
373
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) ;
363
377
}
378
+
379
+ target_deps
364
380
}
365
381
}
366
382
@@ -438,6 +454,7 @@ impl Step for Rustc {
438
454
cargo,
439
455
vec ! [ ] ,
440
456
& librustc_stamp ( builder, compiler, target) ,
457
+ vec ! [ ] ,
441
458
false ) ;
442
459
443
460
builder. ensure ( RustcLink {
@@ -586,7 +603,7 @@ impl Step for CodegenBackend {
586
603
587
604
let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
588
605
589
- let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, false ) ;
606
+ let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, vec ! [ ] , false ) ;
590
607
if builder. config . dry_run {
591
608
return ;
592
609
}
@@ -954,6 +971,7 @@ pub fn run_cargo(builder: &Builder<'_>,
954
971
cargo : Cargo ,
955
972
tail_args : Vec < String > ,
956
973
stamp : & Path ,
974
+ additional_target_deps : Vec < PathBuf > ,
957
975
is_check : bool )
958
976
-> Vec < PathBuf >
959
977
{
@@ -1070,6 +1088,7 @@ pub fn run_cargo(builder: &Builder<'_>,
1070
1088
deps. push ( ( path_to_add. into ( ) , false ) ) ;
1071
1089
}
1072
1090
1091
+ deps. extend ( additional_target_deps. into_iter ( ) . map ( |d| ( d, false ) ) ) ;
1073
1092
deps. sort ( ) ;
1074
1093
let mut new_contents = Vec :: new ( ) ;
1075
1094
for ( dep, proc_macro) in deps. iter ( ) {
0 commit comments