|
12 | 12 | }:
|
13 | 13 |
|
14 | 14 | let
|
15 |
| - mkNewStorePath = name: src: |
| 15 | + mkNewStorePath' = name: src: |
16 | 16 | # Since 'src' may be a subdirectory of a store path
|
17 | 17 | # (in string form, which means that it isn't automatically
|
18 | 18 | # copied), the purpose of cleanSourceWith here is to create a
|
|
23 | 23 | inherit src;
|
24 | 24 | };
|
25 | 25 |
|
26 |
| -in |
| 26 | + # Avoid rebuilding because of changes in parent directories |
| 27 | + mkNewStorePath = name: src: |
| 28 | + let newSrc = mkNewStorePath' name src; |
| 29 | + in log.traceDebug "${name}.mkNewStorePath ${newSrc}" newSrc; |
| 30 | + |
| 31 | + callCabal2nix = name: src: |
| 32 | + let pkg = self.callCabal2nix name src { }; |
| 33 | + in log.traceDebug "${name}.callCabal2nix src=${src} deriver=${pkg.cabal2nixDeriver.outPath}" pkg; |
27 | 34 |
|
28 |
| -name: root: cabal2NixFile: |
29 |
| -lib.pipe root |
30 |
| - [ |
31 |
| - # Avoid rebuilding because of changes in parent directories |
32 |
| - (mkNewStorePath "source-${name}") |
33 |
| - (x: log.traceDebug "${name}.mkNewStorePath ${x.outPath}" x) |
| 35 | + # Use cached cabal2nix generated nix expression if present, otherwise use IFD (callCabal2nix) |
| 36 | + callCabal2NixUnlessCached = name: src: cabal2nixFile: |
| 37 | + let path = "${src}/${cabal2nixFile}"; |
| 38 | + in |
| 39 | + if builtins.pathExists path |
| 40 | + then |
| 41 | + callPackage name path |
| 42 | + else |
| 43 | + callCabal2nix name src { }; |
| 44 | + |
| 45 | + callPackage = name: nixFilePath: |
| 46 | + let pkg = self.callPackage nixFilePath { }; |
| 47 | + in log.traceDebug "${name}.callPackage[cabal2nix] ${nixFilePath}" pkg; |
| 48 | + |
| 49 | + callHackage = name: version: |
| 50 | + let pkg = self.callHackage name version { }; |
| 51 | + in log.traceDebug "${name}.callHackage ver=${version}" pkg; |
| 52 | +in |
34 | 53 |
|
35 |
| - (root: |
36 |
| - let path = "${root}/${cabal2NixFile}"; |
37 |
| - in |
38 |
| - # Check if cached cabal2nix generated nix expression is present, |
39 |
| - # if present use it with callPackage |
40 |
| - # to avoid IFD |
41 |
| - if builtins.pathExists path |
42 |
| - then |
43 |
| - (log.traceDebug "${name}.callPackage[cabal2nix] ${path}") |
44 |
| - (self.callPackage path { }) |
45 |
| - else |
46 |
| - lib.pipe (self.callCabal2nix name root { }) |
47 |
| - [ |
48 |
| - (pkg: log.traceDebug "${name}.callCabal2nix root=${root} deriver=${pkg.cabal2nixDeriver.outPath}" pkg) |
49 |
| - ] |
50 |
| - ) |
51 |
| - ] |
| 54 | +name: cfg: |
| 55 | +# If 'source' is a path, we treat it as such. Otherwise, we assume it's a version (from hackage). |
| 56 | +if lib.types.path.check cfg.source |
| 57 | +then |
| 58 | + callCabal2NixUnlessCached name (mkNewStorePath name cfg.source) cfg.cabal2NixFile |
| 59 | +else |
| 60 | + callHackage name cfg.source |
0 commit comments