Skip to content

Commit 79331b2

Browse files
committed
Compile run-make recipes using the stage0 compiler
1 parent 106a3e7 commit 79331b2

File tree

8 files changed

+59
-123
lines changed

8 files changed

+59
-123
lines changed

src/tools/compiletest/src/runtest/run_make.rs

Lines changed: 37 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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/$TARGET/stage0-bootstrap-tools/$HOST/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.
@@ -229,25 +230,21 @@ impl TestCx<'_> {
229230
//
230231
// ```
231232
// build/<target_triple>/
232-
// ├── stageN-tools-bin/
233-
// │ └── librun_make_support.rlib // <- support rlib itself
234-
// ├── stageN-tools/
235-
// │ ├── release/deps/ // <- deps of deps
236-
// │ └── <host_triple>/release/deps/ // <- deps
233+
// ├── stage0-bootstrap-tools/
234+
// │ ├── <host_triple>/release/librun_make_support.rlib // <- support rlib itself
235+
// │ ├── <host_triple>/release/deps/ // <- deps
236+
// │ └── release/deps/ // <- deps of deps
237237
// ```
238238
//
239239
// FIXME(jieyouxu): there almost certainly is a better way to do this (specifically how the
240-
// support lib and its deps are organized, can't we copy them to the tools-bin dir as
241-
// well?), but this seems to work for now.
240+
// support lib and its deps are organized), but this seems to work for now.
242241

243-
let stage_number = self.config.stage;
242+
let tools_bin = build_root.join("stage0-bootstrap-tools");
243+
let support_host_path = tools_bin.join(&self.config.host).join("release");
244+
let support_lib_path = support_host_path.join("librun_make_support.rlib");
244245

245-
let stage_tools_bin = build_root.join(format!("stage{stage_number}-tools-bin"));
246-
let support_lib_path = stage_tools_bin.join("librun_make_support.rlib");
247-
248-
let stage_tools = build_root.join(format!("stage{stage_number}-tools"));
249-
let support_lib_deps = stage_tools.join(&self.config.host).join("release").join("deps");
250-
let support_lib_deps_deps = stage_tools.join("release").join("deps");
246+
let support_lib_deps = support_host_path.join("deps");
247+
let support_lib_deps_deps = tools_bin.join("release").join("deps");
251248

252249
// To compile the recipe with rustc, we need to provide suitable dynamic library search
253250
// paths to rustc. This includes both:
@@ -258,12 +255,6 @@ impl TestCx<'_> {
258255
let base_dylib_search_paths =
259256
Vec::from_iter(env::split_paths(&env::var(dylib_env_var()).unwrap()));
260257

261-
let host_dylib_search_paths = {
262-
let mut paths = vec![self.config.compile_lib_path.clone()];
263-
paths.extend(base_dylib_search_paths.iter().cloned());
264-
paths
265-
};
266-
267258
// Calculate the paths of the recipe binary. As previously discussed, this is placed at
268259
// `<base_dir>/<bin_name>` with `bin_name` being `rmake` or `rmake.exe` depending on
269260
// platform.
@@ -273,7 +264,13 @@ impl TestCx<'_> {
273264
p
274265
};
275266

276-
let mut rustc = Command::new(&self.config.rustc_path);
267+
// run-make-support and run-make tests are compiled using the bootstrap compiler
268+
let bootstrap_rustc = {
269+
let mut p = build_root.join("stage0").join("bin").join("rustc");
270+
p.set_extension(env::consts::EXE_EXTENSION);
271+
p
272+
};
273+
let mut rustc = Command::new(bootstrap_rustc);
277274
rustc
278275
.arg("-o")
279276
.arg(&recipe_bin)
@@ -287,35 +284,12 @@ impl TestCx<'_> {
287284
.arg(format!("run_make_support={}", &support_lib_path.to_string_lossy()))
288285
.arg("--edition=2021")
289286
.arg(&self.testpaths.file.join("rmake.rs"))
290-
.arg("-Cprefer-dynamic")
291-
// Provide necessary library search paths for rustc.
292-
.env(dylib_env_var(), &env::join_paths(host_dylib_search_paths).unwrap());
287+
.arg("-Cprefer-dynamic");
293288

294289
// In test code we want to be very pedantic about values being silently discarded that are
295290
// annotated with `#[must_use]`.
296291
rustc.arg("-Dunused_must_use");
297292

