Skip to content

Commit b3ee81a

Browse files
committed
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
1 parent c7ebddb commit b3ee81a

File tree

3 files changed

+58
-34
lines changed

3 files changed

+58
-34
lines changed

src/bootstrap/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ struct Crate {
248248
name: Interned<String>,
249249
deps: HashSet<Interned<String>>,
250250
path: PathBuf,
251+
has_lib: bool,
251252
}
252253

253254
impl Crate {

src/bootstrap/metadata.rs

+26-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde_derive::Deserialize;
55

66
use crate::cache::INTERNER;
77
use crate::util::output;
8-
use crate::{Build, Crate};
8+
use crate::{t, Build, Crate};
99

1010
/// For more information, see the output of
1111
/// <https://doc.rust-lang.org/nightly/cargo/commands/cargo-metadata.html>
@@ -22,6 +22,7 @@ struct Package {
2222
source: Option<String>,
2323
manifest_path: String,
2424
dependencies: Vec<Dependency>,
25+
targets: Vec<Target>,
2526
}
2627

2728
/// For more information, see the output of
@@ -32,6 +33,11 @@ struct Dependency {
3233
source: Option<String>,
3334
}
3435

36+
#[derive(Debug, Deserialize)]
37+
struct Target {
38+
kind: Vec<String>,
39+
}
40+
3541
/// Collects and stores package metadata of each workspace members into `build`,
3642
/// by executing `cargo metadata` commands.
3743
pub fn build(build: &mut Build) {
@@ -46,11 +52,16 @@ pub fn build(build: &mut Build) {
4652
.filter(|dep| dep.source.is_none())
4753
.map(|dep| INTERNER.intern_string(dep.name))
4854
.collect();
49-
let krate = Crate { name, deps, path };
55+
let has_lib = package.targets.iter().any(|t| t.kind.iter().any(|k| k == "lib"));
56+
let krate = Crate { name, deps, path, has_lib };
5057
let relative_path = krate.local_path(build);
5158
build.crates.insert(name, krate);
5259
let existing_path = build.crate_paths.insert(relative_path, name);
53-
assert!(existing_path.is_none(), "multiple crates with the same path");
60+
assert!(
61+
existing_path.is_none(),
62+
"multiple crates with the same path: {}",
63+
existing_path.unwrap()
64+
);
5465
}
5566
}
5667
}
@@ -60,29 +71,28 @@ pub fn build(build: &mut Build) {
6071
/// Note that `src/tools/cargo` is no longer a workspace member but we still
6172
/// treat it as one here, by invoking an additional `cargo metadata` command.
6273
fn workspace_members(build: &Build) -> impl Iterator<Item = Package> {
63-
let cmd_metadata = |manifest_path| {
74+
let collect_metadata = |manifest_path| {
6475
let mut cargo = Command::new(&build.initial_cargo);
6576
cargo
6677
.arg("metadata")
6778
.arg("--format-version")
6879
.arg("1")
6980
.arg("--no-deps")
7081
.arg("--manifest-path")
71-
.arg(manifest_path);
72-
cargo
82+
.arg(build.src.join(manifest_path));
83+
let metadata_output = output(&mut cargo);
84+
let Output { packages, .. } = t!(serde_json::from_str(&metadata_output));
85+
packages
7386
};
7487

75-
// Collects `metadata.packages` from the root workspace.
76-
let root_manifest_path = build.src.join("Cargo.toml");
77-
let root_output = output(&mut cmd_metadata(&root_manifest_path));
78-
let Output { packages, .. } = serde_json::from_str(&root_output).unwrap();
79-
80-
// Collects `metadata.packages` from src/tools/cargo separately.
81-
let cargo_manifest_path = build.src.join("src/tools/cargo/Cargo.toml");
82-
let cargo_output = output(&mut cmd_metadata(&cargo_manifest_path));
83-
let Output { packages: cargo_packages, .. } = serde_json::from_str(&cargo_output).unwrap();
88+
// Collects `metadata.packages` from all workspaces.
89+
let packages = collect_metadata("Cargo.toml");
90+
let cargo_packages = collect_metadata("src/tools/cargo/Cargo.toml");
91+
let ra_packages = collect_metadata("src/tools/rust-analyzer/Cargo.toml");
92+
let bootstrap_packages = collect_metadata("src/bootstrap/Cargo.toml");
8493

8594
// We only care about the root package from `src/tool/cargo` workspace.
8695
let cargo_package = cargo_packages.into_iter().find(|pkg| pkg.name == "cargo").into_iter();
87-
packages.into_iter().chain(cargo_package)
96+
97+
packages.into_iter().chain(cargo_package).chain(ra_packages).chain(bootstrap_packages)
8898
}

src/bootstrap/test.rs

+31-18
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ impl Step for CrateBootstrap {
103103
path,
104104
bootstrap_host,
105105
));
106-
run_cargo_test(cargo, &[], &[], compiler, bootstrap_host, builder);
106+
let crate_name = path.rsplit_once('/').unwrap().1;
107+
run_cargo_test(cargo, &[], &[], crate_name, compiler, bootstrap_host, builder);
107108
}
108109
}
109110

