From 210106efce9ad52aeb1228a9f2ca6ff6d4d3683f Mon Sep 17 00:00:00 2001 From: qubitnano <146656568+qubitnano@users.noreply.github.com> Date: Mon, 21 Jul 2025 18:12:42 -0400 Subject: [PATCH] spaghettikart: init at 0-unstable-2025-08-07 --- .../sp/spaghettikart/dont-fetch-stb.patch | 16 ++ pkgs/by-name/sp/spaghettikart/git-deps.patch | 44 +++ pkgs/by-name/sp/spaghettikart/package.nix | 263 ++++++++++++++++++ 3 files changed, 323 insertions(+) create mode 100644 pkgs/by-name/sp/spaghettikart/dont-fetch-stb.patch create mode 100644 pkgs/by-name/sp/spaghettikart/git-deps.patch create mode 100644 pkgs/by-name/sp/spaghettikart/package.nix diff --git a/pkgs/by-name/sp/spaghettikart/dont-fetch-stb.patch b/pkgs/by-name/sp/spaghettikart/dont-fetch-stb.patch new file mode 100644 index 000000000000..eade8db90a7b --- /dev/null +++ b/pkgs/by-name/sp/spaghettikart/dont-fetch-stb.patch @@ -0,0 +1,16 @@ +Submodule libultraship contains modified content +diff --git a/libultraship/cmake/dependencies/common.cmake b/libultraship/cmake/dependencies/common.cmake +index 596158c..c62d7b2 100644 +--- a/libultraship/cmake/dependencies/common.cmake ++++ b/libultraship/cmake/dependencies/common.cmake +@@ -47,10 +47,6 @@ set(stormlib_optimizations_patch git apply ${CMAKE_CURRENT_SOURCE_DIR}/cmake/dep + endif() + + #=================== STB =================== +-set(STB_DIR ${CMAKE_BINARY_DIR}/_deps/stb) +-file(DOWNLOAD "https://github.com/nothings/stb/raw/0bc88af4de5fb022db643c2d8e549a0927749354/stb_image.h" "${STB_DIR}/stb_image.h") +-file(WRITE "${STB_DIR}/stb_impl.c" "#define STB_IMAGE_IMPLEMENTATION\n#include \"stb_image.h\"") +- + add_library(stb STATIC) + + target_sources(stb PRIVATE diff --git a/pkgs/by-name/sp/spaghettikart/git-deps.patch b/pkgs/by-name/sp/spaghettikart/git-deps.patch new file mode 100644 index 000000000000..4cf9d14e6e95 --- /dev/null +++ b/pkgs/by-name/sp/spaghettikart/git-deps.patch @@ -0,0 +1,44 @@ +diff --git a/torch/CMakeLists.txt b/torch/CMakeLists.txt +index ba3859a..cf3da99 100644 +--- a/torch/CMakeLists.txt ++++ b/torch/CMakeLists.txt +@@ -36,8 +36,7 @@ if(USE_STANDALONE) + # Because libgfxd is not a CMake project, we have to manually fetch it and add it to the build + FetchContent_Declare( + libgfxd +- GIT_REPOSITORY https://github.com/glankk/libgfxd.git +- GIT_TAG 96fd3b849f38b3a7c7b7f3ff03c5921d328e6cdf ++ URL @libgfxd_src@ + ) + + FetchContent_GetProperties(libgfxd) +@@ -205,8 +204,7 @@ set(YAML_CPP_BUILD_TESTS OFF) + set(YAML_CPP_DISABLE_UNINSTALL ON) + FetchContent_Declare( + yaml-cpp +- GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git +- GIT_TAG 2f86d13775d119edbb69af52e5f566fd65c6953b ++ URL @yaml-cpp_src@ + ) + set(YAML_CPP_BUILD_TESTS OFF) + FetchContent_MakeAvailable(yaml-cpp) +@@ -219,8 +217,7 @@ endif() + if(USE_STANDALONE) + FetchContent_Declare( + spdlog +- GIT_REPOSITORY https://github.com/gabime/spdlog.git +- GIT_TAG 7e635fca68d014934b4af8a1cf874f63989352b7 ++ URL @spdlog_src@ + ) + + FetchContent_MakeAvailable(spdlog) +@@ -234,8 +231,7 @@ endif() + set(tinyxml2_BUILD_TESTING OFF) + FetchContent_Declare( + tinyxml2 +- GIT_REPOSITORY https://github.com/leethomason/tinyxml2.git +- GIT_TAG 10.0.0 ++ URL @tinyxml2_src@ + OVERRIDE_FIND_PACKAGE + ) + FetchContent_MakeAvailable(tinyxml2) diff --git a/pkgs/by-name/sp/spaghettikart/package.nix b/pkgs/by-name/sp/spaghettikart/package.nix new file mode 100644 index 000000000000..cf08606d5daf --- /dev/null +++ b/pkgs/by-name/sp/spaghettikart/package.nix @@ -0,0 +1,263 @@ +{ + lib, + fetchFromGitHub, + applyPatches, + writeTextFile, + fetchurl, + stdenv, + replaceVars, + yaml-cpp, + srcOnly, + cmake, + copyDesktopItems, + installShellFiles, + lsb-release, + makeWrapper, + ninja, + pkg-config, + libGL, + libvorbis, + libX11, + libzip, + nlohmann_json, + SDL2, + SDL2_net, + spdlog, + tinyxml-2, + zenity, + sdl_gamecontrollerdb, + spaghettikart, + makeDesktopItem, +}: + +let + + # The following are either normally fetched during build time or a specific version is required + + dr_libs = fetchFromGitHub { + owner = "mackron"; + repo = "dr_libs"; + rev = "da35f9d6c7374a95353fd1df1d394d44ab66cf01"; + hash = "sha256-ydFhQ8LTYDBnRTuETtfWwIHZpRciWfqGsZC6SuViEn0="; + }; + + imgui' = applyPatches { + src = fetchFromGitHub { + owner = "ocornut"; + repo = "imgui"; + tag = "v1.91.9b-docking"; + hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ="; + }; + patches = [ + "${spaghettikart.src}/libultraship/cmake/dependencies/patches/imgui-fixes-and-config.patch" + ]; + }; + + libgfxd = fetchFromGitHub { + owner = "glankk"; + repo = "libgfxd"; + rev = "008f73dca8ebc9151b205959b17773a19c5bd0da"; + hash = "sha256-AmHAa3/cQdh7KAMFOtz5TQpcM6FqO9SppmDpKPTjTt8="; + }; + + prism = fetchFromGitHub { + owner = "KiritoDv"; + repo = "prism-processor"; + rev = "7ae724a6fb7df8cbf547445214a1a848aefef747"; + hash = "sha256-G7koDUxD6PgZWmoJtKTNubDHg6Eoq8I+AxIJR0h3i+A="; + }; + + stb_impl = writeTextFile { + name = "stb_impl.c"; + text = '' + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + ''; + }; + + stb' = fetchurl { + name = "stb_image.h"; + url = "https://raw.githubusercontent.com/nothings/stb/0bc88af4de5fb022db643c2d8e549a0927749354/stb_image.h"; + hash = "sha256-xUsVponmofMsdeLsI6+kQuPg436JS3PBl00IZ5sg3Vw="; + }; + + stormlib' = applyPatches { + src = fetchFromGitHub { + owner = "ladislav-zezula"; + repo = "StormLib"; + tag = "v9.25"; + hash = "sha256-HTi2FKzKCbRaP13XERUmHkJgw8IfKaRJvsK3+YxFFdc="; + }; + patches = [ + "${spaghettikart.src}/libultraship/cmake/dependencies/patches/stormlib-optimizations.patch" + ]; + }; + + thread_pool = fetchFromGitHub { + owner = "bshoshany"; + repo = "thread-pool"; + tag = "v4.1.0"; + hash = "sha256-zhRFEmPYNFLqQCfvdAaG5VBNle9Qm8FepIIIrT9sh88="; + }; + +in +stdenv.mkDerivation (finalAttrs: { + pname = "spaghettikart"; + version = "0-unstable-2025-08-07"; + + src = fetchFromGitHub { + owner = "HarbourMasters"; + repo = "SpaghettiKart"; + rev = "334fdeafd26c15e03b4f198002ad86b8422c0e2f"; + hash = "sha256-0nDaX34C7stg7S2mzPChz0fRz/t7yyevKEAPmIR+lak="; + fetchSubmodules = true; + deepClone = true; + postFetch = '' + cd $out + (git describe --tags HEAD 2>/dev/null || echo "") > PROJECT_VERSION + git log --pretty=format:%h -1 > PROJECT_VERSION_PATCH + rm -rf .git + ''; + }; + + patches = [ + # Don't fetch stb as we will patch our own + ./dont-fetch-stb.patch + + # Can't fetch these torch deps in the sandbox + (replaceVars ./git-deps.patch { + libgfxd_src = fetchFromGitHub { + owner = "glankk"; + repo = "libgfxd"; + rev = "96fd3b849f38b3a7c7b7f3ff03c5921d328e6cdf"; + hash = "sha256-dedZuV0BxU6goT+rPvrofYqTz9pTA/f6eQcsvpDWdvQ="; + }; + spdlog_src = fetchFromGitHub { + owner = "gabime"; + repo = "spdlog"; + rev = "7e635fca68d014934b4af8a1cf874f63989352b7"; + hash = "sha256-cxTaOuLXHRU8xMz9gluYz0a93O0ez2xOxbloyc1m1ns="; + }; + yaml-cpp_src = fetchFromGitHub { + owner = "jbeder"; + repo = "yaml-cpp"; + rev = "28f93bdec6387d42332220afa9558060c8016795"; + hash = "sha256-59/s4Rqiiw7LKQw0UwH3vOaT/YsNVcoq3vblK0FiO5c="; + }; + tinyxml2_src = srcOnly tinyxml-2; + }) + ]; + + # Recent builds enabled LTO which won't build with nix + NIX_CFLAGS_COMPILE = "-fno-lto"; + + nativeBuildInputs = [ + cmake + copyDesktopItems + installShellFiles + lsb-release + makeWrapper + ninja + pkg-config + ]; + + buildInputs = [ + libGL + libvorbis + libX11 + libzip + nlohmann_json + SDL2 + SDL2_net + spdlog + tinyxml-2 + zenity + ]; + + cmakeFlags = [ + (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_DR_LIBS" "${dr_libs}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_IMGUI" "${imgui'}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_LIBGFXD" "${libgfxd}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_PRISM" "${prism}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_STORMLIB" "${stormlib'}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_THREADPOOL" "${thread_pool}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_TINYXML2" "${tinyxml-2}") + (lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_YAML-CPP" "${yaml-cpp.src}") + ]; + + strictDeps = true; + + # Linking fails without this + hardeningDisable = [ "format" ]; + + preConfigure = '' + mkdir stb + cp ${stb'} ./stb/${stb'.name} + cp ${stb_impl} ./stb/${stb_impl.name} + substituteInPlace libultraship/cmake/dependencies/common.cmake \ + --replace-fail "\''${STB_DIR}" "$(readlink -f ./stb)" + ''; + + postPatch = '' + substituteInPlace CMakeLists.txt \ + --replace-fail "COMMAND git describe --tags" "COMMAND echo $(cat PROJECT_VERSION)" \ + --replace-fail "COMMAND git log --pretty=format:%h -1" "COMMAND echo $(cat PROJECT_VERSION_PATCH)" + ''; + + postBuild = '' + cp ${sdl_gamecontrollerdb}/share/gamecontrollerdb.txt gamecontrollerdb.txt + ./TorchExternal/src/TorchExternal-build/torch pack ../assets spaghetti.o2r o2r + ''; + + postInstall = '' + installBin Spaghettify + mkdir -p $out/share/spaghettikart + cp -r ../yamls $out/share/spaghettikart/ + install -Dm644 -t $out/share/spaghettikart {spaghetti.o2r,config.yml,gamecontrollerdb.txt} + install -Dm644 ../icon.png $out/share/pixmaps/spaghettikart.png + install -Dm644 -t $out/share/licenses/spaghettikart/libgfxd ${libgfxd}/LICENSE + install -Dm644 -t $out/share/licenses/spaghettikart/libultraship ../libultraship/LICENSE + install -Dm644 -t $out/share/licenses/spaghettikart/thread_pool ${thread_pool}/LICENSE.txt + ''; + + # Unfortunately, spaghettikart really wants a writable working directory + # Create $HOME/.local/share/spaghettikart and symlink required files + + postFixup = '' + wrapProgram $out/bin/Spaghettify \ + --prefix PATH ":" ${lib.makeBinPath [ zenity ]} \ + --run 'mkdir -p ~/.local/share/spaghettikart' \ + --run "ln -sf $out/share/spaghettikart/spaghetti.o2r ~/.local/share/spaghettikart/spaghetti.o2r" \ + --run "ln -sf $out/share/spaghettikart/config.yml ~/.local/share/spaghettikart/config.yml" \ + --run "ln -sfT $out/share/spaghettikart/yamls ~/.local/share/spaghettikart/yamls" \ + --run "ln -sf $out/share/spaghettikart/gamecontrollerdb.txt ~/.local/share/spaghettikart/gamecontrollerdb.txt" \ + --run 'cd ~/.local/share/spaghettikart' + ''; + + desktopItems = [ + (makeDesktopItem { + name = "spaghettikart"; + icon = "spaghettikart"; + exec = "Spaghettify"; + comment = finalAttrs.meta.description; + genericName = "spaghettikart"; + desktopName = "spaghettikart"; + categories = [ "Game" ]; + }) + ]; + + meta = { + homepage = "https://github.com/HarbourMasters/SpaghettiKart"; + description = "Mario Kart 64 PC Port"; + mainProgram = "Spaghettify"; + platforms = [ "x86_64-linux" ]; + maintainers = with lib.maintainers; [ qubitnano ]; + license = with lib.licenses; [ + # libultraship, libgfxd, thread_pool, dr_libs, prism-processor + mit + # Reverse engineering + unfree + ]; + }; +})