Hanno Böck commited on 2021-04-17 15:54:07
              Zeige 1 geänderte Dateien mit 529 Einfügungen und 0 Löschungen.
            
| ... | ... | 
                      @@ -0,0 +1,529 @@  | 
                  
| 1 | 
                        +# Copyright 1999-2021 Gentoo Authors  | 
                    |
| 2 | 
                        +# Distributed under the terms of the GNU General Public License v2  | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +# @ECLASS: python-single-r1.eclass  | 
                    |
| 5 | 
                        +# @MAINTAINER:  | 
                    |
| 6 | 
                        +# Python team <python@gentoo.org>  | 
                    |
| 7 | 
                        +# @AUTHOR:  | 
                    |
| 8 | 
                        +# Author: Michał Górny <mgorny@gentoo.org>  | 
                    |
| 9 | 
                        +# Based on work of: Krzysztof Pawlik <nelchael@gentoo.org>  | 
                    |
| 10 | 
                        +# @SUPPORTED_EAPIS: 5 6 7  | 
                    |
| 11 | 
                        +# @BLURB: An eclass for Python packages not installed for multiple implementations.  | 
                    |
| 12 | 
                        +# @DESCRIPTION:  | 
                    |
| 13 | 
                        +# An extension of the python-r1 eclass suite for packages which  | 
                    |
| 14 | 
                        +# don't support being installed for multiple Python implementations.  | 
                    |
| 15 | 
                        +# This mostly includes tools embedding Python and packages using foreign  | 
                    |
| 16 | 
                        +# build systems.  | 
                    |
| 17 | 
                        +#  | 
                    |
| 18 | 
                        +# This eclass sets correct IUSE. It also provides PYTHON_DEPS  | 
                    |
| 19 | 
                        +# and PYTHON_REQUIRED_USE that need to be added to appropriate ebuild  | 
                    |
| 20 | 
                        +# metadata variables.  | 
                    |
| 21 | 
                        +#  | 
                    |
| 22 | 
                        +# The eclass exports PYTHON_SINGLE_USEDEP that is suitable for depending  | 
                    |
| 23 | 
                        +# on other packages using the eclass. Dependencies on packages using  | 
                    |
| 24 | 
                        +# python-r1 should be created via python_gen_cond_dep() function,  | 
                    |
| 25 | 
                        +# using PYTHON_USEDEP placeholder.  | 
                    |
| 26 | 
                        +#  | 
                    |
| 27 | 
                        +# Please note that packages support multiple Python implementations  | 
                    |
| 28 | 
                        +# (using python-r1 eclass) can not depend on packages not supporting  | 
                    |
| 29 | 
                        +# them (using this eclass).  | 
                    |
| 30 | 
                        +#  | 
                    |
| 31 | 
                        +# Please note that python-single-r1 will always inherit python-utils-r1  | 
                    |
| 32 | 
                        +# as well. Thus, all the functions defined there can be used  | 
                    |
| 33 | 
                        +# in the packages using python-single-r1, and there is no need ever  | 
                    |
| 34 | 
                        +# to inherit both.  | 
                    |
| 35 | 
                        +#  | 
                    |
| 36 | 
                        +# For more information, please see the Python Guide:  | 
                    |
| 37 | 
                        +# https://dev.gentoo.org/~mgorny/python-guide/  | 
                    |
| 38 | 
                        +  | 
                    |
| 39 | 
                        +case "${EAPI:-0}" in
                       | 
                    |
| 40 | 
                        + 0|1|2|3|4)  | 
                    |
| 41 | 
                        +		die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
                       | 
                    |
| 42 | 
                        + ;;  | 
                    |
| 43 | 
                        + 5|6|7)  | 
                    |
| 44 | 
                        + # EAPI=5 is required for sane USE_EXPAND dependencies  | 
                    |
| 45 | 
                        + ;;  | 
                    |
| 46 | 
                        + *)  | 
                    |
| 47 | 
                        +		die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
                       | 
                    |
| 48 | 
                        + ;;  | 
                    |
| 49 | 
                        +esac  | 
                    |
| 50 | 
                        +  | 
                    |
| 51 | 
                        +if [[ ! ${_PYTHON_SINGLE_R1} ]]; then
                       | 
                    |
| 52 | 
                        +  | 
                    |
| 53 | 
                        +if [[ ${_PYTHON_R1} ]]; then
                       | 
                    |
| 54 | 
                        + die 'python-single-r1.eclass can not be used with python-r1.eclass.'  | 
                    |
| 55 | 
                        +elif [[ ${_PYTHON_ANY_R1} ]]; then
                       | 
                    |
| 56 | 
                        + die 'python-single-r1.eclass can not be used with python-any-r1.eclass.'  | 
                    |
| 57 | 
                        +fi  | 
                    |
| 58 | 
                        +  | 
                    |
| 59 | 
                        +inherit python-utils-r1  | 
                    |
| 60 | 
                        +  | 
                    |
| 61 | 
                        +fi  | 
                    |
| 62 | 
                        +  | 
                    |
| 63 | 
                        +EXPORT_FUNCTIONS pkg_setup  | 
                    |
| 64 | 
                        +  | 
                    |