298-
// > `cg_clif` uses `COMPILETEST_FORCE_STAGE0=1 ./x.py test --stage 0` for running the rustc
299-
// > test suite. With the introduction of rmake.rs this broke. `librun_make_support.rlib` is
300-
// > compiled using the bootstrap rustc wrapper which sets `--sysroot
301-
// > build/aarch64-unknown-linux-gnu/stage0-sysroot`, but then compiletest will compile
302-
// > `rmake.rs` using the sysroot of the bootstrap compiler causing it to not find the
303-
// > `libstd.rlib` against which `librun_make_support.rlib` is compiled.
304-
//
305-
// The gist here is that we have to pass the proper stage0 sysroot if we want
306-
//
307-
// ```
308-
// $ COMPILETEST_FORCE_STAGE0=1 ./x test run-make --stage 0
309-
// ```
310-
//
311-
// to work correctly.
312-
//
313-
// See <https://github.com/rust-lang/rust/pull/122248> for more background.
314-
let stage0_sysroot = build_root.join("stage0-sysroot");
315-
if std::env::var_os("COMPILETEST_FORCE_STAGE0").is_some() {
316-
rustc.arg("--sysroot").arg(&stage0_sysroot);
317-
}
318-
319293
// Now run rustc to build the recipe.
320294
let res = self.run_command_to_procres(&mut rustc);
321295
if !res.status.success() {
@@ -325,35 +299,22 @@ impl TestCx<'_> {
325299
// To actually run the recipe, we have to provide the recipe with a bunch of information
326300
// provided through env vars.
327301

328-
// Compute stage-specific standard library paths.
329-
let stage_std_path = build_root.join(format!("stage{stage_number}")).join("lib");
330-
331302
// Compute dynamic library search paths for recipes.
303+
// These dylib directories are needed to **execute the recipe**.
332304
let recipe_dylib_search_paths = {
333305
let mut paths = base_dylib_search_paths.clone();
334-
335-
// For stage 0, we need to explicitly include the stage0-sysroot libstd dylib.
336-
// See <https://github.com/rust-lang/rust/issues/135373>.
337-
if std::env::var_os("COMPILETEST_FORCE_STAGE0").is_some() {
338-
paths.push(
339-
stage0_sysroot.join("lib").join("rustlib").join(&self.config.host).join("lib"),
340-
);
341-
}
342-
343-
paths.push(support_lib_path.parent().unwrap().to_path_buf());
344-
paths.push(stage_std_path.join("rustlib").join(&self.config.host).join("lib"));
345-
paths
346-
};
347-
348-
// Compute runtime library search paths for recipes. This is target-specific.
349-
let target_runtime_dylib_search_paths = {
350-
let mut paths = vec![rmake_out_dir.clone()];
351-
paths.extend(base_dylib_search_paths.iter().cloned());
306+
// This is the bootstrap stdlib required to run the rmake recipe itself
307+
paths.push(
308+
build_root
309+
.join("stage0")
310+
.join("lib")
311+
.join("rustlib")
312+
.join(&self.config.host)
313+
.join("lib"),
314+
);
352315
paths
353316
};
354317

355-
// FIXME(jieyouxu): please rename `TARGET_RPATH_ENV`, `HOST_RPATH_DIR` and
356-
// `TARGET_RPATH_DIR`, it is **extremely** confusing!
357318
let mut cmd = Command::new(&recipe_bin);
358319
cmd.current_dir(&rmake_out_dir)
359320
.stdout(Stdio::piped())
@@ -362,9 +323,14 @@ impl TestCx<'_> {
362323
// example, this could be `LD_LIBRARY_PATH` on some linux distros but `PATH` on Windows.
363324
.env("LD_LIB_PATH_ENVVAR", dylib_env_var())
364325
// Provide the dylib search paths.
326+
// This is required to run the **recipe** itself.
365327
.env(dylib_env_var(), &env::join_paths(recipe_dylib_search_paths).unwrap())
366-
// Provide runtime dylib search paths.
367-
.env("TARGET_RPATH_ENV", &env::join_paths(target_runtime_dylib_search_paths).unwrap())
328+
// Provide the directory to libraries that are needed to run the *compiler* invoked
329+
// by the recipe.
330+
.env("HOST_RUSTC_DYLIB_PATH", &self.config.compile_lib_path)
331+
// Provide the directory to libraries that might be needed to run binaries created
332+
// by a compiler invoked by the recipe.
333+
.env("TARGET_EXE_DYLIB_PATH", &self.config.run_lib_path)
368334
// Provide the target.
369335
.env("TARGET", &self.config.target)
370336
// Some tests unfortunately still need Python, so provide path to a Python interpreter.
@@ -375,13 +341,6 @@ impl TestCx<'_> {
375341
.env("BUILD_ROOT", &build_root)
376342
// Provide path to stage-corresponding rustc.
377343
.env("RUSTC", &self.config.rustc_path)
378-
// Provide the directory to libraries that are needed to run the *compiler*. This is not
379-
// to be confused with `TARGET_RPATH_ENV` or `TARGET_RPATH_DIR`. This is needed if the
380-
// recipe wants to invoke rustc.
381-
.env("HOST_RPATH_DIR", &self.config.compile_lib_path)
382-
// Provide the directory to libraries that might be needed to run compiled binaries
383-
// (further compiled by the recipe!).
384-
.env("TARGET_RPATH_DIR", &self.config.run_lib_path)
385344
// Provide which LLVM components are available (e.g. which LLVM components are provided
386345
// through a specific CI runner).
387346
.env("LLVM_COMPONENTS", &self.config.llvm_components);

src/tools/run-make-support/src/external_deps/rustc.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::str::FromStr as _;
55
use crate::command::Command;
66
use crate::env::env_var;
77
use crate::path_helpers::cwd;
8-
use crate::util::set_host_rpath;
8+
use crate::util::set_host_compiler_dylib_path;
99
use crate::{is_aix, is_darwin, is_msvc, is_windows, uname};
1010

1111
/// Construct a new `rustc` invocation. This will automatically set the library
@@ -15,8 +15,8 @@ pub fn rustc() -> Rustc {
1515
Rustc::new()
1616
}
1717

18-
/// Construct a plain `rustc` invocation with no flags set. Note that [`set_host_rpath`]
19-
/// still presets the environment variable `HOST_RPATH_DIR` by default.
18+
/// Construct a plain `rustc` invocation with no flags set. Note that [`set_host_compiler_dylib_path`]
19+
/// still presets the environment variable `HOST_RUSTC_DYLIB_PATH` by default.
2020
#[track_caller]
2121
pub fn bare_rustc() -> Rustc {
2222
Rustc::bare()
@@ -44,7 +44,7 @@ pub fn rustc_path() -> String {
4444
#[track_caller]
4545
fn setup_common() -> Command {
4646
let mut cmd = Command::new(rustc_path());
47-
set_host_rpath(&mut cmd);
47+
set_host_compiler_dylib_path(&mut cmd);
4848
cmd
4949
}
5050

src/tools/run-make-support/src/external_deps/rustdoc.rs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,10 @@ use std::ffi::OsStr;
22
use std::path::Path;
33

44
use crate::command::Command;
5-
use crate::env::{env_var, env_var_os};
6-
use crate::util::set_host_rpath;
5+
use crate::env::env_var;
6+
use crate::util::set_host_compiler_dylib_path;
77

8-
/// Construct a plain `rustdoc` invocation with no flags set.
9-
#[track_caller]
10-
pub fn bare_rustdoc() -> Rustdoc {
11-
Rustdoc::bare()
12-
}
13-
14-
/// Construct a new `rustdoc` invocation with `-L $(TARGET_RPATH_DIR)` set.
8+
/// Construct a new `rustdoc` invocation.
159
#[track_caller]
1610
pub fn rustdoc() -> Rustdoc {
1711
Rustdoc::new()
@@ -29,23 +23,15 @@ crate::macros::impl_common_helpers!(Rustdoc);
2923
fn setup_common() -> Command {
3024
let rustdoc = env_var("RUSTDOC");
3125
let mut cmd = Command::new(rustdoc);
32-
set_host_rpath(&mut cmd);
26+
set_host_compiler_dylib_path(&mut cmd);
3327
cmd
3428
}
3529

3630
impl Rustdoc {
3731
/// Construct a bare `rustdoc` invocation.
3832
#[track_caller]
39-
pub fn bare() -> Self {
40-
let cmd = setup_common();
41-
Self { cmd }
42-
}
43-
44-
/// Construct a `rustdoc` invocation with `-L $(TARGET_RPATH_DIR)` set.
45-
#[track_caller]
4633
pub fn new() -> Self {
47-
let mut cmd = setup_common();
48-
cmd.arg("-L").arg(env_var_os("TARGET_RPATH_DIR"));
34+
let cmd = setup_common();
4935
Self { cmd }
5036
}
5137

src/tools/run-make-support/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ pub use llvm::{
6767
};
6868
pub use python::python_command;
6969
pub use rustc::{aux_build, bare_rustc, rustc, rustc_path, Rustc};
70-
pub use rustdoc::{bare_rustdoc, rustdoc, Rustdoc};
70+
pub use rustdoc::{rustdoc, Rustdoc};
7171

7272
/// [`diff`][mod@diff] is implemented in terms of the [similar] library.
7373
///

src/tools/run-make-support/src/run.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use std::ffi::OsStr;
2-
use std::path::{Path, PathBuf};
2+
use std::path::PathBuf;
33
use std::{env, panic};
44

55
use crate::command::{Command, CompletedProcess};
6-
use crate::util::{handle_failed_output, set_host_rpath};
7-
use crate::{cwd, env_var, is_windows};
6+
use crate::util::handle_failed_output;
7+
use crate::{cwd, env_var};
88

99
#[track_caller]
1010
fn run_common(name: &str, args: Option<&[&str]>) -> Command {
@@ -18,10 +18,11 @@ fn run_common(name: &str, args: Option<&[&str]>) -> Command {
1818
cmd.arg(arg);
1919
}
2020
}
21+
2122
cmd.env(&ld_lib_path_envvar, {
2223
let mut paths = vec![];
2324
paths.push(cwd());
24-
for p in env::split_paths(&env_var("TARGET_RPATH_ENV")) {
25+
for p in env::split_paths(&env_var("TARGET_EXE_DYLIB_PATH")) {
2526
paths.push(p.to_path_buf());
2627
}
2728
for p in env::split_paths(&env_var(&ld_lib_path_envvar)) {
@@ -31,15 +32,6 @@ fn run_common(name: &str, args: Option<&[&str]>) -> Command {
3132
});
3233
cmd.env("LC_ALL", "C"); // force english locale
3334

34-
if is_windows() {
35-
let mut paths = vec![];
36-
for p in env::split_paths(&std::env::var("PATH").unwrap_or(String::new())) {
37-
paths.push(p.to_path_buf());
38-
}
39-
paths.push(Path::new(&env_var("TARGET_RPATH_DIR")).to_path_buf());
40-
cmd.env("PATH", env::join_paths(paths.iter()).unwrap());
41-
}
42-
4335
cmd
4436
}
4537

@@ -84,7 +76,6 @@ pub fn run_fail(name: &str) -> CompletedProcess {
8476
#[track_caller]
8577
pub fn cmd<S: AsRef<OsStr>>(program: S) -> Command {
8678
let mut command = Command::new(program);
87-
set_host_rpath(&mut command);
8879
command.env("LC_ALL", "C"); // force english locale
8980
command
9081
}

src/tools/run-make-support/src/util.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ pub(crate) fn handle_failed_output(
2424
std::process::exit(1)
2525
}
2626

27-
/// Set the runtime library path as needed for running the host rustc/rustdoc/etc.
28-
pub(crate) fn set_host_rpath(cmd: &mut Command) {
27+
/// Set the runtime library paths as needed for running the host compilers (rustc/rustdoc/etc).
28+
pub(crate) fn set_host_compiler_dylib_path(cmd: &mut Command) {
2929
let ld_lib_path_envvar = env_var("LD_LIB_PATH_ENVVAR");
3030
cmd.env(&ld_lib_path_envvar, {
3131
let mut paths = vec![];
3232
paths.push(cwd());
33-
paths.push(PathBuf::from(env_var("HOST_RPATH_DIR")));
33+
paths.push(PathBuf::from(env_var("HOST_RUSTC_DYLIB_PATH")));
3434
for p in std::env::split_paths(&env_var(&ld_lib_path_envvar)) {
3535
paths.push(p.to_path_buf());
3636
}

tests/run-make/rustdoc-default-output/rmake.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
// ensures the output of rustdoc's help menu is as expected.
44
// See https://github.com/rust-lang/rust/issues/88756
55

6-
use run_make_support::{bare_rustdoc, diff};
6+
use run_make_support::{diff, rustdoc};
77

88
fn main() {
9-
let out = bare_rustdoc().run().stdout_utf8();
9+
let out = rustdoc().run().stdout_utf8();
1010
diff()
1111
.expected_file("output-default.stdout")
1212
.actual_text("actual", out)

tests/run-make/version-verbose-commit-hash/rmake.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
//@ needs-git-hash
77

8-
use run_make_support::{bare_rustc, bare_rustdoc, regex};
8+
use run_make_support::{bare_rustc, regex, rustdoc};
99

1010
fn main() {
1111
let out_rustc =
1212
bare_rustc().arg("--version").arg("--verbose").run().stdout_utf8().to_lowercase();
1313
let out_rustdoc =
14-
bare_rustdoc().arg("--version").arg("--verbose").run().stdout_utf8().to_lowercase();
14+
rustdoc().arg("--version").arg("--verbose").run().stdout_utf8().to_lowercase();
1515
let re =
1616
regex::Regex::new(r#"commit-hash: [0-9a-f]{40}\ncommit-date: [0-9]{4}-[0-9]{2}-[0-9]{2}"#)
1717
.unwrap();

0 commit comments

Comments
 (0)