Skip to content
21 changes: 18 additions & 3 deletions nix/build-haskell-package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,30 @@ let
name = "${name}";
inherit src;
};

in

name: root:
name: root: cabal2NixFile:
lib.pipe root
[
# Avoid rebuilding because of changes in parent directories
(mkNewStorePath "source-${name}")
(x: log.traceDebug "${name}.mkNewStorePath ${x.outPath}" x)

(root: self.callCabal2nix name root { })
(x: log.traceDebug "${name}.cabal2nixDeriver ${x.cabal2nixDeriver.outPath}" x)
(root:
let path = "${root}/${cabal2NixFile}";
in
# Check if cached cabal2nix generated nix expression is present,
# if present use it with callPackage
# to avoid IFD
if builtins.pathExists path
then
(log.traceDebug "${name}.callPackage[cabal2nix] ${path}")
(self.callPackage path { })
else
lib.pipe (self.callCabal2nix name root { })
[
(pkg: log.traceDebug "${name}.callCabal2nix root=${root} deriver=${pkg.cabal2nixDeriver.outPath}" pkg)
]
)
]
3 changes: 1 addition & 2 deletions nix/modules/project/packages/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ in
getOrMkPackage = name: cfg:
if lib.types.path.check cfg.source
then
log.traceDebug "${name}.callCabal2nix ${cfg.source}"
(build-haskell-package name cfg.source)
(build-haskell-package name cfg.source cfg.cabal2NixFile)
else
log.traceDebug "${name}.callHackage ${cfg.source}"
(self.callHackage name cfg.source { });
Expand Down
10 changes: 10 additions & 0 deletions nix/modules/project/packages/package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ in
'';
};

cabal2NixFile = lib.mkOption {
type = lib.types.str;
description = ''
The Nix file which contains cached (pre-generated) `cabal2nix` expressions.

By default, it refers to `cabal.nix` file.
'';
default = "cabal.nix";
};

cabal.executables = mkOption {
type = types.nullOr (types.listOf types.str);
description = ''
Expand Down