summaryrefslogtreecommitdiffstats
path: root/src/bootstrap/test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/test.rs')
-rw-r--r--src/bootstrap/test.rs235
1 files changed, 198 insertions, 37 deletions
diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
index b4f1506dc..aedf1ecab 100644
--- a/src/bootstrap/test.rs
+++ b/src/bootstrap/test.rs
@@ -19,10 +19,11 @@ use crate::config::TargetSelection;
use crate::dist;
use crate::doc::DocumentationFormat;
use crate::flags::Subcommand;
-use crate::native;
+use crate::llvm;
+use crate::render_tests::add_flags_and_try_run_tests;
use crate::tool::{self, SourceType, Tool};
use crate::toolstate::ToolState;
-use crate::util::{self, add_link_lib_path, dylib_path, dylib_path_var, output, t};
+use crate::util::{self, add_link_lib_path, dylib_path, dylib_path_var, output, t, up_to_date};
use crate::{envify, CLang, DocTests, GitRepo, Mode};
const ADB_TEST_DIR: &str = "/data/local/tmp/work";
@@ -123,7 +124,43 @@ impl Step for CrateJsonDocLint {
SourceType::InTree,
&[],
);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub struct SuggestTestsCrate {
+ host: TargetSelection,
+}
+
+impl Step for SuggestTestsCrate {
+ type Output = ();
+ const ONLY_HOSTS: bool = true;
+ const DEFAULT: bool = true;
+
+ fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
+ run.path("src/tools/suggest-tests")
+ }
+
+ fn make_run(run: RunConfig<'_>) {
+ run.builder.ensure(SuggestTestsCrate { host: run.target });
+ }
+
+ fn run(self, builder: &Builder<'_>) {
+ let bootstrap_host = builder.config.build;
+ let compiler = builder.compiler(0, bootstrap_host);
+
+ let suggest_tests = tool::prepare_tool_cargo(
+ builder,
+ compiler,
+ Mode::ToolBootstrap,
+ bootstrap_host,
+ "test",
+ "src/tools/suggest-tests",
+ SourceType::InTree,
+ &[],
+ );
+ add_flags_and_try_run_tests(builder, &mut suggest_tests.into());
}
}
@@ -172,7 +209,7 @@ You can skip linkcheck with --exclude src/tools/linkchecker"
SourceType::InTree,
&[],
);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
// Build all the default documentation.
builder.default_doc(&[]);
@@ -333,7 +370,7 @@ impl Step for Cargo {
cargo.env("PATH", &path_for_cargo(builder, compiler));
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -392,7 +429,7 @@ impl Step for RustAnalyzer {
cargo.add_rustc_lib_path(builder, compiler);
cargo.arg("--").args(builder.config.cmd.test_args());
- builder.run(&mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -445,7 +482,7 @@ impl Step for Rustfmt {
cargo.add_rustc_lib_path(builder, compiler);
- builder.run(&mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -496,7 +533,7 @@ impl Step for RustDemangler {
cargo.add_rustc_lib_path(builder, compiler);
- builder.run(&mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -637,6 +674,8 @@ impl Step for Miri {
// Forward test filters.
cargo.arg("--").args(builder.config.cmd.test_args());
+ // This can NOT be `add_flags_and_try_run_tests` since the Miri test runner
+ // does not understand those flags!
let mut cargo = Command::from(cargo);
builder.run(&mut cargo);
@@ -694,7 +733,7 @@ impl Step for CompiletestTest {
/// Runs `cargo test` for compiletest.
fn run(self, builder: &Builder<'_>) {
let host = self.host;
- let compiler = builder.compiler(0, host);
+ let compiler = builder.compiler(1, host);
// We need `ToolStd` for the locally-built sysroot because
// compiletest uses unstable features of the `test` crate.
@@ -711,7 +750,7 @@ impl Step for CompiletestTest {
);
cargo.allow_features("test");
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -1064,6 +1103,8 @@ impl Step for RustdocGUI {
cargo.env("RUSTDOCFLAGS", "-Zunstable-options --generate-link-to-definition");
} else if entry.file_name() == "scrape_examples" {
cargo.arg("-Zrustdoc-scrape-examples");
+ } else if entry.file_name() == "extend_css" {
+ cargo.env("RUSTDOCFLAGS", &format!("--extend-css extra.css"));
}
builder.run(&mut cargo);
}
@@ -1118,7 +1159,11 @@ impl Step for Tidy {
cmd.arg(&builder.src);
cmd.arg(&builder.initial_cargo);
cmd.arg(&builder.out);
- cmd.arg(builder.jobs().to_string());
+ // Tidy is heavily IO constrained. Still respect `-j`, but use a higher limit if `jobs` hasn't been configured.
+ let jobs = builder.config.jobs.unwrap_or_else(|| {
+ 8 * std::thread::available_parallelism().map_or(1, std::num::NonZeroUsize::get) as u32
+ });
+ cmd.arg(jobs.to_string());
if builder.is_verbose() {
cmd.arg("--verbose");
}
@@ -1129,7 +1174,7 @@ impl Step for Tidy {
if builder.config.channel == "dev" || builder.config.channel == "nightly" {
builder.info("fmt check");
if builder.initial_rustfmt().is_none() {
- let inferred_rustfmt_dir = builder.config.initial_rustc.parent().unwrap();
+ let inferred_rustfmt_dir = builder.initial_rustc.parent().unwrap();
eprintln!(
"\
error: no `rustfmt` binary found in {PATH}
@@ -1189,7 +1234,7 @@ impl Step for TidySelfTest {
SourceType::InTree,
&[],
);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -1430,11 +1475,11 @@ note: if you're sure you want to do this, please open an issue as to why. In the
builder.ensure(compile::Std::new(compiler, compiler.host));
// Also provide `rust_test_helpers` for the host.
- builder.ensure(native::TestHelpers { target: compiler.host });
+ builder.ensure(TestHelpers { target: compiler.host });
// As well as the target, except for plain wasm32, which can't build it
if !target.contains("wasm") || target.contains("emscripten") {
- builder.ensure(native::TestHelpers { target });
+ builder.ensure(TestHelpers { target });
}
builder.ensure(RemoteCopyLibs { compiler, target });
@@ -1531,7 +1576,10 @@ note: if you're sure you want to do this, please open an issue as to why. In the
flags.extend(builder.config.cmd.rustc_args().iter().map(|s| s.to_string()));
if let Some(linker) = builder.linker(target) {
- cmd.arg("--linker").arg(linker);
+ cmd.arg("--target-linker").arg(linker);
+ }
+ if let Some(linker) = builder.linker(compiler.host) {
+ cmd.arg("--host-linker").arg(linker);
}
let mut hostflags = flags.clone();
@@ -1616,15 +1664,13 @@ note: if you're sure you want to do this, please open an issue as to why. In the
cmd.arg("--verbose");
}
- if !builder.config.verbose_tests {
- cmd.arg("--quiet");
- }
+ cmd.arg("--json");
let mut llvm_components_passed = false;
let mut copts_passed = false;
if builder.config.llvm_enabled() {
- let native::LlvmResult { llvm_config, .. } =
- builder.ensure(native::Llvm { target: builder.config.build });
+ let llvm::LlvmResult { llvm_config, .. } =
+ builder.ensure(llvm::Llvm { target: builder.config.build });
if !builder.config.dry_run() {
let llvm_version = output(Command::new(&llvm_config).arg("--version"));
let llvm_components = output(Command::new(&llvm_config).arg("--components"));
@@ -1662,7 +1708,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
// If LLD is available, add it to the PATH
if builder.config.lld_enabled {
let lld_install_root =
- builder.ensure(native::Lld { target: builder.config.build });
+ builder.ensure(llvm::Lld { target: builder.config.build });
let lld_bin_path = lld_install_root.join("bin");
@@ -1769,7 +1815,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
suite, mode, &compiler.host, target
));
let _time = util::timeit(&builder);
- try_run(builder, &mut cmd);
+ crate::render_tests::try_run_tests(builder, &mut cmd);
if let Some(compare_mode) = compare_mode {
cmd.arg("--compare-mode").arg(compare_mode);
@@ -1778,7 +1824,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
suite, mode, compare_mode, &compiler.host, target
));
let _time = util::timeit(&builder);
- try_run(builder, &mut cmd);
+ crate::render_tests::try_run_tests(builder, &mut cmd);
}
}
}
@@ -2141,7 +2187,7 @@ impl Step for Crate {
compile::std_cargo(builder, target, compiler.stage, &mut cargo);
}
Mode::Rustc => {
- compile::rustc_cargo(builder, &mut cargo, target);
+ compile::rustc_cargo(builder, &mut cargo, target, compiler.stage);
}
_ => panic!("can only test libraries"),
};
@@ -2180,9 +2226,8 @@ impl Step for Crate {
cargo.arg("--");
cargo.args(&builder.config.cmd.test_args());
- if !builder.config.verbose_tests {
- cargo.arg("--quiet");
- }
+ cargo.arg("-Z").arg("unstable-options");
+ cargo.arg("--format").arg("json");
if target.contains("emscripten") {
cargo.env(
@@ -2210,7 +2255,7 @@ impl Step for Crate {
target
));
let _time = util::timeit(&builder);
- try_run(builder, &mut cargo.into());
+ crate::render_tests::try_run_tests(builder, &mut cargo.into());
}
}
@@ -2330,7 +2375,7 @@ impl Step for CrateRustdoc {
));
let _time = util::timeit(&builder);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -2391,17 +2436,13 @@ impl Step for CrateRustdocJsonTypes {
cargo.arg("'-Ctarget-feature=-crt-static'");
}
- if !builder.config.verbose_tests {
- cargo.arg("--quiet");
- }
-
builder.info(&format!(
"{} rustdoc-json-types stage{} ({} -> {})",
test_kind, compiler.stage, &compiler.host, target
));
let _time = util::timeit(&builder);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
}
@@ -2570,7 +2611,7 @@ impl Step for Bootstrap {
// rustbuild tests are racy on directory creation so just run them one at a time.
// Since there's not many this shouldn't be a problem.
cmd.arg("--test-threads=1");
- try_run(builder, &mut cmd);
+ add_flags_and_try_run_tests(builder, &mut cmd);
}
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@@ -2651,7 +2692,7 @@ impl Step for ReplacePlaceholderTest {
SourceType::InTree,
&[],
);
- try_run(builder, &mut cargo.into());
+ add_flags_and_try_run_tests(builder, &mut cargo.into());
}
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@@ -2695,3 +2736,123 @@ impl Step for LintDocs {
});
}
}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub struct RustInstaller;
+
+impl Step for RustInstaller {
+ type Output = ();
+ const ONLY_HOSTS: bool = true;
+ const DEFAULT: bool = true;
+
+ /// Ensure the version placeholder replacement tool builds
+ fn run(self, builder: &Builder<'_>) {
+ builder.info("test rust-installer");
+
+ let bootstrap_host = builder.config.build;
+ let compiler = builder.compiler(0, bootstrap_host);
+ let cargo = tool::prepare_tool_cargo(
+ builder,
+ compiler,
+ Mode::ToolBootstrap,
+ bootstrap_host,
+ "test",
+ "src/tools/rust-installer",
+ SourceType::InTree,
+ &[],
+ );
+ try_run(builder, &mut cargo.into());
+
+ // We currently don't support running the test.sh script outside linux(?) environments.
+ // Eventually this should likely migrate to #[test]s in rust-installer proper rather than a
+ // set of scripts, which will likely allow dropping this if.
+ if bootstrap_host != "x86_64-unknown-linux-gnu" {
+ return;
+ }
+
+ let mut cmd =
+ std::process::Command::new(builder.src.join("src/tools/rust-installer/test.sh"));
+ let tmpdir = testdir(builder, compiler.host).join("rust-installer");
+ let _ = std::fs::remove_dir_all(&tmpdir);
+ let _ = std::fs::create_dir_all(&tmpdir);
+ cmd.current_dir(&tmpdir);
+ cmd.env("CARGO_TARGET_DIR", tmpdir.join("cargo-target"));
+ cmd.env("CARGO", &builder.initial_cargo);
+ cmd.env("RUSTC", &builder.initial_rustc);
+ cmd.env("TMP_DIR", &tmpdir);
+ try_run(builder, &mut cmd);
+ }
+
+ fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
+ run.path("src/tools/rust-installer")
+ }
+
+ fn make_run(run: RunConfig<'_>) {
+ run.builder.ensure(Self);
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub struct TestHelpers {
+ pub target: TargetSelection,
+}
+
+impl Step for TestHelpers {
+ type Output = ();
+
+ fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
+ run.path("tests/auxiliary/rust_test_helpers.c")
+ }
+
+ fn make_run(run: RunConfig<'_>) {
+ run.builder.ensure(TestHelpers { target: run.target })
+ }
+
+ /// Compiles the `rust_test_helpers.c` library which we used in various
+ /// `run-pass` tests for ABI testing.
+ fn run(self, builder: &Builder<'_>) {
+ if builder.config.dry_run() {
+ return;
+ }
+ // The x86_64-fortanix-unknown-sgx target doesn't have a working C
+ // toolchain. However, some x86_64 ELF objects can be linked
+ // without issues. Use this hack to compile the test helpers.
+ let target = if self.target == "x86_64-fortanix-unknown-sgx" {
+ TargetSelection::from_user("x86_64-unknown-linux-gnu")
+ } else {
+ self.target
+ };
+ let dst = builder.test_helpers_out(target);
+ let src = builder.src.join("tests/auxiliary/rust_test_helpers.c");
+ if up_to_date(&src, &dst.join("librust_test_helpers.a")) {
+ return;
+ }
+
+ builder.info("Building test helpers");
+ t!(fs::create_dir_all(&dst));
+ let mut cfg = cc::Build::new();
+ // FIXME: Workaround for https://github.com/emscripten-core/emscripten/issues/9013
+ if target.contains("emscripten") {
+ cfg.pic(false);
+ }
+
+ // We may have found various cross-compilers a little differently due to our
+ // extra configuration, so inform cc of these compilers. Note, though, that
+ // on MSVC we still need cc's detection of env vars (ugh).
+ if !target.contains("msvc") {
+ if let Some(ar) = builder.ar(target) {
+ cfg.archiver(ar);
+ }
+ cfg.compiler(builder.cc(target));
+ }
+ cfg.cargo_metadata(false)
+ .out_dir(&dst)
+ .target(&target.triple)
+ .host(&builder.config.build.triple)
+ .opt_level(0)
+ .warnings(false)
+ .debug(false)
+ .file(builder.src.join("tests/auxiliary/rust_test_helpers.c"))
+ .compile("rust_test_helpers");
+ }
+}