From 4ada74e293212434114ac87a679c1432650f4b40 Mon Sep 17 00:00:00 2001 From: Morgan Jones Date: Thu, 12 Jul 2018 08:42:52 +0000 Subject: [PATCH] dwarf-fortress: Support multiple unfuck/dfhack/TWBT versions --- pkgs/games/dwarf-fortress/default.nix | 52 +++++++++++++------ pkgs/games/dwarf-fortress/dfhack/default.nix | 21 ++++++-- pkgs/games/dwarf-fortress/dfhack/dfhack.json | 38 ++++++++++++++ .../dwarf-therapist/dwarf-therapist.in | 26 ++++++++++ .../dwarf-therapist/wrapper.nix | 19 ++++--- pkgs/games/dwarf-fortress/game.nix | 3 -- pkgs/games/dwarf-fortress/lazy-pack.nix | 2 +- pkgs/games/dwarf-fortress/twbt/default.nix | 25 ++++++--- pkgs/games/dwarf-fortress/twbt/twbt.json | 32 ++++++++++++ pkgs/games/dwarf-fortress/unfuck.json | 26 ++++++++++ pkgs/games/dwarf-fortress/unfuck.nix | 32 ++++++------ pkgs/games/dwarf-fortress/wrapper/default.nix | 46 ++++++++-------- 12 files changed, 244 insertions(+), 78 deletions(-) create mode 100644 pkgs/games/dwarf-fortress/dfhack/dfhack.json create mode 100644 pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in create mode 100644 pkgs/games/dwarf-fortress/twbt/twbt.json create mode 100644 pkgs/games/dwarf-fortress/unfuck.json diff --git a/pkgs/games/dwarf-fortress/default.nix b/pkgs/games/dwarf-fortress/default.nix index aa4ff210812b..87bcc44b8156 100644 --- a/pkgs/games/dwarf-fortress/default.nix +++ b/pkgs/games/dwarf-fortress/default.nix @@ -5,7 +5,8 @@ # This directory menaces with spikes of Nix code. It is terrifying. # # If this is your first time here, you should probably install the dwarf-fortress-full package, -# for instance with `environment.systempackages = [ pkgs.dwarf-fortress.dwarf-fortress-full ];`. +# for instance with: +# `environment.systemPackages = [ pkgs.dwarf-fortress-packages.dwarf-fortress-full ];` # # You can adjust its settings by using override, or compile your own package by # using the other packages here. Take a look at lazy-pack.nix to get an idea of @@ -24,11 +25,36 @@ let callPackage = pkgs.newScope self; df-games = lib.listToAttrs (map (dfVersion: { - name = "dwarf-fortress_${lib.replaceStrings ["."] ["_"] dfVersion}"; - value = callPackage ./wrapper { - inherit (self) themes; - dwarf-fortress = callPackage ./game.nix { inherit dfVersion; }; - }; + name = "dwarf-fortress_${lib.replaceStrings ["."] ["_"] dfVersion}"; + value = + let + # I can't believe this syntax works. Spikes of Nix code indeed... + dwarf-fortress = callPackage ./game.nix { + inherit dfVersion; + inherit dwarf-fortress-unfuck; + }; + + # unfuck is linux-only right now, we will only use it there. + dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { inherit dfVersion; } + else null; + + twbt = callPackage ./twbt { inherit dfVersion; }; + + dfhack = callPackage ./dfhack { + inherit (pkgs.perlPackages) XMLLibXML XMLLibXSLT; + inherit dfVersion; + inherit twbt; + stdenv = gccStdenv; + }; + in + callPackage ./wrapper { + inherit (self) themes; + + dwarf-fortress = dwarf-fortress; + dwarf-fortress-unfuck = dwarf-fortress-unfuck; + twbt = twbt; + dfhack = dfhack; + }; }) (lib.attrNames self.df-hashes)); self = rec { @@ -37,17 +63,8 @@ let dwarf-fortress-full = callPackage ./lazy-pack.nix { }; - dfhack = callPackage ./dfhack { - inherit (pkgs.perlPackages) XMLLibXML XMLLibXSLT; - stdenv = gccStdenv; - }; - soundSense = callPackage ./soundsense.nix { }; - # unfuck is linux-only right now, we will only use it there. - dwarf-fortress-unfuck = if stdenv.isLinux then callPackage ./unfuck.nix { } - else null; - dwarf-therapist = callPackage ./dwarf-therapist/wrapper.nix { inherit (dwarf-fortress) dwarf-fortress; dwarf-therapist = pkgs.qt5.callPackage ./dwarf-therapist { @@ -59,8 +76,9 @@ let legends-browser = callPackage ./legends-browser {}; - twbt = callPackage ./twbt {}; - themes = recurseIntoAttrs (callPackage ./themes { }); + themes = recurseIntoAttrs (callPackage ./themes { + stdenv = stdenvNoCC; + }); # aliases phoebus-theme = themes.phoebus; diff --git a/pkgs/games/dwarf-fortress/dfhack/default.nix b/pkgs/games/dwarf-fortress/dfhack/default.nix index 4a8c84cf92dc..1c88cab02193 100644 --- a/pkgs/games/dwarf-fortress/dfhack/default.nix +++ b/pkgs/games/dwarf-fortress/dfhack/default.nix @@ -3,14 +3,25 @@ , enableStoneSense ? false, allegro5, libGLU_combined , enableTWBT ? true, twbt , SDL +, dfVersion }: +with lib; + let - dfVersion = "0.44.12"; - version = "${dfVersion}-r1"; + dfhack-releases = builtins.fromJSON (builtins.readFile ./dfhack.json); + + release = if hasAttr dfVersion dfhack-releases + then getAttr dfVersion dfhack-releases + else throw "[DFHack] Unsupported Dwarf Fortress version: ${dfVersion}"; + + version = release.dfHackRelease; + + warning = if release.prerelease then builtins.trace "[DFHack] Version ${version} is a prerelease. Careful!" + else null; # revision of library/xml submodule - xmlRev = "23500e4e9bd1885365d0a2ef1746c321c1dd5094"; + xmlRev = release.xmlRev; arch = if stdenv.hostPlatform.system == "x86_64-linux" then "64" @@ -41,8 +52,8 @@ let src = fetchFromGitHub { owner = "DFHack"; repo = "dfhack"; - sha256 = "0j03lq6j6w378z6cvm7jspxc7hhrqm8jaszlq0mzfvap0k13fgyy"; - rev = version; + rev = release.dfHackRelease; + sha256 = release.sha256; fetchSubmodules = true; }; diff --git a/pkgs/games/dwarf-fortress/dfhack/dfhack.json b/pkgs/games/dwarf-fortress/dfhack/dfhack.json new file mode 100644 index 000000000000..d1907fb38afb --- /dev/null +++ b/pkgs/games/dwarf-fortress/dfhack/dfhack.json @@ -0,0 +1,38 @@ +{ + "0.43.05": { + "dfHackRelease": "0.43.05-r3.1", + "sha256": "1ds366i0qcfbn62w9qv98lsqcrm38npzgvcr35hf6ihqa6nc6xrl", + "xmlRev": "860a9041a75305609643d465123a4b598140dd7f", + "prerelease": false + }, + "0.44.05": { + "dfHackRelease": "0.44.05-r2", + "sha256": "1cwifdhi48a976xc472nf6q2k0ibwqffil5a4llcymcxdbgxdcc9", + "xmlRev": "2794f8a6d7405d4858bac486a0bb17b94740c142", + "prerelease": false + }, + "0.44.09": { + "dfHackRelease": "0.44.09-r1", + "sha256": "1nkfaa43pisbyik5inj5q2hja2vza5lwidg5z02jyh136jm64hwk", + "xmlRev": "3c0bf63674d5430deadaf7befaec42f0ec1e8bc5", + "prerelease": false + }, + "0.44.10": { + "dfHackRelease": "0.44.10-r2", + "sha256": "19bxsghxzw3bilhr8sm4axz7p7z8lrvbdsd1vdjf5zbg04rs866i", + "xmlRev": "321bd48b10c4c3f694cc801a7dee6be392c09b7b", + "prerelease": false + }, + "0.44.11": { + "dfHackRelease": "0.44.11-beta2.1", + "sha256": "1jgwcqg9m1ybv3szgnklp6zfpiw5mswla464dlj2gfi5v82zqbv2", + "xmlRev": "f27ebae6aa8fb12c46217adec5a812cd49a905c8", + "prerelease": true + }, + "0.44.12": { + "dfHackRelease": "0.44.12-r1", + "sha256": "0j03lq6j6w378z6cvm7jspxc7hhrqm8jaszlq0mzfvap0k13fgyy", + "xmlRev": "23500e4e9bd1885365d0a2ef1746c321c1dd5094", + "prerelease": false + } +} diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in new file mode 100644 index 000000000000..77936c430e2b --- /dev/null +++ b/pkgs/games/dwarf-fortress/dwarf-therapist/dwarf-therapist.in @@ -0,0 +1,26 @@ +#!@stdenv_shell@ -e + +[ -z "$DT_DIR" ] && DT_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dwarftherapist" + +install_dir="@install@" +therapist_dir="@therapist@" + +cat <&2 +Using $DT_DIR as Dwarf Therapist overlay directory. +EOF + +update_path() { + local path="$1" + + mkdir -p "$DT_DIR/$(dirname "$path")" + if [ ! -e "$DT_DIR/$path" ] || [ -L "$DT_DIR/$path" ]; then + rm -f "$DT_DIR/$path" + ln -s "$install_dir/share/dwarftherapist/$path" "$DT_DIR/$path" + fi +} + +cd "$install_dir/share/dwarftherapist" +update_path memory_layouts + +QT_QPA_PLATFORM_PLUGIN_PATH="@qt_plugin_path@" \ + exec "$therapist_dir/bin/dwarftherapist" "$@" diff --git a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix index 322a21ec3ad9..f86ef4bea7ab 100644 --- a/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix +++ b/pkgs/games/dwarf-fortress/dwarf-therapist/wrapper.nix @@ -1,4 +1,4 @@ -{ stdenv, symlinkJoin, dwarf-therapist, dwarf-fortress, makeWrapper }: +{ pkgs, stdenv, symlinkJoin, lib, dwarf-therapist, dwarf-fortress, makeWrapper }: let platformSlug = if stdenv.targetPlatform.is32bit then @@ -7,6 +7,8 @@ let in symlinkJoin { name = "dwarf-therapist-${dwarf-therapist.version}"; + + wrapper = ./dwarf-therapist.in; paths = [ dwarf-therapist ]; @@ -14,13 +16,18 @@ in symlinkJoin { passthru = { inherit dwarf-fortress dwarf-therapist; }; - postBuild = '' - # DwarfTherapist assumes it's run in $out/share/dwarftherapist and - # therefore uses many relative paths. - wrapProgram $out/bin/dwarftherapist \ - --run "cd $out/share/dwarftherapist" + buildCommand = '' + mkdir -p $out/bin ln -s $out/bin/dwarftherapist $out/bin/DwarfTherapist + substitute $wrapper $out/bin/dwarftherapist \ + --subst-var-by stdenv_shell ${stdenv.shell} \ + --subst-var-by install $out \ + --subst-var-by therapist ${dwarf-therapist} \ + --subst-var-by qt_plugin_path "${pkgs.qt5.qtbase}/lib/qt-${pkgs.qt5.qtbase.qtCompatVersion}/plugins/platforms" + chmod 755 $out/bin/dwarftherapist + + # Fix up memory layouts rm -rf $out/share/dwarftherapist/memory_layouts/linux mkdir -p $out/share/dwarftherapist/memory_layouts/linux origmd5=$(cat "${dwarf-fortress}/hash.md5.orig" | cut -c1-8) diff --git a/pkgs/games/dwarf-fortress/game.nix b/pkgs/games/dwarf-fortress/game.nix index 2547bb83f3f5..b5c80a0a56dc 100644 --- a/pkgs/games/dwarf-fortress/game.nix +++ b/pkgs/games/dwarf-fortress/game.nix @@ -42,9 +42,6 @@ let in -assert dwarf-fortress-unfuck != null -> - dwarf-fortress-unfuck.dfVersion == dfVersion; - stdenv.mkDerivation { name = "dwarf-fortress-${dfVersion}"; diff --git a/pkgs/games/dwarf-fortress/lazy-pack.nix b/pkgs/games/dwarf-fortress/lazy-pack.nix index 3e0d3dcc6d73..ca7ae4024289 100644 --- a/pkgs/games/dwarf-fortress/lazy-pack.nix +++ b/pkgs/games/dwarf-fortress/lazy-pack.nix @@ -6,7 +6,7 @@ , enableDFHack ? stdenvNoCC.isLinux , enableTWBT ? enableDFHack , enableSoundSense ? true -, enableStoneSense ? false # StoneSense is currently broken. +, enableStoneSense ? true , enableDwarfTherapist ? true, dwarf-therapist , enableLegendsBrowser ? true, legends-browser , theme ? themes.phoebus diff --git a/pkgs/games/dwarf-fortress/twbt/default.nix b/pkgs/games/dwarf-fortress/twbt/default.nix index d90812f5d05e..1bdbddb56de4 100644 --- a/pkgs/games/dwarf-fortress/twbt/default.nix +++ b/pkgs/games/dwarf-fortress/twbt/default.nix @@ -1,14 +1,28 @@ -{ stdenvNoCC, fetchurl, unzip }: +{ stdenvNoCC, lib, fetchurl, unzip +, dfVersion +}: +with lib; + +let + twbt-releases = builtins.fromJSON (builtins.readFile ./twbt.json); + + release = if hasAttr dfVersion twbt-releases + then getAttr dfVersion twbt-releases + else throw "[TWBT] Unsupported Dwarf Fortress version: ${dfVersion}"; + + warning = if release.prerelease then builtins.trace "[TWBT] Version ${version} is a prerelease. Careful!" + else null; + +in stdenvNoCC.mkDerivation rec { name = "twbt-${version}"; - version = "6.54"; - dfVersion = "0.44.12"; + version = release.twbtRelease; src = fetchurl { url = "https://github.com/mifki/df-twbt/releases/download/v${version}/twbt-${version}-linux.zip"; - sha256 = "10gfd6vv0vk4v1r5hjbz7vf1zqys06dsad695gysc7fbcik2dakh"; + sha256 = release.sha256; }; sourceRoot = "."; @@ -24,10 +38,9 @@ stdenvNoCC.mkDerivation rec { cp -a *.png $art/data/art/ ''; - meta = with stdenvNoCC.lib; { description = "A plugin for Dwarf Fortress / DFHack that improves various aspects the game interface."; - maintainers = with maintainers; [ Baughn ]; + maintainers = with maintainers; [ Baughn numinit ]; license = licenses.mit; platforms = platforms.linux; homepage = https://github.com/mifki/df-twbt; diff --git a/pkgs/games/dwarf-fortress/twbt/twbt.json b/pkgs/games/dwarf-fortress/twbt/twbt.json new file mode 100644 index 000000000000..b455ff017fcd --- /dev/null +++ b/pkgs/games/dwarf-fortress/twbt/twbt.json @@ -0,0 +1,32 @@ +{ + "0.43.05": { + "twbtRelease": "6.22", + "sha256": "0di5d38f6jj9smsz0wjcs1zav4zba6hrk8cbn59kwpb1wamsh5c7", + "prerelease": false + }, + "0.44.05": { + "twbtRelease": "6.35", + "sha256": "0qjkgl7dsqzsd7pdq8a5bihhi1wplfkv1id7sj6dp3swjpsfxp8g", + "prerelease": false + }, + "0.44.09": { + "twbtRelease": "6.41", + "sha256": "0nsq15z05pbhqjvw2xqs1a9b1n2ma0aalhc3vh3mi4cd4k7lxh44", + "prerelease": false + }, + "0.44.10": { + "twbtRelease": "6.49", + "sha256": "1qjkc7k33qhxj2g18njzasccjqsis5y8zrw5vl90h4rs3i8ld9xz", + "prerelease": false + }, + "0.44.11": { + "twbtRelease": "6.51", + "sha256": "1yclqmarjd97ch054h425a12r8a5ailmflsd7b39cg4qhdr1nii5", + "prerelease": true + }, + "0.44.12": { + "twbtRelease": "6.53", + "sha256": "05qc9x4zm0pamwg7j12j0084dq2sj7825fhd3l0wxfinphzk3was", + "prerelease": false + } +} diff --git a/pkgs/games/dwarf-fortress/unfuck.json b/pkgs/games/dwarf-fortress/unfuck.json new file mode 100644 index 000000000000..f7a4974c575c --- /dev/null +++ b/pkgs/games/dwarf-fortress/unfuck.json @@ -0,0 +1,26 @@ +{ + "0.43.05": { + "unfuckRelease": "0.43.05", + "sha256": "173dyrbxlzqvjf1j3n7vpns4gfjkpyvk9z16430xnmd5m6nda8p2" + }, + "0.44.05": { + "unfuckRelease": "0.44.05", + "sha256": "00yj4l4gazxg4i6fj9rwri6vm17i6bviy2mpkx0z5c0mvsr7s14b" + }, + "0.44.09": { + "unfuckRelease": "0.44.09", + "sha256": "138p0v8z2x47f0fk9k6g75ikw5wb3vxldwv5ggbkf4hhvlw6lvzm" + }, + "0.44.10": { + "unfuckRelease": "0.44.10", + "sha256": "0vb19qx2ibc79j4bgbk9lskb883qfb0815zw1dfz9k7rqwal8mzj" + }, + "0.44.11": { + "unfuckRelease": "0.44.11.1", + "sha256": "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz" + }, + "0.44.12": { + "unfuckRelease": "0.44.12", + "sha256": "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz" + } +} diff --git a/pkgs/games/dwarf-fortress/unfuck.nix b/pkgs/games/dwarf-fortress/unfuck.nix index 0c5a81a52f0f..732003118713 100644 --- a/pkgs/games/dwarf-fortress/unfuck.nix +++ b/pkgs/games/dwarf-fortress/unfuck.nix @@ -1,18 +1,27 @@ -{ stdenv, fetchFromGitHub, cmake +{ stdenv, lib, fetchFromGitHub, cmake , libGL, libSM, SDL, SDL_image, SDL_ttf, glew, openalSoft , ncurses, glib, gtk2, libsndfile, zlib +, dfVersion }: -let dfVersion = "0.44.12"; in +with lib; + +let + unfuck-releases = builtins.fromJSON (builtins.readFile ./unfuck.json); + + release = if hasAttr dfVersion unfuck-releases + then getAttr dfVersion unfuck-releases + else throw "[unfuck] Unknown Dwarf Fortress version: ${dfVersion}"; +in stdenv.mkDerivation { - name = "dwarf_fortress_unfuck-${dfVersion}"; + name = "dwarf_fortress_unfuck-${release.unfuckRelease}"; src = fetchFromGitHub { owner = "svenstaro"; repo = "dwarf_fortress_unfuck"; - rev = dfVersion; - sha256 = "1kszkb1d1vll8p04ja41nangsaxb5lv4p3xh2jhmsmipfixw7nvz"; + rev = release.unfuckRelease; + sha256 = release.sha256; }; cmakeFlags = [ @@ -20,23 +29,12 @@ stdenv.mkDerivation { "-DGTK2_GDKCONFIG_INCLUDE_DIR=${gtk2.out}/lib/gtk-2.0/include" ]; - makeFlags = [ - ''CFLAGS="-fkeep-inline-functions"'' - ''CXXFLAGS="-fkeep-inline-functions"'' - ]; - nativeBuildInputs = [ cmake ]; buildInputs = [ libSM SDL SDL_image SDL_ttf glew openalSoft ncurses gtk2 libsndfile zlib libGL ]; - postPatch = '' - substituteInPlace CMakeLists.txt --replace \ - 'set(CMAKE_BUILD_TYPE Release)' \ - 'set(CMAKE_BUILD_TYPE Debug)' - ''; - # Don't strip unused symbols; dfhack hooks into some of them. dontStrip = true; @@ -56,6 +54,6 @@ stdenv.mkDerivation { homepage = https://github.com/svenstaro/dwarf_fortress_unfuck; license = licenses.free; platforms = platforms.linux; - maintainers = with maintainers; [ abbradar ]; + maintainers = with maintainers; [ abbradar numinit ]; }; } diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix index 6efe004fa9e8..105143916d10 100644 --- a/pkgs/games/dwarf-fortress/wrapper/default.nix +++ b/pkgs/games/dwarf-fortress/wrapper/default.nix @@ -1,4 +1,5 @@ -{ stdenv, lib, buildEnv, dwarf-fortress, substituteAll +{ stdenv, lib, buildEnv, substituteAll +, dwarf-fortress, dwarf-fortress-unfuck , enableDFHack ? false, dfhack , enableSoundSense ? false, soundSense, jdk , enableStoneSense ? false @@ -37,34 +38,12 @@ let paths = themePkg ++ pkgs; pathsToLink = [ "/" "/hack" "/hack/scripts" ]; ignoreCollisions = true; - - postBuild = '' - # De-symlink init.txt - cp $out/data/init/init.txt init.txt - rm $out/data/init/init.txt - mv init.txt $out/data/init/init.txt - '' + lib.optionalString enableDFHack '' - rm $out/hack/symbols.xml - substitute ${dfhack_}/hack/symbols.xml $out/hack/symbols.xml \ - --replace $(cat ${dwarf-fortress}/hash.md5.orig) \ - $(cat ${dwarf-fortress}/hash.md5) - '' + lib.optionalString enableTWBT '' - substituteInPlace $out/data/init/init.txt \ - --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]' - '' + '' - substituteInPlace $out/data/init/init.txt \ - --replace '[INTRO:YES]' '[INTRO:${unBool enableIntro}]' \ - --replace '[TRUETYPE:YES]' '[TRUETYPE:${unBool enableTruetype}]' \ - --replace '[FPS:NO]' '[FPS:${unBool enableFPS}]' - ''; }; in stdenv.mkDerivation rec { name = "dwarf-fortress-${dwarf-fortress.dfVersion}"; - compatible = lib.all (x: assert (x.dfVersion == dwarf-fortress.dfVersion); true) pkgs; - dfInit = substituteAll { name = "dwarf-fortress-init"; src = ./dwarf-fortress-init.in; @@ -99,5 +78,26 @@ stdenv.mkDerivation rec { chmod 755 $out/bin/soundsense ''; + postBuild = '' + # De-symlink init.txt + cp $out/data/init/init.txt init.txt + rm $out/data/init/init.txt + mv init.txt $out/data/init/init.txt + '' + lib.optionalString enableDFHack '' + rm $out/hack/symbols.xml + echo "[$out/hack/symbols.xml] $(cat ${dwarf-fortress}/hash.md5.orig) => $(cat ${dwarf-fortress}/hash.md5)" + substitute ${dfhack_}/hack/symbols.xml $out/hack/symbols.xml \ + --replace $(cat ${dwarf-fortress}/hash.md5.orig) \ + $(cat ${dwarf-fortress}/hash.md5) + '' + lib.optionalString enableTWBT '' + substituteInPlace $out/data/init/init.txt \ + --replace '[PRINT_MODE:2D]' '[PRINT_MODE:TWBT]' + '' + '' + substituteInPlace $out/data/init/init.txt \ + --replace '[INTRO:YES]' '[INTRO:${unBool enableIntro}]' \ + --replace '[TRUETYPE:YES]' '[TRUETYPE:${unBool enableTruetype}]' \ + --replace '[FPS:NO]' '[FPS:${unBool enableFPS}]' + ''; + preferLocalBuild = true; }