@@ -152,7 +153,11 @@ You can skip linkcheck with --exclude src/tools/linkchecker"
152153
SourceType::InTree,
153154
&[],
154155
);
155-
run_cargo_test(cargo, &[], &[], compiler, bootstrap_host, builder);
156+
run_cargo_test(cargo, &[], &[], "linkchecker", compiler, bootstrap_host, builder);
157+
158+
if builder.doc_tests == DocTests::No {
159+
return;
160+
}
156161

157162
// Build all the default documentation.
158163
builder.default_doc(&[]);
@@ -307,7 +312,7 @@ impl Step for Cargo {
307312
cargo.env("CARGO_TEST_DISABLE_NIGHTLY", "1");
308313
cargo.env("PATH", &path_for_cargo(builder, compiler));
309314

310-
run_cargo_test(cargo, &[], &[], compiler, self.host, builder);
315+
run_cargo_test(cargo, &[], &[], "cargo", compiler, self.host, builder);
311316
}
312317
}
313318

@@ -364,7 +369,7 @@ impl Step for RustAnalyzer {
364369
cargo.env("SKIP_SLOW_TESTS", "1");
365370

366371
cargo.add_rustc_lib_path(builder, compiler);
367-
run_cargo_test(cargo, &[], &[], compiler, host, builder);
372+
run_cargo_test(cargo, &[], &[], "rust-analyzer", compiler, host, builder);
368373
}
369374
}
370375

@@ -413,7 +418,7 @@ impl Step for Rustfmt {
413418

414419
cargo.add_rustc_lib_path(builder, compiler);
415420

416-
run_cargo_test(cargo, &[], &[], compiler, host, builder);
421+
run_cargo_test(cargo, &[], &[], "rustfmt", compiler, host, builder);
417422
}
418423
}
419424

@@ -461,7 +466,7 @@ impl Step for RustDemangler {
461466
cargo.env("RUST_DEMANGLER_DRIVER_PATH", rust_demangler);
462467
cargo.add_rustc_lib_path(builder, compiler);
463468

464-
run_cargo_test(cargo, &[], &[], compiler, host, builder);
469+
run_cargo_test(cargo, &[], &[], "rust-demangler", compiler, host, builder);
465470
}
466471
}
467472

@@ -598,7 +603,7 @@ impl Step for Miri {
598603

599604
// This can NOT be `run_cargo_test` since the Miri test runner
600605
// does not understand the flags added by `add_flags_and_try_run_test`.
601-
let mut cargo = prepare_cargo_test(cargo, &[], &[], compiler, target, builder);
606+
let mut cargo = prepare_cargo_test(cargo, &[], &[], "miri", compiler, target, builder);
602607
{
603608
let _time = util::timeit(&builder);
604609
builder.run(&mut cargo);
@@ -675,7 +680,7 @@ impl Step for CompiletestTest {
675680
&[],
676681
);
677682
cargo.allow_features("test");
678-
run_cargo_test(cargo, &[], &[], compiler, host, builder);
683+
run_cargo_test(cargo, &[], &[], "compiletest", compiler, host, builder);
679684
}
680685
}
681686

@@ -718,17 +723,13 @@ impl Step for Clippy {
718723
&[],
719724
);
720725

721-
if !builder.fail_fast {
722-
cargo.arg("--no-fail-fast");
723-
}
724-
725726
cargo.env("RUSTC_TEST_SUITE", builder.rustc(compiler));
726727
cargo.env("RUSTC_LIB_PATH", builder.rustc_libdir(compiler));
727728
let host_libs = builder.stage_out(compiler, Mode::ToolRustc).join(builder.cargo_dir());
728729
cargo.env("HOST_LIBS", host_libs);
729730

