public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Michał Górny" <mgorny@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Cc: hasufell@gentoo.org, python@gentoo.org,
	"Michał Górny" <mgorny@gentoo.org>
Subject: [gentoo-dev] [PATCH 1/7] multibuild: introduce a generic framework for custom phase functions.
Date: Sun, 10 Mar 2013 11:18:05 +0100	[thread overview]
Message-ID: <1362910691-8439-1-git-send-email-mgorny@gentoo.org> (raw)
In-Reply-To: <20130310111644.0840d935@pomiocik.lan>

The framework provides functions to declare, export and obtain custom
phase functions.

Each of the custom phases can be defined by eclasses and ebuilds
in a manner similar to regular phases. The eclasses define
${ECLASS}_${phase} function and run 'multibuild_export_phases' to
register them. The ebuilds define ${phase} function and it automatically
takes precedence over eclass-defined ones.
---
 gx86/eclass/multibuild.eclass | 61 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/gx86/eclass/multibuild.eclass b/gx86/eclass/multibuild.eclass
index bc510e9..ea0500c 100644
--- a/gx86/eclass/multibuild.eclass
+++ b/gx86/eclass/multibuild.eclass
@@ -28,6 +28,8 @@ if [[ ! ${_MULTIBUILD} ]]; then
 
 inherit multiprocessing
 
+DEPEND=">=app-shells/bash-4.2"
+
 # @ECLASS-VARIABLE: MULTIBUILD_VARIANTS
 # @DESCRIPTION:
 # An array specifying all enabled variants which multibuild_foreach*
@@ -245,5 +247,64 @@ run_in_build_dir() {
 	return ${ret}
 }
 
+# @FUNCTION: multibuild_export_phases
+# @USAGE: <phase-name>...
+# @DESCRIPTION:
+# Export the eclass phase functions for named phases. The functions need
+# be named ${ECLASS}_<phase-name>. The exported functions will override
+# any previously exported phases.
+multibuild_export_phases() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	[[ ${#} -eq 0 ]] && die "Usage: multibuild_export_phases <phase-name>..."
+
+	# This is necessary to allow sourcing of the ebuild with old bash
+	# versions, e.g. for cachegen.
+	if [[ $(( (BASH_VERSINFO[0] << 8) + BASH_VERSINFO[1] )) \
+			-lt $(( (4 << 8) + 2 )) ]] ; then
+		_MULTIBUILD_ANCIENT_BASH=1
+		return 0
+	fi
+
+	declare -g -A _MULTIBUILD_EXPORTED_PHASES || die
+	local p
+	for p; do
+		_MULTIBUILD_EXPORTED_PHASES[${p}]=${ECLASS}_${p}
+	done
+}
+
+# @FUNCTION: multibuild_get_phase_function
+# @USAGE: <phase-name>
+# @DESCRIPTION:
+# Find the topmost handler for the named phase. It can be either
+# user-defined phase handler (with the same name as the phase)
+# or a handler exported most recently by an eclass.
+#
+# Prints the function name to stdout or null string if there is
+# no handler for the phase.
+multibuild_get_phase_function() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	[[ ${#} -ne 1 ]] && die "Usage: multibuild_get_phase_function <phase-name>"
+	if [[ ${_MULTIBUILD_ANCIENT_BASH} ]]; then
+		die "Old bash (<4.2) used to start the build, please restart emerge."
+	fi
+
+	local phase=${1}
+
+	# user-defined phase
+	if ! declare -f "${phase}" >/dev/null; then
+		phase=${_MULTIBUILD_EXPORTED_PHASES[${phase}]}
+
+		if [[ ! ${phase} ]]; then
+			return
+		elif ! declare -f "${phase}" >/dev/null; then
+			die "Phase function ${phase} exported but never defined!"
+		fi
+	fi
+
+	echo "${phase}"
+}
+
 _MULTIBUILD=1
 fi
-- 
1.8.1.5



  reply	other threads:[~2013-03-10 10:17 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-10 10:16 [gentoo-dev] [PATCHES] multibuild.eclass: custom phase function helpers Michał Górny
2013-03-10 10:18 ` Michał Górny [this message]
2013-03-10 11:36   ` [gentoo-dev] [PATCH 1/7] multibuild: introduce a generic framework for custom phase functions Ulrich Mueller
2013-03-10 12:16     ` Ulrich Mueller
2013-03-10 12:18       ` Ciaran McCreesh
2013-03-10 13:19         ` Michał Górny
2013-03-10 13:44           ` Ulrich Mueller
2013-03-10 13:48             ` Michał Górny
2013-03-10 15:26               ` Ciaran McCreesh
2013-03-10 15:46                 ` Michał Górny
2013-03-10 15:46                   ` Ciaran McCreesh
2013-03-10 15:50       ` [gentoo-dev] [PATCH] " Michał Górny
2013-03-10 18:37         ` Alec Warner
2013-03-10 10:18 ` [gentoo-dev] [PATCH 2/7] distutils-r1: use multibuild phase helpers Michał Górny
2013-03-10 10:18 ` [gentoo-dev] [PATCH 3/7] multilib-minimal: split out mkdir to unify sub-functions Michał Górny
2013-03-10 10:18 ` [gentoo-dev] [PATCH 4/7] multilib-minimal: reuse run_in_build_dir Michał Górny
2013-03-10 10:18 ` [gentoo-dev] [PATCH 5/7] multilib-minimal: reuse multibuild phase function handlers Michał Górny
2013-03-10 10:18 ` [gentoo-dev] [PATCH 6/7] multilib-minimal: run multilib_src_configure in parallel Michał Górny
2013-03-10 10:18 ` [gentoo-dev] [PATCH 7/7] autotools-multilib: reuse phase functions from multilib-minimal Michał Górny
2013-03-17 13:35 ` [gentoo-dev] [PATCHES] multibuild.eclass: custom phase function helpers Michał Górny

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1362910691-8439-1-git-send-email-mgorny@gentoo.org \
    --to=mgorny@gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    --cc=hasufell@gentoo.org \
    --cc=python@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox