{ lib, stdenv, nim }: { name, src, nimDeps ? [], nativeBuildInputs ? [], buildInputs ? [], patches ? [], patchPhase ? "", preBuild ? "", postBuild ? "", preInstall ? "", postInstall ? "", ... }: with lib; let getRecursiveInputs = getInputsFn: deps: optionals (deps != []) ((getInputsFn (head deps)) ++ (getRecursiveInputs getInputsFn (head deps).nimDeps) ++ (getRecursiveInputs getInputsFn (tail deps))); rNativeBuildInputs = nativeBuildInputs ++ (getRecursiveInputs (i: i.nativeBuildInputs) nimDeps); rBuildInputs = buildInputs ++ (getRecursiveInputs (i: i.buildInputs) nimDeps); copyNimDeps = '' mkdir -p $NIMBLE_DIR/pkgs echo "[]" > $NIMBLE_DIR/packages_official.json '' + toString (map (dep: '' if [ -d ${dep}/.nimble ]; then cp -R ${dep}/.nimble/pkgs $NIMBLE_DIR else cp -R ${dep} $NIMBLE_DIR/pkgs/${dep.name} fi '' ) nimDeps) + '' # nimble >= 0.20.0 wants to store nimblemeta.json here chmod -R u+w $NIMBLE_DIR/pkgs ''; in stdenv.mkDerivation { name = name; src = src; patches = patches; nativeBuildInputs = [ nim ] ++ (filter (i: i != nim) rNativeBuildInputs); buildInputs = rBuildInputs; nimDeps = nimDeps; patchPhase = patchPhase; preBuild = preBuild; postBuild = postBuild; preInstall = preInstall; postInstall = postInstall; LD_LIBRARY_PATH = makeLibraryPath (rBuildInputs ++ rNativeBuildInputs); buildPhase = '' runHook preBuild HOME=$TMPDIR NIMBLE_DIR=$HOME/.nimble '' + copyNimDeps + '' nimble install runHook PostBuild ''; installPhase = '' runHook preInstall mkdir $out if [ -d $NIMBLE_DIR/bin ]; then cp -RL $NIMBLE_DIR/bin $out fi numberNimFiles=$(find $NIMBLE_DIR/pkgs/${name} -type f -name "*.nim" | wc -l) numberDirectories=$(find $NIMBLE_DIR/pkgs/${name} -mindepth 1 -type d | wc -l) if [ $numberNimFiles -gt 0 ] || [ $numberDirectories -gt 0 ]; then mkdir -p $out/.nimble cp -R $NIMBLE_DIR/pkgs $out/.nimble fi runHook postInstall ''; shellHook = '' export NIMBLE_DIR=$PWD/.nimble '' + copyNimDeps; }