since everyone is getting into the reviewing mood, i thought it
would be a good time to get some opinions on the wxwidgets 
eclass rewrite i've done.

it's pretty simple and i hope the docs make it self-explanatory.
a couple things:

- is the stuff in global scope kosher?  i've seen other eclasses do
similar, but i want to be sure.  the reason for the looping is because
i figure calling built_with_use in global would get me hung.

- wxGTK-2.8 will drop the unicode USE flag since it only builds the unicode
libraries now (ie. no more ansi).  thus the reason the `check_wxuse unicode`
calls are conditional on WX_GTK_VER=2.6.

- the lack of pink ponies troubles me.  but how much is too much?

-- 
                  fonts / wxWindows / gcc-porting / treecleaners
  9B81 6C9F E791 83BB 3AB3  5B2D E625 A073 8379 37E8 (0x837937E8)
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

#
#       NOTE - WORK IN PROGRESS

# @ECLASS:                      wxwidgets.eclass
# @MAINTAINER:
#  [EMAIL PROTECTED]
#  [EMAIL PROTECTED]
# @BLURB:                       Manages build configuration for wxGTK-using 
packages.
# @DESCRIPTION:
#  The wxGTK libraries come in several different possible configurations
#  (release/debug, ansi/unicode, etc.), most of which can be installed
#  side-by-side.  The purpose of this eclass is to give ebuilds the ability to
#  specify what particular flavour they require to build against without
#  interfering with the user-set system configuration.
#
#  Ebuilds that use wxGTK must inherit this eclass.  Otherwise the system
#  default will be used, which would be anything the user set it to.
#
#  Ebuilds are also required set the global variable WX_GTK_VER, containing the
#  wxGTK SLOT the ebuild requires.
#
#
#  Simple Usage:
#
#   inherit wxwidgets
#   DEPEND="=x11-libs/wxGTK-2.6*"
#   WX_GTK_VER="2.6"
#
#  That's it.  The eclass will select a sane default configuration to use.  In
#  wxGTK-2.6 the default is ansi.  In wxGTK-2.8 and later it's unicode.  These
#  are the defaults because they are always guaranteed to exist.  (Note: we lock
#  the DEPEND to the needed SLOT to prevent another SLOT from fulfilling the
#  dependency.)
#
#  You'll often find yourself in need of a bit more control.  For that see the
#  need-wxwidgets function below.

inherit eutils flag-o-matic multilib

# We do this globally so ebuilds can get sane defaults just by inheriting.  They
# can be overridden with need-wxwidgets later if need be.

if [[ -n ${WX_GTK_VER} ]]; then
        if [[ ${WX_GTK_VER} == 2.6 ]]; then
                wxchar="ansi"
        elif [[ ${WX_GTK_VER} == 2.8 ]]; then
                wxchar="unicode"
        else
                :
        fi

        for wxtoolkit in gtk2 base; do
                debug-print "global outer loop - wxtoolkit is ${wxtoolkit}"
                for wxdebug in release debug; do
                        debug-print "global inner loop - wxdebug is ${wxdebug}"
                        wxconf="${wxtoolkit}-${wxchar}-${wxdebug}-${WX_GTK_VER}"
                        debug-print "testing for config ${wxconf}"
                        [[ -f /usr/$(get_libdir)/wx/config/${wxconf} ]] || 
continue
                        debug-print "found config ${wxconf} - setting WX_CONFIG"
                        WX_CONFIG="/usr/$(get_libdir)/wx/config/${wxconf}"
                        # TODO: needed for the wx-config wrapper
                        #WX_ECLASS_CONFIG="${WX_CONFIG}"
                        break
                done
                [[ -n ${WX_CONFIG} ]] && break
        done
        [[ -n ${WX_CONFIG} ]] && export WX_CONFIG #WX_ECLASS_CONFIG
else
        :
fi


# @FUNCTION:            need-wxwidgets
# @USAGE:                       <configuration>
# @DESCRIPTION:
#  need-wxwidgets is called with one argument, the wxGTK configuration to use.
#
#  Available configurations are:
#
#               ansi
#               unicode
#               base-ansi
#               base-unicode
#
#  Note that in >=wxGTK-2.8, only the unicode versions are available.  The
#  eclass will automatically map ansi to unicode if WX_GTK_VER is set to 2.8 or
#  later.
#
#  There are two other configurations, gtk2 and base, which correspond with ansi
#  and base-ansi.  They are around for historical reasons and shouldn't be used
#  by new ebuilds.
#
#  This function will set the variable WX_CONFIG to the path of the wx-config
#  script to use.  In most cases you shouldn't have to use it since the
#  /usr/bin/wx-config wrapper points to ${WX_CONFIG} when called from portage.

