1{ stdenv, ghc, pkgconfig, glibcLocales, cacert, stack }@depArgs:
2
3with stdenv.lib;
4
5{ buildInputs ? []
6, extraArgs ? []
7, LD_LIBRARY_PATH ? []
8, ghc ? depArgs.ghc
9, stack ? depArgs.stack
10, ...
11}@args:
12
13let stackCmd = "stack --internal-re-exec-version=${stack.version}";
14
15 # Add all dependencies in buildInputs including propagated ones to
16 # STACK_IN_NIX_EXTRA_ARGS.
17 addStackArgsHook = ''
18for pkg in ''${pkgsHostHost[@]} ''${pkgsHostBuild[@]} ''${pkgsHostTarget[@]}
19do
20 [ -d "$pkg/lib" ] && \
21 export STACK_IN_NIX_EXTRA_ARGS+=" --extra-lib-dirs=$pkg/lib"
22 [ -d "$pkg/include" ] && \
23 export STACK_IN_NIX_EXTRA_ARGS+=" --extra-include-dirs=$pkg/include"
24done
25 '';
26in stdenv.mkDerivation (args // {
27
28 buildInputs =
29 buildInputs ++
30 optional (stdenv.hostPlatform.libc == "glibc") glibcLocales ++
31 [ ghc pkgconfig stack ];
32
33 STACK_PLATFORM_VARIANT="nix";
34 STACK_IN_NIX_SHELL=1;
35 STACK_IN_NIX_EXTRA_ARGS = extraArgs;
36 shellHook = addStackArgsHook + args.shellHook or "";
37
38
39 # XXX: workaround for https://ghc.haskell.org/trac/ghc/ticket/11042.
40 LD_LIBRARY_PATH = makeLibraryPath (LD_LIBRARY_PATH ++ buildInputs);
41 # ^^^ Internally uses `getOutput "lib"` (equiv. to getLib)
42
43 # Non-NixOS git needs cert
44 GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
45
46 # Fixes https://github.com/commercialhaskell/stack/issues/2358
47 LANG = "en_US.UTF-8";
48
49 preferLocalBuild = true;
50
51 configurePhase = args.configurePhase or ''
52 export STACK_ROOT=$NIX_BUILD_TOP/.stack
53 ${addStackArgsHook}
54 '';
55
56 buildPhase = args.buildPhase or "${stackCmd} build";
57
58 checkPhase = args.checkPhase or "${stackCmd} test";
59
60 doCheck = args.doCheck or true;
61
62 installPhase = args.installPhase or ''
63 ${stackCmd} --local-bin-path=$out/bin build --copy-bins
64 '';
65})