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.nix133
1 files changed, 80 insertions, 53 deletions
diff --git a/pkgs/misc/emulators/higan/default.nix b/pkgs/misc/emulators/higan/default.nix
index f77ce6635f2..e735bdb38ee 100644
--- a/pkgs/misc/emulators/higan/default.nix
+++ b/pkgs/misc/emulators/higan/default.nix
@@ -1,108 +1,135 @@
-{ stdenv, fetchurl
-, p7zip, pkgconfig, libicns
+{ stdenv, fetchFromGitHub
+, pkgconfig
 , libX11, libXv
 , udev
-, libGLU, libGL, SDL
-, Carbon, Cocoa, OpenGL, OpenAL
+, libGLU, libGL, SDL2
 , libao, openal, libpulseaudio
+, alsaLib
 , gtk2, gtksourceview
-, runtimeShell }:
+, runtimeShell
+# Darwin dependencies
+, libicns, Carbon, Cocoa, OpenGL, OpenAL}:
 
-with stdenv.lib;
+let
+  inherit (stdenv.lib) optionals;
+in
 stdenv.mkDerivation rec {
 
   pname = "higan";
-  version = "106";
-  sourceName = "higan_v${version}-source";
+  version = "110";
 
-  src = fetchurl {
-    urls = [ "https://download.byuu.org/${sourceName}.7z" ];
-    sha256 = "063dzp9wrdnbvagraxi31xg0154y2gf67rrd0mnc8h104cgzjr35";
-    curlOpts = "--user-agent 'Mozilla/5.0'"; # the good old user-agent trick...
+  src = fetchFromGitHub {
+    owner = "higan-emu";
+    repo = "higan";
+    rev = "v${version}";
+    sha256 = "11rvm53c3p2f6zk8xbyv2j51xp8zmqnch7zravhj3fk590qrjrr2";
   };
 
   patches = [ ./0001-change-flags.diff ];
   postPatch = ''
     sed '1i#include <cmath>' -i higan/fc/ppu/ppu.cpp
 
-    for file in icarus/GNUmakefile higan/target-tomoko/GNUmakefile; do
+    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 = [ p7zip pkgconfig ]
-    ++ optional stdenv.isDarwin [ libicns ];
+  nativeBuildInputs = [ pkgconfig ]
+    ++ optionals stdenv.isDarwin [ libicns ];
 
-  buildInputs =
-    [ SDL libao ]
-    ++ optionals stdenv.isLinux [ openal libpulseaudio udev libX11 libXv libGLU libGL gtk2 gtksourceview ]
-    ++ optionals stdenv.isDarwin [ Carbon Cocoa OpenGL OpenAL ]
-    ;
-
-  unpackPhase = ''
-    7z x $src
-    sourceRoot=${sourceName}
-  '';
+  buildInputs = [ SDL2 libao ]
+                ++ optionals stdenv.isLinux [ alsaLib udev libpulseaudio openal
+                                              gtk2 gtksourceview libX11 libXv
+                                              libGLU libGL ]
+                ++ optionals stdenv.isDarwin [ Carbon Cocoa OpenGL OpenAL ];
 
   buildPhase = ''
-    make compiler=c++ -C icarus
-    make compiler=c++ -C higan
+    make compiler=c++ -C higan openmp=true target=higan
+    make compiler=c++ -C genius openmp=true
+    make compiler=c++ -C icarus openmp=true
   '';
 
-  # Now the cheats file will be distributed separately
-  installPhase = (if !stdenv.isDarwin then ''
-    mkdir -p "$out"/bin "$out"/share/applications "$out"/share/pixmaps
-    install -m 755 icarus/out/icarus "$out"/bin/
-    install -m 755 higan/out/higan "$out"/bin/
-    install -m 644 higan/data/higan.desktop "$out"/share/applications/
-    install -m 644 higan/data/higan.png "$out"/share/pixmaps/higan-icon.png
-    install -m 644 higan/resource/logo/higan.png "$out"/share/pixmaps/higan-logo.png
-  '' else ''
+  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"/
+  '' 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
   '') + ''
-    mkdir -p  "$out"/share/higan
+    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' \
-      higan/systems/* "$out"/share/higan/
+      icarus/Database icarus/Firmware $out/share/icarus/
   '';
 
   fixupPhase = let
-    dest = if !stdenv.isDarwin then "\\$HOME/.local/share/higan" else "\\$HOME/Library/Application Support/higan";
+    dest = if stdenv.isDarwin
+           then "\\$HOME/Library/Application Support/higan"
+           else "\\$HOME/higan";
   in ''
     # A dirty workaround, suggested by @cpages:
     # we create a first-run script to populate
-    # the local $HOME with all the auxiliary
-    # stuff needed by higan at runtime
+    # $HOME with all the stuff needed at runtime
 
     mkdir -p "$out"/bin
     cat <<EOF > $out/bin/higan-init.sh
     #!${runtimeShell}
 
-    cp --recursive --update $out/share/higan/*.sys "${dest}"/
+    cp --recursive --update $out/share/higan/System/ "${dest}"/
 
     EOF
 
     chmod +x $out/bin/higan-init.sh
   '';
 
-  meta = {
-    description = "An open-source, cycle-accurate Nintendo multi-system emulator";
+  meta = with stdenv.lib; {
+    description = "An open-source, cycle-accurate multi-system emulator";
     longDescription = ''
-      higan (formerly bsnes) is a multi-system game console emulator.
+      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:
-        - Nintendo's Famicom, Super Famicom (with subsystems:
-          Super Game Boy, BS-X Satellaview, Sufami Turbo);
-          Game Boy, Game Boy Color, Game Boy Advance;
-        - Sega's Master System, Game Gear, Mega Drive;
-        - NEC's PC Engine, SuperGrafx;
-        - Bandai's WonderSwan, WonderSwan Color.
+      - 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/emulation/higan/";
+    homepage = "https://byuu.org/higan/";
     license = licenses.gpl3Plus;
     maintainers = with maintainers; [ AndersonTorres ];
-    platforms = with platforms; unix;
+    platforms = platforms.unix;
   };
 }
+# TODO: Qt and GTK3+ support