need-wxwidgets() {
        debug-print-function $FUNCNAME $*

        local wxtoolkit wxchar wxdebug wxconf
        append-flags -fno-strict-aliasing

        [[ -n ${WX_GTK_VER} ]] \
                || _wxerror "WX_GTK_VER must be set before calling"

        if [[ ${WX_GTK_VER} != 2.6 \
           && ${WX_GTK_VER} != 2.8 ]]; then
                _wxerror "Invalid WX_GTK_VER: ${WX_GTK_VER} - must be set to a 
valid SLOT"
        fi

        debug-print "WX_GTK_VER is ${WX_GTK_VER}"

        case $1 in
                ansi)
                        debug-print-section ansi
                        if [[ ${WX_GTK_VER} == 2.6 ]]; then
                                wxchar="ansi"
                        else
                                wxchar="unicode"
                        fi
                        check_wxuse X
                        ;;
                unicode)
                        debug-print-section unicode
                        check_wxuse X
                        [[ ${WX_GTK_VER} == 2.6 ]] && check_wxuse unicode
                        wxchar="unicode"
                        ;;
                base-ansi)
                        debug-print-section base-ansi
                        if [[ ${WX_GTK_VER} == 2.6 ]]; then
                                wxchar="ansi"
                        else
                                wxchar="unicode"
                        fi
                        ;;
                base-unicode)
                        debug-print-section base-unicode
                        [[ ${WX_GTK_VER} == 2.6 ]] && check_wxuse unicode
                        wxchar="unicode"
                        ;;
                # backwards compatibility
                gtk2)
                        debug-print-section gtk2
                        if [[ ${WX_GTK_VER} == 2.6 ]]; then
                                wxchar="ansi"
                        else
                                wxchar="unicode"
                        fi
                        check_wxuse X
                        ;;
                base)
                        debug-print-section base
                        if [[ ${WX_GTK_VER} == 2.6 ]]; then
                                wxchar="ansi"
                        else
                                wxchar="unicode"
                        fi
                        ;;
                *)
                        _wxerror "called with invalid argument: $1"
                        ;;
        esac

        debug-print "wxchar is ${wxchar}"

        # since we're no longer in global scope we call built_with_use instead 
of
        # all the crazy looping

        # base can be provided by both gtk2 and base installations
        if $(built_with_use =x11-libs/wxGTK-${WX_GTK_VER}* X); then
                wxtoolkit="gtk2"
        else
                wxtoolkit="base"
        fi

        debug-print "wxtoolkit is ${wxtoolkit}"

        # debug or release?
        if $(built_with_use =x11-libs/wxGTK-${WX_GTK_VER}* debug); then
                wxdebug="debug"
        else
                wxdebug="release"
        fi

        debug-print "wxdebug is ${wxdebug}"

        # put it all together
        wxconf="${wxtoolkit}-${wxchar}-${wxdebug}-${WX_GTK_VER}"

        debug-print "wxconf is ${wxconf}"

        # if this doesn't work, something is seriously screwed
        if [[ ! -f /usr/$(get_libdir)/wx/config/${wxconf} ]]; then
                _wxerror "Failed to find configuration ${wxconf}"
        fi

        debug-print "Found config ${wxconf} - setting WX_CONFIG"

        # This is exported as some configure scripts will check for its 
presence in
        # the environment.
        export WX_CONFIG="/usr/$(get_libdir)/wx/config/${wxconf}"
        # Some more for good measure (seen in the wild)
        export WXCONFIG="${WX_CONFIG}"
        export WX_CONFIG_NAME="${wxconf}"

        debug-print "WX_CONFIG is ${WX_CONFIG}"

        # TODO: Used by the wx-config wrapper
        #export WX_ECLASS_CONFIG="${WX_CONFIG}"

        echo
        ewarn "Requested:        ${1} ${WX_GTK_VER}"
        ewarn "Using:            ${wxconf}"
        echo
}


# @FUNCTION:            check_wxuse
# @USAGE:                       <USE flag>
# @DESCRIPTION:
#  Provides a consistant way to check if wxGTK was built with a particular USE
#  flag enabled.

check_wxuse() {
        debug-print-function $FUNCNAME $*

        [[ -n ${WX_GTK_VER} ]] \
                || _wxerror "WX_GTK_VER must be set before calling"


        ebegin "Checking wxGTK-${WX_GTK_VER} for ${1} support"
        if $(built_with_use =x11-libs/wxGTK-${WX_GTK_VER}* ${1}); then
                eend 0
        else
                eend 1
                echo
                eerror "${FUNCNAME} - You have requested functionality that 
requires ${1} support to"
                eerror "have been built into x11-libs/wxGTK."
                eerror
                eerror "Please re-merge =x11-libs/wxGTK-${WX_GTK_VER}* with the 
${1} USE flag enabled."
                die "Missing USE flags."
        fi
}


# internal error function
# TODO - make pretties
_wxerror() {
        echo
        eerror "${1}"
        echo
        die "${1}"
}

Reply via email to