@@ -173,7 +173,8 @@ impl TestCx<'_> {
173
173
fn run_rmake_v2_test ( & self ) {
174
174
// For `run-make` V2, we need to perform 2 steps to build and run a `run-make` V2 recipe
175
175
// (`rmake.rs`) to run the actual tests. The support library is already built as a tool rust
176
- // library and is available under `build/$TARGET/stageN-tools-bin/librun_make_support.rlib`.
176
+ // library and is available under
177
+ // `build/$HOST/stage0-bootstrap-tools/$TARGET/release/librun_make_support.rlib`.
177
178
//
178
179
// 1. We need to build the recipe `rmake.rs` as a binary and link in the `run_make_support`
179
180
// library.
@@ -224,25 +225,21 @@ impl TestCx<'_> {
224
225
//
225
226
// ```
226
227
// build/<target_triple>/
227
- // ├── stageN-tools-bin/
228
- // │ └── librun_make_support.rlib // <- support rlib itself
229
- // ├── stageN-tools/
230
- // │ ├── release/deps/ // <- deps of deps
231
- // │ └── <host_triple>/release/deps/ // <- deps
228
+ // ├── stage0-bootstrap-tools/
229
+ // │ ├── <host_triple>/release/librun_make_support.rlib // <- support rlib itself
230
+ // │ ├── <host_triple>/release/deps/ // <- deps
231
+ // │ └── release/deps/ // <- deps of deps
232
232
// ```
233
233
//
234
234
// FIXME(jieyouxu): there almost certainly is a better way to do this (specifically how the
235
- // support lib and its deps are organized, can't we copy them to the tools-bin dir as
236
- // well?), but this seems to work for now.
235
+ // support lib and its deps are organized), but this seems to work for now.
237
236
238
- let stage_number = self . config . stage ;
237
+ let tools_bin = host_build_root. join ( "stage0-bootstrap-tools" ) ;
238
+ let support_host_path = tools_bin. join ( & self . config . host ) . join ( "release" ) ;
239
+ let support_lib_path = support_host_path. join ( "librun_make_support.rlib" ) ;
239
240
240
- let stage_tools_bin = host_build_root. join ( format ! ( "stage{stage_number}-tools-bin" ) ) ;
241
- let support_lib_path = stage_tools_bin. join ( "librun_make_support.rlib" ) ;
242
-
243
- let stage_tools = host_build_root. join ( format ! ( "stage{stage_number}-tools" ) ) ;
244
- let support_lib_deps = stage_tools. join ( & self . config . host ) . join ( "release" ) . join ( "deps" ) ;
245
- let support_lib_deps_deps = stage_tools. join ( "release" ) . join ( "deps" ) ;
241
+ let support_lib_deps = support_host_path. join ( "deps" ) ;
242
+ let support_lib_deps_deps = tools_bin. join ( "release" ) . join ( "deps" ) ;
246
243
247
244
// To compile the recipe with rustc, we need to provide suitable dynamic library search
248
245
// paths to rustc. This includes both:
@@ -253,12 +250,6 @@ impl TestCx<'_> {
253
250
let base_dylib_search_paths =
254
251
Vec :: from_iter ( env:: split_paths ( & env:: var ( dylib_env_var ( ) ) . unwrap ( ) ) ) ;
255
252
256
- let host_dylib_search_paths = {
257
- let mut paths = vec ! [ self . config. compile_lib_path. clone( ) ] ;
258
- paths. extend ( base_dylib_search_paths. iter ( ) . cloned ( ) ) ;
259
- paths
260
- } ;
261
-
262
253
// Calculate the paths of the recipe binary. As previously discussed, this is placed at
263
254
// `<base_dir>/<bin_name>` with `bin_name` being `rmake` or `rmake.exe` depending on
264
255
// platform.
@@ -268,7 +259,15 @@ impl TestCx<'_> {
268
259
p
269
260
} ;
270
261
271
- let mut rustc = Command :: new ( & self . config . rustc_path ) ;
262
+ // run-make-support and run-make tests are compiled using the stage0 compiler
263
+ // If the stage is 0, then the compiler that we test (either bootstrap or an explicitly
264
+ // set compiler) is the one that actually compiled run-make-support.
265
+ let stage0_rustc = self
266
+ . config
267
+ . stage0_rustc_path
268
+ . as_ref ( )
269
+ . expect ( "stage0 rustc is required to run run-make tests" ) ;
270
+ let mut rustc = Command :: new ( & stage0_rustc) ;
272
271
rustc
273
272
. arg ( "-o" )
274
273
. arg ( & recipe_bin)
@@ -282,35 +281,12 @@ impl TestCx<'_> {
282
281
. arg ( format ! ( "run_make_support={}" , & support_lib_path. to_string_lossy( ) ) )
283
282
. arg ( "--edition=2021" )
284
283
. arg ( & self . testpaths . file . join ( "rmake.rs" ) )
285
- . arg ( "-Cprefer-dynamic" )
286
- // Provide necessary library search paths for rustc.
287
- . env ( dylib_env_var ( ) , & env:: join_paths ( host_dylib_search_paths) . unwrap ( ) ) ;
284
+ . arg ( "-Cprefer-dynamic" ) ;
288
285
289
286
// In test code we want to be very pedantic about values being silently discarded that are
290
287
// annotated with `#[must_use]`.
291
288
rustc. arg ( "-Dunused_must_use" ) ;
292
289
293
- // > `cg_clif` uses `COMPILETEST_FORCE_STAGE0=1 ./x.py test --stage 0` for running the rustc
294
- // > test suite. With the introduction of rmake.rs this broke. `librun_make_support.rlib` is
295
- // > compiled using the bootstrap rustc wrapper which sets `--sysroot
296
- // > build/aarch64-unknown-linux-gnu/stage0-sysroot`, but then compiletest will compile
297
- // > `rmake.rs` using the sysroot of the bootstrap compiler causing it to not find the
298
- // > `libstd.rlib` against which `librun_make_support.rlib` is compiled.
299
- //
300
- // The gist here is that we have to pass the proper stage0 sysroot if we want
301
- //
302
- // ```
303
- // $ COMPILETEST_FORCE_STAGE0=1 ./x test run-make --stage 0
304
- // ```
305
- //
306
- // to work correctly.
307
- //
308
- // See <https://github.com/rust-lang/rust/pull/122248> for more background.
309
- let stage0_sysroot = host_build_root. join ( "stage0-sysroot" ) ;
310
- if std:: env:: var_os ( "COMPILETEST_FORCE_STAGE0" ) . is_some ( ) {
311
- rustc. arg ( "--sysroot" ) . arg ( & stage0_sysroot) ;
312
- }
313
-
314
290
// Now run rustc to build the recipe.
315
291
let res = self . run_command_to_procres ( & mut rustc) ;
316
292
if !res. status . success ( ) {
@@ -320,35 +296,24 @@ impl TestCx<'_> {
320
296
// To actually run the recipe, we have to provide the recipe with a bunch of information
321
297
// provided through env vars.
322
298
323
- // Compute stage-specific standard library paths.
324
- let stage_std_path = host_build_root. join ( format ! ( "stage{stage_number}" ) ) . join ( "lib" ) ;
325
-
326
299
// Compute dynamic library search paths for recipes.
300
+ // These dylib directories are needed to **execute the recipe**.
327
301
let recipe_dylib_search_paths = {
328
302
let mut paths = base_dylib_search_paths. clone ( ) ;
329
-
330
- // For stage 0, we need to explicitly include the stage0-sysroot libstd dylib.
331
- // See <https://github.com/rust-lang/rust/issues/135373>.
332
- if std:: env:: var_os ( "COMPILETEST_FORCE_STAGE0" ) . is_some ( ) {
333
- paths. push (
334
- stage0_sysroot. join ( "lib" ) . join ( "rustlib" ) . join ( & self . config . host ) . join ( "lib" ) ,
335
- ) ;
336
- }
337
-
338
- paths. push ( support_lib_path. parent ( ) . unwrap ( ) . to_path_buf ( ) ) ;
339
- paths. push ( stage_std_path. join ( "rustlib" ) . join ( & self . config . host ) . join ( "lib" ) ) ;
340
- paths
341
- } ;
342
-
343
- // Compute runtime library search paths for recipes. This is target-specific.
344
- let target_runtime_dylib_search_paths = {
345
- let mut paths = vec ! [ rmake_out_dir. clone( ) ] ;
346
- paths. extend ( base_dylib_search_paths. iter ( ) . cloned ( ) ) ;
303
+ paths. push (
304
+ stage0_rustc
305
+ . parent ( )
306
+ . unwrap ( )
307
+ . parent ( )
308
+ . unwrap ( )
309
+ . join ( "lib" )
310
+ . join ( "rustlib" )
311
+ . join ( & self . config . host )
312
+ . join ( "lib" ) ,
313
+ ) ;
347
314
paths
348
315
} ;
349
316
350
- // FIXME(jieyouxu): please rename `TARGET_RPATH_ENV`, `HOST_RPATH_DIR` and
351
- // `TARGET_RPATH_DIR`, it is **extremely** confusing!
352
317
let mut cmd = Command :: new ( & recipe_bin) ;
353
318
cmd. current_dir ( & rmake_out_dir)
354
319
. stdout ( Stdio :: piped ( ) )
@@ -357,9 +322,14 @@ impl TestCx<'_> {
357
322
// example, this could be `LD_LIBRARY_PATH` on some linux distros but `PATH` on Windows.
358
323
. env ( "LD_LIB_PATH_ENVVAR" , dylib_env_var ( ) )
359
324
// Provide the dylib search paths.
325
+ // This is required to run the **recipe** itself.
360
326
. env ( dylib_env_var ( ) , & env:: join_paths ( recipe_dylib_search_paths) . unwrap ( ) )
361
- // Provide runtime dylib search paths.
362
- . env ( "TARGET_RPATH_ENV" , & env:: join_paths ( target_runtime_dylib_search_paths) . unwrap ( ) )
327
+ // Provide the directory to libraries that are needed to run the *compiler* invoked
328
+ // by the recipe.
329
+ . env ( "HOST_RUSTC_DYLIB_PATH" , & self . config . compile_lib_path )
330
+ // Provide the directory to libraries that might be needed to run binaries created
331
+ // by a compiler invoked by the recipe.
332
+ . env ( "TARGET_EXE_DYLIB_PATH" , & self . config . run_lib_path )
363
333
// Provide the target.
364
334
. env ( "TARGET" , & self . config . target )
365
335
// Some tests unfortunately still need Python, so provide path to a Python interpreter.
@@ -370,13 +340,6 @@ impl TestCx<'_> {
370
340
. env ( "BUILD_ROOT" , & host_build_root)
371
341
// Provide path to stage-corresponding rustc.
372
342
. env ( "RUSTC" , & self . config . rustc_path )
373
- // Provide the directory to libraries that are needed to run the *compiler*. This is not
374
- // to be confused with `TARGET_RPATH_ENV` or `TARGET_RPATH_DIR`. This is needed if the
375
- // recipe wants to invoke rustc.
376
- . env ( "HOST_RPATH_DIR" , & self . config . compile_lib_path )
377
- // Provide the directory to libraries that might be needed to run compiled binaries
378
- // (further compiled by the recipe!).
379
- . env ( "TARGET_RPATH_DIR" , & self . config . run_lib_path )
380
343
// Provide which LLVM components are available (e.g. which LLVM components are provided
381
344
// through a specific CI runner).
382
345
. env ( "LLVM_COMPONENTS" , & self . config . llvm_components ) ;
0 commit comments