On Sunday 29 November 2009 13:46:59 Dominik Kapusta wrote:
> Hello guys!
> 
> We, the Qt team, would like to include a new eclass in the tree.
> 
> The qt4-r2 eclass is meant to help with ebuilds for Qt-based (qmake-based,
>  to be precise) applications.
> 
> The eclass is attached, and here's a short comparison between qt4-r2 and
>  qt4 (currently in tree) eclasses:
> 
> Removed in qt4-r2:
> * obsolete QT4_BUILD_WITH_USE_CHECK and
> QT4_OPTIONAL_BUILD_WITH_USE_CHECK hacks.
> 
> Improved in qt4-r2:
> * eqmake4 function now behaves similarly to qmake itself, i.e.:
>       - doesn't assume ${PN}.pro, but searches for the project file if not
>       specified, just like qmake does
>       - in some cases is able to figure out the correct project file if there
>       are several of them in one directory (rare case, but technically
>       possible)
> 
> New in qt4-r2:
> * automatic generation of "linguas_*" IUSE, based on LANGS and LANGSLONG
> variables,
> * automatic installation of documentation, based on DOCS and DOCSDIR
> variables,
> * exported src_configure(), src_compile() and src_install() functions
> 
> The qt4-r2 eclass requires EAPI-2.
> 
> We have been developing, testing and constantly improving qt4-r2 in
>  qting-edge overlay for around a year already. It's working for us and we
>  find it very handy compared to the old qt4.eclass.
> 
> After pushing qt4-r2 to the tree, we're going to port Qt 4 apps' ebuilds to
> qt4-r2 and deprecate qt4.eclass.
> 
> 
> Thanks,
> Dominik
> 

Hey,

I'm attaching:
* the eclass updated according to suggestion from scarabeus,
* the diff between the first revision and the current one.

Changes include:
* moving EAPI check to the global scope,
* moving documentation around,
* passing parameters to inner functions (inherited from base.eclass).

Please review this one, if there are no objections we'd like to introduce it 
to the tree in about two weeks time starting from now.

Thanks a lot,
Dominik
--- qt4-r2.eclass.orig	2009-12-01 23:26:20.000000000 +0200
+++ qt4-r2.eclass	2009-12-03 20:36:47.000000000 +0200
@@ -8,39 +8,46 @@
 # Markos Chandras <hwoar...@gentoo.org>,
 # Davide Pesavento <davidep...@gmail.com>,
 # Dominik Kapusta <a...@gentoo.org>
-# @BLURB: Experimental eclass for Qt4 packages
+# @BLURB: Eclass for Qt4 packages, second edition
 # @DESCRIPTION:
 # This eclass contains various functions that may be useful when
 # dealing with packages using Qt4 libraries. Requires EAPI=2.
 
+case ${EAPI} in
+	2) : ;;
+	*) DEPEND="EAPI-INCOMPATIBLE" ;;
+esac
+
 inherit base eutils multilib toolchain-funcs
 
 export XDG_CONFIG_HOME="${T}"
 
-for x in ${LANGSLONG}; do
-	IUSE="${IUSE} linguas_${x%_*}"
-done
-
+# @ECLASS-VARIABLE: LANGS
+# @DESCRIPTION:
+# In case your Qt4 application provides various translations, use this variable
+# to specify them in order to populate "linguas_*" IUSE automatically. Make sure
+# that you set this variable BEFORE inheriting qt4-r2 eclass.
+# example: LANGS="en el de"
 for x in ${LANGS}; do
 	IUSE="${IUSE} linguas_${x}"
 done
 
-qt4-r2_pkg_setup() {
-	case ${EAPI} in
-		2) ;;
-		*)
-			eerror
-			eerror "The ${ECLASS} eclass requires EAPI=2, but this ebuild does not"
-			eerror "have EAPI=2 set. The ebuild author or editor failed. This ebuild needs"
-			eerror "to be fixed. Using ${ECLASS} eclass without EAPI=2 will fail."
-			eerror
-			die "${ECLASS} eclass requires EAPI=2"
-			;;
-	esac
-}
+# @ECLASS-VARIABLE: LANGSLONG
+# @DESCRIPTION:
+# Same as above, but this variable is for LINGUAS that must be in long format.
+# Remember to set this variable BEFORE inheriting qt4-r2 eclass.
+# Look at ${PORTDIR}/profiles/desc/linguas.desc for details.
+for x in ${LANGSLONG}; do
+	IUSE="${IUSE} linguas_${x%_*}"
+done
 
