Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "{citra,yuzuPackages}: remove package" #295587

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions pkgs/applications/emulators/citra/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{ branch
, qt6Packages
, fetchFromGitHub
, fetchurl
}:

let
# Fetched from https://api.citra-emu.org/gamedb
# Please make sure to update this when updating citra!
compat-list = fetchurl {
name = "citra-compat-list";
url = "https://web.archive.org/web/20231111133415/https://api.citra-emu.org/gamedb";
hash = "sha256-J+zqtWde5NgK2QROvGewtXGRAWUTNSKHNMG6iu9m1fU=";
};
in {
nightly = qt6Packages.callPackage ./generic.nix rec {
pname = "citra-nightly";
version = "2088";

src = fetchFromGitHub {
owner = "citra-emu";
repo = "citra-nightly";
rev = "nightly-${version}";
sha256 = "0l9w4i0zbafcv2s6pd1zqb11vh0i7gzwbqnzlz9al6ihwbsgbj3k";
fetchSubmodules = true;
};

inherit branch compat-list;
};

canary = qt6Packages.callPackage ./generic.nix rec {
pname = "citra-canary";
version = "2766";

src = fetchFromGitHub {
owner = "citra-emu";
repo = "citra-canary";
rev = "canary-${version}";
sha256 = "1gm3ajphpzwhm3qnchsx77jyl51za8yw3r0j0h8idf9y1ilcjvi4";
fetchSubmodules = true;
};

inherit branch compat-list;
};
}.${branch}
149 changes: 149 additions & 0 deletions pkgs/applications/emulators/citra/generic.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
{ pname
, version
, src
, branch
, compat-list

, lib
, stdenv
, cmake
, boost
, pkg-config
, catch2_3
, cpp-jwt
, cryptopp
, enet
, ffmpeg
, fmt
, gamemode
, glslang
, httplib
, inih
, libusb1
, nlohmann_json
, openal
, openssl
, SDL2
, soundtouch
, spirv-tools
, zstd
, vulkan-headers
, vulkan-loader
, enableSdl2Frontend ? true
, enableQt ? true, qtbase, qtmultimedia, qtwayland, wrapQtAppsHook
, enableQtTranslation ? enableQt, qttools
, enableWebService ? true
, enableCubeb ? true, cubeb
, useDiscordRichPresence ? false, rapidjson
}:
stdenv.mkDerivation {
inherit pname version src;

nativeBuildInputs = [
cmake
pkg-config
ffmpeg
glslang
] ++ lib.optionals enableQt [ wrapQtAppsHook ];

buildInputs = [
boost
catch2_3
cpp-jwt
cryptopp
# intentionally omitted: dynarmic - prefer vendored version for compatibility
enet
fmt
httplib
inih
libusb1
nlohmann_json
openal
openssl
SDL2
soundtouch
spirv-tools
vulkan-headers
# intentionally omitted: xbyak - prefer vendored version for compatibility
zstd
] ++ lib.optionals enableQt [ qtbase qtmultimedia qtwayland ]
++ lib.optional enableQtTranslation qttools
++ lib.optional enableCubeb cubeb
++ lib.optional useDiscordRichPresence rapidjson;

cmakeFlags = [
(lib.cmakeBool "USE_SYSTEM_LIBS" true)

(lib.cmakeBool "DISABLE_SYSTEM_DYNARMIC" true)
(lib.cmakeBool "DISABLE_SYSTEM_GLSLANG" true) # The following imported targets are referenced, but are missing: SPIRV-Tools-opt
(lib.cmakeBool "DISABLE_SYSTEM_LODEPNG" true) # Not packaged in nixpkgs
(lib.cmakeBool "DISABLE_SYSTEM_VMA" true)
(lib.cmakeBool "DISABLE_SYSTEM_XBYAK" true)

# We don't want to bother upstream with potentially outdated compat reports
(lib.cmakeBool "CITRA_ENABLE_COMPATIBILITY_REPORTING" true)
(lib.cmakeBool "ENABLE_COMPATIBILITY_LIST_DOWNLOAD" false) # We provide this deterministically

(lib.cmakeBool "ENABLE_SDL2_FRONTEND" enableSdl2Frontend)
(lib.cmakeBool "ENABLE_QT" enableQt)
(lib.cmakeBool "ENABLE_QT_TRANSLATION" enableQtTranslation)
(lib.cmakeBool "ENABLE_WEB_SERVICE" enableWebService)
(lib.cmakeBool "ENABLE_CUBEB" enableCubeb)
(lib.cmakeBool "USE_DISCORD_PRESENCE" useDiscordRichPresence)
];

# causes redefinition of _FORTIFY_SOURCE
hardeningDisable = [ "fortify3" ];

postPatch = let
branchCaptialized = (lib.toUpper (lib.substring 0 1 branch) + lib.substring 1 (-1) branch);
in ''
# Fix file not found when looking in var/empty instead of opt
mkdir externals/dynarmic/src/dynarmic/ir/var
ln -s ../opt externals/dynarmic/src/dynarmic/ir/var/empty

# Prep compatibilitylist
ln -s ${compat-list} ./dist/compatibility_list/compatibility_list.json

# We already know the submodules are present
substituteInPlace CMakeLists.txt \
--replace "check_submodules_present()" ""

# Add versions
echo 'set(BUILD_FULLNAME "${branchCaptialized} ${version}")' >> CMakeModules/GenerateBuildInfo.cmake

# Add gamemode
substituteInPlace externals/gamemode/include/gamemode_client.h --replace "libgamemode.so.0" "${lib.getLib gamemode}/lib/libgamemode.so.0"
'';

postInstall = let
libs = lib.makeLibraryPath [ vulkan-loader ];
in lib.optionalString enableSdl2Frontend ''
wrapProgram "$out/bin/citra" \
--prefix LD_LIBRARY_PATH : ${libs}
'' + lib.optionalString enableQt ''
qtWrapperArgs+=(
--prefix LD_LIBRARY_PATH : ${libs}
)
'';

meta = with lib; {
broken = (stdenv.isLinux && stdenv.isAarch64);
homepage = "https://citra-emu.org";
description = "The ${branch} branch of an open-source emulator for the Nintendo 3DS";
longDescription = ''
A Nintendo 3DS Emulator written in C++
Using the nightly branch is recommended for general usage.
Using the canary branch is recommended if you would like to try out
experimental features, with a cost of stability.
'';
mainProgram = if enableQt then "citra-qt" else "citra";
platforms = platforms.linux;
license = licenses.gpl2Plus;
maintainers = with maintainers; [
abbradar
ashley
ivar
];
};
}
84 changes: 84 additions & 0 deletions pkgs/applications/emulators/citra/update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#! /usr/bin/env nix-shell
#! nix-shell -i bash -p nix nix-prefetch-git coreutils curl jq gnused