| 65 | 
                        +# @ECLASS-VARIABLE: PYTHON_COMPAT  | 
                    |
| 66 | 
                        +# @REQUIRED  | 
                    |
| 67 | 
                        +# @DESCRIPTION:  | 
                    |
| 68 | 
                        +# This variable contains a list of Python implementations the package  | 
                    |
| 69 | 
                        +# supports. It must be set before the `inherit' call. It has to be  | 
                    |
| 70 | 
                        +# an array.  | 
                    |
| 71 | 
                        +#  | 
                    |
| 72 | 
                        +# Example:  | 
                    |
| 73 | 
                        +# @CODE  | 
                    |
| 74 | 
                        +# PYTHON_COMPAT=( python2_7 python3_3 python3_4 )  | 
                    |
| 75 | 
                        +# @CODE  | 
                    |
| 76 | 
                        +#  | 
                    |
| 77 | 
                        +# Please note that you can also use bash brace expansion if you like:  | 
                    |
| 78 | 
                        +# @CODE  | 
                    |
| 79 | 
                        +# PYTHON_COMPAT=( python2_7 python3_{3,4} )
                       | 
                    |
| 80 | 
                        +# @CODE  | 
                    |
| 81 | 
                        +  | 
                    |
| 82 | 
                        +# @ECLASS-VARIABLE: PYTHON_COMPAT_OVERRIDE  | 
                    |
| 83 | 
                        +# @USER_VARIABLE  | 
                    |
| 84 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 85 | 
                        +# @DESCRIPTION:  | 
                    |
| 86 | 
                        +# This variable can be used when working with ebuilds to override  | 
                    |
| 87 | 
                        +# the in-ebuild PYTHON_COMPAT. It is a string naming the implementation  | 
                    |
| 88 | 
                        +# which package will be built for. It needs to be specified  | 
                    |
| 89 | 
                        +# in the calling environment, and not in ebuilds.  | 
                    |
| 90 | 
                        +#  | 
                    |
| 91 | 
                        +# It should be noted that in order to preserve metadata immutability,  | 
                    |
| 92 | 
                        +# PYTHON_COMPAT_OVERRIDE does not affect IUSE nor dependencies.  | 
                    |
| 93 | 
                        +# The state of PYTHON_SINGLE_TARGET is ignored, and the implementation  | 
                    |
| 94 | 
                        +# in PYTHON_COMPAT_OVERRIDE is built instead. Dependencies need to be  | 
                    |
| 95 | 
                        +# satisfied manually.  | 
                    |
| 96 | 
                        +#  | 
                    |
| 97 | 
                        +# Example:  | 
                    |
| 98 | 
                        +# @CODE  | 
                    |
| 99 | 
                        +# PYTHON_COMPAT_OVERRIDE='pypy' emerge -1v dev-python/bar  | 
                    |
| 100 | 
                        +# @CODE  | 
                    |
| 101 | 
                        +  | 
                    |
| 102 | 
                        +# @ECLASS-VARIABLE: PYTHON_REQ_USE  | 
                    |
| 103 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 104 | 
                        +# @DESCRIPTION:  | 
                    |
| 105 | 
                        +# The list of USEflags required to be enabled on the chosen Python  | 
                    |
| 106 | 
                        +# implementations, formed as a USE-dependency string. It should be valid  | 
                    |
| 107 | 
                        +# for all implementations in PYTHON_COMPAT, so it may be necessary to  | 
                    |
| 108 | 
                        +# use USE defaults.  | 
                    |
| 109 | 
                        +#  | 
                    |
| 110 | 
                        +# This should be set before calling `inherit'.  | 
                    |
| 111 | 
                        +#  | 
                    |
| 112 | 
                        +# Example:  | 
                    |
| 113 | 
                        +# @CODE  | 
                    |
| 114 | 
                        +# PYTHON_REQ_USE="gdbm,ncurses(-)?"  | 
                    |
| 115 | 
                        +# @CODE  | 
                    |
| 116 | 
                        +#  | 
                    |
| 117 | 
                        +# It will cause the Python dependencies to look like:  | 
                    |
| 118 | 
                        +# @CODE  | 
                    |
| 119 | 
                        +# python_single_target_pythonX_Y? ( dev-lang/python:X.Y[gdbm,ncurses(-)?] )  | 
                    |
| 120 | 
                        +# @CODE  | 
                    |
| 121 | 
                        +  | 
                    |
| 122 | 
                        +# @ECLASS-VARIABLE: PYTHON_DEPS  | 
                    |
| 123 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 124 | 
                        +# @DESCRIPTION:  | 
                    |
| 125 | 
                        +# This is an eclass-generated Python dependency string for all  | 
                    |
| 126 | 
                        +# implementations listed in PYTHON_COMPAT.  | 
                    |
| 127 | 
                        +#  | 
                    |
| 128 | 
                        +# The dependency string is conditional on PYTHON_SINGLE_TARGET.  | 
                    |
| 129 | 
                        +#  | 
                    |
| 130 | 
                        +# Example use:  | 
                    |
| 131 | 
                        +# @CODE  | 
                    |
