From 5439c144d1aa6223496f224dfd2154be017c54cb Mon Sep 17 00:00:00 2001 From: Redhawk18 Date: Mon, 16 Sep 2024 14:04:33 -0400 Subject: [PATCH] edopro: init fmt sound suggestions 1 license update add support for windbot escape string xdg directory with a fallback of $HOME add update script and new deps file finished update script format deps file remove testing logic remove tlater, because he is not in the maintainer list and didn't response to me Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Update pkgs/by-name/ed/edopro/package.nix Co-authored-by: Cosima Neidahl Apply suggestions from code review Co-authored-by: Cosima Neidahl change hash format Apply suggestions from code review Co-authored-by: Cosima Neidahl Apply suggestions from code review Co-authored-by: Cosima Neidahl add patchfile and multiarch function --- pkgs/by-name/ed/edopro/deps.nix | 12 + .../ed/edopro/ocgcore-lua-symbols.patch | 29 ++ pkgs/by-name/ed/edopro/package.nix | 320 ++++++++++++++++++ pkgs/by-name/ed/edopro/update.py | 109 ++++++ 4 files changed, 470 insertions(+) create mode 100644 pkgs/by-name/ed/edopro/deps.nix create mode 100644 pkgs/by-name/ed/edopro/ocgcore-lua-symbols.patch create mode 100644 pkgs/by-name/ed/edopro/package.nix create mode 100755 pkgs/by-name/ed/edopro/update.py diff --git a/pkgs/by-name/ed/edopro/deps.nix b/pkgs/by-name/ed/edopro/deps.nix new file mode 100644 index 00000000000000..063c3baa6dff89 --- /dev/null +++ b/pkgs/by-name/ed/edopro/deps.nix @@ -0,0 +1,12 @@ +# 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-2E1cjG0FONu/fbr67/3qRCKQ1W/wPznClEWsMa1FAzo="; + irrlicht-rev = "7edde28d4f8c0c3589934c398a3a441286bb7c22"; + irrlicht-hash = "sha256-Q2tNiYE/enZPqA5YhUe+Tkvmqtmmz2E0OqTRUDnt+UA="; + ocgcore-rev = "4a872ad7686e0d00ee4c1c051e90fc07c40613d4"; + ocgcore-hash = "sha256-s3DOHrZilRUy6fbXObNiLRinxpdHY99vDOmS/ZfOI78="; +} 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 00000000000000..253051ebf0f7e4 --- /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 new file mode 100644 index 00000000000000..368b402e014e51 --- /dev/null +++ b/pkgs/by-name/ed/edopro/package.nix @@ -0,0 +1,320 @@ +{ + lib, + stdenv, + fetchFromGitHub, + fetchzip, + premake5, + writeShellScriptBin, + runCommandLocal, + symlinkJoin, + imagemagick, + bzip2, + curl, + flac, + # Use fmt 10+ after release 40.1.4+ + fmt_9, + freetype, + libevent, + libgit2, + libGL, + libGLU, + libjpeg, + libpng, + libvorbis, + libX11, + libxkbcommon, + libXxf86vm, + lua5_3, + mono, + nlohmann_json, + openal, + SDL2, + sqlite, + wayland, + egl-wayland, + 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. + # Thats why this link can change since it's compiled into the program, However it will + # download assets when needed so it is unlikely to get banned. Unless you search the + # card list with no filters of any kind. When testing use ProjectIgnis' website instead. + pics_url ? "https://images.ygoprodeck.com/images/cards/{}.jpg", +}: +let + archLabel = + { + "x86_64-linux" = "x64"; + "aarch64-linux" = "arm64"; + } + .${stdenv.hostPlatform.system} + or (throw "Don't know how to translate ${stdenv.hostPlatform.system} into an arch label for edopro"); + + deps = import ./deps.nix; +in +let + assets = { + pname = "assets"; + version = deps.edopro-version; + + src = fetchzip { + url = "https://github.com/ProjectIgnis/edopro-assets/releases/download/${deps.edopro-version}/ProjectIgnis-EDOPro-${deps.edopro-version}-linux.tar.gz"; + sha256 = deps.assets-hash; + }; + }; + + irrlicht-edopro = stdenv.mkDerivation { + pname = "irrlicht-edopro"; + version = "1.9-custom"; + + src = fetchFromGitHub { + owner = "edo9300"; + repo = "irrlicht1-8-4"; + rev = deps.irrlicht-rev; + hash = deps.irrlicht-hash; + }; + + buildInputs = [ + libGLU + libX11 + libxkbcommon + libXxf86vm + wayland + ]; + + enableParallelBuilding = true; + buildFlags = [ + "NDEBUG=1" + ]; + makeFlags = [ + "-C" + "source/Irrlicht" + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/{bin,include} + cp lib/Linux/libIrrlicht.a $out/bin + cp -r include/* $out/include + + runHook postInstall + ''; + }; + + ocgcore = stdenv.mkDerivation rec { + pname = "ygopro-core"; + version = deps.ocgcore-rev; + + src = fetchFromGitHub { + owner = "edo9300"; + repo = "ygopro-core"; + rev = version; + hash = deps.ocgcore-hash; + fetchSubmodules = true; + }; + + patches = [ + ./ocgcore-lua-symbols.patch + ]; + + nativeBuildInputs = [ premake5 ]; + + buildInputs = [ lua5_3 ]; + + preBuild = '' + premake5 gmake2 \ + --lua-path="${lua5_3}" + ''; + + enableParallelBuilding = true; + buildFlags = [ + "verbose=true" + "config=release" + "ocgcoreshared" + ]; + makeFlags = [ + "-C" + "build" + ]; + + installPhase = '' + runHook preInstall + + install -Dm644 -t $out/lib bin/release/libocgcore${stdenv.hostPlatform.extensions.sharedLibrary} + + runHook postInstall + ''; + }; + + edopro = stdenv.mkDerivation { + pname = "edopro"; + version = deps.edopro-version; + + src = fetchFromGitHub { + owner = "edo9300"; + repo = "edopro"; + rev = deps.edopro-rev; + hash = deps.edopro-hash; + fetchSubmodules = true; + }; + + nativeBuildInputs = [ premake5 ]; + + buildInputs = [ + bzip2 + curl + flac + fmt_9 + freetype + irrlicht-edopro + libevent + libgit2 + libjpeg + libpng + libvorbis + lua5_3 + nlohmann_json + ocgcore + openal + SDL2 + sqlite + ]; + + # nixpkgs' gcc stack currently appears to not support LTO + postPatch = '' + substituteInPlace premake5.lua \ + --replace-fail 'flags "LinkTimeOptimization"' 'removeflags "LinkTimeOptimization"' + ''; + + preBuild = '' + premake5 gmake2 \ + --architecture=${archLabel} \ + --covers=\"${covers_url}\" \ + --fields=\"${fields_url}\" \ + --pics=\"${pics_url}\" \ + --prebuilt-core="${lib.getLib ocgcore}/lib" \ + --sound=sfml + ''; + + enableParallelBuilding = true; + env = { + # remove after release 40.1.4+ + # https://discord.com/channels/170601678658076672/792223685112889344/1286043823293599785 + CXXFLAGS = "-include cstdint"; + LDFLAGS = "-I ${irrlicht-edopro}/include -L ${irrlicht-edopro}/bin"; + }; + buildFlags = [ + "verbose=true" + "config=release_${archLabel}" + "ygopro" + ]; + makeFlags = [ + "-C" + "build" + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + cp bin/${archLabel}/release/ygopro $out/bin + + runHook postInstall + ''; + }; + + edopro-script = + let + assetsToCopy = lib.concatStringsSep "," [ + # Needed if we download files from ProjectIgnis' website or any https only website. + "cacert.pem" + "config" + "deck" + "COPYING.txt" + "expansions" + "lflists" + "notices" + "puzzles" + "fonts" + "script" + "skin" + "sound" + "textures" + "WindBot" + ]; + in + writeShellScriptBin "edopro" '' + set -eu + EDOPRO_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/edopro" + + if [ ! -d $EDOPRO_DIR ]; then + mkdir -p $EDOPRO_DIR + cp -r --no-preserve=all ${assets.src}/{${assetsToCopy}} $EDOPRO_DIR + chmod -R go-rwx $EDOPRO_DIR + + rm $EDOPRO_DIR/config/io.github.edo9300.EDOPro.desktop.in + fi + + export PATH=PATH:'${lib.makeBinPath [ mono ]}'; + export LD_LIBRARY_PATH='${ + lib.makeLibraryPath [ + libGL + libX11 + libxkbcommon + libXxf86vm + sqlite + wayland + egl-wayland + ] + }'; + + exec ${edopro}/bin/ygopro -C $EDOPRO_DIR $@ + ''; + + edopro-desktop = runCommandLocal "io.github.edo9300.EDOPro.desktop" { } '' + cp ${assets.src}/config/io.github.edo9300.EDOPro.desktop.in desktop-template + + sed '/Path=/d' -i desktop-template + sed 's/Exec=.*/Exec=EDOPro/' -i desktop-template + sed 's/Icon=.*/Icon=EDOPro/' -i desktop-template + + install -D desktop-template $out/share/applications/io.github.edo9300.EDOPro.desktop + ''; +in +symlinkJoin { + name = "edopro-application-${deps.edopro-version}"; + version = deps.edopro-version; + paths = [ + edopro + edopro-script + edopro-desktop + ]; + + postBuild = '' + mkdir -p $out/share/icons/hicolor/256x256/apps/ + ${imagemagick}/bin/magick \ + ${assets.src}/textures/AppIcon.png \ + -resize 256x256 \ + $out/share/icons/hicolor/256x256/apps/EDOPro.png + ''; + + passthru.updateScript = ./update.py; + + meta = { + description = "Bleeding-edge automatic duel simulator, a fork of the YGOPro client"; + homepage = "https://projectignis.github.io"; + changelog = "https://github.com/edo9300/edopro/releases"; + license = lib.licenses.agpl3Plus; + maintainers = with lib.maintainers; [ + OPNA2608 + redhawk + ]; + mainProgram = "edopro"; + # This is likely a very easy app to port if you're interested. + # We just have no way to test on other platforms. + platforms = [ + "x86_64-linux" + "aarch64-linux" + ]; + }; +} diff --git a/pkgs/by-name/ed/edopro/update.py b/pkgs/by-name/ed/edopro/update.py new file mode 100755 index 00000000000000..47d47312ed71bd --- /dev/null +++ b/pkgs/by-name/ed/edopro/update.py @@ -0,0 +1,109 @@ +#!/usr/bin/env nix-shell +#! nix-shell -i python -p nix-prefetch-github python3Packages.githubkit +import json +import subprocess + +from githubkit import GitHub, UnauthAuthStrategy +from githubkit.versions.latest.models import ( + Commit, + ContentSubmodule, + Tag, +) + +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] + + ocgcore: ContentSubmodule = github.rest.repos.get_content( + "edo9300", "edopro", "ocgcore" + ).parsed_data + + # This dep is not versioned in anyway 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] + + +edopro_working_version: str = "" +try: + with open(DEPS_PATH, "r") as file: + for line in file.readlines(): + if "edopro-version" in line: + edopro_working_version = line.split('"')[1] +except FileNotFoundError: + print("Error: Dep file not found.") + exit(2) + +if edopro_working_version == "": + print("Working version is unbound") + exit(5) + +if edopro_working_version == edopro.name: + print("Version is updated") + exit(0) + + +def get_hash(owner: str, repo: str, rev: str, submodule: bool = False) -> str: + args: list[str] = ["nix-prefetch-github", owner, repo, "--rev", rev] + + if submodule: + args.append("--fetch-submodules") + + out: subprocess.CompletedProcess = subprocess.run(args, capture_output=True) + out_json = json.loads(out.stdout.decode()) + + return out_json["hash"] + + +edopro_hash = get_hash("edo9300", "edopro", edopro.commit.sha, submodule=True) +ocgcore_hash = get_hash("edo9300", "ygopro-core", ocgcore.sha) +irrlicht_hash = get_hash("edo9300", "irrlicht1-8-4", irrlicht.sha) + +asset_legacy_hash: str = ( + subprocess.run( + [ + "nix-prefetch-url", + f"https://github.com/ProjectIgnis/edopro-assets/releases/download/{edopro.name}/ProjectIgnis-EDOPro-{edopro.name}-linux.tar.gz", + "--unpack", + ], + capture_output=True, + ) + .stdout.decode() + .strip() +) +asset_hash: str = ( + subprocess.run( + [ + "nix", + "--extra-experimental-features", + "nix-command", + "hash", + "to-sri", + "--type", + "sha256", + asset_legacy_hash, + ], + capture_output=True, + ) + .stdout.decode() + .strip() +) + + +with open(DEPS_PATH, "w") as file: + contents = f"""# This is automatically generated by the update script. +# DO NOT MANUALLY EDIT. +{{ + assets-hash = "{asset_hash}"; + edopro-version = "{edopro.name}"; + edopro-rev = "{edopro.commit.sha}"; + edopro-hash = "{edopro_hash}"; + irrlicht-rev = "{irrlicht.sha}"; + irrlicht-hash = "{irrlicht_hash}"; + ocgcore-rev = "{ocgcore.sha}"; + ocgcore-hash = "{ocgcore_hash}"; +}} +""" + + file.write(contents)