set -euo pipefail

# Will be replaced with the actual branch when running this from passthru.updateScript
BRANCH="@branch@"

if [[ ! "$(basename $PWD)" = "citra" ]]; then
echo "error: Script must be ran from citra's directory!"
exit 1
fi

getLocalVersion() {
pushd ../../../.. >/dev/null
nix eval --raw -f default.nix "$1".version
popd >/dev/null
}

getLocalHash() {
pushd ../../../.. >/dev/null
nix eval --raw -f default.nix "$1".src.drvAttrs.outputHash
popd >/dev/null
}

updateNightly() {
OLD_NIGHTLY_VERSION="$(getLocalVersion "citra-nightly")"
OLD_NIGHTLY_HASH="$(getLocalHash "citra-nightly")"

NEW_NIGHTLY_VERSION="$(curl -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} \
"https://api.github.com/repos/citra-emu/citra-nightly/releases?per_page=1" | jq -r '.[0].name' | cut -d"-" -f2 | cut -d" " -f2)"

if [[ "${OLD_NIGHTLY_VERSION}" = "${NEW_NIGHTLY_VERSION}" ]]; then
echo "citra-nightly is already up to date!"

[ "$KEEP_GOING" ] && return || exit
else
echo "citra-nightly: ${OLD_NIGHTLY_VERSION} -> ${NEW_NIGHTLY_VERSION}"
fi

echo " Fetching source code..."

NEW_NIGHTLY_HASH="$(nix-prefetch-git --quiet --fetch-submodules --rev "nightly-${NEW_NIGHTLY_VERSION}" "https://github.com/citra-emu/citra-nightly" | jq -r '.sha256')"

echo " Successfully fetched. hash: ${NEW_NIGHTLY_HASH}"

sed -i "s|${OLD_NIGHTLY_VERSION}|${NEW_NIGHTLY_VERSION}|" ./default.nix
sed -i "s|${OLD_NIGHTLY_HASH}|${NEW_NIGHTLY_HASH}|" ./default.nix
}

