Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 2 additions & 0 deletions doc/release-notes/rl-2511.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@

- `spidermonkey_91` has been removed, as it has been EOL since September 2022.

- The license of duckstation has changed from `gpl3Only` to `cc-by-nc-nd-40` making it unfree in newer releases. The `duckstation` package has been overhauled to support the new releases and `duckstation-bin` has been aliased to `duckstation` to support darwin binary builds.

- `hiawata` has been removed, due to lack of active development upstream, lack of maintainership downstream and upcoming security issues.

- `forgejo` main program has been renamed to `bin/forgejo` from the previous `bin/gitea`.
Expand Down
317 changes: 317 additions & 0 deletions pkgs/by-name/du/duckstation/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,317 @@
{
lib,
llvmPackages,
stdenvNoCC,
fetchFromGitHub,
cmake,
pkg-config,
ninja,
extra-cmake-modules,
wayland-scanner,
makeBinaryWrapper,
qt6,
sdl3,
zstd,
libwebp,
zlib,
libpng,
libjpeg,
freetype,
plutosvg,
cpuinfo,
soundtouch,
rapidjson,
libzip,
curl,
libX11,
wayland,
shaderc,
spirv-cross,
udev,
libbacktrace,
ffmpeg-headless,
alsa-lib,
libjack2,
libpulseaudio,
pipewire,
fetchurl,
zip,
unzip,
}:

let
passthru = {
updateScript = ./update.sh;
};

meta = {
description = "Fast PlayStation 1 emulator for x86-64/AArch32/AArch64/RV64";
longDescription = ''
# DISCLAIMER
This is an **unofficial** package, do not report any issues to
duckstation developers. Instead, please report them to
<https://github.com/NixOS/nixpkgs> or use the officially
supported platform build at <https://duckstation.org> or other
upstream-approved distribution mechanism not listed here. We
(nixpkgs) do not endorse or condone any action taken on your own
accord in regards to this package.

The SDL audio backend must be used as cubeb support is currently
non-functional without patches.
'';
homepage = "https://duckstation.org";
license = lib.licenses.cc-by-nc-nd-40;
maintainers = with lib.maintainers; [
normalcea
matteopacini
];
};

pkgSources = lib.importJSON ./sources.json;

