More details in the mail preceding the patch. --- gx86/eclass/autotools-multilib.eclass | 47 ++++++++-- gx86/eclass/autotools-utils.eclass | 157 +++++++++++++++++++++++++--------- 2 files changed, 158 insertions(+), 46 deletions(-)
diff --git a/gx86/eclass/autotools-multilib.eclass b/gx86/eclass/autotools-multilib.eclass index 5ca8112..6156610 100644 --- a/gx86/eclass/autotools-multilib.eclass +++ b/gx86/eclass/autotools-multilib.eclass @@ -38,27 +38,62 @@ autotools-multilib_src_prepare() { } autotools-multilib_src_configure() { - multilib_parallel_foreach_abi autotools-utils_src_configure "${@}" + if declare -f autotools_configure >/dev/null; then + multilib_parallel_foreach_abi \ + _autotools-utils_run_phase autotools_configure "${@}" + else + multilib_parallel_foreach_abi \ + _autotools-utils_run_phase \ + autotools-utils_autotools_configure "${@}" + fi } autotools-multilib_src_compile() { - multilib_foreach_abi autotools-utils_src_compile "${@}" + if declare -f autotools_compile >/dev/null; then + multilib_foreach_abi \ + _autotools-utils_run_phase autotools_compile "${@}" + else + multilib_foreach_abi \ + _autotools-utils_run_phase \ + autotools-utils_autotools_compile "${@}" + fi } autotools-multilib_src_test() { - multilib_foreach_abi autotools-utils_src_test "${@}" + if declare -f autotools_test >/dev/null; then + multilib_foreach_abi \ + _autotools-utils_run_phase autotools_test "${@}" + else + multilib_foreach_abi \ + _autotools-utils_run_phase \ + autotools-utils_autotools_test "${@}" + fi } autotools-multilib_src_install() { - autotools-multilib_secure_install() { - autotools-utils_src_install "${@}" + _autotools-multilib_wrap_install() { + "${@}" multilib_prepare_wrappers # Make sure all headers are the same for each ABI. multilib_check_headers } - multilib_foreach_abi autotools-multilib_secure_install "${@}" + if declare -f autotools_install >/dev/null; then + multilib_foreach_abi _autotools-multilib_wrap_install \ + _autotools-utils_run_phase autotools_install "${@}" + else + multilib_foreach_abi _autotools-multilib_wrap_install \ + _autotools-utils_run_phase \ + autotools-utils_autotools_install "${@}" + fi + + if declare -f autotools_install_all >/dev/null; then + _autotools-utils_run_phase autotools_install_all "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_install_all "${@}" + fi # merge the wrappers multilib_install_wrappers diff --git a/gx86/eclass/autotools-utils.eclass b/gx86/eclass/autotools-utils.eclass index e6bf526..b0a299c 100644 --- a/gx86/eclass/autotools-utils.eclass +++ b/gx86/eclass/autotools-utils.eclass @@ -14,8 +14,15 @@ # handling, libtool files removal. # # Please note that autotools-utils does not support mixing of its phase -# functions with regular econf/emake calls. If necessary, please call -# autotools-utils_src_compile instead of the latter. +# functions with regular econf/emake calls in src_*. If necessary, please +# declare autotools_* sub-phases instead which will be run in ${BUILD_DIR}. +# +# autotools-utils uses the following sub-phases: +# +# - autotools_prepare_all, autotools_install_all -- run in ${S}, once. +# +# - autotools_configure, autotools_compile, autotools_test, +# autotools_install -- run in ${BUILD_DIR}, may be run multiple times. # # @EXAMPLE: # Typical ebuild using autotools-utils.eclass: @@ -60,26 +67,26 @@ # "${FILESDIR}/${P}-unbundle_libpng.patch" # ) # -# src_configure() { +# autotools_configure() { # local myeconfargs=( # $(use_enable debug) # $(use_with qt4) # $(use_enable threads multithreading) # $(use_with tiff) # ) -# autotools-utils_src_configure +# edefault # } # -# src_compile() { -# autotools-utils_src_compile -# use doc && autotools-utils_src_compile docs +# autotools_compile() { +# edefault +# use doc && emake docs # } # -# src_install() { -# use doc && HTML_DOCS=("${BUILD_DIR}/apidocs/html/") -# autotools-utils_src_install +# autotools_install_all() { +# use doc && HTML_DOCS=( apidocs/html/. ) +# edefault # if use examples; then -# dobin "${BUILD_DIR}"/foo_example{1,2,3} \\ +# dobin foo_example{1,2,3} \\ # || die 'dobin examples failed' # fi # } @@ -228,6 +235,8 @@ _check_build_dir() { # Backwards compatibility for getting the value. AUTOTOOLS_BUILD_DIR=${BUILD_DIR} echo ">>> Working in BUILD_DIR: \"${BUILD_DIR}\"" + + mkdir -p "${BUILD_DIR}" || die } # @FUNCTION: remove_libtool_files @@ -383,12 +392,12 @@ autotools-utils_autoreconf() { done } -# @FUNCTION: autotools-utils_src_prepare +# @FUNCTION: autotools-utils_autotools_prepare_all # @DESCRIPTION: # The src_prepare function. # # Supporting PATCHES array and user patches. See base.eclass(5) for reference. -autotools-utils_src_prepare() { +autotools-utils_autotools_prepare_all() { debug-print-function ${FUNCNAME} "$@" local want_autoreconf=${AUTOTOOLS_AUTORECONF} @@ -415,7 +424,7 @@ autotools-utils_src_prepare() { elibtoolize --patch-only } -# @FUNCTION: autotools-utils_src_configure +# @FUNCTION: autotools-utils_autotools_configure # @DESCRIPTION: # The src_configure function. For out of source build it creates build # directory and runs econf there. Configuration parameters defined @@ -424,7 +433,7 @@ autotools-utils_src_prepare() { # # IUSE="static-libs" passes --enable-shared and either --disable-static/--enable-static # to econf respectively. -autotools-utils_src_configure() { +autotools-utils_autotools_configure() { debug-print-function ${FUNCNAME} "$@" [[ -z ${myeconfargs+1} || $(declare -p myeconfargs) == 'declare -a'* ]] \ @@ -435,7 +444,6 @@ autotools-utils_src_configure() { # Common args local econfargs=() - _check_build_dir if "${ECONF_SOURCE}"/configure --help 2>&1 | grep -q '^ *--docdir='; then econfargs+=( --docdir="${EPREFIX}"/usr/share/doc/${PF} @@ -453,40 +461,38 @@ autotools-utils_src_configure() { # Append user args econfargs+=("${myeconfargs[@]}") - mkdir -p "${BUILD_DIR}" || die - pushd "${BUILD_DIR}" > /dev/null || die econf "${econfargs[@]}" "$@" - popd > /dev/null || die } -# @FUNCTION: autotools-utils_src_compile +# @FUNCTION: autotools-utils_autotools_compile # @DESCRIPTION: # The autotools src_compile function, invokes emake in specified BUILD_DIR. -autotools-utils_src_compile() { +autotools-utils_autotools_compile() { debug-print-function ${FUNCNAME} "$@" - _check_build_dir - pushd "${BUILD_DIR}" > /dev/null || die emake "$@" || die 'emake failed' - popd > /dev/null || die } -# @FUNCTION: autotools-utils_src_install +# @FUNCTION: autotools-utils_autotools_install +# @DESCRIPTION: +# The build-dir part of src_install function. Runs emake install. +autotools-utils_autotools_install() { + debug-print-function ${FUNCNAME} "$@" + + emake DESTDIR="${D}" "$@" install || die "emake install failed" +} + +# @FUNCTION: autotools-utils_autotools_install_all # @DESCRIPTION: -# The autotools src_install function. Runs emake install, unconditionally -# removes unnecessary static libs (based on shouldnotlink libtool property) -# and removes unnecessary libtool files when static-libs USE flag is defined +# The common part of autotools src_install function. Removes unnecessary +# static libs (based on shouldnotlink libtool property) and removes +# unnecessary libtool files when static-libs USE flag is defined # and unset. # # DOCS and HTML_DOCS arrays are supported. See base.eclass(5) for reference. -autotools-utils_src_install() { +autotools-utils_autotools_install_all() { debug-print-function ${FUNCNAME} "$@" - _check_build_dir - pushd "${BUILD_DIR}" > /dev/null || die - emake DESTDIR="${D}" "$@" install || die "emake install failed" - popd > /dev/null || die - # Move docs installed by autotools (in EAPI < 4). if [[ ${EAPI} == [23] ]] \ && path_exists "${D}${EPREFIX}"/usr/share/doc/${PF}/*; then @@ -532,17 +538,88 @@ autotools-utils_src_install() { prune_libtool_files ${prune_ltfiles:+--${prune_ltfiles}} } -# @FUNCTION: autotools-utils_src_test +# @FUNCTION: autotools-utils_autotools_test # @DESCRIPTION: # The autotools src_test function. Runs emake check in build directory. -autotools-utils_src_test() { +autotools-utils_autotools_test() { debug-print-function ${FUNCNAME} "$@" - _check_build_dir - pushd "${BUILD_DIR}" > /dev/null || die - # XXX: do we need to support other targets in autotools? emake check "${@}" || die 'emake check failed.' +} + +# @FUNCTION: _autotools-utils_run_phase +# @USAGE: <sub-phase> [<args>...] +# @INTERNAL +# @DESCRIPTION: +# Run the given ebuild sub-phase or the default implementation. +_autotools-utils_run_phase() { + local phase=${1} + + # it's ok to have wrong value in default impls + # since they can't use it anyway. + eval "edefault() { autotools-utils_${phase} \"\${@}\"; }" + if [[ ${phase} != *_all ]]; then + _check_build_dir + pushd "${BUILD_DIR}" > /dev/null || die + fi + + "${@}" + + if [[ ${phase} != *_all ]]; then + popd > /dev/null || die + fi + unset -f edefault +} + +autotools-utils_src_prepare() { + if declare -f autotools_prepare_all >/dev/null; then + _autotools-utils_run_phase autotools_prepare_all "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_prepare_all "${@}" + fi +} + +autotools-utils_src_configure() { + if declare -f autotools_configure >/dev/null; then + _autotools-utils_run_phase autotools_configure "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_configure "${@}" + fi +} + +autotools-utils_src_compile() { + if declare -f autotools_compile >/dev/null; then + _autotools-utils_run_phase autotools_compile "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_compile "${@}" + fi +} + +autotools-utils_src_test() { + if declare -f autotools_test >/dev/null; then + _autotools-utils_run_phase autotools_test "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_test "${@}" + fi +} - popd > /dev/null || die +autotools-utils_src_install() { + if declare -f autotools_install >/dev/null; then + _autotools-utils_run_phase autotools_install "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_install "${@}" + fi + + if declare -f autotools_install_all >/dev/null; then + _autotools-utils_run_phase autotools_install_all "${@}" + else + _autotools-utils_run_phase \ + autotools-utils_autotools_install_all "${@}" + fi } -- 1.8.2.1