From 4be5a44861b0ea55429aebcf5797539850dab850 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 29 Jun 2018 12:17:41 -0700 Subject: [PATCH] Fix avoiding a rebuild when moving around a workspace There's a case where Cargo will recompile a project even if the fingerprint looks like it's fresh, when some output files are missing. This was intended to cover the case where an output file was deleted manually or otherwise messed with. The check here was a bit too eager, however. It checked not only the actual output destination of the compiler but *also* the location that we hard link the output file up to. Due to recent changes in #5460 we don't always create the hard links for path dependencies in the top-level dir, and this meant that if the library were compiled and then tested later on the test may recompile the original library by accident. The fix in this commit is to cease looking for the hardlink if it exists or not. This way we only check for the presence of the output file itself and only recompile if that file is missing. The reason for this is that we unconditionally relink files into place whether it's fresh or not, so we'll always recreate the hard link anyway if it's missing. cc rust-lang/rust#51717 --- src/cargo/core/compiler/fingerprint.rs | 7 +++-- tests/testsuite/freshness.rs | 38 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/cargo/core/compiler/fingerprint.rs b/src/cargo/core/compiler/fingerprint.rs index 284bc599304..e3783ddb6ce 100644 --- a/src/cargo/core/compiler/fingerprint.rs +++ b/src/cargo/core/compiler/fingerprint.rs @@ -96,9 +96,10 @@ pub fn prepare_target<'a, 'cfg>( if output.flavor == FileFlavor::DebugInfo { continue; } - missing_outputs |= !output.path.exists(); - if let Some(ref link_dst) = output.hardlink { - missing_outputs |= !link_dst.exists(); + if !output.path.exists() { + info!("missing output path {:?}", output.path); + missing_outputs = true; + break } } } diff --git a/tests/testsuite/freshness.rs b/tests/testsuite/freshness.rs index edf9c74dd62..7effa2a1c4c 100644 --- a/tests/testsuite/freshness.rs +++ b/tests/testsuite/freshness.rs @@ -1243,3 +1243,41 @@ fn dont_rebuild_based_on_plugins() { execs().with_status(0).with_stderr("[FINISHED] [..]\n"), ); } + +#[test] +fn reuse_workspace_lib() { + let p = project("p") + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.1" + + [workspace] + + [dependencies] + bar = { path = 'bar' } + "#, + ) + .file("src/lib.rs", "") + .file( + "bar/Cargo.toml", + r#" + [package] + name = "bar" + version = "0.1.1" + "#, + ) + .file("bar/src/lib.rs", "") + .build(); + + assert_that(p.cargo("build"), execs().with_status(0)); + assert_that( + p.cargo("test -p bar -v --no-run"), + execs().with_status(0).with_stderr("\ +[COMPILING] bar v0.1.1 ([..]) +[RUNNING] `rustc[..] --test [..]` +[FINISHED] [..] +")); +}