Skip to content

Commit

Permalink
Fix assertion failure when combining build-tool-depends and --enable-…
Browse files Browse the repository at this point in the history
…documentation

The `setDocumentation` function was modifying the elaborated package
after the hash was computed. This led to the assertion failing as the
computed hash was different to what was computed in the initial install
plan.

Therefore in order to fix this we either needed to:

1. Set elabBuildHaddocks = False at the point where the hash is
   initially computed.
2. Verify that elabBuildHaddocks = True will not lead to unexpected
   results.

The latter has been implemented.

The elabBuildHaddocks option is only consulted in
`hasValidHaddockTargets`, at which point documentation building the
executable component is disabled because elabHaddockExecutables is
False.

In the added test we ensure this by checking that we didn't build
documentation for the executable which is built because of
build-tool-depends.

Fixes haskell#6006 haskell#8313
  • Loading branch information
mpickering committed Nov 14, 2023
1 parent 2dad49a commit 69eeee7
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 26 deletions.
34 changes: 8 additions & 26 deletions cabal-install/src/Distribution/Client/ProjectPlanning.hs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ sanityCheckElaboratedConfiguredPackage
-> a
-> a
sanityCheckElaboratedConfiguredPackage
_sharedConfig
sharedConfig
elab@ElaboratedConfiguredPackage{..} =
( case elabPkgOrComp of
ElabPackage pkg -> sanityCheckElaboratedPackage elab pkg
Expand All @@ -273,10 +273,12 @@ sanityCheckElaboratedConfiguredPackage
-- 'installedPackageId' we assigned is consistent with
-- the 'hashedInstalledPackageId' we would compute from
-- the elaborated configured package
-- . assert (isInplaceBuildStyle elabBuildStyle ||
-- elabComponentId == hashedInstalledPackageId
-- (packageHashInputs sharedConfig elab))

. assert
( isInplaceBuildStyle elabBuildStyle
|| elabComponentId
== hashedInstalledPackageId
(packageHashInputs sharedConfig elab)
)
-- the stanzas explicitly disabled should not be available
. assert
( optStanzaSetNull $
Expand Down Expand Up @@ -3293,9 +3295,7 @@ pruneInstallPlanPass1 pkgs
prune :: ElaboratedConfiguredPackage -> PrunedPackage
prune elab = PrunedPackage elab' (pruneOptionalDependencies elab')
where
elab' =
setDocumentation $
addOptionalStanzas elab
elab' = addOptionalStanzas elab

graph = Graph.fromDistinctList pkgs'

Expand Down Expand Up @@ -3444,24 +3444,6 @@ pruneInstallPlanPass1 pkgs
<> optionalStanzasWithDepsAvailable availablePkgs elab pkg
addOptionalStanzas elab = elab

setDocumentation :: ElaboratedConfiguredPackage -> ElaboratedConfiguredPackage
setDocumentation elab@ElaboratedConfiguredPackage{elabPkgOrComp = ElabComponent comp} =
elab
{ elabBuildHaddocks =
elabBuildHaddocks elab && documentationEnabled (compSolverName comp) elab
}
where
documentationEnabled c =
case c of
CD.ComponentLib -> const True
CD.ComponentSubLib _ -> elabHaddockInternal
CD.ComponentFLib _ -> elabHaddockForeignLibs
CD.ComponentExe _ -> elabHaddockExecutables
CD.ComponentTest _ -> elabHaddockTestSuites
CD.ComponentBench _ -> elabHaddockBenchmarks
CD.ComponentSetup -> const False
setDocumentation elab = elab

-- Calculate package dependencies but cut out those needed only by
-- optional stanzas that we've determined we will not enable.
-- These pruned deps are not persisted in this pass since they're based on
Expand Down
10 changes: 10 additions & 0 deletions cabal-testsuite/PackageTests/HaddockBuildDepends/a.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: a
version: 0.1.0.0
build-type: Simple
cabal-version: >= 1.10

library
exposed-modules: MyLib
build-depends: base, lib
hs-source-dirs: src
default-language: Haskell2010
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packages: .
22 changes: 22 additions & 0 deletions cabal-testsuite/PackageTests/HaddockBuildDepends/cabal.test.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import Test.Cabal.Prelude


main = cabalTest . withRepo "repo" $ do
cabal "build" ["--enable-documentation"]

env <- getTestEnv
let storeDir = testCabalDir env </> "store"

-- Check properties of executable component
libDir <- liftIO $ findDependencyInStore storeDir "exe"
-- Documentation is enabled..
assertFileDoesContain (libDir </> "cabal-hash.txt") "documentation: True"
-- But not built
shouldDirectoryNotExist ( libDir </> "share" </> "doc" )

-- Check properties of library
libDir <- liftIO $ findDependencyInStore storeDir "lib"
-- Documentation is enabled..
assertFileDoesContain (libDir </> "cabal-hash.txt") "documentation: True"
-- and has been built
shouldDirectoryExist ( libDir </> "share" </> "doc" )
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Main where

main = return ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: exe
version: 1
license: BSD3
author: Edward Z. Yang
maintainer: ezyang@cs.stanford.edu
build-type: Simple
cabal-version: 2.0

executable exe
build-depends: base
main-is: Main.hs
default-language: Haskell2010
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module Lib where
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: lib
version: 1
license: BSD3
author: Edward Z. Yang
maintainer: ezyang@cs.stanford.edu
build-type: Simple
cabal-version: 2.0

library
build-depends: base
build-tool-depends: exe:exe
exposed-modules: Lib
default-language: Haskell2010
4 changes: 4 additions & 0 deletions cabal-testsuite/PackageTests/HaddockBuildDepends/src/MyLib.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module MyLib (someFunc) where

someFunc :: IO ()
someFunc = return ()

0 comments on commit 69eeee7

Please sign in to comment.