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