{ lib , stdenv , fetchurl , dwarfs , makeDesktopItem , copyDesktopItems , makeWrapper , steam-run , patchelf , glibc , zlib }: stdenv.mkDerivation (finalAttrs: { pname = "opengoal-launcher"; version = "2.9.1"; src = fetchurl { url = "https://github.com/open-goal/launcher/releases/download/v${finalAttrs.version}/OpenGOAL-Launcher_${finalAttrs.version}_amd64.AppImage"; hash = "sha256-McdifSYCHmCTkbmAlSBYlsJwjNTSdinMnMoETi6g4C8="; }; nativeBuildInputs = [ dwarfs copyDesktopItems makeWrapper ]; dontPatchELF = true; dontStrip = true; dontPatchShebangs = true; dontAutoPatchelf = true; dontUnpack = true; dontBuild = true; desktopItems = [ (makeDesktopItem { name = "opengoal-launcher"; exec = "opengoal-launcher"; icon = "opengoal-launcher"; desktopName = "OpenGOAL Launcher"; comment = "Launcher for OpenGOAL - native PC port of Jak and Daxter"; categories = [ "Game" ]; }) ]; installPhase = '' runHook preInstall # Extract the DwarFS AppImage mkdir -p extracted dwarfsextract \ -i ${finalAttrs.src} \ -o extracted \ --image-offset 1454544 # Remove dangling symlinks from bundled AppImage find extracted -xtype l -delete # Install the self-contained binary and its bundled libs mkdir -p $out/opt/opengoal-launcher cp -r extracted/. $out/opt/opengoal-launcher/ chmod +x $out/opt/opengoal-launcher/bin/OpenGOAL-Launcher chmod +x $out/opt/opengoal-launcher/sharun chmod +x $out/opt/opengoal-launcher/AppRun mkdir -p $out/bin # opengoal-patch-bins: run after the launcher downloads a new version # Uses a quoted heredoc ('EOF') so that $@ and other shell vars are # written literally into the generated script rather than expanded now cat > $out/bin/opengoal-patch-bins << 'PATCHSCRIPT' #!/bin/sh set -e VERSIONS_DIR="$1" if [ -z "$VERSIONS_DIR" ]; then echo "Usage: opengoal-patch-bins " echo "Example: opengoal-patch-bins /path/to/opengoal/versions/official/v0.3.1" exit 1 fi LINKER="GLIBC_LIB/ld-linux-x86-64.so.2" RPATH="GLIBC_LIB:ZLIB_LIB" STEAM_RUN="STEAM_RUN_BIN" PATCHELF="PATCHELF_BIN" for bin in gk extractor goalc; do if [ -f "$VERSIONS_DIR/$bin" ]; then # Skip if already patched if [ -f "$VERSIONS_DIR/$bin.real" ]; then echo "Skipping $bin (already patched)" continue fi echo "Patching $bin..." "$PATCHELF" \ --set-interpreter "$LINKER" \ --set-rpath "$RPATH" \ "$VERSIONS_DIR/$bin" mv "$VERSIONS_DIR/$bin" "$VERSIONS_DIR/$bin.real" printf '#!/bin/sh\nexec "%s" "%s" "$@"\n' \ "$STEAM_RUN" \ "$VERSIONS_DIR/$bin.real" \ > "$VERSIONS_DIR/$bin" chmod +x "$VERSIONS_DIR/$bin" echo "Done: $bin" fi done echo "All binaries patched. You can now launch games via the OpenGOAL Launcher." PATCHSCRIPT # Replace the placeholders with actual nix store paths substituteInPlace $out/bin/opengoal-patch-bins \ --replace "GLIBC_LIB" "${glibc}/lib" \ --replace "ZLIB_LIB" "${zlib}/lib" \ --replace "STEAM_RUN_BIN" "${steam-run}/bin/steam-run" \ --replace "PATCHELF_BIN" "${patchelf}/bin/patchelf" chmod +x $out/bin/opengoal-patch-bins # Main launcher wrapper - clean PATH, no leaked build tools makeWrapper $out/opt/opengoal-launcher/AppRun $out/bin/opengoal-launcher \ --set APPDIR $out/opt/opengoal-launcher \ --prefix PATH : $out/opt/opengoal-launcher/bin # Install icon mkdir -p $out/share/icons/hicolor/256x256/apps cp extracted/OpenGOAL-Launcher.png \ $out/share/icons/hicolor/256x256/apps/opengoal-launcher.png runHook postInstall ''; meta = { description = "Launcher for OpenGOAL, a native PC port of the Jak and Daxter series"; longDescription = '' OpenGOAL is a project to decompile and recompile the Jak and Daxter series of games for modern PC hardware. This launcher simplifies the installation, configuration, and update process for OpenGOAL games. Note: After the launcher downloads a new game version, run opengoal-patch-bins to patch the game binaries for NixOS compatibility. Example: opengoal-patch-bins /path/to/opengoal/versions/official/v0.3.1 ''; homepage = "https://opengoal.dev"; downloadPage = "https://github.com/open-goal/launcher/releases"; changelog = "https://github.com/open-goal/launcher/releases/tag/v${finalAttrs.version}"; license = lib.licenses.isc; maintainers = with lib.maintainers; [ ]; platforms = [ "x86_64-linux" ]; sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; }; })