on e94de40 help sign in
haskell.nix/lib/clean-source-haskell.nix
55 lines 2.1 kB history raw
1# This is a source filter function which cleans common build products
2# and files not needed to do a haskell build from a source directory.
3#
4# This can avoid unnecessary builds when these files change.
5#
6# It should be used with "pkgs.lib.cleanSourceWith". Alternatively,
7# use the convenience function "cleanSourceHaskell".
8#
9{ lib }:
11rec {
12 haskellSourceFilter = name: type:
13 let baseName = baseNameOf (toString name);
14 in ! (
15 # Filter out cabal build products.
16 baseName == "dist" || baseName == "dist-newstyle" ||
17 baseName == "cabal.project.local" ||
18 lib.hasPrefix ".ghc.environment" baseName ||
19 # Filter out stack build products.
20 lib.hasPrefix ".stack-work" baseName ||
21 # Filter out files left by ghci
22 lib.hasSuffix ".hi" baseName ||
23 # Filter out files generated by "hasktags"
24 baseName == "TAGS" || baseName == "tags" ||
25 # Filter out files which are commonly edited but don't
26 # affect the cabal build.
27 lib.hasSuffix ".nix" baseName
28 );
30 # Like pkgs.lib.cleanSource, but adds Haskell files to the filter.
31 cleanSourceHaskell = { src, name ? null }:
32 let
33 clean = lib.cleanSourceWith {
34 filter = haskellSourceFilter;
35 src = lib.cleanSource src;
36 inherit name;
37 };
38 # Copy function from 19.09 for compatibility with 19.03.
39 # Does require at least Nix 2.0.
40 compat = let
41 isFiltered = src ? _isLibCleanSourceWith;
42 origSrc = if isFiltered then src.origSrc else src;
43 filter' = name: type: haskellSourceFilter name type && lib.cleanSourceFilter name type;
44 name' = if name != null then name else if isFiltered then src.name else baseNameOf src;
45 in {
46 inherit origSrc;
47 filter = filter';
48 outPath = builtins.path { filter = filter'; path = origSrc; name = name'; };
49 _isLibCleanSourceWith = true;
50 name = name';
51 };
52 in
53 if (builtins.typeOf src) == "path"
54 then (if lib.versionAtLeast lib.version "19.09" then clean else compat) else src;