diff --git a/ChangeLog.md b/ChangeLog.md index cb46d53451..8875d03482 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -14,6 +14,8 @@ Other enhancements: Bug fixes: * `~/.stack/config.yaml` and `stack.yaml` terminating by newline +* A regression in recompilation checking introduced in v1.7.1 has been fixed. + See [#4001](https://github.com/commercialhaskell/stack/issues/4001) * `stack ghci` on a package with internal libraries was erroneously looking for a wrong package corresponding to the internal library and failing to load any module. This has been fixed now and changes to the code in the diff --git a/src/Stack/Build/Source.hs b/src/Stack/Build/Source.hs index 8a268617bb..f1cb548d3d 100644 --- a/src/Stack/Build/Source.hs +++ b/src/Stack/Build/Source.hs @@ -437,7 +437,8 @@ getPackageFilesForTargets getPackageFilesForTargets pkg cabalFP nonLibComponents = do (components',compFiles,otherFiles,warnings) <- getPackageFiles (packageFiles pkg) cabalFP - let components = M.keysSet components' `Set.union` nonLibComponents + let necessaryComponents = Set.insert CLib $ Set.filter isCInternalLib (M.keysSet components') + components = necessaryComponents `Set.union` nonLibComponents componentsFiles = M.map (\files -> Set.union otherFiles (Set.map dotCabalGetPath files)) $ M.filterWithKey (\component _ -> component `Set.member` components) compFiles diff --git a/test/integration/tests/4001-excess-recompilation/Main.hs b/test/integration/tests/4001-excess-recompilation/Main.hs new file mode 100644 index 0000000000..20b99b9a5a --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/Main.hs @@ -0,0 +1,19 @@ +import Control.Monad (unless) +import Data.List (isInfixOf) +import StackTest + +main :: IO () +main = do + copy "test/Main1.hs" "test/Main.hs" + copy "bench/Main1.hs" "bench/Main.hs" + stack ["build"] + + copy "test/Main2.hs" "test/Main.hs" + copy "bench/Main2.hs" "bench/Main.hs" + res <- unregisteringLines . snd <$> stackStderr ["build"] + removeFileIgnore "test/Main.hs" + removeFileIgnore "bench/Main.hs" + unless (null res) $ fail "Stack recompiled when a test or benchmark file was changed, but only the library was targeted" + +unregisteringLines :: String -> [String] +unregisteringLines = filter (isInfixOf " unregistering ") . lines diff --git a/test/integration/tests/4001-excess-recompilation/files/Setup.hs b/test/integration/tests/4001-excess-recompilation/files/Setup.hs new file mode 100644 index 0000000000..9a994af677 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/test/integration/tests/4001-excess-recompilation/files/bench/Main1.hs b/test/integration/tests/4001-excess-recompilation/files/bench/Main1.hs new file mode 100644 index 0000000000..dbd8a1e159 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/bench/Main1.hs @@ -0,0 +1,5 @@ +import Lib + +main :: IO () +main = putStrLn "I am Main1" + diff --git a/test/integration/tests/4001-excess-recompilation/files/bench/Main2.hs b/test/integration/tests/4001-excess-recompilation/files/bench/Main2.hs new file mode 100644 index 0000000000..9c51c0f9ef --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/bench/Main2.hs @@ -0,0 +1,5 @@ +import Lib + +main :: IO () +main = putStrLn "I am Main2" + diff --git a/test/integration/tests/4001-excess-recompilation/files/files.cabal b/test/integration/tests/4001-excess-recompilation/files/files.cabal new file mode 100644 index 0000000000..00c3ca0303 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/files.cabal @@ -0,0 +1,25 @@ +name: files +version: 0.1.0.0 +build-type: Simple +cabal-version: >= 2.0 + +library + hs-source-dirs: src + exposed-modules: Lib + build-depends: base + default-language: Haskell2010 + +test-suite test + hs-source-dirs: test + main-is: Main.hs + build-depends: base, files + default-language: Haskell2010 + type: exitcode-stdio-1.0 + +benchmark bench + hs-source-dirs: bench + main-is: Main.hs + build-depends: base, files + default-language: Haskell2010 + type: exitcode-stdio-1.0 + diff --git a/test/integration/tests/4001-excess-recompilation/files/src/Lib.hs b/test/integration/tests/4001-excess-recompilation/files/src/Lib.hs new file mode 100644 index 0000000000..2aa67d6a94 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/src/Lib.hs @@ -0,0 +1,2 @@ +module Lib where + diff --git a/test/integration/tests/4001-excess-recompilation/files/stack.yaml b/test/integration/tests/4001-excess-recompilation/files/stack.yaml new file mode 100644 index 0000000000..a95908b164 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/stack.yaml @@ -0,0 +1 @@ +resolver: ghc-8.2.2 diff --git a/test/integration/tests/4001-excess-recompilation/files/test/Main1.hs b/test/integration/tests/4001-excess-recompilation/files/test/Main1.hs new file mode 100644 index 0000000000..dbd8a1e159 --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/test/Main1.hs @@ -0,0 +1,5 @@ +import Lib + +main :: IO () +main = putStrLn "I am Main1" + diff --git a/test/integration/tests/4001-excess-recompilation/files/test/Main2.hs b/test/integration/tests/4001-excess-recompilation/files/test/Main2.hs new file mode 100644 index 0000000000..9c51c0f9ef --- /dev/null +++ b/test/integration/tests/4001-excess-recompilation/files/test/Main2.hs @@ -0,0 +1,5 @@ +import Lib + +main :: IO () +main = putStrLn "I am Main2" +