This patch adds a new frob, MULTILIB_PARALLEL_PHASES, to multlib-minimal.eclass, which implements eclass-consumer-selectable parallelization of src_configure, src_compile, and src_test. By default, all parallelization is deactivated, which represents a change from the previous gentoo-x86 behavior (which was parallelizing src_configure automatically). --- 004-multilib-phase-all/multilib-minimal.eclass 2013-12-03 02:54:40.045335905 -0800 +++ 005-MULTILIB_PARALLEL_PHASES/multilib-minimal.eclass 2013-12-03 02:59:33.687448429 -0800 @@ -45,8 +45,8 @@ # for more information. # # Another snag you may encounter is that, in many circumstances, it is possible -# for variables to flow between multilib_ functions. This is because -# no subshell is utilized. +# for variables to flow between multilib_ functions. This is because, +# unless you parallelize the phase in question, no subshell is utilized. # Extreme care must sometimes be taken to ensure that different ABI's don't # trample each other's variables. # @@ -122,6 +122,58 @@ case ${EAPI:-0} in *) die "EAPI=${EAPI} is not supported" ;; esac +# @ECLASS-VARIABLE: MULTILIB_PARALLEL_PHASES +# @DEFAULT-UNSET +# @DESCRIPTION: +# multilib-minimal.eclass consumers may set this to a string containing +# a space-separated list of phase-function names, like so: +# +# @CODE@ +# MULTILIB_PARALLEL_PHASES="src_configure src_test" +# @CODE@ +# +# For each (supported) phase-function name in the list, the corresponding +# multilib-minimal_ phase function will execute in parallel, in +# the sense that, within limits (set by multiprocessing.eclass) the +# multilib_ function invocations (or, if none is present, the +# built-in default implementation) for each ABI will run simultaneously. +# +# Any phase-function-names not specified are executed serially, with the +# native ABI coming last. +# +# It is OK to add extra "bonus" whitespace or duplicated values. +# Changes take effect immediately, so it may be set before or after +# inheriting multilib-minimal, or even during execution of a phase function +# (but not in parallelized multilib_ functions; see below). +# +# By default, MULTILIB_PARALLEL_PHASES is empty. Consuming eclasses could +# override this default by setting a new default before the inherits clause. +# For example, +# +# @CODE +# : {MULTILIB_PARALLEL_PHASES:="src_configure"} +# inherit multilib-minimal +# @CODE +# +# would create a default behavior of parallel src_configure. The question +# of whether, in practice, eclasses ever should do so is potentially +# complicated; you'll have to figure that out for yourself. +# +# Supported phase-function-names are: src_configure, src_compile, and src_test. +# All other values are silently ignored. +# +# Note that parallel execution can lead to ugly -- and sometimes very, very ugly -- +# console output at build-time. Consumers of multilib-minimal.eclass +# may wish to consider activating less verbose build-time output modes, if they are +# readily available, to mitigate this effect, although doing so goes against a +# long-standing Gentoo tradition and might make debugging a hassle for bugzilla +# and IRC participants, so use your best judgement. +# +# A handy per-ABI log is kept in ${T}/build-${ABI}.log by multibuild.eclass. +# Debugging and bug-reporting may also benefit (unless your bug specifically +# pertains to parallelization) from setting MAKEOPTS=-j1, which will prevent +# parallelization entirely. + # @ECLASS-VARIABLE: MULTILIB_INSECURE_INSTALL # @DEFAULT-UNSET # @DESCRIPTION: @@ -161,7 +213,12 @@ multilib-minimal_src_configure() { if declare -f multilib_src_configure_all > /dev/null ; then multilib_src_configure_all fi - multilib_foreach_abi multilib-minimal_abi_src_configure + + if has src_configure ${MULTILIB_PARALLEL_PHASES} ; then + multilib_parallel_foreach_abi multilib-minimal_abi_src_configure + else + multilib_foreach_abi multilib-minimal_abi_src_configure + fi } multilib-minimal_src_compile() { @@ -179,7 +236,12 @@ multilib-minimal_src_compile() { popd >/dev/null || die } - multilib_foreach_abi multilib-minimal_abi_src_compile + if has src_compile ${MULTILIB_PARALLEL_PHASES} ; then + multilib_parallel_foreach_abi multilib-minimal_abi_src_compile + else + multilib_foreach_abi multilib-minimal_abi_src_compile + fi + if declare -f multilib_src_compile_all > /dev/null ; then multilib_src_compile_all fi @@ -200,7 +262,12 @@ multilib-minimal_src_test() { popd >/dev/null || die } - multilib_foreach_abi multilib-minimal_abi_src_test + if has src_test ${MULTILIB_PARALLEL_PHASES} ; then + multilib_parallel_foreach_abi multilib-minimal_abi_src_test + else + multilib_foreach_abi multilib-minimal_abi_src_test + fi + if declare -f multilib_src_test_all >/dev/null ; then multilib_src_test_all fi