diff options
Diffstat (limited to 'biz.nix')
-rw-r--r-- | biz.nix | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/biz.nix b/biz.nix deleted file mode 100644 index 6caadfd..0000000 --- a/biz.nix +++ /dev/null @@ -1,98 +0,0 @@ -{ nixpkgs }: - -with nixpkgs; -with nixpkgs.lib; - -let - # provided by .envrc - root = builtins.getEnv "BIZ_ROOT"; - - # general functions to put in a lib - lines = s: strings.splitString "\n" s; - removeNull = ls: builtins.filter (x: x != null) ls; - - depsToPackageSet = 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; - - # gather data needed for compiling by analyzing the main module - analyze = main: rec { - # path to the module relative to the git root - relpath = builtins.replaceStrings ["${root}/"] [""] - (builtins.toString main); - # Haskell-appropriate name of the module - module = builtins.replaceStrings ["/" ".hs"] ["." ""] relpath; - # file contents - content = builtins.readFile main; - # search for the ': exe' declaration - exe = builtins.head (lists.flatten (removeNull - (map (builtins.match "^-- : exe ([[:alnum:]._-]*)$") - (lines content)))); - # collect all of the ': dep' declarations - deps = lists.flatten (removeNull - (map (builtins.match "^-- : dep ([[:alnum:]._-]*)$") - (lines content))); - }; - - mkGhc = compiler: (deps: compiler (hp: - if (subset deps allDeps) - then depsToPackageSet hp deps - else throw '' - missing from deps.nix: - ${toString (lib.lists.subtractLists allDeps deps)} - '')); - - ghc_ = mkGhc pkgs.haskell.packages.ghc865.ghcWithHoogle; - ghcjs_ = mkGhc pkgs.haskell.packages.ghcjs.ghcWithPackages; -in { - buildGhc = main: - let - data = analyze main; - ghc = ghc_ data.deps; - in stdenv.mkDerivation { - name = data.module; - src = ./.; - nativeBuildInputs = [ ghc ]; - strictDeps = true; - buildPhase = '' - mkdir -p $out/bin - # compile with ghc - ${ghc}/bin/ghc -Werror -i. \ - --make ${main} \ - -main-is ${data.module} \ - -o $out/bin/${data.exe} - ''; - # the install process was handled above - installPhase = "exit 0"; - } // { env = ghc; }; - - buildGhcjs = main: - let - data = analyze main; - ghcjs = ghcjs_ data.deps; - in stdenv.mkDerivation { - name = data.module; - src = ./.; - nativeBuildInputs = [ ghcjs ]; - strictDeps = true; - buildPhase = '' - mkdir -p $out/static - # compile with ghcjs - ${ghcjs}/bin/ghcjs -Werror -i. \ - --make ${main} \ - -main-is ${data.module} \ - -o ${data.exe} - # optimize js output - ${pkgs.closurecompiler}/bin/closure-compiler \ - ${data.exe}/all.js > $out/static/${data.exe} - ''; - installPhase = "exit 0"; - } // { env = ghcjs; }; - - globalGhc = ghc_ allDeps; -} |