This patch splits the definition of _PYTHON_ALL_IMPLS and _python_impl_supported to a separate eclass, this allows overlays to easily support a different set of python implementations than ::gentoo without having to fork the entire suite of eclasses.
diff --git a/eclass/python-impls-r1.eclass b/eclass/python-impls-r1.eclass new file mode 100644 index 00000000000..0ae6e4e84a1 --- /dev/null +++ b/eclass/python-impls-r1.eclass @@ -0,0 +1,90 @@ +# Copyright 1999-2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: python-impls-r1.eclass +# @MAINTAINER: +# Python team <pyt...@gentoo.org> +# @AUTHOR: +# Author: MichaŠGórny <mgo...@gentoo.org> +# Split to separate eclass by: Patrick McLean <chutz...@gentoo.org> +# Based on work of: Krzysztof Pawlik <nelch...@gentoo.org> +# @SUPPORTED_EAPIS: 5 6 7 +# @BLURB: Definitions of supported eclasses for python-utils-r1 +# @DESCRIPTION: +# A helper eclass defining the supported python implementations for +# the python-r1 suite of eclasses. +# +# This eclass is meant to be inherited by python-utils-r1, inheriting +# it separately is very unlikely to be useful. +# +# For more information, please see the Python Guide: +# https://dev.gentoo.org/~mgorny/python-guide/ + +case "${EAPI:-0}" in + [0-4]) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;; + [5-7]) ;; + *) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;; +esac + +if [[ ${_PYTHON_ECLASS_INHERITED} ]]; then + die 'python-r1 suite eclasses can not be used with python.eclass.' +fi + +if [[ ! ${_PYTHON_IMPLS_R1} ]]; then + +# @ECLASS-VARIABLE: _PYTHON_ALL_IMPLS +# @INTERNAL +# @DESCRIPTION: +# All supported Python implementations, most preferred last. +_PYTHON_ALL_IMPLS=( + pypy3 + python2_7 + python3_6 python3_7 python3_8 +) +readonly _PYTHON_ALL_IMPLS + +# @ECLASS-VARIABLE: PYTHON_COMPAT_NO_STRICT +# @INTERNAL +# @DESCRIPTION: +# Set to a non-empty value in order to make eclass tolerate (ignore) +# unknown implementations in PYTHON_COMPAT. +# +# This is intended to be set by the user when using ebuilds that may +# have unknown (newer) implementations in PYTHON_COMPAT. The assumption +# is that the ebuilds are intended to be used within multiple contexts +# which can involve revisions of this eclass that support a different +# set of Python implementations. + +# @FUNCTION: _python_impl_supported +# @USAGE: <impl> +# @INTERNAL +# @DESCRIPTION: +# Check whether the implementation <impl> (PYTHON_COMPAT-form) +# is still supported. +# +# Returns 0 if the implementation is valid and supported. If it is +# unsupported, returns 1 -- and the caller should ignore the entry. +# If it is invalid, dies with an appopriate error messages. +_python_impl_supported() { + debug-print-function ${FUNCNAME} "${@}" + + [[ ${#} -eq 1 ]] || die "${FUNCNAME}: takes exactly 1 argument (impl)." + + local impl=${1} + + # keep in sync with _PYTHON_ALL_IMPLS! + # (not using that list because inline patterns shall be faster) + case "${impl}" in + python2_7|python3_[678]|pypy3) + return 0 + ;; + jython2_7|pypy|pypy1_[89]|pypy2_0|python2_[56]|python3_[12345]) + return 1 + ;; + *) + [[ ${PYTHON_COMPAT_NO_STRICT} ]] && return 1 + die "Invalid implementation in PYTHON_COMPAT: ${impl}" + esac +} +_PYTHON_IMPLS_R1=1 +fi diff --git a/eclass/python-utils-r1.eclass b/eclass/python-utils-r1.eclass index aacee5ac35a..28df410d5a1 100644 --- a/eclass/python-utils-r1.eclass +++ b/eclass/python-utils-r1.eclass @@ -32,62 +32,7 @@ fi if [[ ! ${_PYTHON_UTILS_R1} ]]; then [[ ${EAPI} == 5 ]] && inherit eutils multilib -inherit toolchain-funcs - -# @ECLASS-VARIABLE: _PYTHON_ALL_IMPLS -# @INTERNAL -# @DESCRIPTION: -# All supported Python implementations, most preferred last. -_PYTHON_ALL_IMPLS=( - pypy3 - python2_7 - python3_6 python3_7 python3_8 -) -readonly _PYTHON_ALL_IMPLS - -# @ECLASS-VARIABLE: PYTHON_COMPAT_NO_STRICT -# @INTERNAL -# @DESCRIPTION: -# Set to a non-empty value in order to make eclass tolerate (ignore) -# unknown implementations in PYTHON_COMPAT. -# -# This is intended to be set by the user when using ebuilds that may -# have unknown (newer) implementations in PYTHON_COMPAT. The assumption -# is that the ebuilds are intended to be used within multiple contexts -# which can involve revisions of this eclass that support a different -# set of Python implementations. - -# @FUNCTION: _python_impl_supported -# @USAGE: <impl> -# @INTERNAL -# @DESCRIPTION: -# Check whether the implementation <impl> (PYTHON_COMPAT-form) -# is still supported. -# -# Returns 0 if the implementation is valid and supported. If it is -# unsupported, returns 1 -- and the caller should ignore the entry. -# If it is invalid, dies with an appopriate error messages. -_python_impl_supported() { - debug-print-function ${FUNCNAME} "${@}" - - [[ ${#} -eq 1 ]] || die "${FUNCNAME}: takes exactly 1 argument (impl)." - - local impl=${1} - - # keep in sync with _PYTHON_ALL_IMPLS! - # (not using that list because inline patterns shall be faster) - case "${impl}" in - python2_7|python3_[678]|pypy3) - return 0 - ;; - jython2_7|pypy|pypy1_[89]|pypy2_0|python2_[56]|python3_[12345]) - return 1 - ;; - *) - [[ ${PYTHON_COMPAT_NO_STRICT} ]] && return 1 - die "Invalid implementation in PYTHON_COMPAT: ${impl}" - esac -} +inherit toolchain-funcs python-impls-r1 # @FUNCTION: _python_set_impls # @INTERNAL