diff options
author | Adam Russell <adamlr6+pub@gmail.com> | 2015-09-26 18:13:06 -0500 |
---|---|---|
committer | Moritz Ulrich <moritz@tarn-vedra.de> | 2015-11-08 22:46:17 +0100 |
commit | a3ec50791f8023c84a69336f59909ebc5ea1b720 (patch) | |
tree | 6a15e98863ae27f877f7f0f90d9183439d0d07e2 /pkgs/games/dwarf-fortress/default.nix | |
parent | 60b4d47f90cb872ac4552be049ebdf8dc4791191 (diff) | |
download | nixpkgs-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.nix | 191 |
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 ]; }; } |