diff options
Diffstat (limited to 'biz.nix')
-rw-r--r-- | biz.nix | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -9,22 +9,33 @@ let # general functions to put in a lib lines = s: strings.splitString "\n" s; - seq = ls: builtins.filter (x: x!= null) ls; + removeNull = ls: builtins.filter (x: x != null) ls; + depsToPackageSet = packageSet: deps: - map (s: builtins.getAttr s packageSet) deps; + attrsets.attrVals deps packageSet; + + # returns true if a is a subset of b, where a and b are attrsets + subset = a: b: builtins.all + (x: builtins.elem x b) a; + + allDeps = import ./deps.nix; in { buildGhc = main: let relpath = builtins.replaceStrings ["${root}/"] [""] (builtins.toString main); module = builtins.replaceStrings ["/" ".hs"] ["." ""] relpath; content = builtins.readFile main; - exe = builtins.head (lists.flatten (seq + exe = builtins.head (lists.flatten (removeNull (map (builtins.match "^-- : exe ([[:alnum:]._-]*)$") (lines content)))); - deps = lists.flatten (seq + deps = lists.flatten (removeNull (map (builtins.match "^-- : dep ([[:alnum:]._-]*)$") (lines content))); - ghc = pkgs.haskell.packages.ghc865.ghcWithHoogle (hp: depsToPackageSet hp deps); + ghc = pkgs.haskell.packages.ghc865.ghcWithHoogle (hp: + if (subset deps allDeps) + then depsToPackageSet hp deps + else throw ("missing from deps.nix: ${toString (lib.lists.subtractLists allDeps deps)}") + ); in stdenv.mkDerivation { name = module; version = "0"; @@ -82,4 +93,6 @@ in { ''; installPhase = "exit 0"; } // { env = ghcjs; }; + + globalGhc = pkgs.haskell.packages.ghc865.ghcWithHoogle (hp: depsToPackageSet hp allDeps); } |