diff options
author | Chris Gianelloni <wolf31o2@gentoo.org> | 2008-03-13 20:13:27 +0000 |
---|---|---|
committer | Chris Gianelloni <wolf31o2@gentoo.org> | 2008-03-13 20:13:27 +0000 |
commit | 9af53ae73a7c59bb5966b4e3badf9e75777c64cb (patch) | |
tree | 6c45fd646020251c0ffcb7a4965800e569371804 /eclass | |
parent | Initial import of etqw-bin and etqw-data from my personal developer overlay. (diff) | |
download | games-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.eclass | 255 |
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 +} |