+# @FUNCTION: qt4-r2_src_unpack
+# @DESCRIPTION:
+# Default src_unpack function for packages that depend on qt4. If you have to
+# override src_unpack in your ebuild (probably you don't need to), call
+# qt4-r2_src_unpack in it.
 qt4-r2_src_unpack() {
-	base_src_unpack
+	debug-print-function $FUNCNAME "$@"
 
 	# Fallback to ${WORKDIR}/${MY_P} when ${WORKDIR}/${P} doesn't exist.
 	# Feel free to re-implement this
@@ -48,6 +55,8 @@
 		ewarn "Falling back to '${WORKDIR}/${MY_P}'"
 		S="${WORKDIR}/${MY_P}"
 	fi
+	
+	base_src_unpack "$@"
 }
 
 # @ECLASS-VARIABLE: PATCHES
@@ -58,29 +67,6 @@
 # PATCHES=( "${FILESDIR}"/mypatch.patch
 # 	"${FILESDIR}"/mypatch2.patch )
 #
-# @ECLASS-VARIABLE: LANGS
-# @DESCRIPTION:
-# In case your Qt4 application provides various translations, use this variable
-# to specify them in order to populate "linguas_*" IUSE automatically. Make sure
-# that you set this variable BEFORE inheriting qt4-r2 eclass.
-# example: LANGS="en el de"
-#
-# @ECLASS-VARIABLE: LANGSLONG
-# @DESCRIPTION:
-# Same as above, but this variable is for LINGUAS that must be in long format.
-# Remember to set this variable BEFORE inheriting qt4-r2 eclass.
-# Look at ${PORTDIR}/profiles/desc/linguas.desc for details.
-#
-# @ECLASS-VARIABLE: DOCS
-# @DESCRIPTION:
-# Use this variable if you want to install any documentation.
-# example: DOCS="README AUTHORS"
-#
-# @ECLASS-VARIABLE: DOCSDIR
-# @DESCRIPTION:
-# Directory containing documentation. If not specified, ${S} will be used
-# instead.
-#
 # @FUNCTION: qt4-r2_src_prepare
 # @DESCRIPTION:
 # Default src_prepare function for packages that depend on qt4. If you have to
@@ -89,7 +75,7 @@
 qt4-r2_src_prepare() {
 	debug-print-function $FUNCNAME "$@"
 
-	base_src_prepare
+	base_src_prepare "$@"
 }
 
 # @FUNCTION: qt4-r2_src_configure
@@ -104,21 +90,31 @@
 	if [[ -n ${project_file} ]]; then
 		eqmake4 ${project_file}
 	else
-		base_src_configure
+		base_src_configure "$@"
 	fi
 }
 
 # @FUNCTION: qt4-r2_src_compile
 # @DESCRIPTION:
-# Default src_compile function for packages that depends on qt4. If you have to
+# Default src_compile function for packages that depend on qt4. If you have to
 # override src_compile in your ebuild (probably you don't need to), call
 # qt4-r2_src_compile in it.
 qt4-r2_src_compile() {
 	debug-print-function $FUNCNAME "$@"
 
-	emake || die "emake failed"
+	base_src_compile "$@"
 }
 
+# @ECLASS-VARIABLE: DOCS
+# @DESCRIPTION:
+# Use this variable if you want to install any documentation.
+# example: DOCS="README AUTHORS"
+#
+# @ECLASS-VARIABLE: DOCSDIR
+# @DESCRIPTION:
+# Directory containing documentation. If not specified, ${S} will be used
+# instead.
+#
 # @FUNCTION: qt4-r2_src_install
 # @DESCRIPTION:
 # Default src_install function for qt4-based packages. Installs compiled code,
@@ -127,7 +123,7 @@
 qt4-r2_src_install() {
 	debug-print-function $FUNCNAME "$@"
 
-	emake INSTALL_ROOT="${D}" install || die "emake install failed"
+	emake INSTALL_ROOT="${D}" DESTDIR="${D}" install || die "emake install failed"
 
 	# install documentation
 	if [[ -n "${DOCS}" ]]; then
@@ -275,4 +271,4 @@
 	return 0
 }
 
-EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_install
+EXPORT_FUNCTIONS src_unpack src_prepare src_configure src_compile src_install
# Copyright 2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

# @ECLASS: qt4-r2.eclass
# @MAINTAINER:
# Ben de Groot <yng...@gentoo.org>,
# Markos Chandras <hwoar...@gentoo.org>,
# Davide Pesavento <davidep...@gmail.com>,
# Dominik Kapusta <a...@gentoo.org>
# @BLURB: Eclass for Qt4 packages, second edition
# @DESCRIPTION:
# This eclass contains various functions that may be useful when
# dealing with packages using Qt4 libraries. Requires EAPI=2.

case ${EAPI} in
        2) : ;;
        *) DEPEND="EAPI-INCOMPATIBLE" ;;
esac

inherit base eutils multilib toolchain-funcs

export XDG_CONFIG_HOME="${T}"

