summary refs log tree commit diff
path: root/pkgs/misc/emulators/higan/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/misc/emulators/higan/default.nix')
-rw-r--r--pkgs/misc/emulators/higan/default.nix213
1 files changed, 117 insertions, 96 deletions
diff --git a/pkgs/misc/emulators/higan/default.nix b/pkgs/misc/emulators/higan/default.nix
index 8e10b7bb315..558cb53c3d5 100644
--- a/pkgs/misc/emulators/higan/default.nix
+++ b/pkgs/misc/emulators/higan/default.nix
@@ -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
+  ];
+
+  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
+  ];
+
+  patches = [
+    # Includes cmath header
+    ./001-include-cmath.patch
+    # Uses png2icns instead of sips
+    ./002-sips-to-png2icns.patch
+  ];
+
+  dontConfigure = true;
+
+  enableParallelBuilding = true;
 
-    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
-  '';
-
-  nativeBuildInputs = [ pkg-config ]
-    ++ optionals stdenv.isDarwin [ libicns ];
+  buildPhase = ''
+    runHook preBuild
 
-  buildInputs = [ SDL2 libao ]
-                ++ optionals stdenv.isLinux [ alsa-lib udev libpulseaudio openal
-                                              gtk2 gtksourceview libX11 libXv
-                                              libGLU libGL ]
-                ++ optionals stdenv.isDarwin [ Carbon Cocoa OpenGL OpenAL ];
+    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
 
-  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 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 -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 -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"}/bin
+    install higan-ui/out/higan -t ${placeholder "out"}/bin/
+    install icarus/out/icarus -t ${placeholder "out"}/bin/
+
+    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 -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.
-
-      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
+      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.
     '';
-    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