| 132 | 
                        +# RDEPEND="${PYTHON_DEPS}
                       | 
                    |
| 133 | 
                        +# dev-foo/mydep"  | 
                    |
| 134 | 
                        +# BDEPEND="${PYTHON_DEPS}"
                       | 
                    |
| 135 | 
                        +# @CODE  | 
                    |
| 136 | 
                        +#  | 
                    |
| 137 | 
                        +# Example value:  | 
                    |
| 138 | 
                        +# @CODE  | 
                    |
| 139 | 
                        +# dev-lang/python-exec:=  | 
                    |
| 140 | 
                        +# python_single_target_python2_7? ( dev-lang/python:2.7[gdbm] )  | 
                    |
| 141 | 
                        +# python_single_target_pypy? ( dev-python/pypy[gdbm] )  | 
                    |
| 142 | 
                        +# @CODE  | 
                    |
| 143 | 
                        +  | 
                    |
| 144 | 
                        +# @ECLASS-VARIABLE: PYTHON_SINGLE_USEDEP  | 
                    |
| 145 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 146 | 
                        +# @DESCRIPTION:  | 
                    |
| 147 | 
                        +# This is an eclass-generated USE-dependency string which can be used to  | 
                    |
| 148 | 
                        +# depend on another python-single-r1 package being built for the same  | 
                    |
| 149 | 
                        +# Python implementations.  | 
                    |
| 150 | 
                        +#  | 
                    |
| 151 | 
                        +# If you need to depend on a multi-impl (python-r1) package, use  | 
                    |
| 152 | 
                        +# python_gen_cond_dep with PYTHON_USEDEP placeholder instead.  | 
                    |
| 153 | 
                        +#  | 
                    |
| 154 | 
                        +# Example use:  | 
                    |
| 155 | 
                        +# @CODE  | 
                    |
| 156 | 
                        +# RDEPEND="dev-python/foo[${PYTHON_SINGLE_USEDEP}]"
                       | 
                    |
| 157 | 
                        +# @CODE  | 
                    |
| 158 | 
                        +#  | 
                    |
| 159 | 
                        +# Example value:  | 
                    |
| 160 | 
                        +# @CODE  | 
                    |
| 161 | 
                        +# python_single_target_python3_4(-)?  | 
                    |
| 162 | 
                        +# @CODE  | 
                    |
| 163 | 
                        +  | 
                    |
| 164 | 
                        +# @ECLASS-VARIABLE: PYTHON_USEDEP  | 
                    |
| 165 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 166 | 
                        +# @DESCRIPTION:  | 
                    |
| 167 | 
                        +# This is a placeholder variable supported by python_gen_cond_dep,  | 
                    |
| 168 | 
                        +# in order to depend on python-r1 packages built for the same Python  | 
                    |
| 169 | 
                        +# implementations.  | 
                    |
| 170 | 
                        +#  | 
                    |
| 171 | 
                        +# Example use:  | 
                    |
| 172 | 
                        +# @CODE  | 
                    |
| 173 | 
                        +# RDEPEND="$(python_gen_cond_dep '  | 
                    |
| 174 | 
                        +#     dev-python/foo[${PYTHON_USEDEP}]
                       | 
                    |
| 175 | 
                        +# ')"  | 
                    |
| 176 | 
                        +# @CODE  | 
                    |
| 177 | 
                        +#  | 
                    |
| 178 | 
                        +# Example value:  | 
                    |
| 179 | 
                        +# @CODE  | 
                    |
| 180 | 
                        +# python_targets_python3_4(-)  | 
                    |
| 181 | 
                        +# @CODE  | 
                    |
| 182 | 
                        +  | 
                    |
| 183 | 
                        +# @ECLASS-VARIABLE: PYTHON_MULTI_USEDEP  | 
                    |
| 184 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 185 | 
                        +# @DESCRIPTION:  | 
                    |
| 186 | 
                        +# This is a backwards-compatibility placeholder. Use PYTHON_USEDEP  | 
                    |
| 187 | 
                        +# instead.  | 
                    |
| 188 | 
                        +  | 
                    |
| 189 | 
                        +# @ECLASS-VARIABLE: PYTHON_REQUIRED_USE  | 
                    |
| 190 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 191 | 
                        +# @DESCRIPTION:  | 
                    |
| 192 | 
                        +# This is an eclass-generated required-use expression which ensures  | 
                    |
| 193 | 
                        +# that exactly one PYTHON_SINGLE_TARGET value has been enabled.  | 
                    |
| 194 | 
                        +#  | 
                    |
| 195 | 
                        +# This expression should be utilized in an ebuild by including it in  | 
                    |
| 196 | 
                        +# REQUIRED_USE, optionally behind a use flag.  | 
                    |
| 197 | 
                        +#  | 
                    |
| 198 | 
                        +# Example use:  | 
                    |
| 199 | 
                        +# @CODE  | 
                    |
| 200 | 
                        +# REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
                       | 
                    |
| 201 | 
                        +# @CODE  | 
                    |
| 202 | 
                        +#  | 
                    |
| 203 | 
                        +# Example value:  | 
                    |
| 204 | 
                        +# @CODE  | 
                    |
