aboutsummaryrefslogtreecommitdiff
path: root/compiler/default.nix
blob: b9bd6400e63bcc89885e03d8096322f37894368e (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
{ boot ? import <nixpkgs> {} }:

let

  filtFn = root: path: type:
    let
      name = baseNameOf path;
      hidden = builtins.match "\\..+" name != null;
      nix = builtins.match ".*\\.nix" name != null;
      r = !hidden && !nix ;
    in builtins.trace (path + ": " + (if r then "yes" else "no")) r;

  fltsrc = builtins.filterSource (filtFn (builtins.toPath ./. + "/"));

  nixpkgs = boot.pkgs.fetchFromGitHub {
    owner = "NixOS";
    repo = "nixpkgs";
    rev = "897ec814c9c234f3ed9d60a1a713025d2f9fab2d";
    sha256 = "0alg5h5zmxdrnfdj94fa4yr5g7j7z3424k78aq44r0a0aqm20iy5";
  };

  config = {
    allowUnfree = true; # for local packages
    allowBroken = true; # some nixpkgs' nonsense
  };

  inherit (import nixpkgs { inherit config; }) pkgs;
  inherit (pkgs) lib;

  nixHaskellPackages =
    let
      isnix = n: _: null != builtins.match ".*\\.nix" n && n != "default.nix";
      files = lib.filterAttrs isnix (builtins.readDir ./.);
    in lib.mapAttrs' (n: _:
          { name = lib.removeSuffix ".nix" n;
            value = ./. + "/${n}";
          }) files;

  localHaskellPackages =
    let
      islocal = n: t: !lib.hasPrefix "." n && t == "directory";
      files = lib.filterAttrs islocal (builtins.readDir ./.);
    in lib.mapAttrs (n: _: fltsrc (./. + "/${n}")) files;

  haskellPackages =
    let

      hlib = pkgs.haskell.lib;

      set0 = pkgs.haskell.packages.ghc865;

      set1 = set0.extend (
        self: super:
          lib.mapAttrs (_: f: super.callPackage f {}) nixHaskellPackages
      );

      set2 = set1.extend (
        self: super:
          lib.mapAttrs (n: d: super.callCabal2nix n d {}) localHaskellPackages
      );

      set3 = set2.extend (
        self: super: {
          mkDerivation = drv: super.mkDerivation (drv // {
            buildTools = (drv.buildTools or []);

            # XXX a lot of troubles are cause by tests which require fancy packages of features.
            # XXX Enable tests for critical packages when unsure.
            doCheck = false;

            doHaddock = false;

            enableExecutableProfiling = false;
            enableLibraryProfiling = false;
          });

          primitive = self.primitive_0_7_0_0;
          primitive-extras = self.primitive-extras_0_8;

        });

      set = set3.extend (
        self: super:
          lib.mapAttrs (n: _:
              hlib.overrideCabal super.${n} (drv:
                {
                  doCheck = true;
                  configureFlags = (drv.configureFlags or []) ++ [
                    "--ghc-option=-Werror"
                  ];
                })
            ) localHaskellPackages);

    in set;

in haskellPackages