summary refs log tree commit diff
path: root/pkgs/games/dwarf-fortress/default.nix
diff options
context:
space:
mode:
authorAdam Russell <adamlr6+pub@gmail.com>2015-09-26 18:13:06 -0500
committerMoritz Ulrich <moritz@tarn-vedra.de>2015-11-08 22:46:17 +0100
commita3ec50791f8023c84a69336f59909ebc5ea1b720 (patch)
tree6a15e98863ae27f877f7f0f90d9183439d0d07e2 /pkgs/games/dwarf-fortress/default.nix
parent60b4d47f90cb872ac4552be049ebdf8dc4791191 (diff)
downloadnixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar.gz
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar.bz2
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar.lz
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar.xz
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.tar.zst
nixpkgs-a3ec50791f8023c84a69336f59909ebc5ea1b720.zip
dwarf-fortress: add dfhack
Diffstat (limited to 'pkgs/games/dwarf-fortress/default.nix')
-rw-r--r--pkgs/games/dwarf-fortress/default.nix191
1 files changed, 151 insertions, 40 deletions
diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix
index 4e34453a1e8..ad2733df079 100644
--- a/pkgs/games/dwarf-fortress/default.nix
+++ b/pkgs/games/dwarf-fortress/default.nix
@@ -1,6 +1,14 @@
 { stdenv, fetchgit, fetchurl, cmake, glew, ncurses
 , SDL, SDL_image, SDL_ttf, gtk2, glib
-, mesa, openal, pango, atk, gdk_pixbuf, glibc, libsndfile }:
+, mesa, openal, pango, atk, gdk_pixbuf, glibc, libsndfile
+# begin dfhack-only parameters
+, XMLLibXML
+, XMLLibXSLT
+, perl
+, zlib
+# end dfhack-only parameters
+, enableDFHack ? false
+}:
 
 let
   baseVersion = "40";
@@ -12,12 +20,21 @@ let
       sha256 = "19vwx6kpv1sf93bx5v8x47f7x2cgxsqk82v6j1a72sa3q7m5cpc7";
     };
 
+    dfhack = fetchgit {
+      url = "https://github.com/DFHack/dfhack.git";
+      rev = "0849099f2083e100cae6f64940b4eff4c28ce2eb";
+      sha256 = "0lnqrayi8hwfivkrxb7fw8lb6v95i04pskny1px7084n7nzvyv8b";
+    };
+
     df = fetchurl {
       url = "http://www.bay12games.com/dwarves/df_${baseVersion}_${patchVersion}_linux.tar.bz2";
       sha256 = "0d4jrs45qj89vq9mjg7fxxhis7zivvb0vzjpmkk274b778kccdys";
     };
   };
 
+  dfHackWorksWithCurrentVersion = true;
+  dfHackEnabled = dfHackWorksWithCurrentVersion && enableDFHack;
+
 in
 
 assert stdenv.system == "i686-linux";