updateCanary() {
OLD_CANARY_VERSION="$(getLocalVersion "citra-canary")"
OLD_CANARY_HASH="$(getLocalHash "citra-canary")"

NEW_CANARY_VERSION="$(curl -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} \
"https://api.github.com/repos/citra-emu/citra-canary/releases?per_page=1" | jq -r '.[0].name' | cut -d"-" -f2 | cut -d" " -f1)"

if [[ "${OLD_CANARY_VERSION}" = "${NEW_CANARY_VERSION}" ]]; then
echo "citra-canary is already up to date!"

[ "$KEEP_GOING" ] && return || exit
else
echo "citra-canary: ${OLD_CANARY_VERSION} -> ${NEW_CANARY_VERSION}"
fi

echo " Fetching source code..."

NEW_CANARY_HASH="$(nix-prefetch-git --quiet --fetch-submodules --rev "canary-${NEW_CANARY_VERSION}" "https://github.com/citra-emu/citra-canary" | jq -r '.sha256')"

echo " Successfully fetched. hash: ${NEW_CANARY_HASH}"

sed -i "s|${OLD_CANARY_VERSION}|${NEW_CANARY_VERSION}|" ./default.nix
sed -i "s|${OLD_CANARY_HASH}|${NEW_CANARY_HASH}|" ./default.nix
}

if [[ "$BRANCH" = "nightly" ]]; then
updateNightly
elif [[ "$BRANCH" = "early-access" ]]; then
updateCanary
else
KEEP_GOING=1
updateNightly
updateCanary
fi
18 changes: 18 additions & 0 deletions pkgs/applications/emulators/yuzu/compat-list.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{ stdenv, fetchFromGitHub, unstableGitUpdater }:
stdenv.mkDerivation {
pname = "yuzu-compatibility-list";
version = "unstable-2024-02-26";

src = fetchFromGitHub {
owner = "flathub";
repo = "org.yuzu_emu.yuzu";
rev = "9c2032a3c7e64772a8112b77ed8b660242172068";
hash = "sha256-ITh/W4vfC9w9t+TJnPeTZwWifnhTNKX54JSSdpgaoBk=";
};

buildCommand = ''
cp $src/compatibility_list.json $out
'';

passthru.updateScript = unstableGitUpdater {};
}
12 changes: 12 additions & 0 deletions pkgs/applications/emulators/yuzu/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{ qt6Packages, makeScopeWithSplicing', generateSplicesForMkScope }:

makeScopeWithSplicing' {
otherSplices = generateSplicesForMkScope "yuzuPackages";
f = self: qt6Packages // {
compat-list = self.callPackage ./compat-list.nix {};
nx_tzdb = self.callPackage ./nx_tzdb.nix {};

mainline = self.callPackage ./mainline.nix {};
early-access = self.callPackage ./early-access {};
};
}
37 changes: 37 additions & 0 deletions pkgs/applications/emulators/yuzu/early-access/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{ mainline, fetchzip, fetchgit, runCommand, gnutar }:
# The mirror repo for early access builds is missing submodule info,
# but the Windows distributions include a source tarball, which in turn
# includes the full git metadata. So, grab that and rehydrate it.
# This has the unfortunate side effect of requiring two FODs, one
# for the Windows download and one for the full repo with submodules.
let
sources = import ./sources.nix;

zip = fetchzip {
name = "yuzu-ea-windows-dist";
url = "https://github.com/pineappleEA/pineapple-src/releases/download/EA-${sources.version}/Windows-Yuzu-EA-${sources.version}.zip";
hash = sources.distHash;
};

gitSrc = runCommand "yuzu-ea-dist-unpacked" {
src = zip;
nativeBuildInputs = [ gnutar ];
}
''
mkdir $out
tar xf $src/*.tar.xz --directory=$out --strip-components=1
'';

rehydratedSrc = fetchgit {
name = "yuzu-ea-rehydrated";
url = gitSrc;
fetchSubmodules = true;
hash = sources.fullHash;
};
in mainline.overrideAttrs(old: {
pname = "yuzu-early-access";
version = sources.version;
src = rehydratedSrc;
passthru.updateScript = ./update.sh;
meta = old.meta // { description = old.meta.description + " - early access branch"; };
})
7 changes: 7 additions & 0 deletions pkgs/applications/emulators/yuzu/early-access/sources.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Generated by ./update.sh - do not update manually!
# Last updated: 2024-02-27
{
version = "4174";
distHash = "sha256:1hzwfsm4m2q29a2ihipk0ij0qakn4730283d6gwbrgr8lzmj8q49";
fullHash = "sha256:1ayn7y595iz4smbxq10jjgip04ss35v4vrn8pa1mpnrmyikv79l9";
}
Loading
Loading