@@ -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
@@ -306,7 +314,7 @@ pub struct StartupObjects {
306
314
}
307
315
308
316
impl Step for StartupObjects {
309
- type Output = ( ) ;
317
+ type Output = Vec < PathBuf > ;
310
318
311
319
fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
312
320
run. path ( "src/rtstartup" )
@@ -325,13 +333,15 @@ impl Step for StartupObjects {
325
333
/// They don't require any library support as they're just plain old object
326
334
/// files, so we just use the nightly snapshot compiler to always build them (as
327
335
/// no other compilers are guaranteed to be available).
328
- fn run ( self , builder : & Builder < ' _ > ) {
336
+ fn run ( self , builder : & Builder < ' _ > ) -> Vec < PathBuf > {
329
337
let for_compiler = self . compiler ;
330
338
let target = self . target ;
331
339
if !target. contains ( "windows-gnu" ) {
332
- return
340
+ return vec ! [ ]
333
341
}
334
342
343
+ let mut target_deps = vec ! [ ] ;
344
+
335
345
let src_dir = & builder. src . join ( "src/rtstartup" ) ;
336
346
let dst_dir = & builder. native_dir ( target) . join ( "rtstartup" ) ;
337
347
let sysroot_dir = & builder. sysroot_libdir ( for_compiler, target) ;
@@ -350,16 +360,22 @@ impl Step for StartupObjects {
350
360
. arg ( src_file) ) ;
351
361
}
352
362
353
- builder. copy ( dst_file, & sysroot_dir. join ( file. to_string ( ) + ".o" ) ) ;
363
+ let target = sysroot_dir. join ( file. to_string ( ) + ".o" ) ;
364
+ builder. copy ( dst_file, & target) ;
365
+ target_deps. push ( target) ;
354
366
}
355
367
356
368
for obj in [ "crt2.o" , "dllcrt2.o" ] . iter ( ) {
357
369
let src = compiler_file ( builder,
358
370
builder. cc ( target) ,
359
371
target,
360
372
obj) ;
361
- builder. copy ( & src, & sysroot_dir. join ( obj) ) ;
373
+ let target = sysroot_dir. join ( obj) ;
374
+ builder. copy ( & src, & target) ;
375
+ target_deps. push ( target) ;
362
376
}
377
+
378
+ target_deps
363
379
}
364
380
}
365
381
@@ -437,6 +453,7 @@ impl Step for Rustc {
437
453
cargo,
438
454
vec ! [ ] ,
439
455
& librustc_stamp ( builder, compiler, target) ,
456
+ vec ! [ ] ,
440
457
false ) ;
441
458
442
459
builder. ensure ( RustcLink {
@@ -585,7 +602,7 @@ impl Step for CodegenBackend {
585
602
586
603
let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
587
604
588
- let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, false ) ;
605
+ let files = run_cargo ( builder, cargo, vec ! [ ] , & tmp_stamp, vec ! [ ] , false ) ;
589
606
if builder. config . dry_run {
590
607
return ;
591
608
}
@@ -941,6 +958,7 @@ pub fn run_cargo(builder: &Builder<'_>,
941
958
cargo : Cargo ,
942
959
tail_args : Vec < String > ,
943
960
stamp : & Path ,
961
+ additional_target_deps : Vec < PathBuf > ,
944
962
is_check : bool )
945
963
-> Vec < PathBuf >
946
964
{
@@ -1057,6 +1075,7 @@ pub fn run_cargo(builder: &Builder<'_>,
1057
1075
deps. push ( ( path_to_add. into ( ) , false ) ) ;
1058
1076
}
1059
1077
1078
+ deps. extend ( additional_target_deps. into_iter ( ) . map ( |d| ( d, false ) ) ) ;
1060
1079
deps. sort ( ) ;
1061
1080
let mut new_contents = Vec :: new ( ) ;
1062
1081
for ( dep, proc_macro) in deps. iter ( ) {
0 commit comments