@@ -173,7 +173,8 @@ impl TestCx<'_> {
173173 fn run_rmake_v2_test ( & self ) {
174174 // For `run-make` V2, we need to perform 2 steps to build and run a `run-make` V2 recipe
175175 // (`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`.
177178 //
178179 // 1. We need to build the recipe `rmake.rs` as a binary and link in the `run_make_support`
179180 // library.
@@ -224,25 +225,21 @@ impl TestCx<'_> {
224225 //
225226 // ```
226227 // 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
232232 // ```
233233 //
234234 // 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.
237236
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" ) ;
239240
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" ) ;
246243
247244 // To compile the recipe with rustc, we need to provide suitable dynamic library search
248245 // paths to rustc. This includes both:
@@ -253,12 +250,6 @@ impl TestCx<'_> {
253250 let base_dylib_search_paths =
254251 Vec :: from_iter ( env:: split_paths ( & env:: var ( dylib_env_var ( ) ) . unwrap ( ) ) ) ;
255252
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-
262253 // Calculate the paths of the recipe binary. As previously discussed, this is placed at
263254 // `<base_dir>/<bin_name>` with `bin_name` being `rmake` or `rmake.exe` depending on
264255 // platform.
@@ -268,7 +259,15 @@ impl TestCx<'_> {
268259 p
269260 } ;
270261
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) ;
272271 rustc
273272 . arg ( "-o" )
274273 . arg ( & recipe_bin)
@@ -282,35 +281,12 @@ impl TestCx<'_> {
282281 . arg ( format ! ( "run_make_support={}" , & support_lib_path. to_string_lossy( ) ) )
283282 . arg ( "--edition=2021" )
284283 . 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" ) ;
288285
289286 // In test code we want to be very pedantic about values being silently discarded that are
290287 // annotated with `#[must_use]`.
291288 rustc. arg ( "-Dunused_must_use" ) ;
292289
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-
314290 // Now run rustc to build the recipe.
315291 let res = self . run_command_to_procres ( & mut rustc) ;
316292 if !res. status . success ( ) {
@@ -320,35 +296,24 @@ impl TestCx<'_> {
320296 // To actually run the recipe, we have to provide the recipe with a bunch of information
321297 // provided through env vars.
322298
323- // Compute stage-specific standard library paths.
324- let stage_std_path = host_build_root. join ( format ! ( "stage{stage_number}" ) ) . join ( "lib" ) ;
325-
326299 // Compute dynamic library search paths for recipes.
300+ // These dylib directories are needed to **execute the recipe**.
327301 let recipe_dylib_search_paths = {
328302 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+ ) ;
347314 paths
348315 } ;
349316
350- // FIXME(jieyouxu): please rename `TARGET_RPATH_ENV`, `HOST_RPATH_DIR` and
351- // `TARGET_RPATH_DIR`, it is **extremely** confusing!
352317 let mut cmd = Command :: new ( & recipe_bin) ;
353318 cmd. current_dir ( & rmake_out_dir)
354319 . stdout ( Stdio :: piped ( ) )
@@ -357,9 +322,14 @@ impl TestCx<'_> {
357322 // example, this could be `LD_LIBRARY_PATH` on some linux distros but `PATH` on Windows.
358323 . env ( "LD_LIB_PATH_ENVVAR" , dylib_env_var ( ) )
359324 // Provide the dylib search paths.
325+ // This is required to run the **recipe** itself.
360326 . 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 )
363333 // Provide the target.
364334 . env ( "TARGET" , & self . config . target )
365335 // Some tests unfortunately still need Python, so provide path to a Python interpreter.
@@ -370,13 +340,6 @@ impl TestCx<'_> {
370340 . env ( "BUILD_ROOT" , & host_build_root)
371341 // Provide path to stage-corresponding rustc.
372342 . 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 )
380343 // Provide which LLVM components are available (e.g. which LLVM components are provided
381344 // through a specific CI runner).
382345 . env ( "LLVM_COMPONENTS" , & self . config . llvm_components ) ;
0 commit comments