about summary refs log tree commit diff
path: root/pkgs/games/dwarf-fortress/wrapper
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2016-02-03 16:54:03 +0100
committerVladimír Čunát <vcunat@gmail.com>2016-02-03 16:57:19 +0100
commitae74c356d94b795eb07dfe9978788b49b70f5959 (patch)
treec13c6894b75f95d3a4dc4627efef508bb03dfba8 /pkgs/games/dwarf-fortress/wrapper
parentc9790126312119ce5a2a8ac946d9f086e7ea9f55 (diff)
parent53e0f8b1cdf36574bfede6e62e2ac2739c3ef804 (diff)
downloadnixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar.gz
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar.bz2
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar.lz
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar.xz
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.tar.zst
nixlib-ae74c356d94b795eb07dfe9978788b49b70f5959.zip
Merge recent 'staging' into closure-size
Let's get rid of those merge conflicts.
Diffstat (limited to 'pkgs/games/dwarf-fortress/wrapper')
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/default.nix68
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dfhack.in11
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in41
-rw-r--r--pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in6
4 files changed, 126 insertions, 0 deletions
diff --git a/pkgs/games/dwarf-fortress/wrapper/default.nix b/pkgs/games/dwarf-fortress/wrapper/default.nix
new file mode 100644
index 000000000000..5493cdb3faf6
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/wrapper/default.nix
@@ -0,0 +1,68 @@
+{ stdenv, lib, buildEnv, dwarf-fortress-original, substituteAll
+, enableDFHack ? false, dfhack
+, themes ? {}
+, theme ? null
+}:
+
+let
+  ptheme =
+    if builtins.isString theme
+    then builtins.getAttr theme themes
+    else theme;
+
+  # These are in inverse order for first packages to override the next ones.
+  pkgs = lib.optional (theme != null) ptheme
+         ++ lib.optional enableDFHack dfhack
+         ++ [ dwarf-fortress-original ];
+
+  env = buildEnv {
+    name = "dwarf-fortress-env-${dwarf-fortress-original.dfVersion}";
+    paths = pkgs;
+    ignoreCollisions = true;
+    postBuild = lib.optionalString enableDFHack ''
+      # #4621
+      if [ -L "$out/hack" ]; then
+        rm $out/hack
+        mkdir $out/hack
+        for i in ${dfhack}/hack/*; do
+          ln -s $i $out/hack
+        done
+      fi
+      rm $out/hack/symbols.xml
+      substitute ${dfhack}/hack/symbols.xml $out/hack/symbols.xml \
+        --replace $(cat ${dwarf-fortress-original}/hash.md5.orig) \
+                  $(cat ${dwarf-fortress-original}/hash.md5)
+    '';
+  };
+in
+
+assert lib.all (x: x.dfVersion == dwarf-fortress-original.dfVersion) pkgs;
+
+stdenv.mkDerivation rec {
+  name = "dwarf-fortress-${dwarf-fortress-original.dfVersion}";
+
+  dfInit = substituteAll {
+    name = "dwarf-fortress-init";
+    src = ./dwarf-fortress-init.in;
+    inherit env;
+  };
+
+  runDF = ./dwarf-fortress.in;
+  runDFHack = ./dfhack.in;
+
+  buildCommand = ''
+    mkdir -p $out/bin
+
+    substitute $runDF $out/bin/dwarf-fortress \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var dfInit
+    chmod 755 $out/bin/dwarf-fortress
+  '' + lib.optionalString enableDFHack ''
+    substitute $runDFHack $out/bin/dfhack \
+      --subst-var-by stdenv_shell ${stdenv.shell} \
+      --subst-var dfInit
+    chmod 755 $out/bin/dfhack
+  '';
+
+  preferLocalBuild = true;
+}
diff --git a/pkgs/games/dwarf-fortress/wrapper/dfhack.in b/pkgs/games/dwarf-fortress/wrapper/dfhack.in
new file mode 100644
index 000000000000..d53769ca4b61
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/wrapper/dfhack.in
@@ -0,0 +1,11 @@
+#!@stdenv_shell@ -e
+
+source @dfInit@
+
+for i in dfhack.init-example dfhack-config/default hack/*; do
+  update_path "$i"
+done
+
+cd "$DF_DIR"
+LD_LIBRARY_PATH="$env_dir/hack/libs:$env_dir/hack:$LD_LIBRARY_PATH" \
+  LD_PRELOAD=$env_dir/hack/libdfhack.so exec $env_dir/libs/Dwarf_Fortress "$@"
diff --git a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
new file mode 100644
index 000000000000..1fd6178895db
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress-init.in
@@ -0,0 +1,41 @@
+shopt -s extglob
+
+[ -z "$DF_DIR" ] && DF_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/df_linux"
+env_dir="@env@"
+
+update_path() {
+  local path="$1"
+
+  mkdir -p "$DF_DIR/$(dirname "$path")"
+  # If user has replaced these data directories, let them stay.
+  if [ ! -e "$DF_DIR/$path" ] || [ -L "$DF_DIR/$path" ]; then
+    rm -f "$DF_DIR/$path"
+    ln -s "$env_dir/$path" "$DF_DIR/$path"
+  fi
+}
+
+forcecopy_path() {
+  local path="$1"
+
+  mkdir -p "$DF_DIR/$(dirname "$path")"
+  rm -rf "$DF_DIR/$path"
+  cp -rL --no-preserve=all "$env_dir/$path" "$DF_DIR/$path"
+}
+
+mkdir -p "$DF_DIR"
+
+cat <<EOF >&2
+Using $DF_DIR as Dwarf Fortress overlay directory.
+If you do any changes in it, don't forget to clean it when updating the game version!
+We try to detect changes based on data directories being symbolic links -- keep this in mind.
+
+EOF
+
+cd "$env_dir"
+for i in data/init/* data/!(init|index|announcement) raw; do
+  update_path "$i"
+done
+
+forcecopy_path data/index
+# For some reason, it's needed to be writable...
+forcecopy_path data/announcement
diff --git a/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
new file mode 100644
index 000000000000..f405f1b0e393
--- /dev/null
+++ b/pkgs/games/dwarf-fortress/wrapper/dwarf-fortress.in
@@ -0,0 +1,6 @@
+#!@stdenv_shell@ -e
+
+source @dfInit@
+
+cd "$DF_DIR"
+exec "$env_dir/libs/Dwarf_Fortress" "$@"