Fix --all-targets in a crate without a lib.
authorEric Huss <eric@huss.org>
Mon, 30 Oct 2017 21:42:47 +0000 (14:42 -0700)
committerEric Huss <eric@huss.org>
Mon, 30 Oct 2017 21:42:47 +0000 (14:42 -0700)
Fixes #4615.

src/cargo/ops/cargo_compile.rs
tests/build.rs

index 2644777a6a5770b96c47ca5b84d678273abab336..ff8249a60cbe898c60fd348848b8b5d85eefbb1b 100644 (file)
@@ -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")
                 }
             }
index 4374a90b7bed3e3b7c0e7987ffa2a6b7012cfcf7..523e42d913077ec53e266f23e7954116f1bae604 100644 (file)
@@ -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 [..]")
+        );
+}