@@ -73,7 +73,7 @@ impl Step for Std {
73
73
74
74
fn run ( self , builder : & Builder < ' _ > ) {
75
75
let target = self . target ;
76
- let compiler = builder. compiler ( 0 , builder. config . build ) ;
76
+ let compiler = builder. compiler ( builder . top_stage , builder. config . build ) ;
77
77
78
78
let mut cargo = builder. cargo (
79
79
compiler,
@@ -94,9 +94,13 @@ impl Step for Std {
94
94
true ,
95
95
) ;
96
96
97
- let libdir = builder. sysroot_libdir ( compiler, target) ;
98
- let hostdir = builder. sysroot_libdir ( compiler, compiler. host ) ;
99
- add_to_sysroot ( & builder, & libdir, & hostdir, & libstd_stamp ( builder, compiler, target) ) ;
97
+ // We skip populating the sysroot in non-zero stage because that'll lead
98
+ // to rlib/rmeta conflicts if std gets built during this session.
99
+ if compiler. stage == 0 {
100
+ let libdir = builder. sysroot_libdir ( compiler, target) ;
101
+ let hostdir = builder. sysroot_libdir ( compiler, compiler. host ) ;
102
+ add_to_sysroot ( & builder, & libdir, & hostdir, & libstd_stamp ( builder, compiler, target) ) ;
103
+ }
100
104
101
105
// Then run cargo again, once we've put the rmeta files for the library
102
106
// crates into the sysroot. This is needed because e.g., core's tests
@@ -163,10 +167,20 @@ impl Step for Rustc {
163
167
/// the `compiler` targeting the `target` architecture. The artifacts
164
168
/// created will also be linked into the sysroot directory.
165
169
fn run ( self , builder : & Builder < ' _ > ) {
166
- let compiler = builder. compiler ( 0 , builder. config . build ) ;
170
+ let compiler = builder. compiler ( builder . top_stage , builder. config . build ) ;
167
171
let target = self . target ;
168
172
169
- builder. ensure ( Std { target } ) ;
173
+ if compiler. stage != 0 {
174
+ // If we're not in stage 0, then we won't have a std from the beta
175
+ // compiler around. That means we need to make sure there's one in
176
+ // the sysroot for the compiler to find. Otherwise, we're going to
177
+ // fail when building crates that need to generate code (e.g., build
178
+ // scripts and their dependencies).
179
+ builder. ensure ( crate :: compile:: Std { target : compiler. host , compiler } ) ;
180
+ builder. ensure ( crate :: compile:: Std { target, compiler } ) ;
181
+ } else {
182
+ builder. ensure ( Std { target } ) ;
183
+ }
170
184
171
185
let mut cargo = builder. cargo (
172
186
compiler,
@@ -225,7 +239,7 @@ impl Step for CodegenBackend {
225
239
}
226
240
227
241
fn run ( self , builder : & Builder < ' _ > ) {
228
- let compiler = builder. compiler ( 0 , builder. config . build ) ;
242
+ let compiler = builder. compiler ( builder . top_stage , builder. config . build ) ;
229
243
let target = self . target ;
230
244
let backend = self . backend ;
231
245
@@ -280,7 +294,7 @@ macro_rules! tool_check_step {
280
294
}
281
295
282
296
fn run( self , builder: & Builder <' _>) {
283
- let compiler = builder. compiler( 0 , builder. config. build) ;
297
+ let compiler = builder. compiler( builder . top_stage , builder. config. build) ;
284
298
let target = self . target;
285
299
286
300
builder. ensure( Rustc { target } ) ;
0 commit comments