psDeriver/psDeriver.nix

79 lines
1.4 KiB
Nix

# 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 "");
}