summary refs log tree commit diff
path: root/pkgs/applications/emulators/higan/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/emulators/higan/default.nix')
-rw-r--r--pkgs/applications/emulators/higan/default.nix155
1 files changed, 155 insertions, 0 deletions
diff --git a/pkgs/applications/emulators/higan/default.nix b/pkgs/applications/emulators/higan/default.nix
new file mode 100644
index 00000000000..c5f38a040c1
--- /dev/null
+++ b/pkgs/applications/emulators/higan/default.nix
@@ -0,0 +1,155 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, SDL2
+, alsa-lib
+, gtk3
+, gtksourceview3
+, libGL
+, libGLU
+, libX11
+, libXv
+, libao
+, libpulseaudio
+, openal
+, pkg-config
+, runtimeShell
+, udev
+# Darwin dependencies
+, libicns
+, darwin
+}:
+
+stdenv.mkDerivation rec {
+  pname = "higan";
+  version = "115+unstable=2021-08-18";
+
+  src = fetchFromGitHub {
+    owner = "higan-emu";
+    repo = "higan";
+    rev = "9bf1b3314b2bcc73cbc11d344b369c31562aff10";
+    hash = "sha256-HZItJ97x20OjFKv2OVbMja7g+c1ZXcgcaC/XDe3vMZM=";
+  };
+
+  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 (with darwin.apple_sdk.frameworks; [
+    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;
+
+  buildPhase = ''
+    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 = ''
+    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 -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
+  '') + ''
+    install -d ${placeholder "out"}/share/higan
+    cp -rd extras/ higan/System/ ${placeholder "out"}/share/higan/
+
+    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
+    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 ${placeholder "out"}/share/higan/System/ "${dest}"/
+
+    EOF
+
+    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 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 = licenses.gpl3Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+    platforms = platforms.unix;
+    broken = stdenv.isDarwin;
+  };
+}
+# TODO: select between Qt, GTK2 and GTK3