summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eclass/games-mods.eclass356
1 files changed, 187 insertions, 169 deletions
diff --git a/eclass/games-mods.eclass b/eclass/games-mods.eclass
index 577280cd1396..3d9315ba4cfa 100644
--- a/eclass/games-mods.eclass
+++ b/eclass/games-mods.eclass
@@ -1,6 +1,6 @@
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/eclass/games-mods.eclass,v 1.41 2009/10/11 11:50:21 maekke Exp $
+# $Header: /var/cvsroot/gentoo-x86/eclass/games-mods.eclass,v 1.42 2009/10/12 00:53:51 nyhm Exp $
# Variables to specify in an ebuild which uses this eclass:
# GAME - (doom3, quake4 or ut2004, etc), unless ${PN} starts with e.g. "doom3-"
@@ -15,107 +15,134 @@ EXPORT_FUNCTIONS src_install pkg_postinst
[[ -z ${GAME} ]] && GAME=${PN%%-*}
-# Set our default title, icon, and cli options
case ${GAME} in
doom3)
GAME_PKGS="games-fps/doom3"
- GAME_TITLE="Doom 3"
- DEFAULT_MOD_ICON="doom3"
- SELECT_MOD="+set fs_game "
- GAME_EXE="doom3"
- DED_EXE="doom3-ded"
- DED_OPTIONS="+set dedicated 1 +exec server.cfg"
+ GAME_DIRS=( "${GAMES_PREFIX_OPT}"/doom3 )
+ GAME_NAME="Doom 3"
+ GAME_BIN="doom3"
+ GAME_ICON="doom3"
+ DED_PKGS=""
+ DED_BIN="doom3-ded"
+ DED_OPTS="+set dedicated 1 +exec server.cfg"
DED_CFG_DIR=".doom3"
+ SELECT_MOD="+set fs_game "
;;
enemy-territory)
GAME_PKGS="games-fps/enemy-territory"
- GAME_TITLE="Enemy Territory"
- DEFAULT_MOD_ICON="ET"
- SELECT_MOD="+set fs_game "
- GAME_EXE="et"
- DED_EXE="et-ded"
- DED_OPTIONS="+set dedicated 1 +exec server.cfg"
+ GAME_DIRS=( "${GAMES_PREFIX_OPT}"/enemy-territory )
+ GAME_NAME="Enemy Territory"
+ GAME_BIN="et"
+ GAME_ICON="ET"
+ DED_PKGS=""
+ DED_BIN="et-ded"
+ DED_OPTS="+set dedicated 1 +exec server.cfg"
DED_CFG_DIR=".etwolf"
+ SELECT_MOD="+set fs_game "
;;
quake3)
GAME_PKGS="games-fps/quake3 games-fps/quake3-bin"
- GAME_TITLE="Quake III"
- DEFAULT_MOD_ICON="quake3"
- SELECT_MOD="+set fs_game "
- GAME_EXE="quake3"
- DED_EXE="quake3-ded"
- DED_OPTIONS="+set dedicated 1 +exec server.cfg"
+ GAME_DIRS=( "${GAMES_DATADIR}"/quake3 "${GAMES_PREFIX_OPT}"/quake3 )
+ GAME_NAME="Quake III"
+ GAME_BIN="quake3"
+ GAME_ICON="quake3"
+ DED_PKGS=""
+ DED_BIN="quake3-ded"
+ DED_OPTS="+set dedicated 1 +exec server.cfg"
DED_CFG_DIR=".q3a"
+ SELECT_MOD="+set fs_game "
;;
quake4)
GAME_PKGS="games-fps/quake4-bin"
- GAME_TITLE="Quake 4"
- DEFAULT_MOD_ICON="/usr/share/pixmaps/quake4.bmp"
- SELECT_MOD="+set fs_game "
- GAME_EXE="quake4"
- DED_EXE="quake4-ded"
- DED_OPTIONS="+set dedicated 1 +exec server.cfg"
+ GAME_DIRS=( "${GAMES_PREFIX_OPT}"/quake4 )
+ GAME_NAME="Quake 4"
+ GAME_BIN="quake4"
+ GAME_ICON="/usr/share/pixmaps/quake4.bmp"
+ DED_PKGS=""
+ DED_BIN="quake4-ded"
+ DED_OPTS="+set dedicated 1 +exec server.cfg"
DED_CFG_DIR=".quake4"
+ SELECT_MOD="+set fs_game "
;;
ut2003)
GAME_PKGS="games-fps/ut2003"
- GAME_TITLE="UT2003"
- DEFAULT_MOD_ICON="ut2003"
- SELECT_MOD="-mod="
- GAME_EXE="ut2003"
- DED_EXE="ucc"
- DED_OPTIONS=""
+ GAME_DIRS=( "${GAMES_PREFIX_OPT}"/ut2003 )
+ GAME_NAME="UT2003"
+ GAME_BIN="ut2003"
+ GAME_ICON="ut2003"
+ DED_PKGS=""
+ DED_BIN="ucc"
+ DED_OPTS=""
DED_CFG_DIR=""
+ SELECT_MOD="-mod="
;;
ut2004)
GAME_PKGS="games-fps/ut2004"
- GAME_TITLE="UT2004"
- DEFAULT_MOD_ICON="ut2004"
- SELECT_MOD="-mod="
- GAME_EXE="ut2004"
- DED_EXE="ut2004-ded"
- DED_OPTIONS=""
+ GAME_DIRS=( "${GAMES_PREFIX_OPT}"/{ut2004,ut2004-ded} )
+ GAME_NAME="UT2004"
+ GAME_BIN="ut2004"
+ GAME_ICON="ut2004"
+ DED_PKGS="games-server/ut2004-ded"
+ DED_BIN="ut2004-ded"
+ DED_OPTS=""
DED_CFG_DIR=""
+ SELECT_MOD="-mod="
;;
*)
eerror "This game is either not supported or you must set the GAME"
eerror "variable to the proper game."
- die "unsupported game"
+ die "games-mods.eclass: unsupported GAME"
;;
esac
+MOD_BIN="${GAME_BIN}-${PN/${GAME}-}"
+MOD_DED_BIN="${MOD_BIN}-ded"
+
games-mods_get_rdepend() {
- [[ $# -lt 1 ]] && die "${FUNCNAME}: need args"
- [[ $# -gt 1 ]] && echo -n "|| ( "
+ local pkgs
+
+ if [[ ${1} == "--ded" ]] ; then
+ pkgs=( ${DED_PKGS} ${GAME_PKGS} )
+ else
+ pkgs=( ${GAME_PKGS} )
+ fi
+
+ [[ ${#pkgs[@]} -gt 1 ]] && echo -n "|| ( "
case ${EAPI:-0} in
- 0|1) echo -n $@ ;;
+ 0|1) echo -n "${pkgs[@]}" ;;
2)
- local pkg
- for pkg in $@ ; do
- if [[ -z ${MOD_DIR} ]] ; then
- echo -n " ${pkg}"
- else
- echo -n " ${pkg}[dedicated=,opengl=]"
- fi
- done
+ local p
+ if [[ ${1} == "--ded" ]] ; then
+ echo -n "${DED_PKGS}"
+ for p in ${GAME_PKGS} ; do
+ echo -n " ${p}[dedicated]"
+ done
+ else
+ for p in ${GAME_PKGS} ; do
+ echo -n " || ( ${p}[opengl] ${p}[-dedicated] )"
+ done
+ fi
;;
esac
- [[ $# -gt 1 ]] && echo -n " )"
+ [[ ${#pkgs[@]} -gt 1 ]] && echo -n " )"
}
-DESCRIPTION="${GAME_TITLE} ${MOD_NAME} - ${MOD_DESC}"
+DESCRIPTION="${GAME_NAME} ${MOD_NAME} - ${MOD_DESC}"
SLOT="0"
+IUSE="dedicated opengl"
RESTRICT="mirror strip"
DEPEND="app-arch/unzip"
-RDEPEND="$(games-mods_get_rdepend ${GAME_PKGS})"
+RDEPEND="dedicated? ( $(games-mods_get_rdepend --ded) )
+ opengl? ( $(games-mods_get_rdepend) )
+ !dedicated? ( !opengl? ( $(games-mods_get_rdepend) ) )"
S=${WORKDIR}
-dir=${GAMES_DATADIR}/${GAME}
+INS_DIR=${GAMES_DATADIR}/${GAME}
games-mods_use_opengl() {
[[ -z ${MOD_DIR} ]] && return 1
@@ -134,135 +161,41 @@ games-mods_use_dedicated() {
use dedicated && return 0 || return 1
}
-games-mods_src_install() {
- local readme MOD_ICON_EXT new_bin_name bin_name
- INS_DIR=${dir}
-
- # If we have a README, install it
- for readme in README* ; do
- if [[ -s "${readme}" ]] ; then
- dodoc "${readme}" || die "dodoc failed"
- fi
- done
-
- if games-mods_use_opengl ; then
- if [[ -n "${MOD_ICON}" ]] ; then
- # Install custom icon
- MOD_ICON_EXT=${MOD_ICON##*.}
- if [[ -f ${MOD_ICON} ]] ; then
- newicon "${MOD_ICON}" ${PN}.${MOD_ICON_EXT}
- else
- newicon ${MOD_DIR}/"${MOD_ICON}" ${PN}.${MOD_ICON_EXT}
- fi
- case ${MOD_ICON_EXT} in
- bmp|ico)
- MOD_ICON=/usr/share/pixmaps/${PN}.${MOD_ICON_EXT}
- ;;
- *)
- MOD_ICON=${PN}
- ;;
- esac
- else
- # Use the game's standard icon
- MOD_ICON=${DEFAULT_MOD_ICON}
- fi
-
- # Set up command-line and desktop menu entries
- if [[ -n ${MOD_DIR} ]] ; then
- games_make_wrapper "${GAME_EXE}-${PN/${GAME}-}" \
- "${GAME_EXE} ${SELECT_MOD}${MOD_DIR}"
- make_desktop_entry "${GAME_EXE}-${PN/${GAME}-}" \
- "${GAME_TITLE} - ${MOD_NAME}" "${MOD_ICON}"
- # Since only quake3 has both a binary and a source-based install,
- # we only look for quake3 here.
- case "${GAME_EXE}" in
- "quake3")
- if has_version games-fps/quake3-bin ; then
- games_make_wrapper "${GAME_EXE}-bin-${PN/${GAME}-}" \
- "${GAME_EXE}-bin ${SELECT_MOD}${MOD_DIR}"
- fi
- make_desktop_entry "${GAME_EXE}-bin-${PN/${GAME}-}" \
- "${GAME_TITLE} - ${MOD_NAME} (binary)" \
- "${MOD_ICON}"
- ;;
- esac
- fi
- fi
-
- # We expect anything not wanted to have been deleted by the ebuild
- insinto "${INS_DIR}"
- doins -r * || die "doins -r failed"
-
+games-mods_dosyms() {
# We are installing everything for these mods into ${INS_DIR},
# ${GAMES_DATADIR}/${GAME} in most cases, and symlinking it
# into ${GAMES_PREFIX_OPT}/${GAME} for each game. This should
# allow us to support both binary and source-based games easily.
- if [[ ${GAMES_PREFIX_OPT} != ${GAMES_DATADIR} ]] ; then
+ local dir
+ for dir in "${GAME_DIRS[@]}" ; do
+ [[ -z ${dir} || ${INS_DIR} == ${dir} ]] && continue
pushd "${D}/${INS_DIR}" > /dev/null || die "pushd failed"
local i
for i in * ; do
if [[ -d ${i} ]] ; then
if [[ ${i} == ${MOD_DIR} ]] ; then
- dosym "${INS_DIR}/${i}" \
- "${GAMES_PREFIX_OPT}/${GAME}/${i}" \
+ dosym "${INS_DIR}/${i}" "${dir}/${i}" \
|| die "dosym ${i} failed"
else
local f
while read f ; do
- dosym "${INS_DIR}/${f}" \
- "${GAMES_PREFIX_OPT}/${GAME}/${f}" \
+ dosym "${INS_DIR}/${f}" "${dir}/${f}" \
|| die "dosym ${f} failed"
done < <(find "${i}" -type f)
fi
elif [[ -f ${i} ]] ; then
- dosym "${INS_DIR}/${i}" "${GAMES_PREFIX_OPT}/${GAME}/${i}" \
+ dosym "${INS_DIR}/${i}" "${dir}/${i}" \
|| die "dosym ${i} failed"
else
die "${i} shouldn't be there"
fi
done
popd > /dev/null || die "popd failed"
- fi
-
- if games-mods_use_dedicated ; then
- if [[ -f ${FILESDIR}/server.cfg ]] ; then
- insinto "${GAMES_SYSCONFDIR}"/${GAME}/${MOD_DIR}
- doins "${FILESDIR}"/server.cfg || die "Copying server config"
- dodir "${GAMES_PREFIX}"/${DED_CFG_DIR}/${MOD_DIR}
- dosym "${GAMES_SYSCONFDIR}"/${GAME}/${MOD_DIR}/server.cfg \
- "${GAMES_PREFIX}"/${DED_CFG_DIR}/${MOD_DIR}/server.cfg
- fi
- games_make_wrapper \
- ${GAME_EXE}-${PN/${GAME}-}-ded \
- "${DED_EXE} ${SELECT_MOD}${MOD_DIR} ${DED_OPTIONS}"
- games-mods_make_initd
- games-mods_make_confd
- fi
-
- prepgamesdirs
-}
-
-games-mods_pkg_postinst() {
- games_pkg_postinst
- if games-mods_use_opengl ; then
- if [[ -n ${MOD_DIR} ]] ; then
- elog "To play this mod run:"
- elog " ${GAME_EXE}-${PN/${GAME}-}"
- echo
- fi
- fi
- if games-mods_use_dedicated ; then
- elog "To launch a dedicated server run:"
- elog " ${GAME_EXE}-${PN/${GAME}-}-ded"
- echo
- elog "To launch server at startup run:"
- elog " rc-update add ${GAME_EXE}-${PN/${GAME}-}-ded default"
- echo
- fi
+ done
}
games-mods_make_initd() {
- cat <<EOF > "${T}"/${GAME_EXE}-${PN/${GAME}-}-ded
+ cat <<EOF > "${T}"/${MOD_DED_BIN}
#!/sbin/runscript
$(head -n 2 ${PORTDIR}/header.txt)
# Generated by games-mods.eclass
@@ -272,30 +205,115 @@ depend() {
}
start() {
- ebegin "Starting ${GAME_TITLE} ${MOD_NAME} dedicated server"
- start-stop-daemon --start --quiet --background --chuid \\
- ${GAMES_USER_DED}:${GAMES_GROUP} --env HOME="${GAMES_PREFIX}" --exec \\
- ${GAMES_BINDIR}/${GAME_EXE}-${PN/${GAME}-}-ded -- \\
- \${${GAME_EXE}_${PN/${GAME}-}_opts}
+ ebegin "Starting ${MOD_DED_BIN}"
+ start-stop-daemon --start --quiet --background --make-pidfile \\
+ --pidfile /var/run/${MOD_DED_BIN}.pid \\
+ --chuid \${${MOD_DED_BIN//-/_}_user}:\${${MOD_DED_BIN//-/_}_group} \\
+ --env HOME="\${${MOD_DED_BIN//-/_}_home}" \\
+ --exec "${GAMES_BINDIR}/${MOD_DED_BIN}" \\
+ -- \${${MOD_DED_BIN//-/_}_opts}
eend \$?
}
stop() {
- ebegin "Stopping ${GAME_TITLE} ${MOD_NAME} dedicated server"
- start-stop-daemon --stop --quiet --exec \\
- ${GAMES_BINDIR}/${GAME_EXE}-${PN/${GAME}-}-ded
+ ebegin "Stopping ${MOD_DED_BIN}"
+ start-stop-daemon --stop \\
+ --pidfile /var/run/${MOD_DED_BIN}.pid
eend \$?
}
EOF
- doinitd "${T}"/${GAME_EXE}-${PN/${GAME}-}-ded || die "doinitd failed"
+ doinitd "${T}"/${MOD_DED_BIN} || die "doinitd failed"
}
games-mods_make_confd() {
- cat <<-EOF > "${T}"/${GAME_EXE}-${PN/${GAME}-}-ded
+ cat <<-EOF > "${T}"/${MOD_DED_BIN}
+ # User and group the server should run as
+ ${MOD_DED_BIN//-/_}_user="${GAMES_USER_DED}"
+ ${MOD_DED_BIN//-/_}_group="${GAMES_GROUP}"
+
+ # Directory to use for HOME
+ ${MOD_DED_BIN//-/_}_home="${GAMES_PREFIX}"
+
# Any extra options you want to pass to the dedicated server
- ${GAME_EXE}_${PN/${GAME}-}_opts=""
+ ${MOD_DED_BIN//-/_}_opts=""
EOF
- doconfd "${T}"/${GAME_EXE}-${PN/${GAME}-}-ded || die "doconfd failed"
+ doconfd "${T}"/${MOD_DED_BIN} || die "doconfd failed"
+}
+
+games-mods_src_install() {
+ if games-mods_use_opengl ; then
+ if [[ -n ${MOD_ICON} ]] ; then
+ # Install custom icon
+ local ext=${MOD_ICON##*.}
+ if [[ -f ${MOD_ICON} ]] ; then
+ newicon "${MOD_ICON}" ${PN}.${ext} || die "newicon failed"
+ else
+ newicon ${MOD_DIR}/"${MOD_ICON}" ${PN}.${ext} \
+ || die "newicon failed"
+ fi
+ case ${ext} in
+ bmp|ico)
+ MOD_ICON=/usr/share/pixmaps/${PN}.${ext}
+ ;;
+ *)
+ MOD_ICON=${PN}
+ ;;
+ esac
+ else
+ # Use the game's standard icon
+ MOD_ICON=${GAME_ICON}
+ fi
+
+ games_make_wrapper ${MOD_BIN} "${GAME_BIN} ${SELECT_MOD}${MOD_DIR}"
+ make_desktop_entry ${MOD_BIN} "${GAME_NAME} - ${MOD_NAME}" "${MOD_ICON}"
+ # Since only quake3 has both a binary and a source-based install,
+ # we only look for quake3 here.
+ case ${GAME} in
+ quake3)
+ if has_version games-fps/quake3-bin ; then
+ games_make_wrapper ${GAME_BIN}-bin-${PN/${GAME}-} \
+ "${GAME_BIN}-bin ${SELECT_MOD}${MOD_DIR}"
+ fi
+ make_desktop_entry ${GAME_BIN}-bin-${PN/${GAME}-} \
+ "${GAME_NAME} - ${MOD_NAME} (binary)" "${MOD_ICON}"
+ ;;
+ esac
+ fi
+
+ # We expect anything not wanted to have been deleted by the ebuild
+ insinto "${INS_DIR}"
+ doins -r * || die "doins -r failed"
+ games-mods_dosyms
+
+ if games-mods_use_dedicated ; then
+ if [[ -f ${FILESDIR}/server.cfg ]] ; then
+ insinto "${GAMES_SYSCONFDIR}"/${GAME}/${MOD_DIR}
+ doins "${FILESDIR}"/server.cfg || die "doins server.cfg failed"
+ dosym "${GAMES_SYSCONFDIR}"/${GAME}/${MOD_DIR}/server.cfg \
+ "${GAMES_PREFIX}"/${DED_CFG_DIR}/${MOD_DIR}/server.cfg \
+ || die "dosym server.cfg failed"
+ fi
+ games_make_wrapper ${MOD_DED_BIN} \
+ "\"${GAMES_BINDIR}/${DED_BIN}\" ${SELECT_MOD}${MOD_DIR} ${DED_OPTS}"
+ games-mods_make_initd
+ games-mods_make_confd
+ fi
+
+ prepgamesdirs
+}
+
+games-mods_pkg_postinst() {
+ games_pkg_postinst
+ if games-mods_use_opengl ; then
+ elog "To play this mod run:"
+ elog " ${MOD_BIN}"
+ fi
+ if games-mods_use_dedicated ; then
+ elog "To launch a dedicated server run:"
+ elog " ${MOD_DED_BIN}"
+ elog "To launch the server at startup run:"
+ elog " rc-update add ${MOD_DED_BIN} default"
+ fi
}