summaryrefslogtreecommitdiff
path: root/games-util
diff options
context:
space:
mode:
authoreroen2013-06-17 02:49:50 +0200
committereroen2013-06-17 02:49:50 +0200
commit38151a937b22b93e0b8d8876bada3365d113a4dc (patch)
tree3624184abaf66bbcec7e93debecc402688a28a6b /games-util
parent04a6bb8f0fa9428bd0f0a4023b3e9202b570fdb3 (diff)
downloaderoen-overlay-38151a937b22b93e0b8d8876bada3365d113a4dc.tar.gz
eroen-overlay-38151a937b22b93e0b8d8876bada3365d113a4dc.tar.bz2
eroen-overlay-38151a937b22b93e0b8d8876bada3365d113a4dc.tar.xz
dfhack-9999 - working egg
Diffstat (limited to 'games-util')
-rw-r--r--games-util/dfhack/Manifest7
-rw-r--r--games-util/dfhack/dfhack-9999.ebuild20
-rw-r--r--games-util/dfhack/files/dfhack-9999/07-startup-scripts-configurable.patch69
-rw-r--r--games-util/dfhack/files/dfhack-9999/08-ruby-plugin-configurable-paths.patch525
-rw-r--r--games-util/dfhack/files/dfhack-9999/series1
5 files changed, 590 insertions, 32 deletions
diff --git a/games-util/dfhack/Manifest b/games-util/dfhack/Manifest
index 3704a094..9a48ee0a 100644
--- a/games-util/dfhack/Manifest
+++ b/games-util/dfhack/Manifest
@@ -10,8 +10,9 @@ AUX dfhack-9999/03-configurable-install-paths.patch 3975 SHA256 bdfd0d8285089a51
AUX dfhack-9999/04-compile-time-configurable.patch 5252 SHA256 89f8396c8709a2d72f55f364b73d129e05f65caa32b8c145741d841281f7a71a SHA512 6a613fb00748f22938bf8fdbf55a1acfb141e48c85185c71fd08cc934ab9dd0089431f3942f2bce726d0e71cfd660ece4866026335ca03f75370565c190d330b WHIRLPOOL 7d3e6fe729f61ce5e61e6843c1219e19cba5b77d7558371044c2bb3e60c071d6a13af2e051d3978704b7ee43523ac029833d18e47830ab688ef8af7208bb7edb
AUX dfhack-9999/05-compile-time-configurable-0.patch 1562 SHA256 16810214a14c585a7f99f3939f52c66aaab7d388f4854c1d684032df4e3ddf80 SHA512 a2797092215b61765cfee6654a45f0c1f890e6d537e370d038907e25e9e916d54e140635b57012b892039467027e62505045287f3d6a06a2f6d0e6dac83fe256 WHIRLPOOL 49c95f1adb62d1997adea7521e550ffb1bdf38b22e2ca699fd8314b0f96b32de6ee042218d0053f9da0827fecd81d923d078cb9f37447bc4c3211226d9ea0eff
AUX dfhack-9999/06-compile-time-configurable-1.patch 3578 SHA256 ead1019a14dbdab2fb0ac097073c7f2a22fa24f426eb031615cd79a5a28b1a54 SHA512 fae5f28c20364a6032f329115a8d1630e17fb1e5e7888c058c94218824616f1b807e7471330fdb7e6d1f29d3960a85f1469edbf1d270cc44ed9a707295bf8c90 WHIRLPOOL 5c8e9a113fc0a4972e54df0871fa6cce4074ef0b4cca33cf2d26cffab3d75863d8aace3423d14d2110a00a5ba79ca39b680e1838889e9ac390f4ea95d06c6784
-AUX dfhack-9999/07-startup-scripts-configurable.patch 8154 SHA256 b7669577715f3c3fe000b951bb9071359fe6bdf41e2ea56351a0fa3a76e10bc3 SHA512 1271050439a9dcea525fb9555d1c43e2e76c99544db9789dbea22cae217826391ff5e31f9d08029e777e121e8b658e67e9cbdeb6edbbbcf28cc54afe737903e6 WHIRLPOOL af71902548542259a4103a3c156e6bbbf85607226c2a7f5e0638f872bf55dd1304283460e59f17e3975574329b80b04dd252df2e7d00819f62a8b41d75656139
-AUX dfhack-9999/series 333 SHA256 9f6dc3e87b5fe9c19ee6e4c9a83ec99751975ebab26da58c1e8899bb8f31e304 SHA512 d1ba58776c80b86f847f6c2ddf11ab9002a8c15c978eb25f15f8a3807b70ebb182e5c75fcf92c06507365a53058e43f3b7841a60fc404b7cefd79a0e4079579b WHIRLPOOL de03a18cc24bcd54dde05efe202ddfb2955812283813808b0b9f8c713b5be5641869d51785d63f41d3cbb32caeaf48621740dded238be9d5f2d9add156caf668
+AUX dfhack-9999/07-startup-scripts-configurable.patch 9738 SHA256 a107a4693ed5c8f156c2dd9718c3c83b6c6802bd39d8a41fb15b604bdd2d7908 SHA512 c833b81a0bf7be6d15bc6149e43ae4bcd37bdbe42890ea73ebe950bef416732d9c807c9268031568e08c3f3de9130fc6759d32dd236c830abfa0c3dfddc0f73f WHIRLPOOL 58c7e9891f72819782be79eb9388bd7650a18df2816f4d75f4708fcbdc72d882b0aa18f30af0a91f052cc83f8bf972a6e6df6a64845dbf4521689ba95f8094e4
+AUX dfhack-9999/08-ruby-plugin-configurable-paths.patch 19636 SHA256 2a24c35f5e4b1cf060fd6f11a5ff4b438b1fafea6a7ece9b5e0f018d1dfcad46 SHA512 00130cc96695e40e47763e858dd73b739d083808b7f0bb1a097a8120c0b7c8d10306a3da0700aa42b69422a32b7814d40290228f26da4e486c5cbb507bdf139d WHIRLPOOL 80aaf69a4c4139096c120f837bcf25a37076269f0f0d3a6ae272fd95124a59c163595827ddb22361f37b79f15d0a3853601dd2c3fdc9682826679aea9fdf3098
+AUX dfhack-9999/series 373 SHA256 db1b6ef38578430ecc658c8477299e59ce0124ed1e1c65690b2c3b4ac2e807c4 SHA512 a4940fa27bb9346534d2f4e242415593d7dfb5e0bb3fa84d1ebeca38860ae8c29e010b06a3eadba6de4ca27df46030e78daaec9c46b7584f3ea2ecd14a9fee62 WHIRLPOOL abf5987a2f98f34bc4a75f2cecde356f1e30c164775bc35d350d6c601f10db3d36fe27fecc270ec0a7daf2062e1951a03476aa554bc614b55734e5d188f80ea7
AUX stonesense-9999/01-null-isn-t-an-int32.patch 2293 SHA256 c140f17f9ad485b43ab2b6de8e1ab88ff8e3f6748a233d7d34d63e79a9f8074e SHA512 84ab7ebd25505515085c3c6c2c903d4aa51d8432b8c750a4f66d436426ad9963c07fa5019e24f0ca6d5618be329b35673a819443d092460e55bb6bb829dd4760 WHIRLPOOL 3beb7cc546b1f5eba970628e3a263e2536f881ae1e21115df19c4979b9c267d66ba060bf16f78a46675fe96b2f18fb7281ba1a9dd1695e3e5f0df4147bcb78b7
AUX stonesense-9999/02-configurable-install-paths.patch 1388 SHA256 03ac914c0fbee6d27b68c075d91b8b315179d9cb91944da731006241e0589dbb SHA512 b7b75f33b9aefe91081f4cede21b79b7583374ea5f5608cd4982a6ba5ad35006986ede06985bac70f5260610f2b32ac05cc06e90a983dbc6e85e7346da084d96 WHIRLPOOL 677942b840640ce40a3e93d28265a5f39c778fe369c4de27eee382d8a83e063a775477f5434f754173de88c2a0bf46750006ca11294b244fffe4f3ec5ba80d5f
AUX stonesense-9999/03-don-t-segfault-if-logfile-is.patch 817 SHA256 7fd33d13206ef38bca971856d9cfff0fbef88f1e7685111e00fa13b780cc9ecb SHA512 2ff023f34a1cf8718a3954e3a7584d07a1716b67756473d0852863f182c55bcde209921a9e26e1efeffde17ae42ab87c322915d74f2661b79ec49dd158df7cd1 WHIRLPOOL 1c88b645f01d651896b951acbc97d610d986a7d756cb0d58cc9c3c9caaa3873c18d191c46238ad13e050047476cc2589ae7f40614f0b8d3a52bb24fa58325976
@@ -26,5 +27,5 @@ AUX stonesense/0002-compile-time-configuration-of-magic-cwd.patch 7753 SHA256 79
AUX stonesense/0003-screenshots-in-home-dir.patch 2578 SHA256 88bc1a28442dfe8e5ff08e27e82de6443a3c5bccf49d7bcb2a26637a71ae3e18 SHA512 988efaba82e96149641e8dd6d8769b3ac1d890ebaa35128507a8f0d633af947ad9d8090758e1734a2f9b118c5404e4d712e2abb9a4e971f980f4163c0b646f5b WHIRLPOOL f3f03c297fbd39f27b5957cca0073a3420a10ba0a1741cf73f210cf680c2083c761cb68a637663281e69d1fee9e7b5049c3074f18fed394f48888bc377f5bb70
AUX stonesense/0004-create-various-output-files-in-HOME-not-cwd.patch 5217 SHA256 3ac09c948cc36b04058a82cb9f04e0ff26ffee765bf2300a46eac09cebc867de SHA512 9f0c2c5f4a2d15c99e06d30e1d3825527449f63de4d370533f07ce4324d0afbd1a2190dcf9589cbd326fd0f9705333bb436bed74e72ac4a7485f002fa3600639 WHIRLPOOL cbe81a086301a3dc218f31e3b1edb837bd81a25d151e5d46c0988d080165e95faac8ab14a97995a7092262542cbb8b29a2a540fe45a5c74b520e47ec5ab0f420
EBUILD dfhack-0.34.11.2.ebuild 5523 SHA256 c126fc718aaddcfd1f62c04a5ce37add8c6ecfb72e0fa73d8048383e02d048f0 SHA512 ab671faa41ab7cff26b933ef816fba8f5c86389769f5dcf1da6a5ee7413324d50ebcd7e60812935fd0ddd70688461ca23d55edf499ffffec89e3ff3ad321c2e8 WHIRLPOOL 11246c870f497929299ccf75c91f77481a6d3faccc9a8646c668836b22906d089e04826b3f67f5dcc8640b918a9e3a0e1fa9821d7d17664ec58f8a88db498170
-EBUILD dfhack-9999.ebuild 8268 SHA256 018bd1b3964b30cf1aee98dba465ad39d4d39097b3591b3ed310d51b08522a15 SHA512 ac7de2e601562232b57a98907ce512babd4ba5b736d20b21dee47f1fef0bf5f3bca58fde02cf77b42144d7a4eb347482f56a116fa833bf6f85e7d4f3abc87022 WHIRLPOOL a9be423a7aada29d1eed6cde7b5b9f8c1906bf784a1180e39d5113f88d936ddc536952f7fec7f625f6889081d9316e0c9dc143ca26cf3f651fbd1a2c1a61b4c9
+EBUILD dfhack-9999.ebuild 8033 SHA256 7415763c5817ab1d866bfe98a2fc2ec1a4bcc24f85b711331336a97599d9ff78 SHA512 5225221a30b3f33cc83c38c0563b2b3cdd9bc3a246d0b95c66d70027bdaa04ab37b736dd59fb7d4148710796fdfbe245355c9bbf8be0571a926add0b840f9a58 WHIRLPOOL 493f98a0493630381b09b8dfd48ce4b08a5f81d129ad7a9b34e44f52dad7c040f72f66c81f11e0d364ae749b61cb18b487c705ff038fc61f10fbfcab480e1c65
MISC metadata.xml 663 SHA256 55a12d4c9666a995d266a30d607c232114db139aafa462b02db6f657eb39fa8a SHA512 9a9eede0ad1fed3f735bb08e6f0e9911cc5de7310bc57be987b42842bcaff05becad270d7414da2bca9b40531a69eefb5dff725a61d5b9bfcd3cb84c41847d3c WHIRLPOOL 28e63c07f1470f7bdb56d9c0a7838a501bf94585ed1446e2a107dc5669e0aefc48a6b227c5c55e1e33d0ed2a9be1bff8e2437381496e278b598e542950f43e42
diff --git a/games-util/dfhack/dfhack-9999.ebuild b/games-util/dfhack/dfhack-9999.ebuild
index 46db9316..41e47446 100644
--- a/games-util/dfhack/dfhack-9999.ebuild
+++ b/games-util/dfhack/dfhack-9999.ebuild
@@ -23,6 +23,7 @@ if [[ ! ${PV} == "9999" ]]; then
EGIT_COMMIT="${MY_PV}"
fi
+CMAKE_MIN_VERSION=2.8.9
CMAKE_REMOVE_MODULES_LIST="FindCurses FindDoxygen CMakeVS10FindMake"
LICENSE="ZLIB MIT BSD-2"
@@ -52,6 +53,8 @@ RDEPEND="${LIBRARY_DEPEND}
ssense? ( app-emulation/emul-linux-x86-opengl
app-emulation/emul-linux-x86-xlibs )"
+QA_PREBUILT+="${dfhack_libdir}"/libruby.so
+
## missing multilib
#dev-lang/lua - binary bundled
#dev-libs/protobuf - bundled
@@ -83,8 +86,7 @@ multilib_toolchain_setup x86
if use egg; then
dfhack_libdir="$(games_get_libdir)"
else
- #dfhack_libdir="$(games_get_libdir)/${P}"
- dfhack_libdir="$(games_get_libdir)"
+ dfhack_libdir="$(games_get_libdir)/${P}"
fi
pkg_setup() {
@@ -102,6 +104,7 @@ src_prepare() {
epatch "${FILESDIR}"/${P}/05-compile-time-configurable-0.patch
epatch "${FILESDIR}"/${P}/06-compile-time-configurable-1.patch
epatch "${FILESDIR}"/${P}/07-startup-scripts-configurable.patch
+ epatch "${FILESDIR}"/${P}/08-ruby-plugin-configurable-paths.patch
pushd "${S}"/depends/clsocket
epatch "${FILESDIR}"/clsocket/0001-Compile-static-library-as-PIC.patch
@@ -123,9 +126,6 @@ src_prepare() {
fi
# Fix other scripts
- sed -i "plugins/ruby/ruby.rb" \
- -e "s%\./hack/ruby/%${GAMES_DATADIR}/${P}/ruby/%" \
- || die "ruby/ruby.rb sed failed"
# if use dfusion; then
# sed -f - -i plugins/Dfusion/luafiles/{init.lua,friendship/{init.lua,plugin.lua,install.lua},triggers/{plugin.lua,functions_menu.lua},friendship_civ/init.lua,common.lua,embark/{init.lua,plugin.lua},migrants/{init.lua,plugin.lua},xml_struct.lua,xml_types.lua} <<- EOF || die
# s:("dfusion/:("${datadir}/dfusion/:
@@ -134,15 +134,7 @@ src_prepare() {
# sed -i "s:libs/Dwarf_Fortress:Dwarf_Fortress:" plugins/Dfusion/luafiles/common.lua
# fi
- #if use egg; then
-# sed -f - -i ./library/Hooks-egg.cpp <<- EOF || die
-# s/SDL_Event\* event/SDL::Event\* event/
-# EOF
- #fi
-
##Issues:
- # - libdir should be hidden
- # - egg
# - df version
# - dfusion is strange. It's always been that, though.
# - prebuilt ruby
@@ -209,8 +201,6 @@ src_compile() {
cmake-utils_src_compile
}
-QA_PREBUILT+="${dfhack_libdir}"/libruby.so
-
src_install() {
cmake-utils_src_install
mv "${D}/${GAMES_BINDIR}/dfhack" \
diff --git a/games-util/dfhack/files/dfhack-9999/07-startup-scripts-configurable.patch b/games-util/dfhack/files/dfhack-9999/07-startup-scripts-configurable.patch
index 73fb4c54..28fbf71f 100644
--- a/games-util/dfhack/files/dfhack-9999/07-startup-scripts-configurable.patch
+++ b/games-util/dfhack/files/dfhack-9999/07-startup-scripts-configurable.patch
@@ -5,16 +5,20 @@ From: eroen <eroen@occam.eroen.eu>
---
CMakeLists.txt | 3 ++
- library/CMakeLists.txt | 6 +++
+ library/CMakeLists.txt | 13 +++++++
package/linux/dfhack | 79 -------------------------------------------
package/linux/dfhack-run | 8 ----
package/linux/dfhack-run.in | 8 ++++
package/linux/dfhack.in | 79 +++++++++++++++++++++++++++++++++++++++++++
- 6 files changed, 96 insertions(+), 87 deletions(-)
+ package/linux/egghack | 7 ----
+ package/linux/egghack.in | 7 ++++
+ 8 files changed, 110 insertions(+), 94 deletions(-)
delete mode 100755 package/linux/dfhack
delete mode 100755 package/linux/dfhack-run
create mode 100755 package/linux/dfhack-run.in
create mode 100755 package/linux/dfhack.in
+ delete mode 100755 package/linux/egghack
+ create mode 100755 package/linux/egghack.in
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 73a4ac1..031a2cd 100644
@@ -31,10 +35,10 @@ index 73a4ac1..031a2cd 100644
# the dfhack libraries will be installed here:
IF(UNIX)
diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt
-index 18635ed..6979f0a 100644
+index 18635ed..11a17ff 100644
--- a/library/CMakeLists.txt
+++ b/library/CMakeLists.txt
-@@ -301,6 +301,12 @@ IF(UNIX)
+@@ -301,10 +301,23 @@ IF(UNIX)
DESTINATION .)
else()
# On linux, copy our version of the df launch script which sets LD_PRELOAD
@@ -44,9 +48,20 @@ index 18635ed..6979f0a 100644
+ configure_file(${dfhack_SOURCE_DIR}/package/linux/dfhack-run.in
+ ${dfhack_SOURCE_DIR}/package/linux/dfhack-run
+ @ONLY)
++ configure_file(${dfhack_SOURCE_DIR}/package/linux/egghack.in
++ ${dfhack_SOURCE_DIR}/package/linux/egghack
++ @ONLY)
install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack
DESTINATION ${DFHACK_BINARY_DESTINATION})
install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack-run
+ DESTINATION ${DFHACK_BINARY_DESTINATION})
++ if(BUILD_EGGY)
++ install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/egghack
++ DESTINATION ${DFHACK_BINARY_DESTINATION})
++ endif()
+ endif()
+ ELSE()
+ if(NOT BUILD_EGGY)
diff --git a/package/linux/dfhack b/package/linux/dfhack
deleted file mode 100755
index 5ddd2a1..0000000
@@ -148,7 +163,7 @@ index 55001cf..0000000
-exec hack/dfhack-run "$@"
diff --git a/package/linux/dfhack-run.in b/package/linux/dfhack-run.in
new file mode 100755
-index 0000000..8dc3ea7
+index 0000000..f013053
--- /dev/null
+++ b/package/linux/dfhack-run.in
@@ -0,0 +1,8 @@
@@ -157,12 +172,12 @@ index 0000000..8dc3ea7
+DF_DIR=$(dirname "$0")
+cd "${DF_DIR}"
+
-+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"@DFHACK_LIBRARY_DESTINATION@"/libs:"@DFHACK_LIBRARY_DESTINATION@"
++export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"@DFHACK_LIBRARY_DESTINATION@"/libs:"@DFHACK_LIBRARY_DESTINATION@"
+
-+exec "@DFHACK_LIBRARY_DESTINATION@"/dfhack-run "$@"
++exec "@DFHACK_LIBRARY_DESTINATION@"/dfhack-run "${@}"
diff --git a/package/linux/dfhack.in b/package/linux/dfhack.in
new file mode 100755
-index 0000000..7b32e1a
+index 0000000..a969708
--- /dev/null
+++ b/package/linux/dfhack.in
@@ -0,0 +1,79 @@
@@ -204,34 +219,34 @@ index 0000000..7b32e1a
+
+# Now run
+
-+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"@DFHACK_LIBRARY_DESTINATION@"/libs:"@DFHACK_LIBRARY_DESTINATION@"
++export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"@DFHACK_LIBRARY_DESTINATION@"/libs:"@DFHACK_LIBRARY_DESTINATION@"
+
+case "$1" in
+ -g | --gdb)
+ shift
+ echo "set environment LD_PRELOAD=@DFHACK_LIBRARY_DESTINATION@/libdfhack.so" > gdbcmd.tmp
+ echo "set environment MALLOC_PERTURB_=45" >> gdbcmd.tmp
-+ gdb $DF_GDB_OPTS -x gdbcmd.tmp "@DF_EXECUTABLE@" "$@"
++ gdb ${DF_GDB_OPTS} -x gdbcmd.tmp "@DF_EXECUTABLE@" "${@}"
+ rm gdbcmd.tmp
+ ret=$?
+ ;;
+ -h | --helgrind)
+ shift
-+ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind $DF_HELGRIND_OPTS --tool=helgrind --log-file=helgrind.log "@DF_EXECUTABLE@" "$@"
++ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind ${DF_HELGRIND_OPTS} --tool=helgrind --log-file=helgrind.log "@DF_EXECUTABLE@" "${@}"
+ ret=$?
+ ;;
+ -v | --valgrind)
+ shift
-+ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind $DF_VALGRIND_OPTS --log-file=valgrind.log "@DF_EXECUTABLE@" "$@"
++ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind ${DF_VALGRIND_OPTS} --log-file=valgrind.log "@DF_EXECUTABLE@" "${@}"
+ ret=$?
+ ;;
+ -c | --callgrind)
+ shift
-+ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind $DF_CALLGRIND_OPTS --tool=callgrind --separate-threads=yes --dump-instr=yes --instr-atstart=no --log-file=callgrind.log "@DF_EXECUTABLE@" "$@"
++ LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so setarch i386 -R valgrind ${DF_CALLGRIND_OPTS} --tool=callgrind --separate-threads=yes --dump-instr=yes --instr-atstart=no --log-file=callgrind.log "@DF_EXECUTABLE@" "${@}"
+ ret=$?
+ ;;
+ *)
-+ setarch i386 -R env LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so "@DF_EXECUTABLE@" "$@"
++ setarch i386 -R env LD_PRELOAD="@DFHACK_LIBRARY_DESTINATION@"/libdfhack.so "@DF_EXECUTABLE@" "${@}"
+ ret=$?
+ ;;
+esac
@@ -245,3 +260,29 @@ index 0000000..7b32e1a
+fi
+
+exit $ret
+diff --git a/package/linux/egghack b/package/linux/egghack
+deleted file mode 100755
+index 5b3b03b..0000000
+--- a/package/linux/egghack
++++ /dev/null
+@@ -1,7 +0,0 @@
+-#!/bin/sh
+-DF_DIR=$(dirname "$0")
+-cd "${DF_DIR}"
+-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"./hack/libs":"./hack"
+-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.
+-./libs/Dwarf_Fortress $* # Go, go, go! :)
+diff --git a/package/linux/egghack.in b/package/linux/egghack.in
+new file mode 100755
+index 0000000..4bf4c9d
+--- /dev/null
++++ b/package/linux/egghack.in
+@@ -0,0 +1,7 @@
++#!/bin/sh
++DF_DIR=$(dirname "$0")
++cd "${DF_DIR}"
++export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":"@DFHACK_LIBRARY_DESTINATION@"/libs:"@DFHACK_LIBRARY_DESTINATION@"
++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.
++"@DF_EXECUTABLE@" ${*} # Go, go, go! :)
diff --git a/games-util/dfhack/files/dfhack-9999/08-ruby-plugin-configurable-paths.patch b/games-util/dfhack/files/dfhack-9999/08-ruby-plugin-configurable-paths.patch
new file mode 100644
index 00000000..47531337
--- /dev/null
+++ b/games-util/dfhack/files/dfhack-9999/08-ruby-plugin-configurable-paths.patch
@@ -0,0 +1,525 @@
+ruby plugin - configurable paths
+
+From: eroen <eroen@occam.eroen.eu>
+
+
+---
+ plugins/ruby/CMakeLists.txt | 4 +
+ plugins/ruby/ruby.rb | 239 -------------------------------------------
+ plugins/ruby/ruby.rb.in | 239 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 243 insertions(+), 239 deletions(-)
+ delete mode 100644 plugins/ruby/ruby.rb
+ create mode 100644 plugins/ruby/ruby.rb.in
+
+diff --git a/plugins/ruby/CMakeLists.txt b/plugins/ruby/CMakeLists.txt
+index e6d3eff..b282751 100644
+--- a/plugins/ruby/CMakeLists.txt
++++ b/plugins/ruby/CMakeLists.txt
+@@ -27,6 +27,8 @@ ADD_CUSTOM_COMMAND(
+ )
+ ADD_CUSTOM_TARGET(ruby-autogen-rb DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ruby-autogen.rb)
+
++CONFIGURE_FILE(ruby.rb.in ruby.rb @ONLY)
++
+ INCLUDE_DIRECTORIES("${dfhack_SOURCE_DIR}/depends/tthread")
+
+ DFHACK_PLUGIN(ruby ruby.cpp LINK_LIBRARIES dfhack-tinythread)
+@@ -34,6 +36,8 @@ ADD_DEPENDENCIES(ruby ruby-autogen-rb)
+
+ INSTALL(FILES ${RUBYLIB} DESTINATION ${DFHACK_LIBRARY_DESTINATION})
+
++INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/ruby.rb DESTINATION ${DFHACK_RUBY_DESTINATION})
++
+ INSTALL(DIRECTORY .
+ DESTINATION ${DFHACK_RUBY_DESTINATION}
+ FILES_MATCHING PATTERN "*.rb")
+diff --git a/plugins/ruby/ruby.rb b/plugins/ruby/ruby.rb
+deleted file mode 100644
+index 47924dc..0000000
+--- a/plugins/ruby/ruby.rb
++++ /dev/null
+@@ -1,239 +0,0 @@
+-# redefine standard i/o methods to use the dfhack console
+-module Kernel
+- def puts(*a)
+- a.flatten.each { |l|
+- DFHack.print_str(l.to_s.chomp + "\n")
+- }
+- nil
+- end
+-
+- def puts_err(*a)
+- a.flatten.each { |l|
+- DFHack.print_err(l.to_s.chomp + "\n")
+- }
+- nil
+- end
+-
+- def p(*a)
+- a.each { |e|
+- puts_err e.inspect
+- }
+- nil
+- end
+-end
+-
+-module DFHack
+- VERSION = version
+-
+- class OnupdateCallback
+- attr_accessor :callback, :timelimit, :minyear, :minyeartick, :description
+- def initialize(descr, cb, tl, initdelay=0)
+- @description = descr
+- @callback = cb
+- @ticklimit = tl
+- @minyear = (tl ? df.cur_year : 0)
+- @minyeartick = (tl ? df.cur_year_tick+initdelay : 0)
+- end
+-
+- # run callback if timedout
+- def check_run(year, yeartick, yearlen)
+- if @ticklimit
+- return unless year > @minyear or (year == @minyear and yeartick >= @minyeartick)
+- @minyear = year
+- @minyeartick = yeartick + @ticklimit
+- if @minyeartick > yearlen
+- @minyear += 1
+- @minyeartick -= yearlen
+- end
+- end
+- # t0 = Time.now
+- @callback.call
+- # dt = Time.now - t0 ; puts "rb cb #@description took #{'%.02f' % dt}s" if dt > 0.1
+- rescue Exception
+- df.onupdate_unregister self
+- puts_err "onupdate #@description unregistered: #$!", $!.backtrace
+- end
+-
+- def <=>(o)
+- [@minyear, @minyeartick] <=> [o.minyear, o.minyeartick]
+- end
+- end
+-
+- class << self
+- attr_accessor :onupdate_list, :onstatechange_list
+-
+- # register a callback to be called every gframe or more
+- # ex: DFHack.onupdate_register('fastdwarf') { DFHack.world.units[0].counters.job_counter = 0 }
+- # if ticklimit is given, do not call unless this much game ticks have passed. Handles advmode time stretching.
+- def onupdate_register(descr, ticklimit=nil, initialtickdelay=0, &b)
+- raise ArgumentError, 'need a description as 1st arg' unless descr.kind_of?(::String)
+- @onupdate_list ||= []
+- @onupdate_list << OnupdateCallback.new(descr, b, ticklimit, initialtickdelay)
+- DFHack.onupdate_active = true
+- if onext = @onupdate_list.sort.first
+- DFHack.onupdate_minyear = onext.minyear
+- DFHack.onupdate_minyeartick = onext.minyeartick
+- end
+- @onupdate_list.last
+- end
+-
+- # delete the callback for onupdate ; use the value returned by onupdate_register or the description
+- def onupdate_unregister(b)
+- b = @onupdate_list.find { |bb| bb.description == b } if b.kind_of?(String)
+- @onupdate_list.delete b
+- if @onupdate_list.empty?
+- DFHack.onupdate_active = false
+- DFHack.onupdate_minyear = DFHack.onupdate_minyeartick = DFHack.onupdate_minyeartickadv = -1
+- end
+- end
+-
+- # same as onupdate_register, but remove the callback once it returns true
+- def onupdate_register_once(*a)
+- handle = onupdate_register(*a) {
+- onupdate_unregister(handle) if yield
+- }
+- end
+-
+- TICKS_PER_YEAR = 1200*28*12
+- # this method is called by ruby.cpp if df.onupdate_active is true
+- def onupdate
+- @onupdate_list ||= []
+-
+- y = cur_year
+- ytmax = TICKS_PER_YEAR
+- if df.gamemode == :ADVENTURE and df.respond_to?(:cur_year_tick_advmode)
+- yt = cur_year_tick_advmode
+- ytmax *= 144
+- else
+- yt = cur_year_tick
+- end
+-
+- @onupdate_list.each { |o|
+- o.check_run(y, yt, ytmax)
+- }
+-
+- if onext = @onupdate_list.sort.first
+- DFHack.onupdate_minyear = onext.minyear
+- if ytmax > TICKS_PER_YEAR
+- DFHack.onupdate_minyeartick = -1
+- DFHack.onupdate_minyeartickadv = onext.minyeartick
+- else
+- DFHack.onupdate_minyeartick = onext.minyeartick
+- DFHack.onupdate_minyeartickadv = -1
+- end
+- end
+- end
+-
+- # register a callback to be called every gframe or more
+- # ex: DFHack.onstatechange_register { |newstate| puts "state changed to #{newstate}" }
+- def onstatechange_register(&b)
+- @onstatechange_list ||= []
+- @onstatechange_list << b
+- @onstatechange_list.last
+- end
+-
+- # delete the callback for onstatechange ; use the value returned by onstatechange_register
+- def onstatechange_unregister(b)
+- @onstatechange_list.delete b
+- end
+-
+- # same as onstatechange_register, but auto-unregisters if the block returns true
+- def onstatechange_register_once
+- handle = onstatechange_register { |st|
+- onstatechange_unregister(handle) if yield(st)
+- }
+- end
+-
+-
+- # this method is called by dfhack every 'onstatechange'
+- def onstatechange(newstate)
+- @onstatechange_list ||= []
+- @onstatechange_list.each { |cb| cb.call(newstate) }
+- end
+-
+- # return true if the argument is under the cursor
+- def at_cursor?(obj)
+- same_pos?(obj, cursor)
+- end
+-
+- # returns true if both arguments are at the same x/y/z
+- def same_pos?(pos1, pos2)
+- pos1 = pos1.pos if pos1.respond_to?(:pos)
+- pos2 = pos2.pos if pos2.respond_to?(:pos)
+- pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z
+- end
+-
+- # try to match a user-specified name to one from the raws
+- # uses case-switching and substring matching
+- # eg match_rawname('coal', ['COAL_BITUMINOUS', 'BAUXITE']) => 'COAL_BITUMINOUS'
+- def match_rawname(name, rawlist)
+- rawlist.each { |r| return r if name == r }
+- rawlist.each { |r| return r if name.downcase == r.downcase }
+- may = rawlist.find_all { |r| r.downcase.index(name.downcase) }
+- may.first if may.length == 1
+- end
+-
+- def translate_name(name, english=true, onlylastpart=false)
+- out = []
+-
+- if not onlylastpart
+- out << name.first_name if name.first_name != ''
+- if name.nickname != ''
+- case respond_to?(:d_init) && d_init.nickname_dwarf
+- when :REPLACE_ALL; return "`#{name.nickname}'"
+- when :REPLACE_FIRST; out.pop
+- end
+- out << "`#{name.nickname}'"
+- end
+- end
+- return out.join(' ') unless name.words.find { |w| w >= 0 }
+-
+- if not english
+- tsl = world.raws.language.translations[name.language]
+- if name.words[0] >= 0 or name.words[1] >= 0
+- out << ''
+- out.last << tsl.words[name.words[0]] if name.words[0] >= 0
+- out.last << tsl.words[name.words[1]] if name.words[1] >= 0
+- end
+- if name.words[5] >= 0
+- out << ''
+- (2..5).each { |i| out.last << tsl.words[name.words[i]] if name.words[i] >= 0 }
+- end
+- if name.words[6] >= 0
+- out << tsl.words[name.words[6]]
+- end
+- else
+- wl = world.raws.language
+- if name.words[0] >= 0 or name.words[1] >= 0
+- out << ''
+- out.last << wl.words[name.words[0]].forms[name.parts_of_speech[0]] if name.words[0] >= 0
+- out.last << wl.words[name.words[1]].forms[name.parts_of_speech[1]] if name.words[1] >= 0
+- end
+- if name.words[5] >= 0
+- out << 'the '
+- out.last.capitalize! if out.length == 1
+- (2..5).each { |i| out.last << wl.words[name.words[i]].forms[name.parts_of_speech[i]] if name.words[i] >= 0 }
+- end
+- if name.words[6] >= 0
+- out << 'of'
+- out.last.capitalize! if out.length == 1
+- out << wl.words[name.words[6]].forms[name.parts_of_speech[6]]
+- end
+- end
+-
+- out.join(' ')
+- end
+- end
+-end
+-
+-# global alias so we can write 'df.world.units.all[0]'
+-def df
+- DFHack
+-end
+-
+-# load autogenned file
+-require './hack/ruby/ruby-autogen-defs'
+-require './hack/ruby/ruby-autogen'
+-
+-# load all modules
+-Dir['./hack/ruby/*.rb'].each { |m| require m.chomp('.rb') }
+diff --git a/plugins/ruby/ruby.rb.in b/plugins/ruby/ruby.rb.in
+new file mode 100644
+index 0000000..2ae169c
+--- /dev/null
++++ b/plugins/ruby/ruby.rb.in
+@@ -0,0 +1,239 @@
++# redefine standard i/o methods to use the dfhack console
++module Kernel
++ def puts(*a)
++ a.flatten.each { |l|
++ DFHack.print_str(l.to_s.chomp + "\n")
++ }
++ nil
++ end
++
++ def puts_err(*a)
++ a.flatten.each { |l|
++ DFHack.print_err(l.to_s.chomp + "\n")
++ }
++ nil
++ end
++
++ def p(*a)
++ a.each { |e|
++ puts_err e.inspect
++ }
++ nil
++ end
++end
++
++module DFHack
++ VERSION = version
++
++ class OnupdateCallback
++ attr_accessor :callback, :timelimit, :minyear, :minyeartick, :description
++ def initialize(descr, cb, tl, initdelay=0)
++ @description = descr
++ @callback = cb
++ @ticklimit = tl
++ @minyear = (tl ? df.cur_year : 0)
++ @minyeartick = (tl ? df.cur_year_tick+initdelay : 0)
++ end
++
++ # run callback if timedout
++ def check_run(year, yeartick, yearlen)
++ if @ticklimit
++ return unless year > @minyear or (year == @minyear and yeartick >= @minyeartick)
++ @minyear = year
++ @minyeartick = yeartick + @ticklimit
++ if @minyeartick > yearlen
++ @minyear += 1
++ @minyeartick -= yearlen
++ end
++ end
++ # t0 = Time.now
++ @callback.call
++ # dt = Time.now - t0 ; puts "rb cb #@description took #{'%.02f' % dt}s" if dt > 0.1
++ rescue Exception
++ df.onupdate_unregister self
++ puts_err "onupdate #@description unregistered: #$!", $!.backtrace
++ end
++
++ def <=>(o)
++ [@minyear, @minyeartick] <=> [o.minyear, o.minyeartick]
++ end
++ end
++
++ class << self
++ attr_accessor :onupdate_list, :onstatechange_list
++
++ # register a callback to be called every gframe or more
++ # ex: DFHack.onupdate_register('fastdwarf') { DFHack.world.units[0].counters.job_counter = 0 }
++ # if ticklimit is given, do not call unless this much game ticks have passed. Handles advmode time stretching.
++ def onupdate_register(descr, ticklimit=nil, initialtickdelay=0, &b)
++ raise ArgumentError, 'need a description as 1st arg' unless descr.kind_of?(::String)
++ @onupdate_list ||= []
++ @onupdate_list << OnupdateCallback.new(descr, b, ticklimit, initialtickdelay)
++ DFHack.onupdate_active = true
++ if onext = @onupdate_list.sort.first
++ DFHack.onupdate_minyear = onext.minyear
++ DFHack.onupdate_minyeartick = onext.minyeartick
++ end
++ @onupdate_list.last
++ end
++
++ # delete the callback for onupdate ; use the value returned by onupdate_register or the description
++ def onupdate_unregister(b)
++ b = @onupdate_list.find { |bb| bb.description == b } if b.kind_of?(String)
++ @onupdate_list.delete b
++ if @onupdate_list.empty?
++ DFHack.onupdate_active = false
++ DFHack.onupdate_minyear = DFHack.onupdate_minyeartick = DFHack.onupdate_minyeartickadv = -1
++ end
++ end
++
++ # same as onupdate_register, but remove the callback once it returns true
++ def onupdate_register_once(*a)
++ handle = onupdate_register(*a) {
++ onupdate_unregister(handle) if yield
++ }
++ end
++
++ TICKS_PER_YEAR = 1200*28*12
++ # this method is called by ruby.cpp if df.onupdate_active is true
++ def onupdate
++ @onupdate_list ||= []
++
++ y = cur_year
++ ytmax = TICKS_PER_YEAR
++ if df.gamemode == :ADVENTURE and df.respond_to?(:cur_year_tick_advmode)
++ yt = cur_year_tick_advmode
++ ytmax *= 144
++ else
++ yt = cur_year_tick
++ end
++
++ @onupdate_list.each { |o|
++ o.check_run(y, yt, ytmax)
++ }
++
++ if onext = @onupdate_list.sort.first
++ DFHack.onupdate_minyear = onext.minyear
++ if ytmax > TICKS_PER_YEAR
++ DFHack.onupdate_minyeartick = -1
++ DFHack.onupdate_minyeartickadv = onext.minyeartick
++ else
++ DFHack.onupdate_minyeartick = onext.minyeartick
++ DFHack.onupdate_minyeartickadv = -1
++ end
++ end
++ end
++
++ # register a callback to be called every gframe or more
++ # ex: DFHack.onstatechange_register { |newstate| puts "state changed to #{newstate}" }
++ def onstatechange_register(&b)
++ @onstatechange_list ||= []
++ @onstatechange_list << b
++ @onstatechange_list.last
++ end
++
++ # delete the callback for onstatechange ; use the value returned by onstatechange_register
++ def onstatechange_unregister(b)
++ @onstatechange_list.delete b
++ end
++
++ # same as onstatechange_register, but auto-unregisters if the block returns true
++ def onstatechange_register_once
++ handle = onstatechange_register { |st|
++ onstatechange_unregister(handle) if yield(st)
++ }
++ end
++
++
++ # this method is called by dfhack every 'onstatechange'
++ def onstatechange(newstate)
++ @onstatechange_list ||= []
++ @onstatechange_list.each { |cb| cb.call(newstate) }
++ end
++
++ # return true if the argument is under the cursor
++ def at_cursor?(obj)
++ same_pos?(obj, cursor)
++ end
++
++ # returns true if both arguments are at the same x/y/z
++ def same_pos?(pos1, pos2)
++ pos1 = pos1.pos if pos1.respond_to?(:pos)
++ pos2 = pos2.pos if pos2.respond_to?(:pos)
++ pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z
++ end
++
++ # try to match a user-specified name to one from the raws
++ # uses case-switching and substring matching
++ # eg match_rawname('coal', ['COAL_BITUMINOUS', 'BAUXITE']) => 'COAL_BITUMINOUS'
++ def match_rawname(name, rawlist)
++ rawlist.each { |r| return r if name == r }
++ rawlist.each { |r| return r if name.downcase == r.downcase }
++ may = rawlist.find_all { |r| r.downcase.index(name.downcase) }
++ may.first if may.length == 1
++ end
++
++ def translate_name(name, english=true, onlylastpart=false)
++ out = []
++
++ if not onlylastpart
++ out << name.first_name if name.first_name != ''
++ if name.nickname != ''
++ case respond_to?(:d_init) && d_init.nickname_dwarf
++ when :REPLACE_ALL; return "`#{name.nickname}'"
++ when :REPLACE_FIRST; out.pop
++ end
++ out << "`#{name.nickname}'"
++ end
++ end
++ return out.join(' ') unless name.words.find { |w| w >= 0 }
++
++ if not english
++ tsl = world.raws.language.translations[name.language]
++ if name.words[0] >= 0 or name.words[1] >= 0
++ out << ''
++ out.last << tsl.words[name.words[0]] if name.words[0] >= 0
++ out.last << tsl.words[name.words[1]] if name.words[1] >= 0
++ end
++ if name.words[5] >= 0
++ out << ''
++ (2..5).each { |i| out.last << tsl.words[name.words[i]] if name.words[i] >= 0 }
++ end
++ if name.words[6] >= 0
++ out << tsl.words[name.words[6]]
++ end
++ else
++ wl = world.raws.language
++ if name.words[0] >= 0 or name.words[1] >= 0
++ out << ''
++ out.last << wl.words[name.words[0]].forms[name.parts_of_speech[0]] if name.words[0] >= 0
++ out.last << wl.words[name.words[1]].forms[name.parts_of_speech[1]] if name.words[1] >= 0
++ end
++ if name.words[5] >= 0
++ out << 'the '
++ out.last.capitalize! if out.length == 1
++ (2..5).each { |i| out.last << wl.words[name.words[i]].forms[name.parts_of_speech[i]] if name.words[i] >= 0 }
++ end
++ if name.words[6] >= 0
++ out << 'of'
++ out.last.capitalize! if out.length == 1
++ out << wl.words[name.words[6]].forms[name.parts_of_speech[6]]
++ end
++ end
++
++ out.join(' ')
++ end
++ end
++end
++
++# global alias so we can write 'df.world.units.all[0]'
++def df
++ DFHack
++end
++
++# load autogenned file
++require '@DFHACK_RUBY_DESTINATION@/ruby-autogen-defs'
++require '@DFHACK_RUBY_DESTINATION@/ruby-autogen'
++
++# load all modules
++Dir['@DFHACK_RUBY_DESTINATION@/*.rb'].each { |m| require m.chomp('.rb') }
diff --git a/games-util/dfhack/files/dfhack-9999/series b/games-util/dfhack/files/dfhack-9999/series
index d1dc79d4..742a16d7 100644
--- a/games-util/dfhack/files/dfhack-9999/series
+++ b/games-util/dfhack/files/dfhack-9999/series
@@ -6,3 +6,4 @@
05-compile-time-configurable-0.patch
06-compile-time-configurable-1.patch
07-startup-scripts-configurable.patch
+08-ruby-plugin-configurable-paths.patch