nixpkgs/pkgs/by-name/hi/higan/package.nix

194 lines
4.7 KiB
Nix

{
lib,
SDL2,
alsa-lib,
fetchFromGitHub,
gtk3,
gtksourceview3,
libGL,
libGLU,
libX11,
libXv,
libao,
libicns,
libpulseaudio,
openal,
installShellFiles,
pkg-config,
runtimeShell,
stdenv,
udev,
unstableGitUpdater,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "higan";
version = "115-unstable-2024-09-04";
src = fetchFromGitHub {
owner = "higan-emu";
repo = "higan";
rev = "a03b2e94c620eb12ab6f9936aee50e4389bee2ff";
hash = "sha256-VpwHjA0LufKDnGRAS906Qh3R2pVt4uUGXxsRcca9SyM=";
};
nativeBuildInputs =
[
installShellFiles
pkg-config
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
libicns
];
buildInputs =
[
SDL2
libao
]
++ lib.optionals stdenv.hostPlatform.isLinux [
alsa-lib
gtk3
gtksourceview3
libGL
libGLU
libX11
libXv
libpulseaudio
openal
udev
];
patches = [
# Includes cmath header
./patches/0001-include-cmath.patch
# Uses png2icns instead of sips
./patches/0002-sips-to-png2icns.patch
];
dontConfigure = true;
enableParallelBuilding = true;
buildPhase =
let
platform =
if stdenv.hostPlatform.isLinux then
"linux"
else if stdenv.hostPlatform.isDarwin then
"macos"
else if stdenv.hostPlatform.isBSD then
"bsd"
else if stdenv.hostPlatform.isWindows then
"windows"
else
throw "Unknown platform for higan: ${stdenv.hostPlatform.system}";
in
''
runHook preBuild
make -C higan-ui -j$NIX_BUILD_CORES \
compiler=${stdenv.cc.targetPrefix}c++ \
platform=${platform} \
openmp=true \
hiro=gtk3 \
build=accuracy \
local=false \
cores="cv fc gb gba md ms msx ngp pce sfc sg ws"
make -C icarus -j$NIX_BUILD_CORES \
compiler=${stdenv.cc.targetPrefix}c++ \
platform=${platform} \
openmp=true \
hiro=gtk3
runHook postBuild
'';
installPhase =
''
runHook preInstall
''
+ (
if stdenv.hostPlatform.isDarwin then
''
mkdir $out
mv higan/out/higan.app $out/
mv icarus/out/icarus.app $out/
''
else
''
installBin higan-ui/out/higan icarus/out/icarus
install -d $out/share/applications
install higan-ui/resource/higan.desktop -t $out/share/applications/
install icarus/resource/icarus.desktop -t $out/share/applications/
install -d $out/share/pixmaps
install higan/higan/resource/higan.svg $out/share/pixmaps/higan-icon.svg
install higan/higan/resource/logo.png $out/share/pixmaps/higan-icon.png
install icarus/resource/icarus.svg $out/share/pixmaps/icarus-icon.svg
install icarus/resource/icarus.png $out/share/pixmaps/icarus-icon.png
''
)
+ ''
install -d $out/share/higan
cp -rd extras/ higan/System/ $out/share/higan/
install -d $out/share/icarus
cp -rd icarus/Database icarus/Firmware $out/share/icarus/
''
+ (
# A dirty workaround, suggested by @cpages:
# we create a first-run script to populate
# $HOME with all the stuff needed at runtime
let
dest =
if stdenv.hostPlatform.isDarwin then
"\\$HOME/Library/Application Support/higan"
else
"\\$HOME/higan";
in
''
mkdir -p $out/bin
cat <<EOF > $out/bin/higan-init.sh
#!${runtimeShell}
cp --recursive --update $out/share/higan/System/ "${dest}"/
EOF
chmod +x $out/bin/higan-init.sh
''
)
+ ''
runHook postInstall
'';
passthru.updateScript = unstableGitUpdater { };
meta = {
homepage = "https://github.com/higan-emu/higan";
description = "Open-source, cycle-accurate multi-system emulator";
longDescription = ''
higan is a multi-system emulator, originally developed by Near, with an
uncompromising focus on accuracy and code readability.
It currently emulates the following systems: Famicom, Famicom Disk System,
Super Famicom, Super Game Boy, Game Boy, Game Boy Color, Game Boy Advance,
Game Boy Player, SG-1000, SC-3000, Master System, Game Gear, Mega Drive,
Mega CD, PC Engine, SuperGrafx, MSX, MSX2, ColecoVision, Neo Geo Pocket,
Neo Geo Pocket Color, WonderSwan, WonderSwan Color, SwanCrystal, Pocket
Challenge V2.
'';
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ AndersonTorres ];
platforms = lib.platforms.unix;
broken = stdenv.hostPlatform.isDarwin;
};
})
# TODO: select between Qt and GTK3
# TODO: call Darwin hackers to deal with respective problems