summary refs log tree commit diff
path: root/pkgs/games/dwarf-fortress
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2018-05-10 23:55:06 -0500
committerMatthew Bauer <mjbauer95@gmail.com>2018-05-10 23:58:12 -0500
commit236b89afebaf55a09c7ec3bea6136871c4d03884 (patch)
tree8f246159e9a2125103c05e16b77c26a908784563 /pkgs/games/dwarf-fortress
parentb45552c35aea6e2cd3ef1edb877574fcec191859 (diff)
downloadnixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar.gz
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar.bz2
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar.lz
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar.xz
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.tar.zst
nixpkgs-236b89afebaf55a09c7ec3bea6136871c4d03884.zip
dwarf-fortress: supports darwin
Diffstat (limited to 'pkgs/games/dwarf-fortress')
-rw-r--r--pkgs/games/dwarf-fortress/default.nix6
-rw-r--r--pkgs/games/dwarf-fortress/game.nix80
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix2
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in1
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in5
5 files changed, 69 insertions, 25 deletions
diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix
index c759c4c60da..82710256c63 100644
--- a/pkgs/games/dwarf-fortress/default.nix
+++ b/pkgs/games/dwarf-fortress/default.nix
@@ -1,4 +1,4 @@
-{ pkgs, pkgsi686Linux }:
+{ pkgs, pkgsi686Linux, stdenv }:
 
 let
   callPackage = pkgs.newScope self;
@@ -13,7 +13,9 @@ let
 
     soundSense = callPackage ./soundsense.nix { };
 
