mirror of
https://github.com/rust-lang/rust
synced 2024-11-05 20:45:15 +00:00
Fix x test --no-deps
- Use `cargo metadata` to determine whether a crate has a library package or not - Collect metadata for all workspaces, not just the root workspace and cargo - Don't pass `--lib` for crates without a library - Use `run_cargo_test` for rust-installer - Don't build documentation in `lint-docs` if `--no-doc` is passed
This commit is contained in:
parent
2a75607bab
commit
78a709348d
3 changed files with 58 additions and 34 deletions
|
@ -246,6 +246,7 @@ struct Crate {
|
|||
name: Interned<String>,
|
||||
deps: HashSet<Interned<String>>,
|
||||
path: PathBuf,
|
||||
has_lib: bool,
|
||||
}
|
||||
|
||||
impl Crate {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
use crate::cache::INTERNER;
|
||||
use crate::util::output;
|
||||
use crate::{Build, Crate};
|
||||
use crate::{t, Build, Crate};
|
||||
|
||||
/// For more information, see the output of
|
||||
/// <https://doc.rust-lang.org/nightly/cargo/commands/cargo-metadata.html>
|
||||
|
@ -22,6 +22,7 @@ struct Package {
|
|||
source: Option<String>,
|
||||
manifest_path: String,
|
||||
dependencies: Vec<Dependency>,
|
||||
targets: Vec<Target>,
|
||||
}
|
||||
|
||||
/// For more information, see the output of
|
||||
|
@ -32,6 +33,11 @@ struct Dependency {
|
|||
source: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct Target {
|
||||
kind: Vec<String>,
|
||||
}
|
||||
|
||||
/// Collects and stores package metadata of each workspace members into `build`,
|
||||
/// by executing `cargo metadata` commands.
|
||||
pub fn build(build: &mut Build) {
|
||||
|
@ -46,11 +52,16 @@ pub fn build(build: &mut Build) {
|
|||
.filter(|dep| dep.source.is_none())
|
||||
.map(|dep| INTERNER.intern_string(dep.name))
|
||||
.collect();
|
||||
let krate = Crate { name, deps, path };
|
||||
let has_lib = package.targets.iter().any(|t| t.kind.iter().any(|k| k == "lib"));
|
||||
let krate = Crate { name, deps, path, has_lib };
|
||||
let relative_path = krate.local_path(build);
|
||||
build.crates.insert(name, krate);
|
||||
let existing_path = build.crate_paths.insert(relative_path, name);
|
||||
assert!(existing_path.is_none(), "multiple crates with the same path");
|
||||
assert!(
|
||||
existing_path.is_none(),
|
||||
"multiple crates with the same path: {}",
|
||||
existing_path.unwrap()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +71,7 @@ pub fn build(build: &mut Build) {
|
|||
/// Note that `src/tools/cargo` is no longer a workspace member but we still
|
||||
/// treat it as one here, by invoking an additional `cargo metadata` command.
|
||||
fn workspace_members(build: &Build) -> impl Iterator<Item = Package> {
|
||||
let cmd_metadata = |manifest_path| {
|
||||
let collect_metadata = |manifest_path| {
|
||||
let mut cargo = Command::new(&build.initial_cargo);
|
||||
cargo
|
||||
.arg("metadata")
|
||||
|
@ -68,21 +79,20 @@ fn workspace_members(build: &Build) -> impl Iterator<Item = Package> {
|
|||
.arg("1")
|
||||
.arg("--no-deps")
|
||||
.arg("--manifest-path")
|
||||
.arg(manifest_path);
|
||||
cargo
|
||||
.arg(build.src.join(manifest_path));
|
||||
let metadata_output = output(&mut cargo);
|
||||
let Output { packages, .. } = t!(serde_json::from_str(&metadata_output));
|
||||
packages
|
||||
};
|
||||
|
||||
// Collects `metadata.packages` from the root workspace.
|
||||
let root_manifest_path = build.src.join("Cargo.toml");
|
||||
let root_output = output(&mut cmd_metadata(&root_manifest_path));
|
||||
let Output { packages, .. } = serde_json::from_str(&root_output).unwrap();
|
||||
|
||||
// Collects `metadata.packages` from src/tools/cargo separately.
|
||||
let cargo_manifest_path = build.src.join("src/tools/cargo/Cargo.toml");
|
||||
let cargo_output = output(&mut cmd_metadata(&cargo_manifest_path));
|
||||
let Output { packages: cargo_packages, .. } = serde_json::from_str(&cargo_output).unwrap();
|
||||
// Collects `metadata.packages` from all workspaces.
|
||||
let packages = collect_metadata("Cargo.toml");
|
||||
let cargo_packages = collect_metadata("src/tools/cargo/Cargo.toml");
|
||||
let ra_packages = collect_metadata("src/tools/rust-analyzer/Cargo.toml");
|
||||
let bootstrap_packages = collect_metadata("src/bootstrap/Cargo.toml");
|
||||
|
||||
// We only care about the root package from `src/tool/cargo` workspace.
|
||||
let cargo_package = cargo_packages.into_iter().find(|pkg| pkg.name == "cargo").into_iter();
|
||||
packages.into_iter().chain(cargo_package)
|
||||
|
||||
packages.into_iter().chain(cargo_package).chain(ra_packages).chain(bootstrap_packages)
|
||||
}
|
||||
|
|
|
@ -103,7 +103,8 @@ fn run(self, builder: &Builder<'_>) {
|
|||
path,
|
||||
bootstrap_host,
|
||||
));
|
||||
run_cargo_test(cargo, &[], &[], compiler, bootstrap_host, builder);
|
||||
let crate_name = path.rsplit_once('/').unwrap().1;
|
||||
run_cargo_test(cargo, &[], &[], crate_name, compiler, bootstrap_host, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,7 +153,11 @@ fn run(self, builder: &Builder<'_>) {
|
|||
SourceType::InTree,
|
||||
&[],
|
||||
);
|
||||
run_cargo_test(cargo, &[], &[], compiler, bootstrap_host, builder);
|
||||
run_cargo_test(cargo, &[], &[], "linkchecker", compiler, bootstrap_host, builder);
|
||||
|
||||
if builder.doc_tests == DocTests::No {
|
||||
return;
|
||||
}
|
||||
|
||||
// Build all the default documentation.
|
||||
builder.default_doc(&[]);
|
||||
|
@ -300,7 +305,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
);
|
||||
|
||||
// NOTE: can't use `run_cargo_test` because we need to overwrite `PATH`
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], compiler, self.host, builder);
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], "cargo", compiler, self.host, builder);
|
||||
|
||||
// Don't run cross-compile tests, we may not have cross-compiled libstd libs
|
||||
// available.
|
||||
|
@ -368,7 +373,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
cargo.env("SKIP_SLOW_TESTS", "1");
|
||||
|
||||
cargo.add_rustc_lib_path(builder, compiler);
|
||||
run_cargo_test(cargo, &[], &[], compiler, host, builder);
|
||||
run_cargo_test(cargo, &[], &[], "rust-analyzer", compiler, host, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -417,7 +422,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
|
||||
cargo.add_rustc_lib_path(builder, compiler);
|
||||
|
||||
run_cargo_test(cargo, &[], &[], compiler, host, builder);
|
||||
run_cargo_test(cargo, &[], &[], "rustfmt", compiler, host, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -465,7 +470,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
cargo.env("RUST_DEMANGLER_DRIVER_PATH", rust_demangler);
|
||||
cargo.add_rustc_lib_path(builder, compiler);
|
||||
|
||||
run_cargo_test(cargo, &[], &[], compiler, host, builder);
|
||||
run_cargo_test(cargo, &[], &[], "rust-demangler", compiler, host, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -602,7 +607,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
|
||||
// This can NOT be `run_cargo_test` since the Miri test runner
|
||||
// does not understand the flags added by `add_flags_and_try_run_test`.
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], compiler, target, builder);
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], "miri", compiler, target, builder);
|
||||
{
|
||||
let _time = util::timeit(&builder);
|
||||
builder.run(&mut cargo);
|
||||
|
@ -679,7 +684,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
&[],
|
||||
);
|
||||
cargo.allow_features("test");
|
||||
run_cargo_test(cargo, &[], &[], compiler, host, builder);
|
||||
run_cargo_test(cargo, &[], &[], "compiletest", compiler, host, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -722,17 +727,13 @@ fn run(self, builder: &Builder<'_>) {
|
|||
&[],
|
||||
);
|
||||
|
||||
if !builder.fail_fast {
|
||||
cargo.arg("--no-fail-fast");
|
||||
}
|
||||
|
||||
cargo.env("RUSTC_TEST_SUITE", builder.rustc(compiler));
|
||||
cargo.env("RUSTC_LIB_PATH", builder.rustc_libdir(compiler));
|
||||
let host_libs = builder.stage_out(compiler, Mode::ToolRustc).join(builder.cargo_dir());
|
||||
cargo.env("HOST_LIBS", host_libs);
|
||||
|
||||
cargo.add_rustc_lib_path(builder, compiler);
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], compiler, host, builder);
|
||||
let mut cargo = prepare_cargo_test(cargo, &[], &[], "clippy", compiler, host, builder);
|
||||
|
||||
if builder.try_run(&mut cargo) {
|
||||
// The tests succeeded; nothing to do.
|
||||
|
@ -2048,11 +2049,13 @@ fn run_cargo_test(
|
|||
cargo: impl Into<Command>,
|
||||
libtest_args: &[&str],
|
||||
crates: &[Interned<String>],
|
||||
primary_crate: &str,
|
||||
compiler: Compiler,
|
||||
target: TargetSelection,
|
||||
builder: &Builder<'_>,
|
||||
) -> bool {
|
||||
let mut cargo = prepare_cargo_test(cargo, libtest_args, crates, compiler, target, builder);
|
||||
let mut cargo =
|
||||
prepare_cargo_test(cargo, libtest_args, crates, primary_crate, compiler, target, builder);
|
||||
let _time = util::timeit(&builder);
|
||||
add_flags_and_try_run_tests(builder, &mut cargo)
|
||||
}
|
||||
|
@ -2062,6 +2065,7 @@ fn prepare_cargo_test(
|
|||
cargo: impl Into<Command>,
|
||||
libtest_args: &[&str],
|
||||
crates: &[Interned<String>],
|
||||
primary_crate: &str,
|
||||
compiler: Compiler,
|
||||
target: TargetSelection,
|
||||
builder: &Builder<'_>,
|
||||
|
@ -2079,7 +2083,14 @@ fn prepare_cargo_test(
|
|||
cargo.arg("--doc");
|
||||
}
|
||||
DocTests::No => {
|
||||
cargo.args(&["--lib", "--bins", "--examples", "--tests", "--benches"]);
|
||||
let krate = &builder
|
||||
.crates
|
||||
.get(&INTERNER.intern_str(primary_crate))
|
||||
.unwrap_or_else(|| panic!("missing crate {primary_crate}"));
|
||||
if krate.has_lib {
|
||||
cargo.arg("--lib");
|
||||
}
|
||||
cargo.args(&["--bins", "--examples", "--tests", "--benches"]);
|
||||
}
|
||||
DocTests::Yes => {}
|
||||
}
|
||||
|
@ -2191,7 +2202,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
compiler.host,
|
||||
target,
|
||||
);
|
||||
run_cargo_test(cargo, &[], &self.crates, compiler, target, builder);
|
||||
run_cargo_test(cargo, &[], &self.crates, &self.crates[0], compiler, target, builder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2284,6 +2295,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
cargo,
|
||||
&[],
|
||||
&[INTERNER.intern_str("rustdoc:0.0.0")],
|
||||
"rustdoc",
|
||||
compiler,
|
||||
target,
|
||||
builder,
|
||||
|
@ -2345,6 +2357,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
cargo,
|
||||
libtest_args,
|
||||
&[INTERNER.intern_str("rustdoc-json-types")],
|
||||
"rustdoc-json-types",
|
||||
compiler,
|
||||
target,
|
||||
builder,
|
||||
|
@ -2504,7 +2517,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
}
|
||||
// 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.
|
||||
run_cargo_test(cmd, &["--test-threads=1"], &[], compiler, host, builder);
|
||||
run_cargo_test(cmd, &["--test-threads=1"], &[], "bootstrap", compiler, host, builder);
|
||||
}
|
||||
|
||||
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
|
||||
|
@ -2617,7 +2630,7 @@ fn run(self, builder: &Builder<'_>) {
|
|||
SourceType::InTree,
|
||||
&[],
|
||||
);
|
||||
try_run(builder, &mut cargo.into());
|
||||
run_cargo_test(cargo, &[], &[], "installer", compiler, bootstrap_host, builder);
|
||||
|
||||
// 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
|
||||
|
|
Loading…
Reference in a new issue