|
|
|
@@ -1,135 +1,156 @@
|
|
|
|
|
{ lib, stdenv, fetchFromGitHub
|
|
|
|
|
, pkg-config
|
|
|
|
|
, libX11, libXv
|
|
|
|
|
, udev
|
|
|
|
|
, libGLU, libGL, SDL2
|
|
|
|
|
, libao, openal, libpulseaudio
|
|
|
|
|
{ lib
|
|
|
|
|
, stdenv
|
|
|
|
|
, fetchFromGitHub
|
|
|
|
|
, SDL2
|
|
|
|
|
, alsa-lib
|
|
|
|
|
, gtk2, gtksourceview
|
|
|
|
|
, gtk3
|
|
|
|
|
, gtksourceview3
|
|
|
|
|
, libGL
|
|
|
|
|
, libGLU
|
|
|
|
|
, libX11
|
|
|
|
|
, libXv
|
|
|
|
|
, libao
|
|
|
|
|
, libpulseaudio
|
|
|
|
|
, openal
|
|
|
|
|
, pkg-config
|
|
|
|
|
, runtimeShell
|
|
|
|
|
, udev
|
|
|
|
|
# Darwin dependencies
|
|
|
|
|
, libicns, Carbon, Cocoa, OpenGL, OpenAL}:
|
|
|
|
|
, libicns
|
|
|
|
|
, Carbon
|
|
|
|
|
, Cocoa
|
|
|
|
|
, OpenAL
|
|
|
|
|
, OpenGL
|
|
|
|
|
}:
|
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
inherit (lib) optionals;
|
|
|
|
|
in
|
|
|
|
|
stdenv.mkDerivation rec {
|
|
|
|
|
|
|
|
|
|
pname = "higan";
|
|
|
|
|
version = "110";
|
|
|
|
|
version = "115+unstable=2021-08-18";
|
|
|
|
|
|
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
|
owner = "higan-emu";
|
|
|
|
|
repo = "higan";
|
|
|
|
|
rev = "v${version}";
|
|
|
|
|
sha256 = "11rvm53c3p2f6zk8xbyv2j51xp8zmqnch7zravhj3fk590qrjrr2";
|
|
|
|
|
rev = "9bf1b3314b2bcc73cbc11d344b369c31562aff10";
|
|
|
|
|
hash = "sha256-HZItJ97x20OjFKv2OVbMja7g+c1ZXcgcaC/XDe3vMZM=";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
patches = [ ./0001-change-flags.diff ];
|
|
|
|
|
postPatch = ''
|
|
|
|
|
sed '1i#include <cmath>' -i higan/fc/ppu/ppu.cpp
|
|
|
|
|
nativeBuildInputs = [
|
|
|
|
|
pkg-config
|
|
|
|
|
] ++ lib.optionals stdenv.isDarwin [
|
|
|
|
|
libicns
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
for file in icarus/GNUmakefile higan/target-higan/GNUmakefile; do
|
|
|
|
|
substituteInPlace "$file" \
|
|
|
|
|
--replace 'sips -s format icns data/$(name).png --out out/$(name).app/Contents/Resources/$(name).icns' \
|
|
|
|
|
'png2icns out/$(name).app/Contents/Resources/$(name).icns data/$(name).png'
|
|
|
|
|
done
|
|
|
|
|
'';
|
|
|
|
|
buildInputs = [
|
|
|
|
|
SDL2
|
|
|
|
|
libao
|
|
|
|
|
] ++ lib.optionals stdenv.isLinux [
|
|
|
|
|
alsa-lib
|
|
|
|
|
gtk3
|
|
|
|
|
gtksourceview3
|
|
|
|
|
libGL
|
|
|
|
|
libGLU
|
|
|
|
|
libX11
|
|
|
|
|
libXv
|
|
|
|
|
libpulseaudio
|
|
|
|
|
openal
|
|
|
|
|
udev
|
|
|
|
|
] ++ lib.optionals stdenv.isDarwin [
|
|
|
|
|
Carbon
|
|
|
|
|
Cocoa
|
|
|
|
|
OpenAL
|
|
|
|
|
OpenGL
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
nativeBuildInputs = [ pkg-config ]
|
|
|
|
|
++ optionals stdenv.isDarwin [ libicns ];
|
|
|
|
|
patches = [
|
|
|
|
|
# Includes cmath header
|
|
|
|
|
./001-include-cmath.patch
|
|
|
|
|
# Uses png2icns instead of sips
|
|
|
|
|
./002-sips-to-png2icns.patch
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
buildInputs = [ SDL2 libao ]
|
|
|
|
|
++ optionals stdenv.isLinux [ alsa-lib udev libpulseaudio openal
|
|
|
|
|
gtk2 gtksourceview libX11 libXv
|
|
|
|
|
libGLU libGL ]
|
|
|
|
|
++ optionals stdenv.isDarwin [ Carbon Cocoa OpenGL OpenAL ];
|
|
|
|
|
dontConfigure = true;
|
|
|
|
|
|
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
|
|
|
|
|
|
buildPhase = ''
|
|
|
|
|
make compiler=c++ -C higan openmp=true target=higan
|
|
|
|
|
make compiler=c++ -C genius openmp=true
|
|
|
|
|
make compiler=c++ -C icarus openmp=true
|
|
|
|
|
runHook preBuild
|
|
|
|
|
|
|
|
|
|
make -j $NIX_BUILD_CORES compiler=${stdenv.cc.targetPrefix}c++ \
|
|
|
|
|
platform=linux openmp=true hiro=gtk3 build=accuracy local=false \
|
|
|
|
|
cores="cv fc gb gba md ms msx ngp pce sfc sg ws" -C higan-ui
|
|
|
|
|
make -j $NIX_BUILD_CORES compiler=${stdenv.cc.targetPrefix}c++ \
|
|
|
|
|
platform=linux openmp=true hiro=gtk3 -C icarus
|
|
|
|
|
|
|
|
|
|
runHook postBuild
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
installPhase = (if stdenv.isDarwin then ''
|
|
|
|
|
mkdir "$out"
|
|
|
|
|
mv higan/out/higan.app "$out"/
|
|
|
|
|
mv icarus/out/icarus.app "$out"/
|
|
|
|
|
mv genius/out/genius.app "$out"/
|
|
|
|
|
installPhase = ''
|
|
|
|
|
runHook preInstall
|
|
|
|
|
|
|
|
|
|
'' + (if stdenv.isDarwin then ''
|
|
|
|
|
mkdir ${placeholder "out"}
|
|
|
|
|
mv higan/out/higan.app ${placeholder "out"}/
|
|
|
|
|
mv icarus/out/icarus.app ${placeholder "out"}/
|
|
|
|
|
'' else ''
|
|
|
|
|
install -dm 755 "$out"/bin "$out"/share/applications "$out"/share/pixmaps
|
|
|
|
|
install -d ${placeholder "out"}/bin
|
|
|
|
|
install higan-ui/out/higan -t ${placeholder "out"}/bin/
|
|
|
|
|
install icarus/out/icarus -t ${placeholder "out"}/bin/
|
|
|
|
|
|
|
|
|
|
install -m 755 higan/out/higan -t "$out"/bin/
|
|
|
|
|
install -m 644 higan/target-higan/resource/higan.desktop \
|
|
|
|
|
-t $out/share/applications/
|
|
|
|
|
install -m 644 higan/target-higan/resource/higan.svg \
|
|
|
|
|
$out/share/pixmaps/higan-icon.svg
|
|
|
|
|
install -m 644 higan/target-higan/resource/higan.png \
|
|
|
|
|
$out/share/pixmaps/higan-icon.png
|
|
|
|
|
install -d ${placeholder "out"}/share/applications
|
|
|
|
|
install higan-ui/resource/higan.desktop -t ${placeholder "out"}/share/applications/
|
|
|
|
|
install icarus/resource/icarus.desktop -t ${placeholder "out"}/share/applications/
|
|
|
|
|
|
|
|
|
|
install -m 755 icarus/out/icarus -t "$out"/bin/
|
|
|
|
|
install -m 644 icarus/data/icarus.desktop -t $out/share/applications/
|
|
|
|
|
install -m 644 icarus/data/icarus.svg $out/share/pixmaps/icarus-icon.svg
|
|
|
|
|
install -m 644 icarus/data/icarus.png $out/share/pixmaps/icarus-icon.png
|
|
|
|
|
|
|
|
|
|
install -m 755 genius/out/genius -t "$out"/bin/
|
|
|
|
|
install -m 644 genius/data/genius.desktop -t $out/share/applications/
|
|
|
|
|
install -m 644 genius/data/genius.svg $out/share/pixmaps/genius-icon.svg
|
|
|
|
|
install -m 644 genius/data/genius.png $out/share/pixmaps/genius-icon.png
|
|
|
|
|
install -d ${placeholder "out"}/share/pixmaps
|
|
|
|
|
install higan/higan/resource/higan.svg ${placeholder "out"}/share/pixmaps/higan-icon.svg
|
|
|
|
|
install higan/higan/resource/logo.png ${placeholder "out"}/share/pixmaps/higan-icon.png
|
|
|
|
|
install icarus/resource/icarus.svg ${placeholder "out"}/share/pixmaps/icarus-icon.svg
|
|
|
|
|
install icarus/resource/icarus.png ${placeholder "out"}/share/pixmaps/icarus-icon.png
|
|
|
|
|
'') + ''
|
|
|
|
|
mkdir -p "$out"/share/higan "$out"/share/icarus
|
|
|
|
|
cp --recursive --no-dereference --preserve='links' --no-preserve='ownership' \
|
|
|
|
|
higan/System/ "$out"/share/higan/
|
|
|
|
|
cp --recursive --no-dereference --preserve='links' --no-preserve='ownership' \
|
|
|
|
|
icarus/Database icarus/Firmware $out/share/icarus/
|
|
|
|
|
'';
|
|
|
|
|
install -d ${placeholder "out"}/share/higan
|
|
|
|
|
cp -rd extras/ higan/System/ ${placeholder "out"}/share/higan/
|
|
|
|
|
|
|
|
|
|
fixupPhase = let
|
|
|
|
|
dest = if stdenv.isDarwin
|
|
|
|
|
then "\\$HOME/Library/Application Support/higan"
|
|
|
|
|
else "\\$HOME/higan";
|
|
|
|
|
in ''
|
|
|
|
|
install -d ${placeholder "out"}/share/icarus
|
|
|
|
|
cp -rd icarus/Database icarus/Firmware ${placeholder "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
|
|
|
|
|
|
|
|
|
|
mkdir -p "$out"/bin
|
|
|
|
|
cat <<EOF > $out/bin/higan-init.sh
|
|
|
|
|
let
|
|
|
|
|
dest = if stdenv.isDarwin
|
|
|
|
|
then "\\$HOME/Library/Application Support/higan"
|
|
|
|
|
else "\\$HOME/higan";
|
|
|
|
|
in ''
|
|
|
|
|
mkdir -p ${placeholder "out"}/bin
|
|
|
|
|
cat <<EOF > ${placeholder "out"}/bin/higan-init.sh
|
|
|
|
|
#!${runtimeShell}
|
|
|
|
|
|
|
|
|
|
cp --recursive --update $out/share/higan/System/ "${dest}"/
|
|
|
|
|
cp --recursive --update ${placeholder "out"}/share/higan/System/ "${dest}"/
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
chmod +x $out/bin/higan-init.sh
|
|
|
|
|
chmod +x ${placeholder "out"}/bin/higan-init.sh
|
|
|
|
|
'') + ''
|
|
|
|
|
|
|
|
|
|
runHook postInstall
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
meta = with lib; {
|
|
|
|
|
homepage = "https://github.com/higan-emu/higan";
|
|
|
|
|
description = "An open-source, cycle-accurate multi-system emulator";
|
|
|
|
|
longDescription = ''
|
|
|
|
|
higan is a multi-system game console emulator. The purpose of higan is to
|
|
|
|
|
serve as hardware documentation in source code form: it is meant to be as
|
|
|
|
|
accurate and complete as possible, with code that is easy to read and
|
|
|
|
|
understand.
|
|
|
|
|
higan is a multi-system emulator, originally developed by Near, with an
|
|
|
|
|
uncompromising focus on accuracy and code readability.
|
|
|
|
|
|
|
|
|
|
It currently supports 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
|
|
|
|
|
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.
|
|
|
|
|
'';
|
|
|
|
|
homepage = "https://byuu.org/higan/";
|
|
|
|
|
license = licenses.gpl3Plus;
|
|
|
|
|
maintainers = with maintainers; [ AndersonTorres ];
|
|
|
|
|
platforms = platforms.unix;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
# TODO: Qt and GTK3+ support
|
|
|
|
|
# TODO: select between Qt, GTK2 and GTK3
|
|
|
|
|