diff --git a/pkgs/applications/emulators/suyu/default.nix b/pkgs/applications/emulators/suyu/default.nix new file mode 100644 index 000000000000..94b8972a7aae --- /dev/null +++ b/pkgs/applications/emulators/suyu/default.nix @@ -0,0 +1,10 @@ +{ qt6Packages, makeScopeWithSplicing', generateSplicesForMkScope }: + +makeScopeWithSplicing' { + otherSplices = generateSplicesForMkScope "suyuPackages"; + f = self: qt6Packages // { + nx_tzdb = self.callPackage ./nx_tzdb.nix {}; + + master = self.callPackage ./master.nix {}; + }; +} diff --git a/pkgs/applications/emulators/suyu/master.nix b/pkgs/applications/emulators/suyu/master.nix new file mode 100644 index 000000000000..12b420ba9a8a --- /dev/null +++ b/pkgs/applications/emulators/suyu/master.nix @@ -0,0 +1,189 @@ +{ lib +, stdenv +, fetchFromGitHub +, nix-update-script +, wrapQtAppsHook +, autoconf +, boost +, catch2_3 +, cmake +, compat-list +, cpp-jwt +, cubeb +, discord-rpc +, enet +, fmt +, glslang +, libopus +, libusb1 +, libva +, lz4 +, nlohmann_json +, nv-codec-headers-12 +, nx_tzdb +, pkg-config +, qtbase +, qtmultimedia +, qttools +, qtwayland +, qtwebengine +, SDL2 +, vulkan-headers +, vulkan-loader +, yasm +, zlib +, zstd +}: +stdenv.mkDerivation(finalAttrs: { + pname = "suyu"; + version = "0.0.1"; + + src = fetchgit { + url = "https://git.suyu.dev/suyu/suyu"; + rev = "v${finalAttrs.version}"; + hash = "sha256-a742ec467cc00f1f9ed2fcf8ced98edf8c367cfd" + }; + + nativeBuildInputs = [ + cmake + glslang + pkg-config + qttools + wrapQtAppsHook + ]; + + buildInputs = [ + # vulkan-headers must come first, so the older propagated versions + # don't get picked up by accident + vulkan-headers + + boost + catch2_3 + cpp-jwt + cubeb + discord-rpc + # intentionally omitted: dynarmic - prefer vendored version for compatibility + enet + + # vendored ffmpeg deps + autoconf + yasm + libva # for accelerated video decode on non-nvidia + nv-codec-headers-12 # for accelerated video decode on nvidia + # end vendored ffmpeg deps + + fmt + # intentionally omitted: gamemode - loaded dynamically at runtime + # intentionally omitted: httplib - upstream requires an older version than what we have + libopus + libusb1 + # intentionally omitted: LLVM - heavy, only used for stack traces in the debugger + lz4 + nlohmann_json + qtbase + qtmultimedia + qtwayland + qtwebengine + # intentionally omitted: renderdoc - heavy, developer only + SDL2 + # not packaged in nixpkgs: simpleini + # intentionally omitted: stb - header only libraries, vendor uses git snapshot + # not packaged in nixpkgs: vulkan-memory-allocator + # intentionally omitted: xbyak - prefer vendored version for compatibility + zlib + zstd + ]; + + # This changes `ir/opt` to `ir/var/empty` in `externals/dynarmic/src/dynarmic/CMakeLists.txt` + # making the build fail, as that path does not exist + dontFixCmake = true; + + cmakeFlags = [ + # actually has a noticeable performance impact + "-DSUYUENABLE_LTO=ON" + + # build with qt6 + "-DENABLE_QT6=ON" + "-DENABLE_QT_TRANSLATION=ON" + + # use system libraries + # NB: "external" here means "from the externals/ directory in the source", + # so "off" means "use system" + "-DSUYUUSE_EXTERNAL_SDL2=OFF" + "-DSUYUUSE_EXTERNAL_VULKAN_HEADERS=OFF" + + # don't use system ffmpeg, suyu uses internal APIs + "-DSUYUUSE_BUNDLED_FFMPEG=ON" + + # don't check for missing submodules + "-DSUYUCHECK_SUBMODULES=OFF" + + # enable some optional features + "-DSUYUUSE_QT_WEB_ENGINE=ON" + "-DSUYUUSE_QT_MULTIMEDIA=ON" + "-DUSE_DISCORD_PRESENCE=ON" + + # We dont want to bother upstream with potentially outdated compat reports + "-DSUYUENABLE_COMPATIBILITY_REPORTING=OFF" + "-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF" # We provide this deterministically + ]; + + # Does some handrolled SIMD + env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isx86_64 "-msse4.1"; + + # Fixes vulkan detection. + # FIXME: patchelf --add-rpath corrupts the binary for some reason, investigate + qtWrapperArgs = [ + "--prefix LD_LIBRARY_PATH : ${vulkan-loader}/lib" + ]; + + preConfigure = '' + # see https://github.com/NixOS/nixpkgs/issues/114044, setting this through cmakeFlags does not work. + cmakeFlagsArray+=( + "-DTITLE_BAR_FORMAT_IDLE=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) {}" + "-DTITLE_BAR_FORMAT_RUNNING=${finalAttrs.pname} | ${finalAttrs.version} (nixpkgs) | {}" + ) + + # provide pre-downloaded tz data + mkdir -p build/externals/nx_tzdb + ln -s ${nx_tzdb} build/externals/nx_tzdb/nx_tzdb + ''; + + # This must be done after cmake finishes as it overwrites the file + postConfigure = '' + ln -sf ${compat-list} ./dist/compatibility_list/compatibility_list.json + ''; + + postInstall = '' + install -Dm444 $src/dist/72-suyu-input.rules $out/lib/udev/rules.d/72-suyu-input.rules + ''; + + passthru.updateScript = nix-update-script { + extraArgs = [ "--version-regex" "mainline-0-(.*)" ]; + }; + + meta = with lib; { + homepage = "https://suyu.dev"; + changelog = "https://suyu.dev/blog"; + description = "An experimental Nintendo Switch emulator written in C++"; + longDescription = '' + An experimental Nintendo Switch emulator written in C++. + Using the master/ branch is recommended for general usage. + Using the dev branch is recommended if you would like to try out experimental features, with a cost of stability. + ''; + mainProgram = "suyu"; + platforms = [ "aarch64-linux" "x86_64-linux" ]; + license = with licenses; [ + gpl3Plus + # Icons + asl20 mit cc0 + ]; + maintainers = with maintainers; [ + ashley + ivar + joshuafern + sbruder + k900 + ]; + }; +}) diff --git a/pkgs/applications/emulators/suyu/nx_tzdb.nix b/pkgs/applications/emulators/suyu/nx_tzdb.nix new file mode 100644 index 000000000000..de847e2b0c78 --- /dev/null +++ b/pkgs/applications/emulators/suyu/nx_tzdb.nix @@ -0,0 +1,20 @@ +{ stdenv, fetchurl, unzip, gitUpdater }: +stdenv.mkDerivation rec { + pname = "nx_tzdb"; + version = "221202"; + + src = fetchurl { + url = "https://github.com/lat9nq/tzdb_to_nx/releases/download/${version}/${version}.zip"; + hash = "sha256-mRzW+iIwrU1zsxHmf+0RArU8BShAoEMvCz+McXFFK3c="; + }; + + nativeBuildInputs = [ unzip ]; + + buildCommand = '' + unzip $src -d $out + ''; + + passthru.updateScript = gitUpdater { + url = "https://github.com/lat9nq/tzdb_to_nx.git"; + }; +} diff --git a/pkgs/applications/emulators/suyu/update.sh b/pkgs/applications/emulators/suyu/update.sh new file mode 100755 index 000000000000..39a46790d207 --- /dev/null +++ b/pkgs/applications/emulators/suyu/update.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p nix-update +#shellcheck shell=bash +nix-update -u suyuPackages.nx_tzdb "$@" +nix-update -u suyuPackages.compat-list "$@" +nix-update -u suyuPackages.mainline "$@" +nix-update -u suyuPackages.early-access --override-filename pkgs/applications/emulators/suyu/early-access/sources.nix "$@"