|
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