79 lines
1.4 KiB
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 "");
|
|
}
|