From: Eric Huss Date: Mon, 30 Oct 2017 21:42:47 +0000 (-0700) Subject: Fix --all-targets in a crate without a lib. X-Git-Tag: archive/raspbian/0.35.0-2+rpi1~3^2^2^2^2^2^2^2~22^2~5^2~19^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b9497ab2f7a6ffb2214c0ce946905cd454d23416;p=cargo.git Fix --all-targets in a crate without a lib. Fixes #4615. --- diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 2644777a6..ff8249a60 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -170,6 +170,7 @@ pub enum CompileFilter<'a> { required_features_filterable: bool, }, Only { + all_targets: bool, lib: bool, bins: FilterRule<'a>, examples: FilterRule<'a>, @@ -389,6 +390,7 @@ impl<'a> CompileFilter<'a> { if all_targets { CompileFilter::Only { + all_targets: true, lib: true, bins: FilterRule::All, examples: FilterRule::All, benches: FilterRule::All, tests: FilterRule::All, @@ -396,6 +398,7 @@ impl<'a> CompileFilter<'a> { } else if lib_only || rule_bins.is_specific() || rule_tsts.is_specific() || rule_exms.is_specific() || rule_bens.is_specific() { CompileFilter::Only { + all_targets: false, lib: lib_only, bins: rule_bins, examples: rule_exms, benches: rule_bens, tests: rule_tsts, @@ -410,7 +413,7 @@ impl<'a> CompileFilter<'a> { pub fn matches(&self, target: &Target) -> bool { match *self { CompileFilter::Default { .. } => true, - CompileFilter::Only { lib, bins, examples, tests, benches } => { + CompileFilter::Only { lib, bins, examples, tests, benches, .. } => { let rule = match *target.kind() { TargetKind::Bin => bins, TargetKind::Test => tests, @@ -637,7 +640,7 @@ fn generate_targets<'a>(pkg: &'a Package, }; generate_auto_targets(mode, pkg.targets(), profile, deps, required_features_filterable) } - CompileFilter::Only { lib, bins, examples, tests, benches } => { + CompileFilter::Only { all_targets, lib, bins, examples, tests, benches } => { let mut targets = Vec::new(); if lib { @@ -647,7 +650,7 @@ fn generate_targets<'a>(pkg: &'a Package, profile: profile, required: true, }); - } else { + } else if !all_targets { bail!("no library targets found") } } diff --git a/tests/build.rs b/tests/build.rs index 4374a90b7..523e42d91 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -3943,3 +3943,31 @@ fn build_filter_infer_profile() { --emit=dep-info,link[..]") ); } + +#[test] +fn all_targets_no_lib() { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.1.0" + authors = [] + "#) + .file("src/main.rs", "fn main() {}") + .build(); + assert_that(p.cargo("build").arg("-v").arg("--all-targets"), + execs().with_status(0) + // bin + .with_stderr_contains("\ + [RUNNING] `rustc --crate-name foo src[/]main.rs --crate-type bin \ + --emit=dep-info,link[..]") + // bench + .with_stderr_contains("\ + [RUNNING] `rustc --crate-name foo src[/]main.rs --emit=dep-info,link \ + -C opt-level=3 --test [..]") + // unit test + .with_stderr_contains("\ + [RUNNING] `rustc --crate-name foo src[/]main.rs --emit=dep-info,link \ + -C debuginfo=2 --test [..]") + ); +}