# @ECLASS-VARIABLE: LANGS
# @DESCRIPTION:
# In case your Qt4 application provides various translations, use this variable
# to specify them in order to populate "linguas_*" IUSE automatically. Make sure
# that you set this variable BEFORE inheriting qt4-r2 eclass.
# example: LANGS="en el de"
for x in ${LANGS}; do
        IUSE="${IUSE} linguas_${x}"
done

# @ECLASS-VARIABLE: LANGSLONG
# @DESCRIPTION:
# Same as above, but this variable is for LINGUAS that must be in long format.
# Remember to set this variable BEFORE inheriting qt4-r2 eclass.
# Look at ${PORTDIR}/profiles/desc/linguas.desc for details.
for x in ${LANGSLONG}; do
        IUSE="${IUSE} linguas_${x%_*}"
done

# @FUNCTION: qt4-r2_src_unpack
# @DESCRIPTION:
# Default src_unpack function for packages that depend on qt4. If you have to
# override src_unpack in your ebuild (probably you don't need to), call
# qt4-r2_src_unpack in it.
qt4-r2_src_unpack() {
        debug-print-function $FUNCNAME "$@"

        # Fallback to ${WORKDIR}/${MY_P} when ${WORKDIR}/${P} doesn't exist.
        # Feel free to re-implement this
        if [[ "${S}" == "${WORKDIR}/${P}" && ! -d ${S} && -d ${WORKDIR}/${MY_P} 
]]; then
                ewarn "Falling back to '${WORKDIR}/${MY_P}'"
                S="${WORKDIR}/${MY_P}"
        fi
        
        base_src_unpack "$@"
}

# @ECLASS-VARIABLE: PATCHES
# @DESCRIPTION:
# In case you have patches to apply, specify them in PATCHES variable. Make sure
# to specify the full path. This variable is used in src_prepare phase.
# example:
# PATCHES=( "${FILESDIR}"/mypatch.patch
#       "${FILESDIR}"/mypatch2.patch )
#
# @FUNCTION: qt4-r2_src_prepare
# @DESCRIPTION:
# Default src_prepare function for packages that depend on qt4. If you have to
# override src_prepare in your ebuild, you should call qt4-r2_src_prepare in it,
# otherwise autopatcher will not work!
qt4-r2_src_prepare() {
        debug-print-function $FUNCNAME "$@"

        base_src_prepare "$@"
}

# @FUNCTION: qt4-r2_src_configure
# @DESCRIPTION:
# Default src_configure function for packages that depend on qt4. If you have to
# override src_configure in your ebuild, call qt4-r2_src_configure in it.
qt4-r2_src_configure() {
        debug-print-function $FUNCNAME "$@"

        local project_file="$(_find_project_file)"

        if [[ -n ${project_file} ]]; then
                eqmake4 ${project_file}
        else
                base_src_configure "$@"
        fi
}

# @FUNCTION: qt4-r2_src_compile
# @DESCRIPTION:
# Default src_compile function for packages that depend on qt4. If you have to
# override src_compile in your ebuild (probably you don't need to), call
# qt4-r2_src_compile in it.
qt4-r2_src_compile() {
        debug-print-function $FUNCNAME "$@"

        base_src_compile "$@"
}

# @ECLASS-VARIABLE: DOCS
# @DESCRIPTION:
# Use this variable if you want to install any documentation.
# example: DOCS="README AUTHORS"
#
# @ECLASS-VARIABLE: DOCSDIR
# @DESCRIPTION:
# Directory containing documentation. If not specified, ${S} will be used
# instead.
#
# @FUNCTION: qt4-r2_src_install
# @DESCRIPTION:
# Default src_install function for qt4-based packages. Installs compiled code,
# documentation (via DOCS variable) and translations (via LANGS and
# LANGSLONG variables).
qt4-r2_src_install() {
        debug-print-function $FUNCNAME "$@"

        emake INSTALL_ROOT="${D}" DESTDIR="${D}" install || die "emake install 
failed"

        # install documentation
        if [[ -n "${DOCS}" ]]; then
                local dir=${DOCSDIR:-${S}}
                for doc in ${DOCS}; do
                        dodoc "${dir}/${doc}" || die "dodoc failed"
                done
        fi
}

# Internal function, used by eqmake4 and qt4-r2_src_configure
# Look for project files:
#   0 *.pro files found - output null string
#   1 *.pro file found - output its name
#   2 or more *.pro files found - if ${PN}.pro or $(basename ${S}).pro
#     are there, output any of them
# Outputs a project file argument used by eqmake4. Sets nullglob locally
# to avoid expanding *.pro as "*.pro" when there are no matching files.
_find_project_file() {
        shopt -s nullglob
        local pro_files=(*.pro)
        shopt -u nullglob
        local dir_name="$(basename ${S})"

        case ${#pro_fil...@]} in
        1)
                echo "${pro_files[0]}"
                ;;
        *)
                for pro_file in "${pro_fil...@]}"; do
                        if [[ "${pro_file}" == "${dir_name}" ||
                                  "${pro_file}" == "${PN}.pro" ]]; then
                                echo "${pro_file}"
                                break
                        fi
                done
                ;;
        esac
}

