-
Notifications
You must be signed in to change notification settings - Fork 0
/
haskell-project.nix
90 lines (85 loc) · 2.91 KB
/
haskell-project.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
inputs:
{
# Source directory of the project using this flake.
src
# A list of compiler versions supported in the project.
# Valid values are keys of haskell.compiler in nixpkgs.
, supportedCompilers
# Default compiler version to choose. Must be one of the supportedCompilers.
, defaultCompiler ? builtins.head supportedCompilers
# Additional haskell packages whose deps should be included in the
# shell. We want cabal to provide most packages, so only list
# packages with native dependencies. That ensures the provided GHC
# can find necessary native libraries on NixOS.
, haskellFfiPackages ? hpkgs: [ ]
# Extra tools to include in the shell. This is a function that takes nixpkgs
# as the argument and returns a list of packages.
, extraTools ? nixpkgs: [ ]
}:
inputs.flake-utils.lib.eachDefaultSystem (system:
let
nixpkgs = import inputs.nixpkgs { inherit system; };
haskell-ci =
let
# Hopefully many of these overrides become redundant in future
# dependency update cycles, as the default version in
# `nixpkgs.haskellPackages` become compatible with `haskell-ci`.
haskellPackages = nixpkgs.haskellPackages.override {
overrides = hfinal: hprev: with nixpkgs.haskell.lib.compose; {
aeson = doJailbreak (hprev.callHackage "aeson" "2.2.2.0" { });
base-compat = hprev.base-compat_0_14_0;
haskell-ci = doJailbreak (hprev.callCabal2nix "haskell-ci" inputs.haskell-ci { });
lattices = doJailbreak hprev.lattices;
primitive = dontCheck hprev.primitive_0_9_0_0;
ShellCheck = hprev.ShellCheck_0_9_0;
time-compat = doJailbreak hprev.time-compat;
};
};
in
haskellPackages.haskell-ci;
checks.pre-commit-check = inputs.pre-commit-hooks.lib.${system}.run {
inherit src;
hooks = {
cabal-fmt.enable = true;
hlint.enable = true;
nixpkgs-fmt.enable = true;
ormolu.enable = true;
};
};
essentialTools = with nixpkgs; [
cabal-install
cabal2nix
haskell-ci
haskellPackages.cabal-fmt
haskellPackages.haskell-language-server
hlint
nixpkgs-fmt
ormolu
] ++ extraTools nixpkgs;
makeShell = compilerName: nixpkgs.haskell.packages.${compilerName}.shellFor {
inherit (checks.pre-commit-check) shellHook;
# Provide zlib by default because anything non-trivial will depend on it.
packages = hpkgs: [ hpkgs.zlib ] ++ haskellFfiPackages hpkgs;
nativeBuildInputs = [ essentialTools ]
++ checks.pre-commit-check.enabledPackages;
};
in
{
devShells =
let
devShellsWithoutDefault =
builtins.listToAttrs
(
builtins.map
(compilerName: {
name = compilerName;
value = makeShell compilerName;
})
supportedCompilers
);
in
devShellsWithoutDefault // {
default = devShellsWithoutDefault.${defaultCompiler};
};
}
)