-    dwarf-fortress-unfuck = callPackage ./unfuck.nix { };
+    # unfuck is linux-only right now, we will just use it there
+    dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { }
+                                              else null;
 
     dwarf-fortress = callPackage ./wrapper {
       themes = {
diff --git a/pkgs/games/dwarf-fortress/game.nix b/pkgs/games/dwarf-fortress/game.nix
index 79dd46c2191..2dbe8ba098b 100644
--- a/pkgs/games/dwarf-fortress/game.nix
+++ b/pkgs/games/dwarf-fortress/game.nix
@@ -1,57 +1,93 @@
 { stdenv, lib, fetchurl
 , SDL, dwarf-fortress-unfuck
+
+# Our own "unfuck" libs for macOS
+, ncurses, fmodex, gcc
 }:
 
+with lib;
+
 let
   baseVersion = "44";
-  patchVersion = "09";
+  patchVersion = "10";
   dfVersion = "0.${baseVersion}.${patchVersion}";
-  libpath = lib.makeLibraryPath [ stdenv.cc.cc stdenv.glibc dwarf-fortress-unfuck SDL ];
-  platform =
-    if stdenv.system == "x86_64-linux" then "linux"
-    else if stdenv.system == "i686-linux" then "linux32"
-    else throw "Unsupported platform";
-  sha256 =
-    if stdenv.system == "x86_64-linux" then "1haikynkg1pqyrzzqk1qxm19p36ww58qp8brh3fjxssp4x71rcdy"
-    else if stdenv.system == "i686-linux" then "0lmbrdf7wjdwj5yx0khnq871yxvhfwqxjjyfkqcdy5ik18lvlkj8"
-    else throw "Unsupported platform";
+
+  libpath = makeLibraryPath [ stdenv.cc.cc stdenv.cc.libc dwarf-fortress-unfuck SDL ];
+
+  homepage = http://www.bay12games.com/dwarves/;
+
+  # Other srcs are avilable like 32-bit mac & win, but I have only
+  # included the ones most likely to be needed by Nixpkgs users.
+  srcs = {
+    "x86_64-linux" = fetchurl {
+      url = "${homepage}df_${baseVersion}_${patchVersion}_linux.tar.bz2";
+      sha256 = "1haikynkg1pqyrzzqk1qxm19p36ww58qp8brh3fjxssp4x71rcdy";
+    };
+    "i686-linux" = fetchurl {
+      url = "${homepage}df_${baseVersion}_${patchVersion}_linux32.tar.bz2";
+      sha256 = "0lmbrdf7wjdwj5yx0khnq871yxvhfwqxjjyfkqcdy5ik18lvlkj8";
+    };
+    "x86_64-darwin" = fetchurl {
+      url = "${homepage}df_${baseVersion}_${patchVersion}_osx.tar.bz2";
+      sha256 = "1wpa45d81q8f5mhqmaxvdkz93k6cm3pg7vpsqjjjsp5s961gd74g";
+    };
+  };
 
 in
 
-assert dwarf-fortress-unfuck.dfVersion == dfVersion;
+assert dwarf-fortress-unfuck != null ->
+       dwarf-fortress-unfuck.dfVersion == dfVersion;
 
 stdenv.mkDerivation {
   name = "dwarf-fortress-original-${dfVersion}";
 
-  src = fetchurl {
-    url = "http://www.bay12games.com/dwarves/df_${baseVersion}_${patchVersion}_${platform}.tar.bz2";
-    inherit sha256;
-  };
+  src = if builtins.hasAttr stdenv.system srcs
+        then builtins.getAttr stdenv.system srcs
+        else throw "Unsupported systems";
 
   installPhase = ''
     mkdir -p $out
     cp -r * $out
     rm $out/libs/lib*
 
-    # Store the original hash
-    md5sum $out/libs/Dwarf_Fortress | awk '{ print $1 }' > $out/hash.md5.orig
+    exe=$out/${if stdenv.isLinux then "libs/Dwarf_Fortress"
+                                 else "dwarfort.exe"}
 
+    # Store the original hash
+    md5sum $exe | awk '{ print $1 }' > $out/hash.md5.orig
+  '' + optionalString stdenv.isLinux ''
     patchelf \
       --set-interpreter $(cat ${stdenv.cc}/nix-support/dynamic-linker) \
       --set-rpath "${libpath}" \
-      $out/libs/Dwarf_Fortress
+      $exe
+  '' + optionalString stdenv.isDarwin ''
+    # My custom unfucked dwarfort.exe for macOS. Can't use
+    # absolute paths because original doesn't have enough
+    # header space. Someone plz break into Tarn's house & put
+    # -headerpad_max_install_names into his LDFLAGS.
+
+    ln -s ${getLib ncurses}/lib/libncurses.dylib $out/libs
+    ln -s ${getLib gcc.cc}/lib/libstdc++.6.dylib $out/libs
+    ln -s ${getLib fmodex}/lib/libfmodex.dylib $out/libs
 
+    install_name_tool \
+      -change /usr/lib/libncurses.5.4.dylib \
+              @executable_path/libs/libncurses.dylib \
+      -change /usr/local/lib/x86_64/libstdc++.6.dylib \
+              @executable_path/libs/libstdc++.6.dylib \
+      $exe
+  '' + ''
     # Store the new hash
-    md5sum $out/libs/Dwarf_Fortress | awk '{ print $1 }' > $out/hash.md5
+    md5sum $exe | awk '{ print $1 }' > $out/hash.md5
   '';
 
   passthru = { inherit baseVersion patchVersion dfVersion; };
 
-  meta = with stdenv.lib; {
+  meta = {
     description = "A single-player fantasy game with a randomly generated adventure world";
-    homepage = http://www.bay12games.com/dwarves;
+    inherit homepage;
     license = licenses.unfreeRedistributable;
-    platforms = platforms.linux;
+    platforms = attrNames srcs;
     maintainers = with maintainers; [ a1russell robbinch roconnor the-kenny abbradar ];
   };
 }
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
index 3d904d006e4..e82cc2be680 100644
--- a/pkgs/games/dwarf-fortress/wrapper/default.nix
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -47,6 +47,8 @@ stdenv.mkDerivation rec {
     name = "dwarf-fortress-init";
     src = ./dwarf-fortress-init.in;
     inherit env;
+    exe = if stdenv.isLinux then "libs/Dwarf_Fortress"
+                             else "dwarfort.exe";
   };
 
   runDF = ./dwarf-fortress.in;
diff --git a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
index 093dae562c2..054935af012 100644
--- a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
+++ b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
@@ -2,6 +2,7 @@ shopt -s extglob
 
 [ -z "$DF_DIR" ] && DF_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/df_linux"
 env_dir="@env@"
+exe="$env_dir/@exe@"
 
 update_path() {
   local path="$1"
diff --git a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
index f405f1b0e39..4448bd05fda 100644
--- a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
+++ b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
@@ -2,5 +2,8 @@
 
 source @dfInit@
 
+export DYLD_LIBRARY_PATH="$env_dir/libs"
+export DYLD_FRAMEWORK_PATH="$env_dir/libs"
+
 cd "$DF_DIR"
-exec "$env_dir/libs/Dwarf_Fortress" "$@"
+exec "$exe" "$@"