# pkgs: nixpkgs # # nodejs?: node derivation to use for running executables # # purescript?: purescript derivation to use for compilation # # deps: # { # name # version # src # } # # or # # { # name # version # gitUrl # } # # out: # # { # name # version # src # executable? # } { pkgs , purescript ? pkgs.purescript , nodejs ? pkgs.nodejs , deps , out }: with builtins; let inputs = map (d: pkgs.stdenv.mkDerivation { name = d.name; version = d.version; src = d.src or fetchGit { url = d.gitUrl; ref = "refs/tags/${d.version}"; }; installPhase = ''cp -r "$src" "$out"''; }) deps; in pkgs.stdenv.mkDerivation { pname = out.name; version = out.version; src = out.src; buildInputs = [ purescript ] ++ inputs; buildPhase = '' purs compile "$src/**/*.purs" ${concatStringsSep " " (map (x: ''"${x}/src/**/*.purs"'') inputs)} '' + (if hasAttr "executable" out then '' cat > output/runMain.js <<-EOF import * as Main from "$out/lib/Main/index.js" Main.main() EOF cat > ${out.executable} <<-EOF #!/bin/sh exec ${nodejs}/bin/node "$out/lib/runMain.js" "$@" EOF '' else ""); installPhase = '' mkdir -p "$out/lib" mv output/* "$out/lib" '' + (if hasAttr "executable" out then '' mkdir -p "$out/bin" install -Dm 755 ${out.executable} "$out/bin" '' else ""); }