diff --git a/pkgs/by-name/ed/edopro/deps.nix b/pkgs/by-name/ed/edopro/deps.nix index e45c21c0f662..14535d8f4634 100644 --- a/pkgs/by-name/ed/edopro/deps.nix +++ b/pkgs/by-name/ed/edopro/deps.nix @@ -1,11 +1,11 @@ # This is automatically generated by the update script. # DO NOT MANUALLY EDIT. { - assets-hash = "sha256-vZhkWJ1ZoNEwdc5kM1S0hyXnWmupiTOanCi9DCuqw/k="; - edopro-version = "40.1.4"; - edopro-rev = "c713e23491a1e55c9d8e91257e5f2b5873696b9b"; - edopro-hash = "sha256-mj0xEJsFcnY//za0uJosAPOPbU/jlduNX0YSNmvduLE="; - irrlicht-version = "1.9.0-unstable-2023-02-18"; - irrlicht-rev = "7edde28d4f8c0c3589934c398a3a441286bb7c22"; - irrlicht-hash = "sha256-Q2tNiYE/enZPqA5YhUe+Tkvmqtmmz2E0OqTRUDnt+UA="; + assets-hash = "sha256-cta4k6yxrdaFFfum0eshEzLODExBfA+oVPqcOpXG9uk="; + edopro-version = "41.0.2"; + edopro-rev = "e5c0578aa504d0831dcbe29dbacd018f7b885b2c"; + edopro-hash = "sha256-ZkQXWt73S3Nn+RnkG+e91BId7keI5OpM3NSeDMJWlZY="; + irrlicht-version = "1.9.0-unstable-2025-03-30"; + irrlicht-rev = "47264fc2bc3223d110c589c9ffe4339d696a3dd0"; + irrlicht-hash = "sha256-AwUCHQOivNgSnYe8kG6JxDIz7H5PC6RoozGiOGUejTI="; } diff --git a/pkgs/by-name/ed/edopro/ocgcore-lua-symbols.patch b/pkgs/by-name/ed/edopro/ocgcore-lua-symbols.patch new file mode 100644 index 000000000000..253051ebf0f7 --- /dev/null +++ b/pkgs/by-name/ed/edopro/ocgcore-lua-symbols.patch @@ -0,0 +1,29 @@ +From 41e750142b44465f3af197b7e2f0d6f54fc48c2d Mon Sep 17 00:00:00 2001 +From: OPNA2608 +Date: Mon, 21 Oct 2024 17:42:24 +0200 +Subject: [PATCH] Mark Lua symbols as C symbols + +Otherwise linking against our Lua built by a C-compiler fails due to the symbols being resolved as C++ symbols. +--- + interpreter.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/interpreter.h b/interpreter.h +index 6c405a1..c471ecb 100644 +--- a/interpreter.h ++++ b/interpreter.h +@@ -9,9 +9,11 @@ + #define INTERPRETER_H_ + + // Due to longjmp behaviour, we must build Lua as C++ to avoid UB ++extern "C" { + #include + #include + #include ++} + + #include "common.h" + #include +-- +2.44.1 + diff --git a/pkgs/by-name/ed/edopro/package.nix b/pkgs/by-name/ed/edopro/package.nix index ba6cc7c6ae76..a19f90aed995 100644 --- a/pkgs/by-name/ed/edopro/package.nix +++ b/pkgs/by-name/ed/edopro/package.nix @@ -2,19 +2,19 @@ lib, stdenv, fetchFromGitHub, - fetchpatch, fetchzip, makeWrapper, premake5, - writeShellScriptBin, + writeShellApplication, runCommandLocal, symlinkJoin, + writeText, imagemagick, bzip2, curl, + envsubst, flac, - # Use fmt 10+ after release 40.1.4+ - fmt_9, + fmt, freetype, irrlicht, libevent, @@ -34,6 +34,7 @@ sqlite, wayland, egl-wayland, + zenity, covers_url ? "https://pics.projectignis.org:2096/pics/cover/{}.jpg", fields_url ? "https://pics.projectignis.org:2096/pics/field/{}.png", # While ygoprodeck has higher quality images, "spamming" of their api results in a ban. @@ -57,6 +58,14 @@ let ]; deps = import ./deps.nix; + + edopro-src = fetchFromGitHub { + owner = "edo9300"; + repo = "edopro"; + rev = deps.edopro-rev; + fetchSubmodules = true; + hash = deps.edopro-hash; + }; in let assets = fetchzip { @@ -107,16 +116,83 @@ let }; }; + ocgcore = + let + # Refer to CORENAME EPRO_TEXT in /gframe/dllinterface.cpp for this + ocgcoreName = lib.strings.concatStrings [ + (lib.optionalString (!stdenv.hostPlatform.isWindows) "lib") + "ocgcore" + ( + if stdenv.hostPlatform.isiOS then + "-ios" + else if stdenv.hostPlatform.isAndroid then + ( + if stdenv.hostPlatform.isx86_64 then + "x64" + else if stdenv.hostPlatform.isx86_32 then + "x86" + else if stdenv.hostPlatform.isAarch64 then + "v8" + else if stdenv.hostPlatform.isAarch32 then + "v7" + else + throw "Don't know what platform suffix edopro expects for ocgcore on: ${stdenv.hostPlatform.system}" + ) + else + lib.optionalString (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) ".aarch64" + ) + stdenv.hostPlatform.extensions.sharedLibrary + ]; + in + stdenv.mkDerivation { + pname = "ocgcore-edopro"; + version = deps.edopro-version; + + src = edopro-src; + sourceRoot = "${edopro-src.name}/ocgcore"; + + nativeBuildInputs = [ + premake5 + ]; + + enableParallelBuilding = true; + + buildFlags = [ + "verbose=true" + "config=release" + "ocgcoreshared" + ]; + + makeFlags = [ + "-C" + "build" + ]; + + # To make sure linking errors are discovered at build time, not when edopro runs into them during loading + env.NIX_LDFLAGS = "--unresolved-symbols=report-all"; + + installPhase = '' + runHook preInstall + + install -Dm644 bin/release/*ocgcore*${stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/${ocgcoreName} + + runHook postInstall + ''; + + meta = { + description = "YGOPro script engine"; + homepage = "https://github.com/edo9300/ygopro-core"; + license = lib.licenses.agpl3Plus; + inherit maintainers; + platforms = lib.platforms.unix; + }; + }; + edopro = stdenv.mkDerivation { pname = "edopro"; version = deps.edopro-version; - src = fetchFromGitHub { - owner = "edo9300"; - repo = "edopro"; - rev = deps.edopro-rev; - hash = deps.edopro-hash; - }; + src = edopro-src; nativeBuildInputs = [ makeWrapper @@ -127,7 +203,7 @@ let bzip2 curl flac - fmt_9 + fmt freetype irrlicht-edopro libevent @@ -141,19 +217,16 @@ let sqlite ]; - patches = [ - (fetchpatch { - name = "libgit2-version.patch"; - url = "https://github.com/edo9300/edopro/commit/f8ddbfff51231827a8dd1dcfcb2dda85f50a56d9.patch"; - hash = "sha256-w9VTmWfw6vEyVvsOH+AK9lAbUOV+MagzGQ3Wa5DCS/U="; - }) - ]; - # nixpkgs' gcc stack currently appears to not support LTO + # Override where bundled ocgcore get looked up in, so we can supply ours + # (can't use --prebuilt-core or let it build a core on its own without making core updates impossible) postPatch = '' substituteInPlace premake5.lua \ --replace-fail 'flags "LinkTimeOptimization"' 'removeflags "LinkTimeOptimization"' + substituteInPlace gframe/game.cpp \ + --replace-fail 'ocgcore = LoadOCGcore(Utils::GetWorkingDirectory())' 'ocgcore = LoadOCGcore("${lib.getLib ocgcore}/lib/")' + touch ocgcore/premake5.lua ''; @@ -244,21 +317,62 @@ let "textures" "WindBot" ]; + wrapperZenityMessageTemplate = writeText "edopro-wrapper-multiple-versions-message.txt.in" '' + Nixpkgs' EDOPro wrapper has found more than 1 directory in: ''${EDOPRO_BASE_DIR} + + We expected the only directory to be: ''${EDOPRO_DIR} + + There may have been an update, requiring you to migrate any files you care about from an older version. + + Examples include: + + - decks/* + - config/system.conf - which has your client's settings + - any custom things you may have installed into: fonts, skins, script, sound, ... + - anything you wish to preserve from: replay, screenshots + + Once you have copied over everything important to ''${EDOPRO_DIR}, delete the old version's path. + ''; in - writeShellScriptBin "edopro" '' - set -eu - EDOPRO_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/edopro" + writeShellApplication { + name = "edopro"; + runtimeInputs = [ + envsubst + zenity + ]; + text = '' + export EDOPRO_VERSION="${deps.edopro-version}" + export EDOPRO_BASE_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/edopro" + export EDOPRO_DIR="''${EDOPRO_BASE_DIR}/''${EDOPRO_VERSION}" - if [ ! -d $EDOPRO_DIR ]; then - mkdir -p $EDOPRO_DIR - cp -r --no-preserve=all ${assets}/{${assetsToCopy}} $EDOPRO_DIR - chmod -R go-rwx $EDOPRO_DIR + # If versioned directory doesn't exist yet, make it & copy over assets + if [ ! -d "$EDOPRO_DIR" ]; then + mkdir -p "$EDOPRO_DIR" + cp -r --no-preserve=all ${assets}/{${assetsToCopy}} "$EDOPRO_DIR" + chmod -R go-rwx "$EDOPRO_DIR" - rm $EDOPRO_DIR/config/io.github.edo9300.EDOPro.desktop.in - fi + rm "$EDOPRO_DIR"/config/io.github.edo9300.EDOPro.desktop.in + fi - exec ${lib.getExe edopro} -C $EDOPRO_DIR $@ - ''; + # Different versions provide different assets. Some are necessary for the game to run properly (configs for + # where to get incremental updates from, online servers, card scripting, certificates for communication etc), + # and some are optional nice-haves (example decks). It's also possible to override assets with custom skins. + # + # Don't try to manage all of this across versions, just inform the user that they may need to migrate their + # files if it looks like there are multiple versions. + + edoproTopDirs="$(find "$EDOPRO_BASE_DIR" -mindepth 1 -maxdepth 1 -type d | wc -l)" + if [ "$edoproTopDirs" -ne 1 ]; then + zenity \ + --info \ + --title='[NIX] Multiple asset copies found' \ + --text="$(envsubst < ${wrapperZenityMessageTemplate})" \ + --ok-label='Continue to EDOPro' + fi + + exec ${lib.getExe edopro} -C "$EDOPRO_DIR" "$@" + ''; + }; edopro-desktop = runCommandLocal "io.github.edo9300.EDOPro.desktop" { } '' mkdir -p $out/share/applications diff --git a/pkgs/by-name/ed/edopro/update.py b/pkgs/by-name/ed/edopro/update.py index c7594b758d21..f582fe6a9d89 100755 --- a/pkgs/by-name/ed/edopro/update.py +++ b/pkgs/by-name/ed/edopro/update.py @@ -2,6 +2,7 @@ #! nix-shell -i python -p nix-prefetch-github python3Packages.githubkit import json import subprocess +import sys from githubkit import GitHub, UnauthAuthStrategy from githubkit.versions.latest.models import ( @@ -15,15 +16,11 @@ DEPS_PATH: str = "./pkgs/by-name/ed/edopro/deps.nix" with GitHub(UnauthAuthStrategy()) as github: edopro: Tag = github.rest.repos.list_tags("edo9300", "edopro").parsed_data[0] - # This dep is not versioned in anyway and is why we check below to see if this is a new version. + # This dep is not versioned in any way and is why we check below to see if this is a new version. irrlicht: Commit = github.rest.repos.list_commits( "edo9300", "irrlicht1-8-4" ).parsed_data[0] - irrlicht: Commit = github.rest.repos.get_commit( - "edo9300", "irrlicht1-8-4", "7edde28d4f8c0c3589934c398a3a441286bb7c22" - ).parsed_data - edopro_working_version: str = "" try: @@ -32,11 +29,11 @@ try: if "edopro-version" in line: edopro_working_version = line.split('"')[1] except FileNotFoundError: - print("Error: Dep file not found.") + print("Error: Dep file not found.", file=sys.stderr) exit(2) if edopro_working_version == "": - print("Working version is unbound") + print("Working version is unbound", file=sys.stderr) exit(5) if edopro_working_version == edopro.name: @@ -56,7 +53,7 @@ def get_hash(owner: str, repo: str, rev: str, submodule: bool = False) -> str: return out_json["hash"] -edopro_hash = get_hash("edo9300", "edopro", edopro.commit.sha) +edopro_hash = get_hash("edo9300", "edopro", edopro.commit.sha, submodule=True) irrlicht_hash = get_hash("edo9300", "irrlicht1-8-4", irrlicht.sha) asset_legacy_hash: str = ( @@ -98,7 +95,7 @@ with open(DEPS_PATH, "w") as file: edopro-version = "{edopro.name}"; edopro-rev = "{edopro.commit.sha}"; edopro-hash = "{edopro_hash}"; - irrlicht-version = "{"1.9.0-unstable-" + irrlicht.commit.committer.date.split("T")[0]}"; + irrlicht-version = "{"1.9.0-unstable-" + irrlicht.commit.committer.date.strftime("%Y-%m-%d")}"; irrlicht-rev = "{irrlicht.sha}"; irrlicht-hash = "{irrlicht_hash}"; }}