On Sun, Mar 10, 2013 at 8:50 AM, Michał Górny <[email protected]> wrote:
> The framework provides functions to declare, export and obtain custom
> phase functions.
Thanks for fixing this up.
-A
>
> 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
>
>