@@ -27,11 +44,31 @@ stdenv.mkDerivation rec {
 
   inherit baseVersion patchVersion;
 
-  buildInputs = [ SDL SDL_image SDL_ttf gtk2 glib glew mesa ncurses openal glibc libsndfile pango atk cmake gdk_pixbuf];
-  src = "${srcs.df_unfuck} ${srcs.df}";
-  phases = "unpackPhase patchPhase configurePhase buildPhase installPhase";
+  buildInputs = [
+    SDL
+    SDL_image
+    SDL_ttf
+    gtk2
+    glib
+    glew
+    mesa
+    ncurses
+    openal
+    glibc
+    libsndfile
+    pango
+    atk
+    cmake
+    gdk_pixbuf
+    XMLLibXML
+    XMLLibXSLT
+    perl
+    zlib
+  ];
+  src = "${srcs.df_unfuck} ${srcs.df}" + stdenv.lib.optionalString dfHackEnabled " ${srcs.dfhack}";
 
   sourceRoot = srcs.df_unfuck.name;
+  dfHackSourceRoot = srcs.dfhack.name;
 
   cmakeFlags = [
     "-DGTK2_GLIBCONFIG_INCLUDE_DIR=${glib}/lib/glib-2.0/include"
@@ -39,68 +76,142 @@ stdenv.mkDerivation rec {
   ];
 
   permission = ./df_permission;
+  dfHackTemplate = ./dwarf-fortress-hacked.in;
+  dfHackRunTemplate = ./dfhack-run.in;
+  dwarfFortressTemplate = ./dwarf-fortress.in;
+  installDfDataToHome = ./install-df-data-to-home.sh;
+  installDfhackDataToHome = ./install-dfhack-data-to-home.sh;
+  installDfDataContentToHome = ./install-df-data-content-to-home.sh;
+  exportLibsTemplate = ./export-libs.sh.in;
+  exportWorkaround = ./export-workaround.sh;
+
+  postUnpack = stdenv.lib.optionalString dfHackEnabled ''
+    if [ "$dontMakeSourcesWritable" != 1 ]; then
+      chmod -R u+w "$dfHackSourceRoot"
+    fi
+  '';
+
+  preConfigure = stdenv.lib.optionalString dfHackEnabled ''
+    export cmakeFlags="-DCMAKE_INSTALL_PREFIX=$out/share/df_linux $cmakeFlags"
+    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/build/depends/protobuf
+  '';
+
+  postConfigure = stdenv.lib.optionalString dfHackEnabled ''
+    if [ -z "$originalSourceRoot" ]; then
+
+      originalSourceRoot=$sourceRoot
+      export sourceRoot=$dfHackSourceRoot
+
+      pushd ../../$sourceRoot
+
+      eval "''${configurePhase:-configurePhase}"
+
+      popd
+
+      export sourceRoot=$originalSourceRoot
+      unset originalSourceRoot
+    fi
+  '';
 
   installPhase = ''
     set -x
     mkdir -p $out/bin
     mkdir -p $out/share/df_linux
-    cd ../../
+    pushd ../../
     cp -r ./df_linux/* $out/share/df_linux
     rm $out/share/df_linux/libs/lib*
 
-    # Store the original hash for dwarf-therapist 
-    echo $(md5sum $out/share/df_linux/libs/Dwarf_Fortress | cut -c1-8) > $out/share/df_linux/hash.md5.orig
-    # Fix rpath
-    patchelf --set-rpath "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc stdenv.glibc ]}:$out/share/df_linux/libs"  $out/share/df_linux/libs/Dwarf_Fortress
+    # Store the original hash
+    orig_hash=$(md5sum $out/share/df_linux/libs/Dwarf_Fortress | awk '{ print $1 }')
+    echo $orig_hash | cut -c1-8 > $out/share/df_linux/hash.md5.orig  # for dwarf-therapist
+    echo $orig_hash > $out/share/df_linux/full-hash-orig.md5  # for dfhack
+
     cp -f ./${srcs.df_unfuck.name}/build/libgraphics.so $out/share/df_linux/libs/libgraphics.so
 
     cp $permission $out/share/df_linux/nix_permission
 
-    patchelf --set-interpreter ${glibc}/lib/ld-linux.so.2 $out/share/df_linux/libs/Dwarf_Fortress
+    # Placeholder files for hashes of patched binary
+    touch $out/share/df_linux/hash.md5.patched
+    touch $out/share/df_linux/full-hash-patched.md5
+
+    mkdir -p $out/share/df_linux/shell
+    cp $installDfDataToHome $out/share/df_linux/shell/install-df-data-to-home.sh
+    cp $installDfhackDataToHome $out/share/df_linux/shell/install-dfhack-data-to-home.sh
+    cp $installDfDataContentToHome $out/share/df_linux/shell/install-df-data-content-to-home.sh
+    cp $exportWorkaround $out/share/df_linux/shell/export-workaround.sh
+    substitute $exportLibsTemplate $out/share/df_linux/shell/export-libs.sh \
+        --subst-var-by stdenv_cc ${stdenv.cc} \
+        --subst-var-by SDL ${SDL} \
+        --subst-var-by SDL_image ${SDL_image} \
+        --subst-var-by SDL_ttf ${SDL_ttf} \
+        --subst-var-by gtk2 ${gtk2} \
+        --subst-var-by glib ${glib} \
+        --subst-var-by libsndfile ${libsndfile} \
+        --subst-var-by mesa ${mesa} \
+        --subst-var-by openal ${openal} \
+        --subst-var-by zlib ${zlib} \
+
+    substitute $dwarfFortressTemplate $out/bin/dwarf-fortress \
+        --subst-var-by stdenv_shell ${stdenv.shell} \
+        --subst-var prefix
+
+    chmod 755 $out/bin/dwarf-fortress
+
+    popd
+  '' + stdenv.lib.optionalString dfHackEnabled ''
+
+    originalSourceRoot=$sourceRoot
+    export sourceRoot=$dfHackSourceRoot
 
-    # Store new hash for dwarf-therapist
-    echo $(md5sum $out/share/df_linux/libs/Dwarf_Fortress | cut -c1-8) > $out/share/df_linux/hash.md5.patched
+    pushd ../../$sourceRoot/build
 
-    cat > $out/bin/dwarf-fortress << EOF
-      #!${stdenv.shell}
-      
-      set -ex
+    mkdir -p $out/dfhack
 
-      export DF_DIR="\$HOME/.config/df_linux"
-      if [ -n "\$XDG_DATA_HOME" ]
-       then export DF_DIR="\$XDG_DATA_HOME/df_linux"
-      fi
+    make install
 
-      if [[ ! -d "\$DF_DIR" ]]; then
-          mkdir -p "\$DF_DIR"
-          ln -s $out/share/df_linux/raw "\$DF_DIR/raw"
-          ln -s $out/share/df_linux/libs "\$DF_DIR/libs"
-          mkdir -p "\$DF_DIR/data/init"
-          cp -rn $out/share/df_linux/data/init "\$DF_DIR/data/"
-      fi
+    cp ../package/linux/dfhack $out/dfhack/
 
-      for link in announcement art dipscript help index initial_movies movies shader.fs shader.vs sound speech; do
-          cp -r $out/share/df_linux/data/\$link "\$DF_DIR/data/\$link"
-          chmod -R u+rw "\$DF_DIR/data/\$link"
-      done
+    mkdir -p $out/bin
+
+    substitute $dfHackTemplate $out/bin/dfhack \
+        --subst-var-by stdenv_shell ${stdenv.shell} \
+        --subst-var prefix
+    chmod 755 $out/bin/dfhack
 
-      # now run Dwarf Fortress!
-      export LD_LIBRARY_PATH=\${stdenv.cc}/lib:${SDL}/lib:${SDL_image}/lib/:${SDL_ttf}/lib/:${gtk2}/lib/:${glib}/lib/:${mesa}/lib/:${openal}/lib/:${libsndfile}/lib:\$DF_DIR/df_linux/libs/
+    substitute $dfHackRunTemplate $out/bin/dfhack-run \
+        --subst-var-by stdenv_shell ${stdenv.shell} \
+        --subst-var prefix
+    chmod 755 $out/bin/dfhack-run
 
-      export SDL_DISABLE_LOCK_KEYS=1 # Work around for bug in Debian/Ubuntu SDL patch.
-      #export SDL_VIDEO_CENTERED=1    # Centre the screen.  Messes up resizing.
+    popd
+
+    export sourceRoot=$originalSourceRoot
+    unset originalSourceRoot
+  '';
 
-      cd \$DF_DIR
-      $out/share/df_linux/libs/Dwarf_Fortress "$@"
-    EOF
+  fixupPhase = ''
+    # Fix rpath
+    patchelf --set-rpath "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc stdenv.glibc ]}:$out/share/df_linux/libs" $out/share/df_linux/libs/Dwarf_Fortress
+
+    patchelf --set-interpreter ${glibc}/lib/ld-linux.so.2 $out/share/df_linux/libs/Dwarf_Fortress
 
-    chmod +x $out/bin/dwarf-fortress
+    # Store new hash
+    patched_hash=$(md5sum $out/share/df_linux/libs/Dwarf_Fortress | awk '{ print $1 }')
+    echo $patched_hash | cut -c1-8 > $out/share/df_linux/hash.md5.patched  # for dwarf-therapist
+    echo $patched_hash > $out/share/df_linux/full-hash-patched.md5  # for dfhack
+  '' + stdenv.lib.optionalString dfHackEnabled ''
+    find $out/share/df_linux/hack \( \
+        \( -type f -a -name "*.so*" \) -o \
+        \( -type f -a -perm +0100 \) \
+        \) -print -exec patchelf --shrink-rpath {} \;
+
+    sed -i "s/$(cat $out/share/df_linux/full-hash-orig.md5)/$(cat $out/share/df_linux/full-hash-patched.md5)/" $out/share/df_linux/hack/symbols.xml
   '';
 
   meta = {
     description = "A single-player fantasy game with a randomly generated adventure world";
     homepage = http://www.bay12games.com/dwarves;
     license = stdenv.lib.licenses.unfreeRedistributable;
-    maintainers = with stdenv.lib.maintainers; [ roconnor the-kenny ];
+    maintainers = with stdenv.lib.maintainers; [ a1russell robbinch roconnor the-kenny ];
   };
 }