/
default.nix
120 lines (111 loc) · 4.72 KB
/
default.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# CAUTION! a spelling mistake in arg string is ignored silently.
#
# To build the chart executable for running bench.sh use:
# nix-shell --argstr c2nix "--flag dev" --run "cabal build chart --flag dev"
#
# You can permanently copy the "chart" executable to "./bin" to pick
# it up irrespective of the compiler/build. Its path is printed by the
# above build command. You can also print its path using the following
# command and then use "cp <path> ./bin" to copy it to "./bin", the bench.sh
# script will pick it up from there:
# nix-shell --argstr c2nix "--flag dev" --run "cabal exec --flag dev -- which chart"
#
# To use ghc-8.6.5
# nix-shell --argstr compiler "ghc865"
{
nixpkgs ?
import (builtins.fetchTarball https://github.com/composewell/nixpkgs/archive/01dd2b4e738.tar.gz)
# fusion-plugin is marked as broken
{ config.allowBroken = true;}
, compiler ? "default"
, c2nix ? "" # cabal2nix CLI options
# TODO
#, sources ? [] # e.g. [./. ./benchmark]
#, hdeps ? [] # e.g. [time, mtl]
#, deps ? [] # e.g. [SDL2]
}:
let haskellPackages =
if compiler == "default"
then nixpkgs.haskellPackages
else nixpkgs.haskell.packages.${compiler};
# we can possibly avoid adding our package to HaskellPackages like
# in the case of nix-shell for a single package?
mkPackage = super: pkg: path: opts: inShell:
let orig = super.callCabal2nixWithOptions pkg path opts {};
in if inShell
# Avoid copying the source directory to nix store by using
# src = null.
then orig.overrideAttrs (oldAttrs: { src = null; })
else orig;
flags = "--benchmark --flag fusion-plugin " + c2nix;
mkHaskellPackages = inShell:
haskellPackages.override {
# We could disbale doCheck on all like this, but it would make the
# whole world rebuild, we can't use the binary cache
#packageSetConfig = self: super: {
# mkDerivation = drv: super.mkDerivation (drv // {
# doCheck = false;
# });
#};
overrides = self: super:
with nixpkgs.haskell.lib;
{
streamly = mkPackage super "streamly" ./. flags inShell;
streamly-benchmarks =
mkPackage super "streamly-benchmarks"
./benchmark flags inShell;
streamly-tests =
mkPackage super "streamly-tests"
./test flags inShell;
fusion-plugin =
super.callHackageDirect
{ pkg = "fusion-plugin";
ver = "0.2.2";
sha256 = "1g7j50wa7ffyizv6fdnr09dr4w7bc0hskb46h7y0paw6rh9yz4zj";
} {};
# Example to Use a different version of a package
#QuickCheck = self.QuickCheck_2_14;
# Example to disable tests if tests fail or take too long
# or to use different configure flags if needed
#
# XXX We need the ability to disable doCheck on all
# those packages that are being built locally and
# not fetched from the cache. Running tests could do
# nasty things to the machine e.g. some tests even
# listen for incoming connections on the network.
#selective =
# super.selective.overrideAttrs (oldAttrs:
# { doCheck = false;
# configureFlags =
# oldAttrs.configureFlags ++ ["--disable-tests"];
# });
};
};
drv = mkHaskellPackages true;
shell = drv.shellFor {
packages = p:
[ p.streamly
p.streamly-benchmarks
p.streamly-tests
];
# some dependencies of hoogle fail to build with quickcheck-2.14
# We should use hoogle as external tool instead of building it here
# withHoogle = true;
doBenchmark = true;
# XXX On macOS cabal2nix does not seem to generate a dependency on
# Cocoa framework.
buildInputs =
if builtins.currentSystem == "x86_64-darwin"
then [nixpkgs.darwin.apple_sdk.frameworks.Cocoa]
else [];
# Use a better prompt
shellHook = ''
if test -n "$PS_SHELL"
then
export PS1="$PS_SHELL\[$bldred\](nix)\[$txtrst\] "
fi
'';
};
in if nixpkgs.lib.inNixShell
then shell
else (mkHaskellPackages false).streamly