summaryrefslogtreecommitdiffstats
path: root/pkgs/development/haskell-modules/generic-stack-builder.nix
blob: 41cd2468b159091e42154089d55a205808fa3ed2 (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
{
  stdenv,
  ghc,
  pkg-config,
  glibcLocales,
  cacert,
  stack,
  makeSetupHook,
  lib,
}@depArgs:

{
  buildInputs ? [ ],
  nativeBuildInputs ? [ ],
  extraArgs ? [ ],
  LD_LIBRARY_PATH ? [ ],
  ghc ? depArgs.ghc,
  stack ? depArgs.stack,
  ...
}@args:

let

  stackCmd = "stack --internal-re-exec-version=${stack.version}";

  # Add all dependencies in buildInputs including propagated ones to
  # STACK_IN_NIX_EXTRA_ARGS.
  stackHook = makeSetupHook {
    name = "stack-hook";

    meta.license = lib.licenses.mit;
  } ./stack-hook.sh;

in
stdenv.mkDerivation (
  args
  // {

    # Doesn't work in the sandbox. Pass `--option sandbox relaxed` or
    # `--option sandbox false` to be able to build this
    __noChroot = true;

    buildInputs = buildInputs ++ lib.optional (stdenv.hostPlatform.libc == "glibc") glibcLocales;

    nativeBuildInputs = nativeBuildInputs ++ [
      ghc
      pkg-config
      stack
      stackHook
    ];

    env = {
      STACK_PLATFORM_VARIANT = "nix";
      STACK_IN_NIX_SHELL = 1;
      STACK_IN_NIX_EXTRA_ARGS = extraArgs;

      # XXX: workaround for https://ghc.haskell.org/trac/ghc/ticket/11042.
      LD_LIBRARY_PATH = lib.makeLibraryPath (LD_LIBRARY_PATH ++ buildInputs);
      # ^^^ Internally uses `getOutput "lib"` (equiv. to getLib)

      # Non-NixOS git needs cert
      GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";

      # Fixes https://github.com/commercialhaskell/stack/issues/2358 krank:ignore-line
      LANG = "en_US.UTF-8";
    };

    preferLocalBuild = true;

    preConfigure = ''
      export STACK_ROOT=$NIX_BUILD_TOP/.stack
    '';

    buildPhase =
      args.buildPhase or ''
        runHook preBuild

        ${stackCmd} build

        runHook postBuild
      '';

    checkPhase =
      args.checkPhase or ''
        runHook preCheck

        ${stackCmd} test

        runHook postCheck
      '';

    doCheck = args.doCheck or true;

    installPhase =
      args.installPhase or ''
        runHook preInstall

        ${stackCmd} --local-bin-path=$out/bin build --copy-bins

        runHook postInstall
      '';
  }
)