-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 After discussion and review by mgorny, and significantly more testing, here's an updated version of the previous patch.
To reiterate, this patch changes python-single-r1 so that if there is only one supported Python implementation that can satisfy the ebuild, then PYTHON_SINGLE_TARGET is ignored, and the ebuild is bound by the value(s) set in PYTHON_TARGETS instead. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iF4EAREIAAYFAlRSj60ACgkQ2ugaI38ACPDIQwEAkcwuJi8sKy7ibCP8jlEbs2yp 1MLvsTwK2EUFeA9YvvkA/3xS38o0OAlZ0M9+ciZHDDGaSvsS/K85DWdDI88XSFJ/ =wlEW -----END PGP SIGNATURE-----
Index: python-single-r1.eclass =================================================================== RCS file: /var/cvsroot/gentoo-x86/eclass/python-single-r1.eclass,v retrieving revision 1.26 diff -u -B -U50 -w -r1.26 python-single-r1.eclass --- python-single-r1.eclass 26 May 2014 16:13:35 -0000 1.26 +++ python-single-r1.eclass 30 Oct 2014 19:20:10 -0000 @@ -1,69 +1,70 @@ # Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/eclass/python-single-r1.eclass,v 1.26 2014/05/26 16:13:35 mgorny Exp $ # @ECLASS: python-single-r1 # @MAINTAINER: # Python team <[email protected]> # @AUTHOR: # Author: Michał Górny <[email protected]> # Based on work of: Krzysztof Pawlik <[email protected]> # @BLURB: An eclass for Python packages not installed for multiple implementations. # @DESCRIPTION: # An extension of the python-r1 eclass suite for packages which # don't support being installed for multiple Python implementations. # This mostly includes tools embedding Python. # # This eclass extends the IUSE and REQUIRED_USE set by python-r1 -# to request correct PYTHON_SINGLE_TARGET. It also replaces -# PYTHON_USEDEP and PYTHON_DEPS with a more suitable form. +# to request the PYTHON_SINGLE_TARGET when the inheriting ebuild +# can be supported by more than one Python implementation. It also +# replaces PYTHON_USEDEP and PYTHON_DEPS with a more suitable form. # # Please note that packages support multiple Python implementations # (using python-r1 eclass) can not depend on packages not supporting # them (using this eclass). # # Please note that python-single-r1 will always inherit python-utils-r1 # as well. Thus, all the functions defined there can be used # in the packages using python-single-r1, and there is no need ever # to inherit both. # # For more information, please see the python-r1 Developer's Guide: # http://www.gentoo.org/proj/en/Python/python-r1/dev-guide.xml case "${EAPI:-0}" in 0|1|2|3) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;; 4|5) # EAPI=4 is required for USE default deps on USE_EXPAND flags ;; *) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;; esac if [[ ! ${_PYTHON_SINGLE_R1} ]]; then if [[ ${_PYTHON_R1} ]]; then die 'python-single-r1.eclass can not be used with python-r1.eclass.' elif [[ ${_PYTHON_ANY_R1} ]]; then die 'python-single-r1.eclass can not be used with python-any-r1.eclass.' fi inherit python-utils-r1 fi EXPORT_FUNCTIONS pkg_setup if [[ ! ${_PYTHON_SINGLE_R1} ]]; then # @ECLASS-VARIABLE: PYTHON_COMPAT # @REQUIRED # @DESCRIPTION: # This variable contains a list of Python implementations the package # supports. It must be set before the `inherit' call. It has to be # an array. # # Example: # @CODE @@ -89,177 +90,212 @@ # @CODE # # It will cause the Python dependencies to look like: # @CODE # python_single_target_pythonX_Y? ( dev-lang/python:X.Y[gdbm,ncurses(-)?] ) # @CODE # @ECLASS-VARIABLE: PYTHON_DEPS # @DESCRIPTION: # This is an eclass-generated Python dependency string for all # implementations listed in PYTHON_COMPAT. # # The dependency string is conditional on PYTHON_SINGLE_TARGET. # # Example use: # @CODE # RDEPEND="${PYTHON_DEPS} # dev-foo/mydep" # DEPEND="${RDEPEND}" # @CODE # # Example value: # @CODE # dev-lang/python-exec:= # python_single_target_python2_6? ( dev-lang/python:2.6[gdbm] ) # python_single_target_python2_7? ( dev-lang/python:2.7[gdbm] ) # @CODE # @ECLASS-VARIABLE: PYTHON_USEDEP # @DESCRIPTION: # This is an eclass-generated USE-dependency string which can be used to # depend on another Python package being built for the same Python # implementations. # # The generate USE-flag list is compatible with packages using python-r1, # python-single-r1 and python-distutils-ng eclasses. It must not be used # on packages using python.eclass. # # Example use: # @CODE # RDEPEND="dev-python/foo[${PYTHON_USEDEP}]" # @CODE # # Example value: # @CODE # python_targets_python2_7(-)?,python_single_target_python2_7(+)? # @CODE # @ECLASS-VARIABLE: PYTHON_REQUIRED_USE # @DESCRIPTION: -# This is an eclass-generated required-use expression which ensures the following: +# This is an eclass-generated required-use expression which ensures the following +# when more than one python implementation is possible: # 1. Exactly one PYTHON_SINGLE_TARGET value has been enabled. # 2. The selected PYTHON_SINGLE_TARGET value is enabled in PYTHON_TARGETS. # # This expression should be utilized in an ebuild by including it in # REQUIRED_USE, optionally behind a use flag. # # Example use: # @CODE # REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )" # @CODE # # Example value: # @CODE # python_single_target_python2_6? ( python_targets_python2_6 ) # python_single_target_python2_7? ( python_targets_python2_7 ) # ^^ ( python_single_target_python2_6 python_single_target_python2_7 ) # @CODE _python_single_set_globals() { local impls=() PYTHON_DEPS= local i PYTHON_PKG_DEP for i in "${PYTHON_COMPAT[@]}"; do _python_impl_supported "${i}" || continue - - # The chosen targets need to be in PYTHON_TARGETS as well. - # This is in order to enforce correct dependencies on packages - # supporting multiple implementations. - PYTHON_REQUIRED_USE+=" python_single_target_${i}? ( python_targets_${i} )" - - python_export "${i}" PYTHON_PKG_DEP - PYTHON_DEPS+="python_single_target_${i}? ( ${PYTHON_PKG_DEP} ) " - impls+=( "${i}" ) done if [[ ${#impls[@]} -eq 0 ]]; then die "No supported implementation in PYTHON_COMPAT." fi local flags_mt=( "${impls[@]/#/python_targets_}" ) local flags=( "${impls[@]/#/python_single_target_}" ) local optflags=${flags_mt[@]/%/(-)?} + + IUSE="${flags_mt[*]}" + + if [[ ${#impls[@]} -eq 1 ]]; then + # There is only one supported implementation; set IUSE and other + # variables without PYTHON_SINGLE_TARGET. + PYTHON_REQUIRED_USE="${flags_mt[*]}" + python_export "${impls[0]}" PYTHON_PKG_DEP + PYTHON_DEPS="${PYTHON_PKG_DEP} " + # Force on the python_single_target_* flag for this impl, so + # that any dependencies that inherit python-single-r1 and + # happen to have multiple implementations will still need + # to bound by the implementation used by this package. + optflags+=,${flags[0]/%/(+)} + else + # Multiple supported implementations; honor PYTHON_SINGLE_TARGET. + IUSE+=" ${flags[*]}" + PYTHON_REQUIRED_USE="^^ ( ${flags[*]} )" + # Ensure deps honor the same python_single_target_* flag as is set + # on this package. optflags+=,${flags[@]/%/(+)?} - IUSE="${flags_mt[*]} ${flags[*]}" - PYTHON_REQUIRED_USE+=" ^^ ( ${flags[*]} )" + for i in "${impls[@]}"; do + # The chosen targets need to be in PYTHON_TARGETS as well. + # This is in order to enforce correct dependencies on packages + # supporting multiple implementations. + PYTHON_REQUIRED_USE+=" python_single_target_${i}? ( python_targets_${i} )" + + python_export "${i}" PYTHON_PKG_DEP + PYTHON_DEPS+="python_single_target_${i}? ( ${PYTHON_PKG_DEP} ) " + done + fi PYTHON_USEDEP=${optflags// /,} # 1) well, python-exec would suffice as an RDEP # but no point in making this overcomplex, BDEP doesn't hurt anyone # 2) python-exec should be built with all targets forced anyway # but if new targets were added, we may need to force a rebuild # 3) use whichever python-exec slot installed in EAPI 5. For EAPI 4, # just fix :2 since := deps are not supported. if [[ ${_PYTHON_WANT_PYTHON_EXEC2} == 0 ]]; then PYTHON_DEPS+="dev-lang/python-exec:0[${PYTHON_USEDEP}]" elif [[ ${EAPI} != 4 ]]; then PYTHON_DEPS+="dev-lang/python-exec:=[${PYTHON_USEDEP}]" else PYTHON_DEPS+="dev-lang/python-exec:2[${PYTHON_USEDEP}]" fi } _python_single_set_globals # @FUNCTION: python_setup # @DESCRIPTION: # Determine what the selected Python implementation is and set # the Python build environment up for it. python_setup() { debug-print-function ${FUNCNAME} "${@}" unset EPYTHON - local impl - for impl in "${_PYTHON_ALL_IMPLS[@]}"; do - if has "${impl}" "${PYTHON_COMPAT[@]}" \ - && use "python_single_target_${impl}" - then + local impl impls=() + for impl in "${PYTHON_COMPAT[@]}"; do + _python_impl_supported "${impl}" || continue + impls+=( "${impl}" ) + done + + if [[ ${#impls[@]} -eq 1 ]]; then + if use "python_targets_${impls[0]}"; then + # Only one supported implementation, enable it explicitly + python_export "${impls[0]}" EPYTHON PYTHON + python_wrapper_setup + fi + else + for impl in "${impls[@]}"; do + if use "python_single_target_${impl}"; then if [[ ${EPYTHON} ]]; then eerror "Your PYTHON_SINGLE_TARGET setting lists more than a single Python" eerror "implementation. Please set it to just one value. If you need" eerror "to override the value for a single package, please use package.env" eerror "or an equivalent solution (man 5 portage)." echo die "More than one implementation in PYTHON_SINGLE_TARGET." fi if ! use "python_targets_${impl}"; then eerror "The implementation chosen as PYTHON_SINGLE_TARGET must be added" eerror "to PYTHON_TARGETS as well. This is in order to ensure that" eerror "dependencies are satisfied correctly. We're sorry" eerror "for the inconvenience." echo die "Build target (${impl}) not in PYTHON_TARGETS." fi python_export "${impl}" EPYTHON PYTHON python_wrapper_setup fi done + fi if [[ ! ${EPYTHON} ]]; then eerror "No Python implementation selected for the build. Please set" + if [[ ${#impls[@]} -eq 1 ]]; then + eerror "the PYTHON_TARGETS variable in your make.conf to include one" + else eerror "the PYTHON_SINGLE_TARGET variable in your make.conf to one" + fi eerror "of the following values:" eerror - eerror "${PYTHON_COMPAT[@]}" + eerror "${impls[@]}" echo - die "No supported Python implementation in PYTHON_SINGLE_TARGET." + die "No supported Python implementation in PYTHON_SINGLE_TARGET/PYTHON_TARGETS." fi } # @FUNCTION: python-single-r1_pkg_setup # @DESCRIPTION: # Runs python_setup. python-single-r1_pkg_setup() { debug-print-function ${FUNCNAME} "${@}" python_setup } _PYTHON_SINGLE_R1=1 fi