linuxDrv = llvmPackages.stdenv.mkDerivation (finalAttrs: {
pname = "duckstation";
version = pkgSources.duckstation.version;

src = fetchFromGitHub {
owner = "stenzek";
repo = "duckstation";
tag = "v${finalAttrs.version}";
hash = pkgSources.duckstation.hash_linux;
};

vendorDiscordRPC = llvmPackages.stdenv.mkDerivation {
pname = "discord-rpc-duckstation";
inherit (finalAttrs) version;
src = fetchFromGitHub {
owner = "stenzek";
repo = "discord-rpc";
inherit (pkgSources.discord_rpc) rev hash;
};
nativeBuildInputs = [ cmake ];
buildInputs = [ rapidjson ];
meta = {
license = lib.licenses.mit;
platforms = lib.platforms.linux;
};
};

vendorShaderc = shaderc.overrideAttrs (oldAttrs: {
pname = "shaderc-duckstation";
inherit (finalAttrs) version;
src = fetchFromGitHub {
owner = "stenzek";
repo = "shaderc";
inherit (pkgSources.shaderc) rev hash;
};

patches = (oldAttrs.patches or [ ]);
cmakeFlags = (oldAttrs.cmakeFlags or [ ]) ++ [
(lib.cmakeBool "SHADERC_SKIP_EXAMPLES" true)
(lib.cmakeBool "SHADERC_SKIP_TESTS" true)
];
outputs = [
"out"
"lib"
"dev"
];
postFixup = null;
});

soundtouch = llvmPackages.stdenv.mkDerivation {
inherit (soundtouch)
pname
version
src
meta
;
nativeBuildInputs = [ cmake ];
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-fail "\''${prefix}/''${CMAKE_INSTALL_LIBDIR}" \
"''${CMAKE_INSTALL_FULL_LIBDIR}"
'';

cmakeFlags = [
(lib.cmakeBool "SOUNDTOUCH_DLL" true)
];
};

chtdb = stdenvNoCC.mkDerivation {
pname = "chtdb-duckstation";
version = "0-unstable-${pkgSources.chtdb.date}";

src = fetchFromGitHub {
owner = "duckstation";
repo = "chtdb";
inherit (pkgSources.chtdb) rev hash;
};

nativeBuildInputs = [
zip
];

buildPhase = ''
runHook preBuild

pushd cheats
zip -r cheats.zip *.cht
popd
pushd patches
zip -r patches.zip *.cht
popd

runHook postBuild
'';

installPhase = ''
runHook preInstall

install -Dm644 cheats/cheats.zip -t $out/lib/duckstation
install -Dm644 patches/patches.zip -t $out/lib/duckstation

install -Dm644 LICENSE -t $out/share/doc/duckstation
install -Dm644 README.md -t $out/share/doc/duckstation

runHook postInstall
'';

meta = {
description = "Collection of cheats and patches for PSX games";
longDescription = ''
Collection of cheats and patches for PSX games, primarily intended for
use with the DuckStation emulator, but can also be used by other
emulators that support GameShark codes.

Patches show in the UI in a separate section to cheats, and are
intended for modifications to the game that do not provide any
"advantage" to the player, including:

- Improving performance.
- Fixing game-breaking bugs.
- Unlocking the frame rate (e.g. "60 FPS patches").
- Widescreen rendering where the built-in widescreen rendering rendering is insufficient.
'';
license = lib.licenses.mit;
inherit (meta) maintainers;
platforms = lib.platforms.all;
};
};

preConfigure = ''
cp ${finalAttrs.chtdb}/lib/duckstation/cheats.zip data/resources
cp ${finalAttrs.chtdb}/lib/duckstation/patches.zip data/resources
'';

nativeBuildInputs = [
cmake
pkg-config
ninja
extra-cmake-modules
wayland-scanner
makeBinaryWrapper
qt6.wrapQtAppsHook
qt6.qttools
];

buildInputs = [
sdl3
zstd
libwebp
zlib
libpng
libjpeg
freetype
plutosvg
cpuinfo
libzip
curl
libX11
wayland
spirv-cross
qt6.qtbase
udev
libbacktrace
ffmpeg-headless
alsa-lib
libjack2
pipewire
libpulseaudio
]
++ [
finalAttrs.vendorDiscordRPC
finalAttrs.vendorShaderc
finalAttrs.soundtouch
];

cmakeFlags = [
(lib.cmakeBool "ALLOW_INSTALL" true)
(lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "${placeholder "out"}/lib/duckstation")
];

postInstall = ''
makeWrapper $out/lib/duckstation/duckstation-qt $out/bin/duckstation-qt

mkdir -p $out/share/applications
ln -s $out/lib/duckstation/resources/org.duckstation.DuckStation.desktop \
$out/share/applications

mkdir -p $out/share/icons/hicolor/512x512/apps
ln -s $out/lib/duckstation/resources/org.duckstation.DuckStation.png \
$out/share/icons/hicolor/512x512/apps

pushd ..
install -Dm644 LICENSE -t $out/share/doc/duckstation
install -Dm644 README.* -t $out/share/doc/duckstation
install -Dm644 CONTRIBUTORS.md -t $out/share/doc/duckstation
popd
'';

inherit passthru;

meta = meta // {
mainProgram = "duckstation-qt";
platforms = lib.platforms.linux;
};
});

darwinDrv = stdenvNoCC.mkDerivation (finalAttrs: {
pname = "duckstation";
version = pkgSources.duckstation.version;

src = fetchurl {
url = "https://github.com/stenzek/duckstation/releases/download/v${finalAttrs.version}/duckstation-mac-release.zip";
hash = pkgSources.duckstation.hash_darwin;
};

nativeBuildInputs = [ unzip ];

dontPatch = true;
dontConfigure = true;
dontBuild = true;

sourceRoot = ".";

installPhase = ''
runHook preInstall

mkdir -p $out/Applications
cp -r DuckStation.app $out/Applications/DuckStation.app

runHook postInstall
'';

inherit passthru;

meta = meta // {
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
platforms = lib.platforms.darwin;
};
});
in
if stdenvNoCC.hostPlatform.isLinux then
linuxDrv
else if stdenvNoCC.hostPlatform.isDarwin then
darwinDrv
else
throw "duckstation is not supported on ${stdenvNoCC.hostPlatform.system}."
20 changes: 20 additions & 0 deletions pkgs/by-name/du/duckstation/sources.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"duckstation": {
"version": "0.1-9669",
"hash_linux": "sha256-Q3vU4PaHMHzA8MTxLQbR++ND4L0iRMw6M7J74jyWBKI=",
"hash_darwin": "sha256-qbY1xKqjYAoxU5EWSFRq8Quu3bZBHHsS8nqnLW3xT+k="
},
"discord_rpc": {
"rev": "cc59d26d1d628fbd6527aac0ac1d6301f4978b92",
"hash": "sha256-8xXcx5w36eiJqtWm6qQfhEHgchVJbhP/jR94eMNNjHU="
},
"shaderc": {
"rev": "4daf9d466ad00897f755163dd26f528d14e1db44",
"hash": "sha256-/o3LPYvMTlKhuvLQITnADmz8BTGXVaVR0aciOWVyFS8="
},
"chtdb": {
"date": "2025-10-05",
"rev": "eab12dde0ddfd03e1260d7111f2a0709144e047e",
"hash": "sha256-wRk9BijV52BCcvpeq4CzhLsaWYYrt+vFvdMwlAixBvU="
}
}
Loading
Loading