| # 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.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-" |
| # MOD_DESC - Description for the mod |
| # MOD_NAME - Creates a command-line wrapper and desktop icon for the mod |
| # MOD_DIR - Subdirectory name for the mod, if applicable |
| # MOD_ICON - Custom icon for the mod, instead of the default |
| |
| inherit eutils games |
| |
| EXPORT_FUNCTIONS src_install pkg_postinst |
| |
| [[ -z ${GAME} ]] && GAME=${PN%%-*} |
| |
| case ${GAME} in |
| doom3) |
| GAME_PKGS="games-fps/doom3" |
| 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_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_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_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_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_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 "games-mods.eclass: unsupported GAME" |
| ;; |
| esac |
| |
| MOD_BIN="${GAME_BIN}-${PN/${GAME}-}" |
| MOD_DED_BIN="${MOD_BIN}-ded" |
| |
| games-mods_get_rdepend() { |
| 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 "${pkgs[@]}" ;; |
| 2) |
| 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 |
| |
| [[ ${#pkgs[@]} -gt 1 ]] && echo -n " )" |
| } |
| |
| DESCRIPTION="${GAME_NAME} ${MOD_NAME} - ${MOD_DESC}" |
| |
| SLOT="0" |
| IUSE="dedicated opengl" |
| RESTRICT="mirror strip" |
| |
| DEPEND="app-arch/unzip" |
| RDEPEND="dedicated? ( $(games-mods_get_rdepend --ded) ) |
| opengl? ( $(games-mods_get_rdepend) ) |
| !dedicated? ( !opengl? ( $(games-mods_get_rdepend) ) )" |
| |
| S=${WORKDIR} |
| |
| INS_DIR=${GAMES_DATADIR}/${GAME} |
| |
| games-mods_use_opengl() { |
| [[ -z ${MOD_DIR} ]] && return 1 |
| |
| if use opengl || ! use dedicated ; then |
| # Use opengl by default |
| return 0 |
| fi |
| |
| return 1 |
| } |
| |
| games-mods_use_dedicated() { |
| [[ -z ${MOD_DIR} ]] && return 1 |
| |
| use dedicated && return 0 || return 1 |
| } |
| |
| 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. |
| 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}" "${dir}/${i}" \ |
| || die "dosym ${i} failed" |
| else |
| local f |
| while read f ; do |
| dosym "${INS_DIR}/${f}" "${dir}/${f}" \ |
| || die "dosym ${f} failed" |
| done < <(find "${i}" -type f) |
| fi |
| elif [[ -f ${i} ]] ; then |
| 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" |
| done |
| } |
| |
| games-mods_make_initd() { |
| cat <<EOF > "${T}"/${MOD_DED_BIN} |
| #!/sbin/runscript |
| $(head -n 2 ${PORTDIR}/header.txt) |
| # Generated by games-mods.eclass |
| |
| depend() { |
| need net |
| } |
| |
| start() { |
| 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 ${MOD_DED_BIN}" |
| start-stop-daemon --stop \\ |
| --pidfile /var/run/${MOD_DED_BIN}.pid |
| eend \$? |
| } |
| EOF |
| |
| doinitd "${T}"/${MOD_DED_BIN} || die "doinitd failed" |
| } |
| |
| games-mods_make_confd() { |
| 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 |
| ${MOD_DED_BIN//-/_}_opts="" |
| EOF |
| |
| 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 |
| } |