Add a DISTUTILS_ALL_SUBPHASE_IMPLS variable that can be used to restrict
implementations for the *_all() sub-phases.

Example use:

  IUSE="doc"
  RDEPEND="doc? ( dev-python/epydoc[$(python_gen_usedep 'python2*')] )"
  REQUIRED_USE="doc? ( || ( $(python_gen_useflags 'python2*') ) )"

  pkg_setup() {
      use doc && DISTUTILS_ALL_SUBPHASE_IMPLS=( 'python2*' )
  }

  python_compile_all() {
      use doc && esetup.py doc
  }
---
 eclass/distutils-r1.eclass | 53 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 42 insertions(+), 11 deletions(-)

diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index da5c687..33b2a96 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -181,6 +181,31 @@ fi
 # 'build --build-base ${BUILD_DIR}' to enforce keeping & using built
 # files in the specific root.
 
+# @ECLASS-VARIABLE: DISTUTILS_ALL_SUBPHASE_IMPLS
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# An array of patterns specifying which implementations can be used
+# for *_all() sub-phase functions. If undefined, defaults to '*'
+# (allowing any implementation). If multiple values are specified,
+# implementations matching any of the patterns will be accepted.
+#
+# If the restriction needs to apply conditionally to a USE flag,
+# the variable should be set conditionally as well (e.g. in an early
+# phase function or other convenient location).
+#
+# Please remember to add a matching || block to REQUIRED_USE,
+# to ensure that at least one implementation matching the patterns will
+# be enabled.
+#
+# Example:
+# @CODE
+# REQUIRED_USE="doc? ( || ( $(python_gen_useflags 'python2*') ) )"
+#
+# pkg_setup() {
+#     use doc && DISTUTILS_ALL_SUBPHASE_IMPLS=( 'python2*' )
+# }
+# @CODE
+
 # @ECLASS-VARIABLE: mydistutilsargs
 # @DEFAULT_UNSET
 # @DESCRIPTION:
@@ -624,24 +649,30 @@ distutils-r1_run_phase() {
 # @USAGE: [<argv>...]
 # @INTERNAL
 # @DESCRIPTION:
-# Run the given command, restoring the best-implementation state.
+# Run the given command, restoring the state for a most preferred Python
+# implementation matching DISTUTILS_ALL_SUBPHASE_IMPLS.
 #
 # If in-source build is used, the command will be run in the copy
-# of sources made for the best Python interpreter.
+# of sources made for the selected Python interpreter.
 _distutils-r1_run_common_phase() {
        local DISTUTILS_ORIG_BUILD_DIR=${BUILD_DIR}
 
        if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then
-               local _DISTUTILS_INITIAL_CWD=${PWD}
-               local MULTIBUILD_VARIANTS
-               _python_obtain_impls
-
-               multibuild_for_best_variant _python_multibuild_wrapper \
-                       distutils-r1_run_phase "${@}"
-       else
-               # semi-hack, be careful.
-               _distutils-r1_run_foreach_impl "${@}"
+               local best_impl patterns=( 
"${DISTUTILS_ALL_SUBPHASE_IMPLS[@]-*}" )
+               _distutils_try_impl() {
+                       local pattern
+                       for pattern in "${patterns[@]}"; do
+                               if [[ ${EPYTHON} == ${pattern} ]]; then
+                                       best_impl=${MULTIBUILD_VARIANT}
+                               fi
+                       done
+               }
+               python_foreach_impl _distutils_try_impl
+
+               local PYTHON_COMPAT=( "${best_impl}" )
        fi
+
+       _distutils-r1_run_foreach_impl "${@}"
 }
 
 # @FUNCTION: _distutils-r1_run_foreach_impl
-- 
2.2.1


Reply via email to