| 205 | 
                        +# ^^ ( python_single_target_python2_7 python_single_target_python3_3 )  | 
                    |
| 206 | 
                        +# @CODE  | 
                    |
| 207 | 
                        +  | 
                    |
| 208 | 
                        +_python_single_set_globals() {
                       | 
                    |
| 209 | 
                        + _python_set_impls  | 
                    |
| 210 | 
                        +  | 
                    |
| 211 | 
                        +	local flags=( "${_PYTHON_SUPPORTED_IMPLS[@]/#/python_single_target_}" )
                       | 
                    |
| 212 | 
                        +  | 
                    |
| 213 | 
                        +	if [[ ${#_PYTHON_SUPPORTED_IMPLS[@]} -eq 1 ]]; then
                       | 
                    |
| 214 | 
                        + # if only one implementation is supported, use IUSE defaults  | 
                    |
| 215 | 
                        + # to avoid requesting the user to enable it  | 
                    |
| 216 | 
                        +		IUSE="+${flags[0]}"
                       | 
                    |
| 217 | 
                        + else  | 
                    |
| 218 | 
                        +		IUSE="${flags[*]}"
                       | 
                    |
| 219 | 
                        + fi  | 
                    |
| 220 | 
                        +  | 
                    |
| 221 | 
                        +	local requse="^^ ( ${flags[*]} )"
                       | 
                    |
| 222 | 
                        +	local single_flags="${flags[@]/%/(-)?}"
                       | 
                    |
| 223 | 
                        +	local single_usedep=${single_flags// /,}
                       | 
                    |
| 224 | 
                        +  | 
                    |
| 225 | 
                        + local deps= i PYTHON_PKG_DEP  | 
                    |
| 226 | 
                        +	for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 227 | 
                        +		_python_export "${i}" PYTHON_PKG_DEP
                       | 
                    |
| 228 | 
                        + # 1) well, python-exec would suffice as an RDEP  | 
                    |
| 229 | 
                        + # but no point in making this overcomplex, BDEP doesn't hurt anyone  | 
                    |
| 230 | 
                        + # 2) python-exec should be built with all targets forced anyway  | 
                    |
| 231 | 
                        + # but if new targets were added, we may need to force a rebuild  | 
                    |
| 232 | 
                        +		deps+="python_single_target_${i}? (
                       | 
                    |
| 233 | 
                        +			${PYTHON_PKG_DEP}
                       | 
                    |
| 234 | 
                        +			>=dev-lang/python-exec-2:=[python_targets_${i}]
                       | 
                    |
| 235 | 
                        + ) "  | 
                    |
| 236 | 
                        + done  | 
                    |
| 237 | 
                        +  | 
                    |
| 238 | 
                        +	if [[ ${PYTHON_DEPS+1} ]]; then
                       | 
                    |
| 239 | 
                        +		if [[ ${PYTHON_DEPS} != "${deps}" ]]; then
                       | 
                    |
| 240 | 
                        + eerror "PYTHON_DEPS have changed between inherits (PYTHON_REQ_USE?)!"  | 
                    |
| 241 | 
                        +			eerror "Before: ${PYTHON_DEPS}"
                       | 
                    |
| 242 | 
                        +			eerror "Now   : ${deps}"
                       | 
                    |
| 243 | 
                        + die "PYTHON_DEPS integrity check failed"  | 
                    |
| 244 | 
                        + fi  | 
                    |
| 245 | 
                        +  | 
                    |
| 246 | 
                        + # these two are formality -- they depend on PYTHON_COMPAT only  | 
                    |
| 247 | 
                        +		if [[ ${PYTHON_REQUIRED_USE} != ${requse} ]]; then
                       | 
                    |
| 248 | 
                        + eerror "PYTHON_REQUIRED_USE have changed between inherits!"  | 
                    |
| 249 | 
                        +			eerror "Before: ${PYTHON_REQUIRED_USE}"
                       | 
                    |
| 250 | 
                        +			eerror "Now   : ${requse}"
                       | 
                    |
| 251 | 
                        + die "PYTHON_REQUIRED_USE integrity check failed"  | 
                    |
| 252 | 
                        + fi  | 
                    |
| 253 | 
                        +  | 
                    |
| 254 | 
                        +		if [[ ${PYTHON_SINGLE_USEDEP} != "${single_usedep}" ]]; then
                       | 
                    |
| 255 | 
                        + eerror "PYTHON_SINGLE_USEDEP have changed between inherits!"  | 
                    |
| 256 | 
                        +			eerror "Before: ${PYTHON_SINGLE_USEDEP}"
                       | 
                    |
| 257 | 
                        +			eerror "Now   : ${single_usedep}"
                       | 
                    |
| 258 | 
                        + die "PYTHON_SINGLE_USEDEP integrity check failed"  | 
                    |
| 259 | 
                        + fi  | 
                    |
| 260 | 
                        + else  | 
                    |
| 261 | 
                        +		PYTHON_DEPS=${deps}
                       | 
                    |
| 262 | 
                        +		PYTHON_REQUIRED_USE=${requse}
                       | 
                    |
| 263 | 
                        + PYTHON_USEDEP='%PYTHON_USEDEP-NEEDS-TO-BE-USED-IN-PYTHON_GEN_COND_DEP%'  | 
                    |
| 264 | 
                        +		PYTHON_SINGLE_USEDEP=${single_usedep}
                       | 
                    |
| 265 | 
                        + readonly PYTHON_DEPS PYTHON_REQUIRED_USE PYTHON_SINGLE_USEDEP \  | 
                    |
| 266 | 
                        + PYTHON_USEDEP  | 
                    |
| 267 | 
                        + fi  | 
                    |
| 268 | 
                        +}  | 
                    |
| 269 | 
                        +_python_single_set_globals  | 
                    |
| 270 | 
                        +unset -f _python_single_set_globals  | 
                    |
| 271 | 
                        +  | 
                    |
| 272 | 
                        +if [[ ! ${_PYTHON_SINGLE_R1} ]]; then
                       | 
                    |
| 273 | 
                        +  | 
                    |
| 274 | 
                        +# @FUNCTION: _python_gen_usedep  | 
                    |
| 275 | 
                        +# @USAGE: [<pattern>...]  | 
                    |
| 276 | 
                        +# @INTERNAL  | 
                    |
| 277 | 
                        +# @DESCRIPTION:  | 
                    |
| 278 | 
                        +# Output a USE dependency string for Python implementations which  | 
                    |
| 279 | 
                        +# are both in PYTHON_COMPAT and match any of the patterns passed  | 
                    |
| 280 | 
                        +# as parameters to the function.  | 
                    |
| 281 | 
                        +#  | 
                    |
| 282 | 
                        +# The patterns can be either fnmatch-style patterns (matched via bash  | 
                    |
| 283 | 
                        +# == operator against PYTHON_COMPAT values) or '-2' / '-3' to indicate  | 
                    |
| 284 | 
                        +# appropriately all enabled Python 2/3 implementations (alike  | 
                    |
| 285 | 
                        +# python_is_python3). Remember to escape or quote the fnmatch patterns  | 
                    |
| 286 | 
                        +# to prevent accidental shell filename expansion.  | 
                    |
| 287 | 
                        +#  | 
                    |
| 288 | 
                        +# This is an internal function used to implement python_gen_cond_dep.  | 
                    |
| 289 | 
                        +_python_gen_usedep() {
                       | 
                    |
| 290 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 291 | 
                        +  | 
                    |
| 292 | 
                        + local impl matches=()  | 
                    |
| 293 | 
                        +  | 
                    |
| 294 | 
                        +	_python_verify_patterns "${@}"
                       | 
                    |
| 295 | 
                        +	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 296 | 
                        +		if _python_impl_matches "${impl}" "${@}"; then
                       | 
                    |
| 297 | 
                        + matches+=(  | 
                    |
| 298 | 
                        +				"python_single_target_${impl}(-)?"
                       | 
                    |
| 299 | 
                        + )  | 
                    |
| 300 | 
                        + fi  | 
                    |
| 301 | 
                        + done  | 
                    |
| 302 | 
                        +  | 
                    |
| 303 | 
                        +	[[ ${matches[@]} ]] || die "No supported implementations match python_gen_usedep patterns: ${@}"
                       | 
                    |
| 304 | 
                        +  | 
                    |
| 305 | 
                        +	local out=${matches[@]}
                       | 
                    |
| 306 | 
                        +	echo "${out// /,}"
                       | 
                    |
| 307 | 
                        +}  | 
                    |
| 308 | 
                        +  | 
                    |
| 309 | 
                        +# @FUNCTION: python_gen_useflags  | 
                    |
| 310 | 
                        +# @USAGE: [<pattern>...]  | 
                    |
| 311 | 
                        +# @DESCRIPTION:  | 
                    |
| 312 | 
                        +# Output a list of USE flags for Python implementations which  | 
                    |
| 313 | 
                        +# are both in PYTHON_COMPAT and match any of the patterns passed  | 
                    |
| 314 | 
                        +# as parameters to the function.  | 
                    |
| 315 | 
                        +#  | 
                    |
| 316 | 
                        +# The patterns can be either fnmatch-style patterns (matched via bash  | 
                    |
| 317 | 
                        +# == operator against PYTHON_COMPAT values) or '-2' / '-3' to indicate  | 
                    |
| 318 | 
                        +# appropriately all enabled Python 2/3 implementations (alike  | 
                    |
| 319 | 
                        +# python_is_python3). Remember to escape or quote the fnmatch patterns  | 
                    |
| 320 | 
                        +# to prevent accidental shell filename expansion.  | 
                    |
| 321 | 
                        +#  | 
                    |
| 322 | 
                        +# Example:  | 
                    |
| 323 | 
                        +# @CODE  | 
                    |
| 324 | 
                        +# PYTHON_COMPAT=( python{2_7,3_4} )
                       | 
                    |
| 325 | 
                        +# REQUIRED_USE="doc? ( ^^ ( $(python_gen_useflags 'python2*') ) )"  | 
                    |
| 326 | 
                        +# @CODE  | 
                    |
| 327 | 
                        +#  | 
                    |
| 328 | 
                        +# It will cause the variable to look like:  | 
                    |
| 329 | 
                        +# @CODE  | 
                    |
| 330 | 
                        +# REQUIRED_USE="doc? ( ^^ ( python_single_target_python2_7 ) )"  | 
                    |
| 331 | 
                        +# @CODE  | 
                    |
| 332 | 
                        +python_gen_useflags() {
                       | 
                    |
| 333 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 334 | 
                        +  | 
                    |
| 335 | 
                        + local impl matches=()  | 
                    |
| 336 | 
                        +  | 
                    |
| 337 | 
                        +	_python_verify_patterns "${@}"
                       | 
                    |
| 338 | 
                        +	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 339 | 
                        +		if _python_impl_matches "${impl}" "${@}"; then
                       | 
                    |
| 340 | 
                        +			matches+=( "python_single_target_${impl}" )
                       | 
                    |
| 341 | 
                        + fi  | 
                    |
| 342 | 
                        + done  | 
                    |
| 343 | 
                        +  | 
                    |
| 344 | 
                        +	echo "${matches[@]}"
                       | 
                    |
| 345 | 
                        +}  | 
                    |
| 346 | 
                        +  | 
                    |
| 347 | 
                        +# @FUNCTION: python_gen_cond_dep  | 
                    |
| 348 | 
                        +# @USAGE: <dependency> [<pattern>...]  | 
                    |
| 349 | 
                        +# @DESCRIPTION:  | 
                    |
| 350 | 
                        +# Output a list of <dependency>-ies made conditional to USE flags  | 
                    |
| 351 | 
                        +# of Python implementations which are both in PYTHON_COMPAT and match  | 
                    |
| 352 | 
                        +# any of the patterns passed as the remaining parameters.  | 
                    |
| 353 | 
                        +#  | 
                    |
| 354 | 
                        +# The patterns can be either fnmatch-style patterns (matched via bash  | 
                    |
| 355 | 
                        +# == operator against PYTHON_COMPAT values) or '-2' / '-3' to indicate  | 
                    |
| 356 | 
                        +# appropriately all enabled Python 2/3 implementations (alike  | 
                    |
| 357 | 
                        +# python_is_python3). Remember to escape or quote the fnmatch patterns  | 
                    |
| 358 | 
                        +# to prevent accidental shell filename expansion.  | 
                    |
| 359 | 
                        +#  | 
                    |
| 360 | 
                        +# In order to enforce USE constraints on the packages, verbatim  | 
                    |
| 361 | 
                        +# '${PYTHON_SINGLE_USEDEP}' and '${PYTHON_USEDEP}' (quoted!) may
                       | 
                    |
| 362 | 
                        +# be placed in the dependency specification. It will get expanded within  | 
                    |
| 363 | 
                        +# the function into a proper USE dependency string.  | 
                    |
| 364 | 
                        +#  | 
                    |
| 365 | 
                        +# Example:  | 
                    |
| 366 | 
                        +# @CODE  | 
                    |
| 367 | 
                        +# PYTHON_COMPAT=( python{2_7,3_{3,4}} pypy )
                       | 
                    |
| 368 | 
                        +# RDEPEND="$(python_gen_cond_dep \  | 
                    |
| 369 | 
                        +#   'dev-python/unittest2[${PYTHON_USEDEP}]' python2_7 pypy )"
                       | 
                    |
| 370 | 
                        +# @CODE  | 
                    |
| 371 | 
                        +#  | 
                    |
| 372 | 
                        +# It will cause the variable to look like:  | 
                    |
| 373 | 
                        +# @CODE  | 
                    |
| 374 | 
                        +# RDEPEND="python_single_target_python2_7? (  | 
                    |
| 375 | 
                        +# dev-python/unittest2[python_targets_python2_7(-)?,...] )  | 
                    |
| 376 | 
                        +# python_single_target_pypy? (  | 
                    |
| 377 | 
                        +# dev-python/unittest2[python_targets_pypy(-)?,...] )"  | 
                    |
| 378 | 
                        +# @CODE  | 
                    |
| 379 | 
                        +python_gen_cond_dep() {
                       | 
                    |
| 380 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 381 | 
                        +  | 
                    |
| 382 | 
                        + local impl matches=()  | 
                    |
| 383 | 
                        +  | 
                    |
| 384 | 
                        +	local dep=${1}
                       | 
                    |
| 385 | 
                        + shift  | 
                    |
| 386 | 
                        +  | 
                    |
| 387 | 
                        +	_python_verify_patterns "${@}"
                       | 
                    |
| 388 | 
                        +	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 389 | 
                        +		if _python_impl_matches "${impl}" "${@}"; then
                       | 
                    |
| 390 | 
                        +			# substitute ${PYTHON_SINGLE_USEDEP} if used
                       | 
                    |
| 391 | 
                        + # (since python_gen_usedep() will not return  | 
                    |
| 392 | 
                        +			#  ${PYTHON_SINGLE_USEDEP}, the code is run at most once)
                       | 
                    |
| 393 | 
                        +			if [[ ${dep} == *'${PYTHON_SINGLE_USEDEP}'* ]]; then
                       | 
                    |
| 394 | 
                        +				local usedep=$(_python_gen_usedep "${@}")
                       | 
                    |
| 395 | 
                        +				dep=${dep//\$\{PYTHON_SINGLE_USEDEP\}/${usedep}}
                       | 
                    |
| 396 | 
                        + fi  | 
                    |
| 397 | 
                        +			local multi_usedep="python_targets_${impl}(-)"
                       | 
                    |
| 398 | 
                        +  | 
                    |
| 399 | 
                        +			local subdep=${dep//\$\{PYTHON_MULTI_USEDEP\}/${multi_usedep}}
                       | 
                    |
| 400 | 
                        +			matches+=( "python_single_target_${impl}? (
                       | 
                    |
| 401 | 
                        +				${subdep//\$\{PYTHON_USEDEP\}/${multi_usedep}} )" )
                       | 
                    |
| 402 | 
                        + fi  | 
                    |
| 403 | 
                        + done  | 
                    |
| 404 | 
                        +  | 
                    |
| 405 | 
                        +	echo "${matches[@]}"
                       | 
                    |
| 406 | 
                        +}  | 
                    |
| 407 | 
                        +  | 
                    |
| 408 | 
                        +# @FUNCTION: python_gen_impl_dep  | 
                    |
| 409 | 
                        +# @USAGE: [<requested-use-flags> [<impl-pattern>...]]  | 
                    |
| 410 | 
                        +# @DESCRIPTION:  | 
                    |
| 411 | 
                        +# Output a dependency on Python implementations with the specified USE  | 
                    |
| 412 | 
                        +# dependency string appended, or no USE dependency string if called  | 
                    |
| 413 | 
                        +# without the argument (or with empty argument). If any implementation  | 
                    |
| 414 | 
                        +# patterns are passed, the output dependencies will be generated only  | 
                    |
| 415 | 
                        +# for the implementations matching them.  | 
                    |
| 416 | 
                        +#  | 
                    |
| 417 | 
                        +# The patterns can be either fnmatch-style patterns (matched via bash  | 
                    |
| 418 | 
                        +# == operator against PYTHON_COMPAT values) or '-2' / '-3' to indicate  | 
                    |
| 419 | 
                        +# appropriately all enabled Python 2/3 implementations (alike  | 
                    |
| 420 | 
                        +# python_is_python3). Remember to escape or quote the fnmatch patterns  | 
                    |
| 421 | 
                        +# to prevent accidental shell filename expansion.  | 
                    |
| 422 | 
                        +#  | 
                    |
| 423 | 
                        +# Use this function when you need to request different USE flags  | 
                    |
| 424 | 
                        +# on the Python interpreter depending on package's USE flags. If you  | 
                    |
| 425 | 
                        +# only need a single set of interpreter USE flags, just set  | 
                    |
| 426 | 
                        +# PYTHON_REQ_USE and use ${PYTHON_DEPS} globally.
                       | 
                    |
| 427 | 
                        +#  | 
                    |
| 428 | 
                        +# Example:  | 
                    |
| 429 | 
                        +# @CODE  | 
                    |
| 430 | 
                        +# PYTHON_COMPAT=( python{2_7,3_{3,4}} pypy )
                       | 
                    |
| 431 | 
                        +# RDEPEND="foo? ( $(python_gen_impl_dep 'xml(+)') )"  | 
                    |
| 432 | 
                        +# @CODE  | 
                    |
| 433 | 
                        +#  | 
                    |
| 434 | 
                        +# It will cause the variable to look like:  | 
                    |
| 435 | 
                        +# @CODE  | 
                    |
| 436 | 
                        +# RDEPEND="foo? (  | 
                    |
| 437 | 
                        +# python_single_target_python2_7? (  | 
                    |
| 438 | 
                        +# dev-lang/python:2.7[xml(+)] )  | 
                    |
| 439 | 
                        +# python_single_target_pypy? (  | 
                    |
| 440 | 
                        +# dev-python/pypy[xml(+)] ) )"  | 
                    |
| 441 | 
                        +# @CODE  | 
                    |
| 442 | 
                        +python_gen_impl_dep() {
                       | 
                    |
| 443 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 444 | 
                        +  | 
                    |
| 445 | 
                        + local impl  | 
                    |
| 446 | 
                        + local matches=()  | 
                    |
| 447 | 
                        +  | 
                    |
| 448 | 
                        +	local PYTHON_REQ_USE=${1}
                       | 
                    |
| 449 | 
                        + shift  | 
                    |
| 450 | 
                        +  | 
                    |
| 451 | 
                        +	_python_verify_patterns "${@}"
                       | 
                    |
| 452 | 
                        +	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 453 | 
                        +		if _python_impl_matches "${impl}" "${@}"; then
                       | 
                    |
| 454 | 
                        + local PYTHON_PKG_DEP  | 
                    |
| 455 | 
                        +			_python_export "${impl}" PYTHON_PKG_DEP
                       | 
                    |
| 456 | 
                        +			matches+=( "python_single_target_${impl}? ( ${PYTHON_PKG_DEP} )" )
                       | 
                    |
| 457 | 
                        + fi  | 
                    |
| 458 | 
                        + done  | 
                    |
| 459 | 
                        +  | 
                    |
| 460 | 
                        +	echo "${matches[@]}"
                       | 
                    |
| 461 | 
                        +}  | 
                    |
| 462 | 
                        +  | 
                    |
| 463 | 
                        +# @FUNCTION: python_setup  | 
                    |
| 464 | 
                        +# @DESCRIPTION:  | 
                    |
| 465 | 
                        +# Determine what the selected Python implementation is and set  | 
                    |
| 466 | 
                        +# the Python build environment up for it.  | 
                    |
| 467 | 
                        +python_setup() {
                       | 
                    |
| 468 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 469 | 
                        +  | 
                    |
| 470 | 
                        + unset EPYTHON  | 
                    |
| 471 | 
                        +  | 
                    |
| 472 | 
                        + # support developer override  | 
                    |
| 473 | 
                        +	if [[ ${PYTHON_COMPAT_OVERRIDE} ]]; then
                       | 
                    |
| 474 | 
                        +		local impls=( ${PYTHON_COMPAT_OVERRIDE} )
                       | 
                    |
| 475 | 
                        +		[[ ${#impls[@]} -eq 1 ]] || die "PYTHON_COMPAT_OVERRIDE must name exactly one implementation for python-single-r1"
                       | 
                    |
| 476 | 
                        +  | 
                    |
| 477 | 
                        + ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"  | 
                    |
| 478 | 
                        + ewarn "implementation will be used:"  | 
                    |
| 479 | 
                        + ewarn  | 
                    |
| 480 | 
                        +		ewarn "	${PYTHON_COMPAT_OVERRIDE}"
                       | 
                    |
| 481 | 
                        + ewarn  | 
                    |
| 482 | 
                        + ewarn "Dependencies won't be satisfied, and PYTHON_SINGLE_TARGET flags will be ignored."  | 
                    |
| 483 | 
                        +  | 
                    |
| 484 | 
                        +		_python_export "${impls[0]}" EPYTHON PYTHON
                       | 
                    |
| 485 | 
                        + _python_wrapper_setup  | 
                    |
| 486 | 
                        +		einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 487 | 
                        + return  | 
                    |
| 488 | 
                        + fi  | 
                    |
| 489 | 
                        +  | 
                    |
| 490 | 
                        + local impl  | 
                    |
| 491 | 
                        +	for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 492 | 
                        +		if use "python_single_target_${impl}"; then
                       | 
                    |
| 493 | 
                        +			if [[ ${EPYTHON} ]]; then
                       | 
                    |
| 494 | 
                        + eerror "Your PYTHON_SINGLE_TARGET setting lists more than a single Python"  | 
                    |
| 495 | 
                        + eerror "implementation. Please set it to just one value. If you need"  | 
                    |
| 496 | 
                        + eerror "to override the value for a single package, please use package.env"  | 
                    |
| 497 | 
                        + eerror "or an equivalent solution (man 5 portage)."  | 
                    |
| 498 | 
                        + echo  | 
                    |
| 499 | 
                        + die "More than one implementation in PYTHON_SINGLE_TARGET."  | 
                    |
| 500 | 
                        + fi  | 
                    |
| 501 | 
                        +  | 
                    |
| 502 | 
                        +			_python_export "${impl}" EPYTHON PYTHON
                       | 
                    |
| 503 | 
                        + _python_wrapper_setup  | 
                    |
| 504 | 
                        +			einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 505 | 
                        + fi  | 
                    |
| 506 | 
                        + done  | 
                    |
| 507 | 
                        +  | 
                    |
| 508 | 
                        +	if [[ ! ${EPYTHON} ]]; then
                       | 
                    |
| 509 | 
                        + eerror "No Python implementation selected for the build. Please set"  | 
                    |
| 510 | 
                        + eerror "the PYTHON_SINGLE_TARGET variable in your make.conf to one"  | 
                    |
| 511 | 
                        + eerror "of the following values:"  | 
                    |
| 512 | 
                        + eerror  | 
                    |
| 513 | 
                        +		eerror "${_PYTHON_SUPPORTED_IMPLS[@]}"
                       | 
                    |
| 514 | 
                        + echo  | 
                    |
| 515 | 
                        + die "No supported Python implementation in PYTHON_SINGLE_TARGET."  | 
                    |
| 516 | 
                        + fi  | 
                    |
| 517 | 
                        +}  | 
                    |
| 518 | 
                        +  | 
                    |
| 519 | 
                        +# @FUNCTION: python-single-r1_pkg_setup  | 
                    |
| 520 | 
                        +# @DESCRIPTION:  | 
                    |
| 521 | 
                        +# Runs python_setup.  | 
                    |
| 522 | 
                        +python-single-r1_pkg_setup() {
                       | 
                    |
| 523 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 524 | 
                        +  | 
                    |
| 525 | 
                        +	[[ ${MERGE_TYPE} != binary ]] && python_setup
                       | 
                    |
| 526 | 
                        +}  | 
                    |
| 527 | 
                        +  | 
                    |
| 528 | 
                        +_PYTHON_SINGLE_R1=1  | 
                    |
| 529 | 
                        +fi  | 
                    |
| 0 | 530 |