730731
cargo.add_rustc_lib_path(builder, compiler);
731-
let mut cargo = prepare_cargo_test(cargo, &[], &[], compiler, host, builder);
732+
let mut cargo = prepare_cargo_test(cargo, &[], &[], "clippy", compiler, host, builder);
732733

733734
if builder.try_run(&mut cargo) {
734735
// The tests succeeded; nothing to do.
@@ -2037,11 +2038,13 @@ fn run_cargo_test(
20372038
cargo: impl Into<Command>,
20382039
libtest_args: &[&str],
20392040
crates: &[Interned<String>],
2041+
primary_crate: &str,
20402042
compiler: Compiler,
20412043
target: TargetSelection,
20422044
builder: &Builder<'_>,
20432045
) -> bool {
2044-
let mut cargo = prepare_cargo_test(cargo, libtest_args, crates, compiler, target, builder);
2046+
let mut cargo =
2047+
prepare_cargo_test(cargo, libtest_args, crates, primary_crate, compiler, target, builder);
20452048
let _time = util::timeit(&builder);
20462049
add_flags_and_try_run_tests(builder, &mut cargo)
20472050
}
@@ -2051,6 +2054,7 @@ fn prepare_cargo_test(
20512054
cargo: impl Into<Command>,
20522055
libtest_args: &[&str],
20532056
crates: &[Interned<String>],
2057+
primary_crate: &str,
20542058
compiler: Compiler,
20552059
target: TargetSelection,
20562060
builder: &Builder<'_>,
@@ -2068,7 +2072,14 @@ fn prepare_cargo_test(
20682072
cargo.arg("--doc");
20692073
}
20702074
DocTests::No => {
2071-
cargo.args(&["--lib", "--bins", "--examples", "--tests", "--benches"]);
2075+
let krate = &builder
2076+
.crates
2077+
.get(&INTERNER.intern_str(primary_crate))
2078+
.unwrap_or_else(|| panic!("missing crate {primary_crate}"));
2079+
if krate.has_lib {
2080+
cargo.arg("--lib");
2081+
}
2082+
cargo.args(&["--bins", "--examples", "--tests", "--benches"]);
20722083
}
20732084
DocTests::Yes => {}
20742085
}
@@ -2181,7 +2192,7 @@ impl Step for Crate {
21812192
&compiler.host,
21822193
target
21832194
));
2184-
run_cargo_test(cargo, &[], &self.crates, compiler, target, builder);
2195+
run_cargo_test(cargo, &[], &self.crates, &self.crates[0], compiler, target, builder);
21852196
}
21862197
}
21872198

@@ -2280,6 +2291,7 @@ impl Step for CrateRustdoc {
22802291
cargo,
22812292
&[],
22822293
&[INTERNER.intern_str("rustdoc:0.0.0")],
2294+
"rustdoc",
22832295
compiler,
22842296
target,
22852297
builder,
@@ -2346,6 +2358,7 @@ impl Step for CrateRustdocJsonTypes {
23462358
cargo,
23472359
libtest_args,
23482360
&[INTERNER.intern_str("rustdoc-json-types")],
2361+
"rustdoc-json-types",
23492362
compiler,
23502363
target,
23512364
builder,
@@ -2505,7 +2518,7 @@ impl Step for Bootstrap {
25052518
}
25062519
// rustbuild tests are racy on directory creation so just run them one at a time.
25072520
// Since there's not many this shouldn't be a problem.
2508-
run_cargo_test(cmd, &["--test-threads=1"], &[], compiler, host, builder);
2521+
run_cargo_test(cmd, &["--test-threads=1"], &[], "bootstrap", compiler, host, builder);
25092522
}
25102523

25112524
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
@@ -2618,7 +2631,7 @@ impl Step for RustInstaller {
26182631
SourceType::InTree,
26192632
&[],
26202633
);
2621-
try_run(builder, &mut cargo.into());
2634+
run_cargo_test(cargo, &[], &[], "installer", compiler, bootstrap_host, builder);
26222635

26232636
// We currently don't support running the test.sh script outside linux(?) environments.
26242637
// Eventually this should likely migrate to #[test]s in rust-installer proper rather than a

0 commit comments

Comments
 (0)