From 9be73a459c989cb312c780096014f97af0822166 Mon Sep 17 00:00:00 2001 From: Igor Melo Date: Wed, 10 Jun 2026 00:36:15 -0300 Subject: [PATCH] libretro.melondsds: custom updateScript --- .../emulators/libretro/cores/melondsds.nix | 89 ++++++++++++++++++- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/pkgs/applications/emulators/libretro/cores/melondsds.nix b/pkgs/applications/emulators/libretro/cores/melondsds.nix index aad929747265..cfcddf3a523a 100644 --- a/pkgs/applications/emulators/libretro/cores/melondsds.nix +++ b/pkgs/applications/emulators/libretro/cores/melondsds.nix @@ -1,16 +1,24 @@ { lib, applyPatches, + coreutils, fetchFromGitHub, - glm, - libslirp, fmt_11, - span-lite, + glm, + gnugrep, + gnused, howard-hinnant-date, + jq, libGL, libGLU, - cmake, + libslirp, mkLibretroCore, + nix, + nix-prefetch-git, + cmake, + span-lite, + unstableGitUpdater, + writeShellApplication, }: let # https://github.com/JesseTG/melonds-ds/blob/33c48260402865ef77667487528efd5ca7ce1233/cmake/FetchDependencies.cmake#L44 @@ -99,6 +107,79 @@ mkLibretroCore rec { postBuild = "cd src/libretro"; + passthru.updateScript = [ + (lib.getExe (writeShellApplication { + name = "update-libretro-melondsds"; + runtimeInputs = [ + coreutils + gnugrep + gnused + jq + nix + nix-prefetch-git + ]; + text = '' + ${lib.escapeShellArgs (unstableGitUpdater { + hardcodeZeroVersion = true; + })} + + src=$(nix-build --no-out-link -A "$UPDATE_NIX_ATTR_PATH.src") + core_file="pkgs/applications/emulators/libretro/cores/melondsds.nix" + + # find lines in the format: + # fetch_dependency(name url rev) + # and extracts name, url and rev + grep "^fetch_dependency" "''${src}/cmake/FetchDependencies.cmake" | + sed 's/"//g' | + sed 's/fetch_dependency(\(.*\))/\1/' | + while read -r name url rev + do + echo >&2 + + # example: if there is fetch_dependency(melonDS ...) and no melonDS-src + if ! fetch_block=$(grep -A10 "''${name}-src =" "$core_file") + then + + # if the dependency comes from nix, we just skip it + if grep -q "FETCHCONTENT_SOURCE_DIR_''${name^^}" "$core_file" + then + echo "> skipped: ''${name} is provided by nixpkgs" >&2 + continue + fi + + # otherwise, its a new dependency not specified on the config, and the updater can't continue + echo "> ERROR: dependency missing: ''${name}" >&2 + exit 1 + fi + + echo "> ''${name}: ''${url} (''${rev})" >&2 + + prefetch=$(nix-prefetch-git --url "''${url}" --rev "''${rev}" --quiet) + rev=$(echo "$prefetch" | jq -r ".rev") + hash=$(echo "$prefetch" | jq -r ".hash") + + old_rev=$(echo "$fetch_block" | grep -m1 "rev =" | sed 's/\s*rev = "\(.*\)".*/\1/') + old_hash=$(echo "$fetch_block" | grep -m1 "hash =" | sed 's/\s*hash = "\(.*\)".*/\1/') + + if [[ "$old_hash" == "$hash" ]] + then + echo "> skipped: same hash" >&2 + continue + fi + + echo "rev - old: $old_rev" >&2 + echo "rev - new: $rev" >&2 + echo "hash - old: $old_hash" >&2 + echo "hash - new: $hash" >&2 + + # finally replace old revision and old hash by the new one + sed -i "s|$old_hash|$hash|" "$core_file" + sed -i "s/$old_rev/$rev/" "$core_file" + done + ''; + })) + ]; + meta = { description = "A remake of the libretro MelonDS core"; homepage = "https://github.com/JesseTG/melonds-ds";