{ lib , stdenv , unzip , jdk , gradle , ghidra }: let metaCommon = oldMeta: oldMeta // (with lib; { maintainers = (oldMeta.maintainers or []) ++ (with maintainers; [ vringar ]); platforms = oldMeta.platforms or ghidra.meta.platforms; }); buildGhidraExtension = { pname, nativeBuildInputs ? [], meta ? { }, ... }@args: stdenv.mkDerivation (args // { nativeBuildInputs = nativeBuildInputs ++ [ unzip jdk gradle ]; preBuild = '' # Set project name, otherwise defaults to directory name echo -e '\nrootProject.name = "${pname}"' >> settings.gradle ''; gradleFlags = [ "-PGHIDRA_INSTALL_DIR=${ghidra}/lib/ghidra" ]; installPhase = args.installPhase or '' runHook preInstall mkdir -p $out/lib/ghidra/Ghidra/Extensions unzip -d $out/lib/ghidra/Ghidra/Extensions dist/*.zip runHook postInstall ''; meta = metaCommon meta; }); buildGhidraScripts = { pname, meta ? { }, ... }@args: stdenv.mkDerivation (args // { installPhase = '' runHook preInstall GHIDRA_HOME=$out/lib/ghidra/Ghidra/Extensions/${pname} mkdir -p $GHIDRA_HOME cp -r . $GHIDRA_HOME/ghidra_scripts touch $GHIDRA_HOME/Module.manifest cat <<'EOF' > extension.properties name=${pname} description=${meta.description or ""} author= createdOn= version=${lib.getVersion ghidra} EOF runHook postInstall ''; meta = metaCommon meta; }); in { inherit buildGhidraExtension buildGhidraScripts; }