Skip to content

Commit f3a6bdc

Browse files
committed
WIP: coverage of dependency
1 parent 0476ecc commit f3a6bdc

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

builder/comp-builder.nix

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ let self =
5454

5555
# Coverage
5656
, doCoverage ? component.doCoverage
57+
, doCoverageNoRecurse ? false
5758

5859
# Data
5960
, enableSeparateDataOutput ? component.enableSeparateDataOutput
@@ -76,9 +77,11 @@ let
7677

7778
needsProfiling = enableExecutableProfiling || enableLibraryProfiling;
7879

80+
needsCoverage = doCoverage || doCoverageNoRecurse;
81+
7982
configFiles = makeConfigFiles {
8083
inherit (package) identifier;
81-
inherit component fullName flags needsProfiling;
84+
inherit component fullName flags needsProfiling needsCoverage;
8285
};
8386

8487
enableFeature = enable: feature:
@@ -122,7 +125,7 @@ let
122125
(enableFeature enableExecutableProfiling "executable-profiling")
123126
(enableFeature enableStatic "static")
124127
(enableFeature enableShared "shared")
125-
(enableFeature doCoverage "coverage")
128+
(enableFeature (doCoverage || doCoverageNoRecurse) "coverage")
126129
] ++ lib.optionals (stdenv.hostPlatform.isMusl && (haskellLib.isExecutableType componentId)) [
127130
# These flags will make sure the resulting executable is statically linked.
128131
# If it uses other libraries it may be necessary for to add more
@@ -209,6 +212,13 @@ let
209212
componentDrv = drv;
210213
};
211214

215+
isComponentLibrary = d: (d.identifier == package.identifier);
216+
217+
asBuildInput = d:
218+
if (doCoverage && isComponentLibrary d)
219+
then (d.components.library.coveredNoRecurse or d)
220+
else (d.components.library or d);
221+
212222
drv = stdenv.mkDerivation (commonAttrs // {
213223
pname = nameOnly;
214224
inherit (package.identifier) version;
@@ -225,6 +235,7 @@ let
225235
env = shellWrappers;
226236
profiled = self (drvArgs // { enableLibraryProfiling = true; });
227237
covered = self (drvArgs // { doCoverage = true; });
238+
coveredNoRecurse = self (drvArgs // { doCoverageNoRecurse = true; });
228239
} // lib.optionalAttrs (haskellLib.isLibrary componentId) ({
229240
inherit haddock;
230241
inherit (haddock) haddockDir; # This is null if `doHaddock = false`
@@ -250,9 +261,9 @@ let
250261
# Not sure why pkgconfig needs to be propagatedBuildInputs but
251262
# for gi-gtk-hs it seems to help.
252263
++ builtins.concatLists pkgconfig;
253-
264+
254265
buildInputs = component.libs
255-
++ map (d: d.components.library or d) component.depends;
266+
++ map asBuildInput component.depends;
256267

257268
nativeBuildInputs =
258269
[shellWrappers buildPackages.removeReferencesTo]
@@ -360,7 +371,7 @@ let
360371
fi
361372
done
362373
'')
363-
+ (lib.optionalString doCoverage ''
374+
+ (lib.optionalString (doCoverage || doCoverageNoRecurse) ''
364375
mkdir -p $out/share
365376
cp -r dist/hpc $out/share
366377
'')

builder/make-config-files.nix

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{ stdenv, lib, haskellLib, ghc, nonReinstallablePkgs, runCommand, writeText, writeScript }:
22

3-
{ identifier, component, fullName, flags ? {}, needsProfiling ? false, chooseDrv ? drv: drv }:
3+
{ identifier, component, fullName, flags ? {}, needsProfiling ? false, needsCoverage ? false, chooseDrv ? drv: drv }:
44

55
let
66
flagsAndConfig = field: xs: lib.optionalString (xs != []) ''
@@ -43,13 +43,17 @@ let
4343
libDir = "lib/${ghcCommand}-${ghc.version}";
4444
packageCfgDir = "${libDir}/package.conf.d";
4545

46+
47+
isComponentLibrary = d: d.identifier == identifier;
48+
4649
# Filters out only library packages that for this GHC target
4750
# TODO investigate why this is needed
4851
# TODO find out why p ? configFiles helps (for instance for `R1909.aarch64-unknown-linux-gnu.tests.cabal-22.run.x86_64-linux`)
4952
libDeps = map chooseDrv (
5053
(if needsProfiling then (x: map (p: p.profiled or p) x) else x: x)
51-
(lib.filter (p: (p ? configFiles) && p.configFiles.targetPrefix == ghc.targetPrefix)
52-
(map getLibComponent component.depends))
54+
(map (d: if (needsCoverage && isComponentLibrary d) then d.coveredNoRecurse else d)
55+
(lib.filter (p: (p ? configFiles) && p.configFiles.targetPrefix == ghc.targetPrefix)
56+
(map getLibComponent component.depends)))
5357
);
5458
cfgFiles =
5559
let xs = map

0 commit comments

Comments
 (0)