{ srcs # list of files , root # path to git root , packageSet # name mapped to private.${packageSet}, e.g. 'ghcWith' , langDeps ? null # list of deps (as a string), split and passed to packageSet , name # exe name , main # entrypoint file , mainIs # entrypoint module name }: with import (/. + root + "/Biz/Bild.nix") {}; with builtins; let srcs_ = lib.strings.splitString " " srcs; skip = ["_" ".direnv"]; filter = file: type: if elem (baseNameOf file) skip then false # TODO: this means any new directory will cause a rebuild. this bad. # i should recurse into the directory and match against the srcsr else if type == "directory" then true else if type == "regular" then builtins.elem file srcs_ else false; deps = pkgset: if langDeps != null then private.selectAttrs (lib.strings.splitString " " langDeps) pkgset else []; in stdenv.mkDerivation { inherit name; buildInputs = [ (private.${packageSet} deps) ]; src = lib.sources.cleanSourceWith {inherit filter; src = lib.sources.cleanSource root;}; buildPhase = '' ghc -Werror -i$src -odir. -hidir. --make $src/${main} -main-is "${mainIs}" -o ${name} ''; installPhase = '' mkdir -p $out/bin && cp ${name} $out/bin ''; }