|
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 |
|
22 | 22 | name = "${name}"; |
23 | 23 | inherit src; |
24 | 24 | }; |
25 | | -in |
26 | 25 |
|
27 | | -name: root: |
28 | | -lib.pipe root |
29 | | - [ |
30 | | - # Avoid rebuilding because of changes in parent directories |
31 | | - (mkNewStorePath "source-${name}") |
32 | | - (x: log.traceDebug "${name}.mkNewStorePath ${x.outPath}" x) |
| 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; |
| 34 | + |
| 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 |
33 | 53 |
|
34 | | - (root: self.callCabal2nix name root { }) |
35 | | - (x: log.traceDebug "${name}.cabal2nixDeriver ${x.cabal2nixDeriver.outPath}" x) |
36 | | - ] |
| 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