# @FUNCTION: eqmake4
# @USAGE: [project file] [parameters to qmake]
# @DESCRIPTION:
# Wrapper for Qt4's qmake. If project file isn't specified eqmake4 will
# look for it in current directory (${S}, non-recursively). If more than
# one project file is found, the ${PN}.pro is processed, provided that it
# exists. Otherwise eqmake4 fails.
# All the arguments are appended unmodified to qmake command line. For
# recursive build systems, i.e. those based on the subdirs template, you
# should run eqmake4 on the top-level project file only, unless you have
# strong reasons to do things differently. During the building, qmake
# will be automatically re-invoked with the right arguments on every
# directory specified inside the top-level project file by the SUBDIRS
# variable.
eqmake4() {
        ebegin "Running qmake"

        local qmake_args="$@"

        # check if project file was passed as a first argument
        # if not, then search for it
        local regexp='.*\.pro'
        if ! [[ "${1}" =~ ${regexp} ]]; then
                local project_file="$(_find_project_file)"
                if [[ -z "${project_file}" ]]; then
                        echo
                        eerror "No project file found in ${S}!"
                        eerror "This shouldn't happen - please send a bug 
report to http://bugs.gentoo.org/";
                        echo
                        die "eqmake4 failed"
                fi
                qmake_args="${qmake_args} ${project_file}"
        fi

        # make sure CONFIG variable is correctly set for both release and debug 
builds
        local CONFIG_ADD="release"
        local CONFIG_REMOVE="debug"
        if has debug ${IUSE} && use debug; then
                CONFIG_ADD="debug"
                CONFIG_REMOVE="release"
        fi
        local awkscript='BEGIN {
                                printf "### eqmake4 was here ###\n" > file;
                                fixed=0;
                        }
                        /^[[:blank:]]*CONFIG[[:blank:]]*[\+\*]?=/ {
                                for (i=1; i <= NF; i++) {
                                        if ($i ~ rem || $i ~ 
/debug_and_release/)
                                                { $i=add; fixed=1; }
                                }
                        }
                        /^[[:blank:]]*CONFIG[[:blank:]]*-=/ {
                                for (i=1; i <= NF; i++) {
                                        if ($i ~ add) { $i=rem; fixed=1; }
                                }
                        }
                        {
                                print >> file;
                        }
                        END {
                                printf "\nCONFIG -= debug_and_release %s\n", 
rem >> file;
                                printf "CONFIG += %s\n", add >> file;
                                print fixed;
                        }'
        local file=
        while read file; do
                grep -q '^### eqmake4 was here ###$' "${file}" && continue
                local retval=$({
                                rm -f "${file}" || echo "FAILED"
                                awk -v file="${file}" -- "${awkscript}" 
add=${CONFIG_ADD} rem=${CONFIG_REMOVE} || echo "FAILED"
                                } < "${file}")
                if [[ ${retval} == 1 ]]; then
                        einfo " - fixed CONFIG in ${file}"
                elif [[ ${retval} != 0 ]]; then
                        eerror "An error occurred while processing ${file}"
                        die "eqmake4 failed to process '${file}'"
                fi
        done < <(find . -type f -name "*.pr[io]" -printf '%P\n' 2>/dev/null)

        /usr/bin/qmake -makefile -nocache \
                QTDIR=/usr/$(get_libdir) \
                QMAKE=/usr/bin/qmake \
                QMAKE_CC=$(tc-getCC) \
                QMAKE_CXX=$(tc-getCXX) \
                QMAKE_LINK=$(tc-getCXX) \
                QMAKE_CFLAGS_RELEASE="${CFLAGS}" \
                QMAKE_CFLAGS_DEBUG="${CFLAGS}" \
                QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}" \
                QMAKE_CXXFLAGS_DEBUG="${CXXFLAGS}" \
                QMAKE_LFLAGS_RELEASE="${LDFLAGS}" \
                QMAKE_LFLAGS_DEBUG="${LDFLAGS}" \
                QMAKE_RPATH= \
                QMAKE_STRIP= \
                ${qmake_args}

        # was qmake successful?
        if ! eend $? ; then
                echo
                eerror "Running qmake has failed! (see above for details)"
                eerror "This shouldn't happen - please send a bug report to 
http://bugs.gentoo.org/";
                echo
                die "eqmake4 failed"
        fi

        return 0
}

EXPORT_FUNCTIONS src_unpack src_prepare src_configure src_compile src_install

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to