summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorChris Gianelloni <wolf31o2@gentoo.org>2008-03-13 20:13:27 +0000
committerChris Gianelloni <wolf31o2@gentoo.org>2008-03-13 20:13:27 +0000
commit9af53ae73a7c59bb5966b4e3badf9e75777c64cb (patch)
tree6c45fd646020251c0ffcb7a4965800e569371804 /eclass
parentInitial import of etqw-bin and etqw-data from my personal developer overlay. (diff)
downloadgames-9af53ae73a7c59bb5966b4e3badf9e75777c64cb.tar.gz
games-9af53ae73a7c59bb5966b4e3badf9e75777c64cb.tar.bz2
games-9af53ae73a7c59bb5966b4e3badf9e75777c64cb.zip
Added games-roguelike/nethack ebuild which uses GAMES_SCORES_FILES for testing for bug #125902 and added a new games.eclass which uses GAMES_SCORES_FILES.
svn path=/; revision=2
Diffstat (limited to 'eclass')
-rw-r--r--eclass/games.eclass255
1 files changed, 255 insertions, 0 deletions
diff --git a/eclass/games.eclass b/eclass/games.eclass
new file mode 100644
index 0000000..a537042
--- /dev/null
+++ b/eclass/games.eclass
@@ -0,0 +1,255 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/eclass/games.eclass,v 1.124 2008/02/15 00:15:51 nyhm Exp $
+
+# devlist: {vapier,wolf31o2,mr_bones_}@gentoo.org -> games@gentoo.org
+#
+# This is the games eclass for standardizing the install of games ...
+# you better have a *good* reason why you're *not* using games.eclass
+# in a games-* ebuild
+
+inherit multilib eutils
+
+EXPORT_FUNCTIONS pkg_preinst pkg_postinst src_compile pkg_setup
+
+[[ -z ${GAME} ]] && GAME=${PN%%-*}
+
+DESCRIPTION="Based on the ${ECLASS} eclass"
+
+export GAMES_PREFIX=${GAMES_PREFIX:-/usr/games}
+export GAMES_PREFIX_OPT=${GAMES_PREFIX_OPT:-/opt}
+export GAMES_DATADIR=${GAMES_DATADIR:-/usr/share/games}
+export GAMES_DATADIR_BASE=${GAMES_DATADIR_BASE:-/usr/share} # some packages auto append 'games'
+export GAMES_SYSCONFDIR=${GAMES_SYSCONFDIR:-/etc/games}
+export GAMES_STATEDIR=${GAMES_STATEDIR:-/var/games}
+export GAMES_LOGDIR=${GAMES_LOGDIR:-/var/log/games}
+export GAMES_BINDIR=${GAMES_BINDIR:-${GAMES_PREFIX}/bin}
+export GAMES_ENVD="90games"
+# if you want to use a different user/group than games.games,
+# just add these two variables to your environment (aka /etc/profile)
+export GAMES_USER=${GAMES_USER:-root}
+export GAMES_USER_DED=${GAMES_USER_DED:-games}
+export GAMES_GROUP=${GAMES_GROUP:-games}
+export GAMES_SCORES_GROUP=${GAMES_GROUP:-scores}
+
+games_get_libdir() {
+ echo ${GAMES_LIBDIR:-${GAMES_PREFIX}/$(get_libdir)}
+}
+
+egamesconf() {
+ econf \
+ --prefix="${GAMES_PREFIX}" \
+ --libdir="$(games_get_libdir)" \
+ --datadir="${GAMES_DATADIR}" \
+ --sysconfdir="${GAMES_SYSCONFDIR}" \
+ --localstatedir="${GAMES_STATEDIR}" \
+ "$@" \
+ || die "egamesconf failed"
+}
+
+egamesinstall() {
+ ewarn "Don't use egamesinstall, use emake DESTDIR=\"\${D}\" install instead"
+ epause 30
+ make \
+ prefix="${D}${GAMES_PREFIX}" \
+ mandir="${D}/usr/share/man" \
+ infodir="${D}/usr/share/info" \
+ datadir="${D}${GAMES_DATADIR}" \
+ sysconfdir="${D}${GAMES_SYSCONFDIR}" \
+ localstatedir="${D}${GAMES_STATEDIR}" \
+ "$@" install || die "egamesinstall failed"
+}
+
+gameswrapper() {
+ # dont want to pollute calling env
+ (
+ into "${GAMES_PREFIX}"
+ cmd=$1
+ shift
+ ${cmd} "$@"
+ )
+}
+
+dogamesbin() { gameswrapper ${FUNCNAME/games} "$@"; }
+dogamessbin() { gameswrapper ${FUNCNAME/games} "$@"; }
+dogameslib() { gameswrapper ${FUNCNAME/games} "$@"; }
+dogameslib.a() { gameswrapper ${FUNCNAME/games} "$@"; }
+dogameslib.so() { gameswrapper ${FUNCNAME/games} "$@"; }
+newgamesbin() { gameswrapper ${FUNCNAME/games} "$@"; }
+newgamessbin() { gameswrapper ${FUNCNAME/games} "$@"; }
+
+games_make_wrapper() { gameswrapper ${FUNCNAME/games_} "$@"; }
+
+gamesowners() { chown ${GAMES_USER}:${GAMES_GROUP} "$@"; }
+gamesperms() { chmod u+rw,g+r-w,o-rwx "$@"; }
+prepgamesdirs() {
+ local dir f perms=750
+ for dir in \
+ "${GAMES_PREFIX}" "${GAMES_PREFIX_OPT}" "${GAMES_DATADIR}" \
+ "${GAMES_SYSCONFDIR}" "${GAMES_STATEDIR}" "$(games_get_libdir)" \
+ "${GAMES_BINDIR}" "$@"
+ do
+ [[ ! -d ${D}/${dir} ]] && continue
+ (
+ gamesowners -R "${D}/${dir}"
+ find "${D}/${dir}" -type d -print0 | xargs -0 chmod ${perms}
+ find "${D}/${dir}" -type f -print0 | xargs -0 chmod o-rwx,g+r
+ ) &>/dev/null
+ f=$(find "${D}/${dir}" -perm +4000 -a -uid 0 2>/dev/null)
+ if [[ -n ${f} ]] ; then
+ eerror "A game was detected that is setuid root!"
+ eerror "${f}"
+ die "refusing to merge a setuid root game"
+ fi
+ done
+ [[ -d ${D}/${GAMES_BINDIR} ]] || return 0
+ if [[ -n ${GAMES_SCORES_FILES} ]]
+ then
+ perms=4750
+ for dir in "${GAMES_STATEDIR}" "${GAMES_BINDIR}"
+ do
+ GAMES_GROUP=${GAMES_SCORES_GROUP} gamesowners -R "${D}/${dir}"
+ done
+ fi
+ find "${D}/${GAMES_BINDIR}" -maxdepth 1 -type f -exec chmod ${perms} '{}' \;
+}
+
+gamesenv() {
+ # As much as I hate doing this, we need to be a bit more flexibility with
+ # our library directories.
+ local hasit=0 GAMES_LIBDIRS="" GAMES_LIBDIR=$(games_get_libdir)
+ if has_multilib_profile ; then
+ for libdir in $(get_all_libdirs) ; do
+ if [[ ${GAMES_LIBDIR} != ${GAMES_PREFIX}/${libdir} ]] ; then
+ GAMES_LIBDIRS="${GAMES_LIBDIRS}:${GAMES_PREFIX}/${libdir}"
+ else
+ hasit=1
+ fi
+ done
+ fi
+ [[ ${hasit} == "1" ]] \
+ && GAMES_LIBDIRS=${GAMES_LIBDIRS:1} \
+ || GAMES_LIBDIRS="${GAMES_LIBDIR}:${GAMES_LIBDIRS}"
+ # Wish we could use doevnd here, but we dont want the env
+ # file to be tracked in the CONTENTS of every game
+ cat <<-EOF > "${ROOT}"/etc/env.d/${GAMES_ENVD}
+ LDPATH="${GAMES_LIBDIRS}"
+ PATH="${GAMES_BINDIR}"
+ EOF
+}
+
+games_pkg_setup() {
+ [[ ${GAMES_CHECK_LICENSE} == "yes" ]] && check_license ${LICENSE}
+
+ # Make sure SDL was built in a certain way
+ if [[ -n ${GAMES_USE_SDL} ]] ; then
+ if built_with_use -o media-libs/libsdl ${GAMES_USE_SDL} ; then
+ eerror "You built libsdl with wrong USE flags."
+ eerror "Make sure you rebuild it like this:"
+ eerror "USE='-${GAMES_USE_SDL// / -}'"
+ die "your libsdl sucks"
+ fi
+ fi
+
+ enewgroup "${GAMES_GROUP}" 35
+ [[ ${GAMES_USER} != "root" ]] \
+ && enewuser "${GAMES_USER}" 35 -1 "${GAMES_PREFIX}" "${GAMES_GROUP}"
+ [[ ${GAMES_USER_DED} != "root" ]] \
+ && enewuser "${GAMES_USER_DED}" 36 /bin/bash "${GAMES_PREFIX}" "${GAMES_GROUP}"
+ [[ -n ${GAMES_SCORES_FILES} ]] && enewgroup "${GAMES_SCORES_GROUP}"
+
+ # Dear portage team, we are so sorry. Lots of love, games team.
+ # See Bug #61680
+ [[ ${USERLAND} != "GNU" ]] && return 0
+ [[ $(getent passwd "${GAMES_USER_DED}" | cut -f7 -d:) == "/bin/false" ]] \
+ && usermod -s /bin/bash "${GAMES_USER_DED}"
+}
+
+games_src_compile() {
+ [[ -x ./configure ]] && { egamesconf || die "egamesconf failed"; }
+ [ -e [Mm]akefile ] && { emake || die "emake failed"; }
+}
+
+games_pkg_preinst() {
+ local f
+
+ for f in $(find "${D}/${GAMES_STATEDIR}" -type f -printf '%P ' 2>/dev/null) ; do
+ if [[ -e ${ROOT}/${GAMES_STATEDIR}/${f} ]] ; then
+ cp -p \
+ "${ROOT}/${GAMES_STATEDIR}/${f}" \
+ "${D}/${GAMES_STATEDIR}/${f}" \
+ || die "cp failed"
+ # make the date match the rest of the install
+ touch "${D}/${GAMES_STATEDIR}/${f}"
+ fi
+ done
+}
+
+# pkg_postinst function ... create env.d entry and warn about games group
+games_pkg_postinst() {
+ gamesenv
+ if [[ -z "${GAMES_SHOW_WARNING}" ]] ; then
+ ewarn "Remember, in order to play games, you have to"
+ ewarn "be in the '${GAMES_GROUP}' group."
+ echo
+ case ${CHOST} in
+ *-darwin*) ewarn "Just run 'niutil -appendprop / /groups/games users <USER>'";;
+ *-freebsd*|*-dragonfly*) ewarn "Just run 'pw groupmod ${GAMES_GROUP} -m <USER>'";;
+ *) ewarn "Just run 'gpasswd -a <USER> ${GAMES_GROUP}', then have <USER> re-login.";;
+ esac
+ echo
+ einfo "For more info about Gentoo gaming in general, see our website:"
+ einfo " http://games.gentoo.org/"
+ echo
+ fi
+}
+
+# Unpack .uz2 files for UT2003/UT2004
+# $1: directory or file to unpack
+games_ut_unpack() {
+ local ut_unpack="$1"
+ local f=
+
+ if [[ -z ${ut_unpack} ]] ; then
+ die "You must provide an argument to games_ut_unpack"
+ fi
+ if [[ -f ${ut_unpack} ]] ; then
+ uz2unpack "${ut_unpack}" "${ut_unpack/.uz2/}" &>/dev/null \
+ || die "uncompressing file ${ut_unpack}"
+ fi
+ if [[ -d ${ut_unpack} ]] ; then
+ for f in $(find "${ut_unpack}" -name '*.uz2' -printf '%f ') ; do
+ uz2unpack "${ut_unpack}/${f}" "${ut_unpack}/${f/.uz2}" &>/dev/null \
+ || die "uncompressing file ${f}"
+ rm -f "${ut_unpack}/${f}" || die "deleting compressed file ${f}"
+ done
+ fi
+}
+
+# Unpacks .umod/.ut2mod/.ut4mod files for UT/UT2003/UT2004
+# Usage: games_umod_unpack $1
+# oh, and don't forget to set 'dir' and 'Ddir'
+games_umod_unpack() {
+ local umod=$1
+ mkdir -p "${Ddir}"/System
+ cp "${dir}"/System/{ucc-bin,{Manifest,Def{ault,User}}.ini,{Engine,Core,zlib,ogg,vorbis}.so,{Engine,Core}.int} "${Ddir}"/System
+ cd "${Ddir}"/System
+ UT_DATA_PATH=${Ddir}/System ./ucc-bin umodunpack -x "${S}/${umod}" -nohomedir &> /dev/null \
+ || die "uncompressing file ${umod}"
+ rm -f "${Ddir}"/System/{ucc-bin,{Manifest,Def{ault,User},User,UT200{3,4}}.ini,{Engine,Core,zlib,ogg,vorbis}.so,{Engine,Core}.int,ucc.log} &>/dev/null \
+ || die "Removing temporary files"
+}
+
+# Link mods created by games-mods.eclass into the GAMES_PREFIX_OPT directories
+# so they can be found by binary versions of the games.
+games_link_mods() {
+ if [[ -e ${GAMES_DATADIR}/${GAME} ]] ; then
+ cd "${GAMES_DATADIR}/${GAME}"
+ for mod in $(find . -type d -printf '%P ') ; do
+ if [[ ! -e ${Ddir}/${mod} ]] ; then
+ elog "Creating symlink for ${mod}"
+ dosym "${GAMES_DATADIR}"/${GAME}/${mod} "${dir}"/${mod} || die
+ fi
+ done
+ fi
+}