Extend ghcHEAD derivation rather than make a new derivation (#486)
[hadrian.git] / shell.nix
1 # Invoking nix-shell sets up an environment where we can build ghc
2 # by only invoking hadrian.
3
4
5 { nixpkgs ? import <nixpkgs> {} }:
6
7 let
8   haskellPackages = nixpkgs.haskell.packages.ghc821;
9
10   removeBuild = path: type:
11     let baseName = baseNameOf (toString path);
12     in
13         ! (baseName == "_build"
14            || baseName == "dist"
15            || baseName == "dist-newstyle"
16            || baseName == ".stack-work"
17            || baseName == "config.log"
18            || baseName == "config.status"
19            || baseName == "shell.nix"
20            || nixpkgs.lib.hasSuffix ".sh" baseName
21            || !(nixpkgs.lib.cleanSourceFilter path type)) ;
22
23   filterSrc = path: builtins.filterSource removeBuild path;
24
25
26   hadrianPackages = nixpkgs.haskell.packages.ghc821.override {
27     overrides = self: super: let
28         localPackage = name: path: self.callCabal2nix name (filterSrc path) {};
29       in {
30         hadrian = localPackage "hadrian" ./. ;
31         shake = self.callHackage "shake" "0.16" {};
32         Cabal = localPackage "Cabal" ./../libraries/Cabal/Cabal ;
33         filepath = localPackage "filepath" ./../libraries/filepath ;
34         text = localPackage "text" ./../libraries/text  ;
35         hpc = localPackage"hpc" ./../libraries/hpc ;
36         parsec = localPackage "parsec" ./../libraries/parsec ;
37         HUnit = nixpkgs.haskell.lib.dontCheck (self.callHackage "HUnit" "1.3.1.2" {});
38         process = localPackage "process" ./../libraries/process ;
39         directory = localPackage "directory" ./../libraries/directory ;
40       }; };
41
42 in
43   nixpkgs.lib.overrideDerivation nixpkgs.haskell.packages.ghcHEAD.ghc
44     (drv: {
45       name = "ghc-dev";
46       buildInputs = drv.buildInputs ++ [
47                     hadrianPackages.hadrian
48                     nixpkgs.arcanist
49                     ];
50     })
51