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 | 66 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/gx86/eclass/multibuild.eclass b/gx86/eclass/multibuild.eclass
index bc510e9..3187c9e 100644
--- a/gx86/eclass/multibuild.eclass
+++ b/gx86/eclass/multibuild.eclass
@@ -245,5 +245,71 @@ run_in_build_dir() {
return ${ret}
}
+# @ECLASS-VARIABLE: _MULTIBUILD_EXPORTED_PHASES
+# @INTERNAL
+# @DESCRIPTION:
+# The list of currently exported phase functions.
+#
+# Each function is stored in the form of 'eclass:phase-name'.
+# New exports are prepended to the list, so the first matching value
+# is the most recent one.
+_MULTIBUILD_EXPORTED_PHASES=()
+
+# @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>..."
+
+ # just prepend to the list
+ _MULTIBUILD_EXPORTED_PHASES=(
+ "${@/#/${ECLASS}:}"
+ "${_MULTIBUILD_EXPORTED_PHASES[@]}"
+ )
+}
+
+# @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>"
+
+ local phase=${1}
+
+ # user-defined phase
+ if ! declare -f "${phase}" >/dev/null; then
+ local found p
+ for p in "${_MULTIBUILD_EXPORTED_PHASES[@]}"; do
+ if [[ ${p} == *:${phase} ]]; then
+ # we're breaking out, so we can overwrite it.
+ phase=${p/:/_}
+ found=1
+ break
+ fi
+ done
+
+ if [[ ! ${found} ]]; 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