{ pkgs ? import {}, stdenv ? pkgs.stdenv, lib ? pkgs.lib, ldc ? null, dcompiler ? pkgs.ldc, dub ? pkgs.dub }: assert dcompiler != null; with ( assert dcompiler != null; with lib; let # Filter function to remove the .dub package folder from src filterDub = name: type: let baseName = baseNameOf (toString name); in ! ( type == "directory" && baseName == ".dub" ); targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}"; # Remove reference to build tools and library sources disallowedReferences = deps: [ dcompiler dub ]; removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}''; in { mkDubDerivation = lib.makeOverridable ({ src, nativeBuildInputs ? [], dubJSON ? src + "/dub.json", passthru ? {}, package ? lib.importJSON dubJSON, ... } @ attrs: stdenv.mkDerivation (attrs // { pname = package.name; nativeBuildInputs = [ dcompiler dub pkgs.removeReferencesTo ] ++ nativeBuildInputs; disallowedReferences = disallowedReferences deps; passthru = passthru // { inherit dub dcompiler pkgs; }; src = lib.cleanSourceWith { filter = filterDub; src = lib.cleanSource src; }; preFixup = '' find $out/share/cgi-bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true ''; buildPhase = '' runHook preBuild export HOME=$PWD for dc_ in dmd ldmd2 gdmd; do echo "- check for D compiler $dc_" dc=$(type -P $dc_ || echo "") if [ ! "$dc" == "" ]; then break fi done if [ "$dc" == "" ]; then exit "Error: could not find D compiler" fi echo "$dc_ used as D compiler to build $pname" dub build --compiler=$dc --build=release --combined --skip-registry=all runHook postBuild ''; checkPhase = '' runHook preCheck export HOME=$PWD dub test --combined --skip-registry=all runHook postCheck ''; installPhase = '' runHook preInstall mkdir -p $out/share/cgi-bin cp -r "${targetOf package}" $out/share/cgi-bin install -m755 -D $out/share/cgi-bin/spine_search spine_search runHook postInstall ''; postInstall = '' echo "HERE ${targetOf package} $out/share/cgi-bin" echo `ls -la $out/share/cgi-bin/spine_search` ''; meta = lib.optionalAttrs (package ? description) { description = package.description; } // attrs.meta or {}; } // lib.optionalAttrs (!(attrs ? version)) { # Use name from dub.json, unless pname and version are specified name = package.name; })); } ); mkDubDerivation rec { name = "spine-search-${version}"; version = "0.11.3"; src = ./.; buildInputs = [ pkgs.sqlite ( with pkgs; [ nixFlakes ## package manager dub ## compiler ldc rund ## linker #lld #mold ## builder #ninja sqlite ] ) ]; meta = with pkgs.lib; { pname = "spine-search"; version = "0.11.3"; homepage = "https://sisudoc.org"; description = "cgi sqlite search form for document object search"; longDescription = '' A sisu like parser and document generator ... ''; license = licenses.agpl3Plus; platforms = platforms.linux; maintainers = [ "RalphAmissah" ]; }; }