Skip to content

Commit feaa338

Browse files
authored
Merge pull request #9464 from alt-romes/wip/romes/4798
Allow per-component builds with coverage enabled
2 parents f3eafa7 + d6e3804 commit feaa338

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+621
-218
lines changed

Cabal-tests/tests/UnitTests/Distribution/Utils/Structured.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ md5CheckGenericPackageDescription proxy = md5Check proxy
4141
md5CheckLocalBuildInfo :: Proxy LocalBuildInfo -> Assertion
4242
md5CheckLocalBuildInfo proxy = md5Check proxy
4343
#if MIN_VERSION_base(4,19,0)
44-
0x23942cff98237dc167ef90d64d7ef893
44+
0x023b3cd1665b2acdedf72d231c96336b
4545
#else
46-
0xa4e9f8a7e1583906880d6ec2d1bbb14b
46+
0xc6c0cc122cc60ce7943764cbaaacdc2d
4747
#endif

Cabal/src/Distribution/Simple/Configure.hs

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
{-# LANGUAGE DeriveDataTypeable #-}
22
{-# LANGUAGE FlexibleContexts #-}
3+
{-# LANGUAGE LambdaCase #-}
4+
{-# LANGUAGE NamedFieldPuns #-}
35
{-# LANGUAGE OverloadedStrings #-}
46
{-# LANGUAGE RankNTypes #-}
57
{-# LANGUAGE RecordWildCards #-}
@@ -44,6 +46,7 @@ module Distribution.Simple.Configure
4446
, localBuildInfoFile
4547
, getInstalledPackages
4648
, getInstalledPackagesMonitorFiles
49+
, getInstalledPackagesById
4750
, getPackageDBContents
4851
, configCompilerEx
4952
, configCompilerAuxEx
@@ -56,6 +59,7 @@ module Distribution.Simple.Configure
5659
, platformDefines
5760
) where
5861

62+
import Control.Monad
5963
import Distribution.Compat.Prelude
6064
import Prelude ()
6165

@@ -78,7 +82,7 @@ import Distribution.Simple.BuildTarget
7882
import Distribution.Simple.BuildToolDepends
7983
import Distribution.Simple.Compiler
8084
import Distribution.Simple.LocalBuildInfo
81-
import Distribution.Simple.PackageIndex (InstalledPackageIndex)
85+
import Distribution.Simple.PackageIndex (InstalledPackageIndex, lookupUnitId)
8286
import qualified Distribution.Simple.PackageIndex as PackageIndex
8387
import Distribution.Simple.PreProcess
8488
import Distribution.Simple.Program
@@ -162,6 +166,7 @@ import qualified Data.Maybe as M
162166
import qualified Data.Set as Set
163167
import qualified Distribution.Compat.NonEmptySet as NES
164168
import Distribution.Simple.Errors
169+
import Distribution.Simple.Flag (mergeListFlag)
165170
import Distribution.Types.AnnotatedId
166171

167172
type UseExternalInternalDeps = Bool
@@ -877,10 +882,21 @@ configure (pkg_descr0, pbi) cfg = do
877882
Map.empty
878883
buildComponents
879884

885+
-- For whole-package configure, we have to determine the additional
886+
-- configCoverageFor of the main lib and sub libs here.
887+
let extraCoverageFor :: [UnitId] = case enabled of
888+
-- Whole package configure, add package libs
889+
ComponentRequestedSpec{} -> mapMaybe (\case LibComponentLocalBuildInfo{componentUnitId} -> Just componentUnitId; _ -> Nothing) buildComponents
890+
-- Component configure, no need to do anything
891+
OneComponentRequestedSpec{} -> []
892+
893+
-- TODO: Should we also enforce something here on that --coverage-for cannot
894+
-- include indefinite components or instantiations?
895+
880896
let lbi =
881897
(setCoverageLBI . setProfLBI)
882898
LocalBuildInfo
883-
{ configFlags = cfg
899+
{ configFlags = cfg{configCoverageFor = mergeListFlag (configCoverageFor cfg) (toFlag extraCoverageFor)}
884900
, flagAssignment = flags
885901
, componentEnabledSpec = enabled
886902
, extraConfigArgs = [] -- Currently configure does not
@@ -1747,6 +1763,28 @@ getInstalledPackagesMonitorFiles verbosity comp packageDBs progdb platform =
17471763
++ prettyShow other
17481764
return []
17491765

1766+
-- | Looks up the 'InstalledPackageInfo' of the given 'UnitId's from the
1767+
-- 'PackageDBStack' in the 'LocalBuildInfo'.
1768+
getInstalledPackagesById
1769+
:: (Exception (VerboseException exception), Show exception, Typeable exception)
1770+
=> Verbosity
1771+
-> LocalBuildInfo
1772+
-> (UnitId -> exception)
1773+
-- ^ Construct an exception that is thrown if a
1774+
-- unit-id is not found in the installed packages,
1775+
-- from the unit-id that is missing.
1776+
-> [UnitId]
1777+
-- ^ The unit ids to lookup in the installed packages
1778+
-> IO [InstalledPackageInfo]
1779+
getInstalledPackagesById verbosity LocalBuildInfo{compiler, withPackageDB, withPrograms} mkException unitids = do
1780+
ipindex <- getInstalledPackages verbosity compiler withPackageDB withPrograms
1781+
mapM
1782+
( \uid -> case lookupUnitId ipindex uid of
1783+
Nothing -> dieWithException verbosity (mkException uid)
1784+
Just ipkg -> return ipkg
1785+
)
1786+
unitids
1787+
17501788
-- | The user interface specifies the package dbs to use with a combination of
17511789
-- @--global@, @--user@ and @--package-db=global|user|clear|$file@.
17521790
-- This function combines the global/user flag and interprets the package-db

Cabal/src/Distribution/Simple/Errors.hs

+6
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ data CabalException
170170
| NoProgramFound String VersionRange
171171
| BadVersionDb String Version VersionRange FilePath
172172
| UnknownVersionDb String VersionRange FilePath
173+
| MissingCoveredInstalledLibrary UnitId
173174
deriving (Show, Typeable)
174175

175176
exceptionCode :: CabalException -> Int
@@ -301,6 +302,7 @@ exceptionCode e = case e of
301302
NoProgramFound{} -> 7620
302303
BadVersionDb{} -> 8038
303304
UnknownVersionDb{} -> 1008
305+
MissingCoveredInstalledLibrary{} -> 9341
304306

305307
versionRequirement :: VersionRange -> String
306308
versionRequirement range
@@ -791,3 +793,7 @@ exceptionMessage e = case e of
791793
++ " is required but the version of "
792794
++ locationPath
793795
++ " could not be determined."
796+
MissingCoveredInstalledLibrary unitId ->
797+
"Failed to find the installed unit '"
798+
++ prettyShow unitId
799+
++ "' in package database stack."

Cabal/src/Distribution/Simple/Flag.hs

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module Distribution.Simple.Flag
2929
, flagToMaybe
3030
, flagToList
3131
, maybeToFlag
32+
, mergeListFlag
3233
, BooleanFlag (..)
3334
) where
3435

@@ -143,6 +144,11 @@ maybeToFlag :: Maybe a -> Flag a
143144
maybeToFlag Nothing = NoFlag
144145
maybeToFlag (Just x) = Flag x
145146

147+
-- | Merge the elements of a list 'Flag' with another list 'Flag'.
148+
mergeListFlag :: Flag [a] -> Flag [a] -> Flag [a]
149+
mergeListFlag currentFlags v =
150+
Flag $ concat (flagToList currentFlags ++ flagToList v)
151+
146152
-- | Types that represent boolean flags.
147153
class BooleanFlag a where
148154
asBool :: a -> Bool

Cabal/src/Distribution/Simple/GHC/BuildGeneric.hs

+2-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import Distribution.PackageDescription.Utils (cabalBug)
1919
import Distribution.Pretty
2020
import Distribution.Simple.BuildPaths
2121
import Distribution.Simple.Compiler
22-
import Distribution.Simple.Flag (Flag (..), fromFlag, toFlag)
2322
import Distribution.Simple.GHC.Build
2423
( checkNeedsRecompilation
2524
, componentGhcOptions
@@ -39,7 +38,7 @@ import Distribution.Simple.LocalBuildInfo
3938
import qualified Distribution.Simple.PackageIndex as PackageIndex
4039
import Distribution.Simple.Program
4140
import Distribution.Simple.Program.GHC
42-
import Distribution.Simple.Setup.Config
41+
import Distribution.Simple.Setup.Common
4342
import Distribution.Simple.Setup.Repl
4443
import Distribution.Simple.Utils
4544
import Distribution.System
@@ -399,10 +398,9 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do
399398
-- Determine if program coverage should be enabled and if so, what
400399
-- '-hpcdir' should be.
401400
let isCoverageEnabled = exeCoverage lbi
402-
distPref = fromFlag $ configDistPref $ configFlags lbi
403401
hpcdir way
404402
| gbuildIsRepl bm = mempty -- HPC is not supported in ghci
405-
| isCoverageEnabled = toFlag $ Hpc.mixDir distPref way (gbuildName bm)
403+
| isCoverageEnabled = toFlag $ Hpc.mixDir (tmpDir </> extraCompilationArtifacts) way
406404
| otherwise = mempty
407405

408406
rpaths <- getRPaths lbi clbi

Cabal/src/Distribution/Simple/GHC/BuildOrRepl.hs

+2-10
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@ import Control.Monad (forM_)
77
import qualified Distribution.ModuleName as ModuleName
88
import Distribution.Package
99
import Distribution.PackageDescription as PD
10-
import Distribution.Pretty
1110
import Distribution.Simple.BuildPaths
1211
import Distribution.Simple.Compiler
13-
import Distribution.Simple.Flag (Flag (..), fromFlag, toFlag)
1412
import Distribution.Simple.GHC.Build
1513
( checkNeedsRecompilation
1614
, componentGhcOptions
@@ -28,7 +26,7 @@ import Distribution.Simple.Program
2826
import qualified Distribution.Simple.Program.Ar as Ar
2927
import Distribution.Simple.Program.GHC
3028
import qualified Distribution.Simple.Program.Ld as Ld
31-
import Distribution.Simple.Setup.Config
29+
import Distribution.Simple.Setup.Common
3230
import Distribution.Simple.Setup.Repl
3331
import Distribution.Simple.Utils
3432
import Distribution.System
@@ -97,15 +95,9 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
9795
-- Determine if program coverage should be enabled and if so, what
9896
-- '-hpcdir' should be.
9997
let isCoverageEnabled = libCoverage lbi
100-
-- TODO: Historically HPC files have been put into a directory which
101-
-- has the package name. I'm going to avoid changing this for
102-
-- now, but it would probably be better for this to be the
103-
-- component ID instead...
104-
pkg_name = prettyShow (PD.package pkg_descr)
105-
distPref = fromFlag $ configDistPref $ configFlags lbi
10698
hpcdir way
10799
| forRepl = mempty -- HPC is not supported in ghci
108-
| isCoverageEnabled = toFlag $ Hpc.mixDir distPref way pkg_name
100+
| isCoverageEnabled = toFlag $ Hpc.mixDir (libTargetDir </> extraCompilationArtifacts) way
109101
| otherwise = mempty
110102

111103
createDirectoryIfMissingVerbose verbosity True libTargetDir

Cabal/src/Distribution/Simple/GHCJS.hs

+4-11
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ import Distribution.Simple.Program
7272
import Distribution.Simple.Program.GHC
7373
import qualified Distribution.Simple.Program.HcPkg as HcPkg
7474
import qualified Distribution.Simple.Program.Strip as Strip
75-
import Distribution.Simple.Setup.Config
75+
import Distribution.Simple.Setup.Common
7676
import Distribution.Simple.Utils
7777
import Distribution.System
7878
import Distribution.Types.ComponentLocalBuildInfo
@@ -481,7 +481,7 @@ buildOrReplLib
481481
-> Library
482482
-> ComponentLocalBuildInfo
483483
-> IO ()
484-
buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
484+
buildOrReplLib mReplFlags verbosity numJobs _pkg_descr lbi lib clbi = do
485485
let uid = componentUnitId clbi
486486
libTargetDir = componentBuildDir lbi clbi
487487
whenVanillaLib forceVanilla =
@@ -515,15 +515,9 @@ buildOrReplLib mReplFlags verbosity numJobs pkg_descr lbi lib clbi = do
515515
-- Determine if program coverage should be enabled and if so, what
516516
-- '-hpcdir' should be.
517517
let isCoverageEnabled = libCoverage lbi
518-
-- TODO: Historically HPC files have been put into a directory which
519-
-- has the package name. I'm going to avoid changing this for
520-
-- now, but it would probably be better for this to be the
521-
-- component ID instead...
522-
pkg_name = prettyShow (PD.package pkg_descr)
523-
distPref = fromFlag $ configDistPref $ configFlags lbi
524518
hpcdir way
525519
| forRepl = mempty -- HPC is not supported in ghci
526-
| isCoverageEnabled = toFlag $ Hpc.mixDir distPref way pkg_name
520+
| isCoverageEnabled = toFlag $ Hpc.mixDir (libTargetDir </> extraCompilationArtifacts) way
527521
| otherwise = mempty
528522

529523
createDirectoryIfMissingVerbose verbosity True libTargetDir
@@ -1240,10 +1234,9 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do
12401234
-- Determine if program coverage should be enabled and if so, what
12411235
-- '-hpcdir' should be.
12421236
let isCoverageEnabled = exeCoverage lbi
1243-
distPref = fromFlag $ configDistPref $ configFlags lbi
12441237
hpcdir way
12451238
| gbuildIsRepl bm = mempty -- HPC is not supported in ghci
1246-
| isCoverageEnabled = toFlag $ Hpc.mixDir distPref way (gbuildName bm)
1239+
| isCoverageEnabled = toFlag $ Hpc.mixDir (tmpDir </> extraCompilationArtifacts) way
12471240
| otherwise = mempty
12481241

12491242
rpaths <- getRPaths lbi clbi

0 commit comments

Comments
 (0)