Hanno Böck commited on 2021-01-31 08:46:01
              Zeige 2 geänderte Dateien mit 1840 Einfügungen und 0 Löschungen.
            
| ... | ... | 
                      @@ -0,0 +1,395 @@  | 
                  
| 1 | 
                        +# Copyright 1999-2020 Gentoo Authors  | 
                    |
| 2 | 
                        +# Distributed under the terms of the GNU General Public License v2  | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +# @ECLASS: python-any-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 packages having build-time dependency on Python.  | 
                    |
| 12 | 
                        +# @DESCRIPTION:  | 
                    |
| 13 | 
                        +# A minimal eclass for packages which need any Python interpreter  | 
                    |
| 14 | 
                        +# installed without a need for explicit choice and invariability.  | 
                    |
| 15 | 
                        +# This usually involves packages requiring Python at build-time  | 
                    |
| 16 | 
                        +# but having no other relevance to it.  | 
                    |
| 17 | 
                        +#  | 
                    |
| 18 | 
                        +# This eclass provides a minimal PYTHON_DEPS variable with a dependency  | 
                    |
| 19 | 
                        +# string on any of the supported Python implementations. It also exports  | 
                    |
| 20 | 
                        +# pkg_setup() which finds the best supported implementation and sets it  | 
                    |
| 21 | 
                        +# as the active one.  | 
                    |
| 22 | 
                        +#  | 
                    |
| 23 | 
                        +# Optionally, you can define a python_check_deps() function. It will  | 
                    |
| 24 | 
                        +# be called by the eclass with EPYTHON set to each matching Python  | 
                    |
| 25 | 
                        +# implementation and it is expected to check whether the implementation  | 
                    |
| 26 | 
                        +# fulfills the package requirements. You can use the locally exported  | 
                    |
| 27 | 
                        +# PYTHON_USEDEP or PYTHON_SINGLE_USEDEP to check USE-dependencies  | 
                    |
| 28 | 
                        +# of relevant packages. It should return a true value (0) if the Python  | 
                    |
| 29 | 
                        +# implementation fulfills the requirements, a false value (non-zero)  | 
                    |
| 30 | 
                        +# otherwise.  | 
                    |
| 31 | 
                        +#  | 
                    |
| 32 | 
                        +# Please note that python-any-r1 will always inherit python-utils-r1  | 
                    |
| 33 | 
                        +# as well. Thus, all the functions defined there can be used in the  | 
                    |
| 34 | 
                        +# packages using python-any-r1, and there is no need ever to inherit  | 
                    |
| 35 | 
                        +# both.  | 
                    |
| 36 | 
                        +#  | 
                    |
| 37 | 
                        +# For more information, please see the Python Guide:  | 
                    |
| 38 | 
                        +# https://dev.gentoo.org/~mgorny/python-guide/  | 
                    |
| 39 | 
                        +  | 
                    |
| 40 | 
                        +case "${EAPI:-0}" in
                       | 
                    |
| 41 | 
                        +	[0-4]) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;;
                       | 
                    |
| 42 | 
                        + [5-7]) ;;  | 
                    |
| 43 | 
                        +	*)     die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
                       | 
                    |
| 44 | 
                        +esac  | 
                    |
| 45 | 
                        +  | 
                    |
| 46 | 
                        +if [[ ! ${_PYTHON_ANY_R1} ]]; then
                       | 
                    |
| 47 | 
                        +  | 
                    |
| 48 | 
                        +if [[ ${_PYTHON_R1} ]]; then
                       | 
                    |
| 49 | 
                        + die 'python-any-r1.eclass can not be used with python-r1.eclass.'  | 
                    |
| 50 | 
                        +elif [[ ${_PYTHON_SINGLE_R1} ]]; then
                       | 
                    |
| 51 | 
                        + die 'python-any-r1.eclass can not be used with python-single-r1.eclass.'  | 
                    |
| 52 | 
                        +fi  | 
                    |
| 53 | 
                        +  | 
                    |
| 54 | 
                        +inherit python-utils-r1  | 
                    |
| 55 | 
                        +  | 
                    |
| 56 | 
                        +fi  | 
                    |
| 57 | 
                        +  | 
                    |
| 58 | 
                        +EXPORT_FUNCTIONS pkg_setup  | 
                    |
| 59 | 
                        +  | 
                    |
| 60 | 
                        +# @ECLASS-VARIABLE: PYTHON_COMPAT  | 
                    |
| 61 | 
                        +# @REQUIRED  | 
                    |
| 62 | 
                        +# @DESCRIPTION:  | 
                    |
| 63 | 
                        +# This variable contains a list of Python implementations the package  | 
                    |
| 64 | 
                        +# supports. It must be set before the `inherit' call. It has to be  | 
                    |
| 65 | 
                        +# an array.  | 
                    |
| 66 | 
                        +#  | 
                    |
| 67 | 
                        +# Example:  | 
                    |
| 68 | 
                        +# @CODE  | 
                    |
| 69 | 
                        +# PYTHON_COMPAT=( python{2_5,2_6,2_7} )
                       | 
                    |
| 70 | 
                        +# @CODE  | 
                    |
| 71 | 
                        +  | 
                    |
| 72 | 
                        +# @ECLASS-VARIABLE: PYTHON_COMPAT_OVERRIDE  | 
                    |
| 73 | 
                        +# @USER_VARIABLE  | 
                    |
| 74 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 75 | 
                        +# @DESCRIPTION:  | 
                    |
| 76 | 
                        +# This variable can be used when working with ebuilds to override  | 
                    |
| 77 | 
                        +# the in-ebuild PYTHON_COMPAT. It is a string naming the implementation  | 
                    |
| 78 | 
                        +# which will be used to build the package. It needs to be specified  | 
                    |
| 79 | 
                        +# in the calling environment, and not in ebuilds.  | 
                    |
| 80 | 
                        +#  | 
                    |
| 81 | 
                        +# It should be noted that in order to preserve metadata immutability,  | 
                    |
| 82 | 
                        +# PYTHON_COMPAT_OVERRIDE does not affect dependencies. The value of  | 
                    |
| 83 | 
                        +# EPYTHON and eselect-python preferences are ignored. Dependencies need  | 
                    |
| 84 | 
                        +# to be satisfied manually.  | 
                    |
| 85 | 
                        +#  | 
                    |
| 86 | 
                        +# Example:  | 
                    |
| 87 | 
                        +# @CODE  | 
                    |
| 88 | 
                        +# PYTHON_COMPAT_OVERRIDE='pypy' emerge -1v dev-python/bar  | 
                    |
| 89 | 
                        +# @CODE  | 
                    |
| 90 | 
                        +  | 
                    |
| 91 | 
                        +# @ECLASS-VARIABLE: PYTHON_REQ_USE  | 
                    |
| 92 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 93 | 
                        +# @DESCRIPTION:  | 
                    |
| 94 | 
                        +# The list of USEflags required to be enabled on the Python  | 
                    |
| 95 | 
                        +# implementations, formed as a USE-dependency string. It should be valid  | 
                    |
| 96 | 
                        +# for all implementations in PYTHON_COMPAT, so it may be necessary to  | 
                    |
| 97 | 
                        +# use USE defaults.  | 
                    |
| 98 | 
                        +#  | 
                    |
| 99 | 
                        +# Example:  | 
                    |
| 100 | 
                        +# @CODE  | 
                    |
| 101 | 
                        +# PYTHON_REQ_USE="gdbm,ncurses(-)?"  | 
                    |
| 102 | 
                        +# @CODE  | 
                    |
| 103 | 
                        +#  | 
                    |
| 104 | 
                        +# It will cause the Python dependencies to look like:  | 
                    |
| 105 | 
                        +# @CODE  | 
                    |
| 106 | 
                        +# || ( dev-lang/python:X.Y[gdbm,ncurses(-)?] ... )  | 
                    |
| 107 | 
                        +# @CODE  | 
                    |
| 108 | 
                        +  | 
                    |
| 109 | 
                        +# @ECLASS-VARIABLE: PYTHON_DEPS  | 
                    |
| 110 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 111 | 
                        +# @DESCRIPTION:  | 
                    |
| 112 | 
                        +# This is an eclass-generated Python dependency string for all  | 
                    |
| 113 | 
                        +# implementations listed in PYTHON_COMPAT.  | 
                    |
| 114 | 
                        +#  | 
                    |
| 115 | 
                        +# Any of the supported interpreters will satisfy the dependency.  | 
                    |
| 116 | 
                        +#  | 
                    |
| 117 | 
                        +# Example use:  | 
                    |
| 118 | 
                        +# @CODE  | 
                    |
| 119 | 
                        +# DEPEND="${RDEPEND}
                       | 
                    |
| 120 | 
                        +#	${PYTHON_DEPS}"
                       | 
                    |
| 121 | 
                        +# @CODE  | 
                    |
| 122 | 
                        +#  | 
                    |
| 123 | 
                        +# Example value:  | 
                    |
| 124 | 
                        +# @CODE  | 
                    |
| 125 | 
                        +# || ( dev-lang/python:2.7[gdbm]  | 
                    |
| 126 | 
                        +# dev-lang/python:2.6[gdbm] )  | 
                    |
| 127 | 
                        +# @CODE  | 
                    |
| 128 | 
                        +  | 
                    |
| 129 | 
                        +# @ECLASS-VARIABLE: PYTHON_USEDEP  | 
                    |
| 130 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 131 | 
                        +# @DESCRIPTION:  | 
                    |
| 132 | 
                        +# An eclass-generated USE-dependency string for the currently tested  | 
                    |
| 133 | 
                        +# implementation. It is set locally for python_check_deps() call.  | 
                    |
| 134 | 
                        +#  | 
                    |
| 135 | 
                        +# The generated USE-flag list is compatible with packages using  | 
                    |
| 136 | 
                        +# python-r1 eclass. For python-single-r1 dependencies,  | 
                    |
| 137 | 
                        +# use PYTHON_SINGLE_USEDEP.  | 
                    |
| 138 | 
                        +#  | 
                    |
| 139 | 
                        +# Example use:  | 
                    |
| 140 | 
                        +# @CODE  | 
                    |
| 141 | 
                        +# python_check_deps() {
                       | 
                    |
| 142 | 
                        +# 	has_version "dev-python/foo[${PYTHON_USEDEP}]"
                       | 
                    |
| 143 | 
                        +# }  | 
                    |
| 144 | 
                        +# @CODE  | 
                    |
| 145 | 
                        +#  | 
                    |
| 146 | 
                        +# Example value:  | 
                    |
| 147 | 
                        +# @CODE  | 
                    |
| 148 | 
                        +# python_targets_python3_7(-),-python_single_target_python3_7(-)  | 
                    |
| 149 | 
                        +# @CODE  | 
                    |
| 150 | 
                        +  | 
                    |
| 151 | 
                        +# @ECLASS-VARIABLE: PYTHON_SINGLE_USEDEP  | 
                    |
| 152 | 
                        +# @OUTPUT_VARIABLE  | 
                    |
| 153 | 
                        +# @DESCRIPTION:  | 
                    |
| 154 | 
                        +# An eclass-generated USE-dependency string for the currently tested  | 
                    |
| 155 | 
                        +# implementation. It is set locally for python_check_deps() call.  | 
                    |
| 156 | 
                        +#  | 
                    |
| 157 | 
                        +# The generated USE-flag list is compatible with packages using  | 
                    |
| 158 | 
                        +# python-single-r1 eclass. For python-r1 dependencies,  | 
                    |
| 159 | 
                        +# use PYTHON_USEDEP.  | 
                    |
| 160 | 
                        +#  | 
                    |
| 161 | 
                        +# Example use:  | 
                    |
| 162 | 
                        +# @CODE  | 
                    |
| 163 | 
                        +# python_check_deps() {
                       | 
                    |
| 164 | 
                        +# 	has_version "dev-python/bar[${PYTHON_SINGLE_USEDEP}]"
                       | 
                    |
| 165 | 
                        +# }  | 
                    |
| 166 | 
                        +# @CODE  | 
                    |
| 167 | 
                        +#  | 
                    |
| 168 | 
                        +# Example value:  | 
                    |
| 169 | 
                        +# @CODE  | 
                    |
| 170 | 
                        +# python_single_target_python3_7(-)  | 
                    |
| 171 | 
                        +# @CODE  | 
                    |
| 172 | 
                        +  | 
                    |
| 173 | 
                        +_python_any_set_globals() {
                       | 
                    |
| 174 | 
                        + local usestr deps i PYTHON_PKG_DEP  | 
                    |
| 175 | 
                        +	[[ ${PYTHON_REQ_USE} ]] && usestr="[${PYTHON_REQ_USE}]"
                       | 
                    |
| 176 | 
                        +  | 
                    |
| 177 | 
                        + _python_set_impls  | 
                    |
| 178 | 
                        +  | 
                    |
| 179 | 
                        +	for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 180 | 
                        +		_python_export "${i}" PYTHON_PKG_DEP
                       | 
                    |
| 181 | 
                        +  | 
                    |
| 182 | 
                        + # note: need to strip '=' slot operator for || deps  | 
                    |
| 183 | 
                        +		deps="${PYTHON_PKG_DEP/:0=/:0} ${deps}"
                       | 
                    |
| 184 | 
                        + done  | 
                    |
| 185 | 
                        +	deps="|| ( ${deps})"
                       | 
                    |
| 186 | 
                        +  | 
                    |
| 187 | 
                        +	if [[ ${PYTHON_DEPS+1} ]]; then
                       | 
                    |
| 188 | 
                        +		if [[ ${PYTHON_DEPS} != "${deps}" ]]; then
                       | 
                    |
| 189 | 
                        + eerror "PYTHON_DEPS have changed between inherits (PYTHON_REQ_USE?)!"  | 
                    |
| 190 | 
                        +			eerror "Before: ${PYTHON_DEPS}"
                       | 
                    |
| 191 | 
                        +			eerror "Now   : ${deps}"
                       | 
                    |
| 192 | 
                        + die "PYTHON_DEPS integrity check failed"  | 
                    |
| 193 | 
                        + fi  | 
                    |
| 194 | 
                        + else  | 
                    |
| 195 | 
                        +		PYTHON_DEPS=${deps}
                       | 
                    |
| 196 | 
                        + readonly PYTHON_DEPS  | 
                    |
| 197 | 
                        + fi  | 
                    |
| 198 | 
                        +  | 
                    |
| 199 | 
                        +	if [[ ! ${PYTHON_REQUIRED_USE+1} ]]; then
                       | 
                    |
| 200 | 
                        + # fake var to catch mistaken usage  | 
                    |
| 201 | 
                        + PYTHON_REQUIRED_USE='I-DO-NOT-EXIST-IN-PYTHON-ANY-R1'  | 
                    |
| 202 | 
                        + readonly PYTHON_REQUIRED_USE  | 
                    |
| 203 | 
                        + fi  | 
                    |
| 204 | 
                        +}  | 
                    |
| 205 | 
                        +_python_any_set_globals  | 
                    |
| 206 | 
                        +unset -f _python_any_set_globals  | 
                    |
| 207 | 
                        +  | 
                    |
| 208 | 
                        +if [[ ! ${_PYTHON_ANY_R1} ]]; then
                       | 
                    |
| 209 | 
                        +  | 
                    |
| 210 | 
                        +# @FUNCTION: python_gen_any_dep  | 
                    |
| 211 | 
                        +# @USAGE: <dependency-block>  | 
                    |
| 212 | 
                        +# @DESCRIPTION:  | 
                    |
| 213 | 
                        +# Generate an any-of dependency that enforces a version match between  | 
                    |
| 214 | 
                        +# the Python interpreter and Python packages. <dependency-block> needs  | 
                    |
| 215 | 
                        +# to list one or more dependencies with verbatim '${PYTHON_USEDEP}'
                       | 
                    |
| 216 | 
                        +# or '${PYTHON_SINGLE_USEDEP}' references (quoted!) that will get
                       | 
                    |
| 217 | 
                        +# expanded inside the function.  | 
                    |
| 218 | 
                        +#  | 
                    |
| 219 | 
                        +# This should be used along with an appropriate python_check_deps()  | 
                    |
| 220 | 
                        +# that checks which of the any-of blocks were matched.  | 
                    |
| 221 | 
                        +#  | 
                    |
| 222 | 
                        +# Example use:  | 
                    |
| 223 | 
                        +# @CODE  | 
                    |
| 224 | 
                        +# DEPEND="$(python_gen_any_dep '  | 
                    |
| 225 | 
                        +#	dev-python/foo[${PYTHON_SINGLE_USEDEP}]
                       | 
                    |
| 226 | 
                        +#	|| ( dev-python/bar[${PYTHON_USEDEP}]
                       | 
                    |
| 227 | 
                        +#		dev-python/baz[${PYTHON_USEDEP}] )')"
                       | 
                    |
| 228 | 
                        +#  | 
                    |
| 229 | 
                        +# python_check_deps() {
                       | 
                    |
| 230 | 
                        +#	has_version "dev-python/foo[${PYTHON_SINGLE_USEDEP}]" \
                       | 
                    |
| 231 | 
                        +#		&& { has_version "dev-python/bar[${PYTHON_USEDEP}]" \
                       | 
                    |
| 232 | 
                        +#			|| has_version "dev-python/baz[${PYTHON_USEDEP}]"; }
                       | 
                    |
| 233 | 
                        +# }  | 
                    |
| 234 | 
                        +# @CODE  | 
                    |
| 235 | 
                        +#  | 
                    |
| 236 | 
                        +# Example value:  | 
                    |
| 237 | 
                        +# @CODE  | 
                    |
| 238 | 
                        +# || (  | 
                    |
| 239 | 
                        +# (  | 
                    |
| 240 | 
                        +# dev-lang/python:3.7  | 
                    |
| 241 | 
                        +# dev-python/foo[python_single_target_python3_7(-)]  | 
                    |
| 242 | 
                        +# || ( dev-python/bar[python_targets_python3_7(-),-python_single_target_python3_7(-)]  | 
                    |
| 243 | 
                        +# dev-python/baz[python_targets_python3_7(-),-python_single_target_python3_7(-)] )  | 
                    |
| 244 | 
                        +# )  | 
                    |
| 245 | 
                        +# (  | 
                    |
| 246 | 
                        +# dev-lang/python:3.8  | 
                    |
| 247 | 
                        +# dev-python/foo[python_single_target_python3_8(-)]  | 
                    |
| 248 | 
                        +# || ( dev-python/bar[python_targets_python3_8(-),-python_single_target_python3_8(-)]  | 
                    |
| 249 | 
                        +# dev-python/baz[python_targets_python3_8(-),-python_single_target_python3_8(-)] )  | 
                    |
| 250 | 
                        +# )  | 
                    |
| 251 | 
                        +# )  | 
                    |
| 252 | 
                        +# @CODE  | 
                    |
| 253 | 
                        +python_gen_any_dep() {
                       | 
                    |
| 254 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 255 | 
                        +  | 
                    |
| 256 | 
                        +	local depstr=${1}
                       | 
                    |
| 257 | 
                        +	[[ ${depstr} ]] || die "No dependency string provided"
                       | 
                    |
| 258 | 
                        +  | 
                    |
| 259 | 
                        + local i PYTHON_PKG_DEP out=  | 
                    |
| 260 | 
                        +	for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do
                       | 
                    |
| 261 | 
                        +		local PYTHON_USEDEP="python_targets_${i}(-),-python_single_target_${i}(-)"
                       | 
                    |
| 262 | 
                        +		local PYTHON_SINGLE_USEDEP="python_single_target_${i}(-)"
                       | 
                    |
| 263 | 
                        +		_python_export "${i}" PYTHON_PKG_DEP
                       | 
                    |
| 264 | 
                        +  | 
                    |
| 265 | 
                        +		local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}
                       | 
                    |
| 266 | 
                        +		i_depstr=${i_depstr//\$\{PYTHON_SINGLE_USEDEP\}/${PYTHON_SINGLE_USEDEP}}
                       | 
                    |
| 267 | 
                        + # note: need to strip '=' slot operator for || deps  | 
                    |
| 268 | 
                        +		out="( ${PYTHON_PKG_DEP%=} ${i_depstr} ) ${out}"
                       | 
                    |
| 269 | 
                        + done  | 
                    |
| 270 | 
                        +	echo "|| ( ${out})"
                       | 
                    |
| 271 | 
                        +}  | 
                    |
| 272 | 
                        +  | 
                    |
| 273 | 
                        +# @FUNCTION: _python_EPYTHON_supported  | 
                    |
| 274 | 
                        +# @USAGE: <epython>  | 
                    |
| 275 | 
                        +# @INTERNAL  | 
                    |
| 276 | 
                        +# @DESCRIPTION:  | 
                    |
| 277 | 
                        +# Check whether the specified implementation is supported by package  | 
                    |
| 278 | 
                        +# (specified in PYTHON_COMPAT). Calls python_check_deps() if declared.  | 
                    |
| 279 | 
                        +_python_EPYTHON_supported() {
                       | 
                    |
| 280 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 281 | 
                        +  | 
                    |
| 282 | 
                        +	local EPYTHON=${1}
                       | 
                    |
| 283 | 
                        +	local i=${EPYTHON/./_}
                       | 
                    |
| 284 | 
                        +  | 
                    |
| 285 | 
                        +	case "${i}" in
                       | 
                    |
| 286 | 
                        + python*|jython*|pypy*)  | 
                    |
| 287 | 
                        + ;;  | 
                    |
| 288 | 
                        + *)  | 
                    |
| 289 | 
                        +			ewarn "Invalid EPYTHON: ${EPYTHON}"
                       | 
                    |
| 290 | 
                        + return 1  | 
                    |
| 291 | 
                        + ;;  | 
                    |
| 292 | 
                        + esac  | 
                    |
| 293 | 
                        +  | 
                    |
| 294 | 
                        +	if has "${i}" "${_PYTHON_SUPPORTED_IMPLS[@]}"; then
                       | 
                    |
| 295 | 
                        +		if python_is_installed "${i}"; then
                       | 
                    |
| 296 | 
                        + if declare -f python_check_deps >/dev/null; then  | 
                    |
| 297 | 
                        +				local PYTHON_USEDEP="python_targets_${i}(-),-python_single_target_${i}(-)"
                       | 
                    |
| 298 | 
                        +				local PYTHON_SINGLE_USEDEP="python_single_target_${i}(-)"
                       | 
                    |
| 299 | 
                        + python_check_deps  | 
                    |
| 300 | 
                        +				return ${?}
                       | 
                    |
| 301 | 
                        + fi  | 
                    |
| 302 | 
                        +  | 
                    |
| 303 | 
                        + return 0  | 
                    |
| 304 | 
                        + fi  | 
                    |
| 305 | 
                        +	elif ! has "${i}" "${_PYTHON_ALL_IMPLS[@]}"; then
                       | 
                    |
| 306 | 
                        +		ewarn "Invalid EPYTHON: ${EPYTHON}"
                       | 
                    |
| 307 | 
                        + fi  | 
                    |
| 308 | 
                        + return 1  | 
                    |
| 309 | 
                        +}  | 
                    |
| 310 | 
                        +  | 
                    |
| 311 | 
                        +# @FUNCTION: python_setup  | 
                    |
| 312 | 
                        +# @DESCRIPTION:  | 
                    |
| 313 | 
                        +# Determine what the best installed (and supported) Python  | 
                    |
| 314 | 
                        +# implementation is, and set the Python build environment up for it.  | 
                    |
| 315 | 
                        +#  | 
                    |
| 316 | 
                        +# This function will call python_check_deps() if defined.  | 
                    |
| 317 | 
                        +python_setup() {
                       | 
                    |
| 318 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 319 | 
                        +  | 
                    |
| 320 | 
                        + # support developer override  | 
                    |
| 321 | 
                        +	if [[ ${PYTHON_COMPAT_OVERRIDE} ]]; then
                       | 
                    |
| 322 | 
                        +		local impls=( ${PYTHON_COMPAT_OVERRIDE} )
                       | 
                    |
| 323 | 
                        +		[[ ${#impls[@]} -eq 1 ]] || die "PYTHON_COMPAT_OVERRIDE must name exactly one implementation for python-any-r1"
                       | 
                    |
| 324 | 
                        +  | 
                    |
| 325 | 
                        + ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"  | 
                    |
| 326 | 
                        + ewarn "implementation will be used:"  | 
                    |
| 327 | 
                        + ewarn  | 
                    |
| 328 | 
                        +		ewarn "	${PYTHON_COMPAT_OVERRIDE}"
                       | 
                    |
| 329 | 
                        + ewarn  | 
                    |
| 330 | 
                        + ewarn "Dependencies won't be satisfied, and EPYTHON/eselect-python will be ignored."  | 
                    |
| 331 | 
                        +  | 
                    |
| 332 | 
                        +		_python_export "${impls[0]}" EPYTHON PYTHON
                       | 
                    |
| 333 | 
                        + _python_wrapper_setup  | 
                    |
| 334 | 
                        +		einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 335 | 
                        + return  | 
                    |
| 336 | 
                        + fi  | 
                    |
| 337 | 
                        +  | 
                    |
| 338 | 
                        +	# first, try ${EPYTHON}... maybe it's good enough for us.
                       | 
                    |
| 339 | 
                        +	if [[ ${EPYTHON} ]]; then
                       | 
                    |
| 340 | 
                        +		if _python_EPYTHON_supported "${EPYTHON}"; then
                       | 
                    |
| 341 | 
                        + _python_export EPYTHON PYTHON  | 
                    |
| 342 | 
                        + _python_wrapper_setup  | 
                    |
| 343 | 
                        +			einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 344 | 
                        + return  | 
                    |
| 345 | 
                        + fi  | 
                    |
| 346 | 
                        + fi  | 
                    |
| 347 | 
                        +  | 
                    |
| 348 | 
                        + # then, try eselect-python  | 
                    |
| 349 | 
                        + local variant i  | 
                    |
| 350 | 
                        + for variant in '' '--python2' '--python3'; do  | 
                    |
| 351 | 
                        +		i=$(eselect python --show ${variant} 2>/dev/null)
                       | 
                    |
| 352 | 
                        +  | 
                    |
| 353 | 
                        +		if [[ ! ${i} ]]; then
                       | 
                    |
| 354 | 
                        + # no eselect-python?  | 
                    |
| 355 | 
                        + break  | 
                    |
| 356 | 
                        +		elif _python_EPYTHON_supported "${i}"; then
                       | 
                    |
| 357 | 
                        +			_python_export "${i}" EPYTHON PYTHON
                       | 
                    |
| 358 | 
                        + _python_wrapper_setup  | 
                    |
| 359 | 
                        +			einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 360 | 
                        + return  | 
                    |
| 361 | 
                        + fi  | 
                    |
| 362 | 
                        + done  | 
                    |
| 363 | 
                        +  | 
                    |
| 364 | 
                        + # fallback to best installed impl.  | 
                    |
| 365 | 
                        + # (reverse iteration over _PYTHON_SUPPORTED_IMPLS)  | 
                    |
| 366 | 
                        +	for (( i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )); do
                       | 
                    |
| 367 | 
                        +		_python_export "${_PYTHON_SUPPORTED_IMPLS[i]}" EPYTHON PYTHON
                       | 
                    |
| 368 | 
                        +		if _python_EPYTHON_supported "${EPYTHON}"; then
                       | 
                    |
| 369 | 
                        + _python_wrapper_setup  | 
                    |
| 370 | 
                        +			einfo "Using ${EPYTHON} to build"
                       | 
                    |
| 371 | 
                        + return  | 
                    |
| 372 | 
                        + fi  | 
                    |
| 373 | 
                        + done  | 
                    |
| 374 | 
                        +  | 
                    |
| 375 | 
                        + eerror "No Python implementation found for the build. This is usually"  | 
                    |
| 376 | 
                        + eerror "a bug in the ebuild. Please report it to bugs.gentoo.org"  | 
                    |
| 377 | 
                        + eerror "along with the build log."  | 
                    |
| 378 | 
                        + echo  | 
                    |
| 379 | 
                        + die "No supported Python implementation installed."  | 
                    |
| 380 | 
                        +}  | 
                    |
| 381 | 
                        +  | 
                    |
| 382 | 
                        +# @FUNCTION: python-any-r1_pkg_setup  | 
                    |
| 383 | 
                        +# @DESCRIPTION:  | 
                    |
| 384 | 
                        +# Runs python_setup during from-source installs.  | 
                    |
| 385 | 
                        +#  | 
                    |
| 386 | 
                        +# In a binary package installs is a no-op. If you need Python in pkg_*  | 
                    |
| 387 | 
                        +# phases of a binary package, call python_setup directly.  | 
                    |
| 388 | 
                        +python-any-r1_pkg_setup() {
                       | 
                    |
| 389 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 390 | 
                        +  | 
                    |
| 391 | 
                        +	[[ ${MERGE_TYPE} != binary ]] && python_setup
                       | 
                    |
| 392 | 
                        +}  | 
                    |
| 393 | 
                        +  | 
                    |
| 394 | 
                        +_PYTHON_ANY_R1=1  | 
                    |
| 395 | 
                        +fi  | 
                    
| ... | ... | 
                      @@ -0,0 +1,1445 @@  | 
                  
| 1 | 
                        +# Copyright 1999-2021 Gentoo Authors  | 
                    |
| 2 | 
                        +# Distributed under the terms of the GNU General Public License v2  | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +# @ECLASS: python-utils-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: Utility functions for packages with Python parts.  | 
                    |
| 12 | 
                        +# @DESCRIPTION:  | 
                    |
| 13 | 
                        +# A utility eclass providing functions to query Python implementations,  | 
                    |
| 14 | 
                        +# install Python modules and scripts.  | 
                    |
| 15 | 
                        +#  | 
                    |
| 16 | 
                        +# This eclass does not set any metadata variables nor export any phase  | 
                    |
| 17 | 
                        +# functions. It can be inherited safely.  | 
                    |
| 18 | 
                        +#  | 
                    |
| 19 | 
                        +# For more information, please see the Python Guide:  | 
                    |
| 20 | 
                        +# https://dev.gentoo.org/~mgorny/python-guide/  | 
                    |
| 21 | 
                        +  | 
                    |
| 22 | 
                        +case "${EAPI:-0}" in
                       | 
                    |
| 23 | 
                        +	[0-4]) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;;
                       | 
                    |
| 24 | 
                        + [5-7]) ;;  | 
                    |
| 25 | 
                        +	*)     die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;;
                       | 
                    |
| 26 | 
                        +esac  | 
                    |
| 27 | 
                        +  | 
                    |
| 28 | 
                        +if [[ ${_PYTHON_ECLASS_INHERITED} ]]; then
                       | 
                    |
| 29 | 
                        + die 'python-r1 suite eclasses can not be used with python.eclass.'  | 
                    |
| 30 | 
                        +fi  | 
                    |
| 31 | 
                        +  | 
                    |
| 32 | 
                        +if [[ ! ${_PYTHON_UTILS_R1} ]]; then
                       | 
                    |
| 33 | 
                        +  | 
                    |
| 34 | 
                        +[[ ${EAPI} == 5 ]] && inherit eutils multilib
                       | 
                    |
| 35 | 
                        +inherit toolchain-funcs  | 
                    |
| 36 | 
                        +  | 
                    |
| 37 | 
                        +# @ECLASS-VARIABLE: _PYTHON_ALL_IMPLS  | 
                    |
| 38 | 
                        +# @INTERNAL  | 
                    |
| 39 | 
                        +# @DESCRIPTION:  | 
                    |
| 40 | 
                        +# All supported Python implementations, most preferred last.  | 
                    |
| 41 | 
                        +_PYTHON_ALL_IMPLS=(  | 
                    |
| 42 | 
                        + pypy3  | 
                    |
| 43 | 
                        + python2_7  | 
                    |
| 44 | 
                        + python3_7 python3_8 python3_9  | 
                    |
| 45 | 
                        +)  | 
                    |
| 46 | 
                        +readonly _PYTHON_ALL_IMPLS  | 
                    |
| 47 | 
                        +  | 
                    |
| 48 | 
                        +# @ECLASS-VARIABLE: _PYTHON_HISTORICAL_IMPLS  | 
                    |
| 49 | 
                        +# @INTERNAL  | 
                    |
| 50 | 
                        +# @DESCRIPTION:  | 
                    |
| 51 | 
                        +# All historical Python implementations that are no longer supported.  | 
                    |
| 52 | 
                        +_PYTHON_HISTORICAL_IMPLS=(  | 
                    |
| 53 | 
                        + jython2_7  | 
                    |
| 54 | 
                        +	pypy pypy1_{8,9} pypy2_0
                       | 
                    |
| 55 | 
                        +	python2_{5,6}
                       | 
                    |
| 56 | 
                        +	python3_{1..6}
                       | 
                    |
| 57 | 
                        +)  | 
                    |
| 58 | 
                        +readonly _PYTHON_HISTORICAL_IMPLS  | 
                    |
| 59 | 
                        +  | 
                    |
| 60 | 
                        +# @ECLASS-VARIABLE: PYTHON_COMPAT_NO_STRICT  | 
                    |
| 61 | 
                        +# @INTERNAL  | 
                    |
| 62 | 
                        +# @DESCRIPTION:  | 
                    |
| 63 | 
                        +# Set to a non-empty value in order to make eclass tolerate (ignore)  | 
                    |
| 64 | 
                        +# unknown implementations in PYTHON_COMPAT.  | 
                    |
| 65 | 
                        +#  | 
                    |
| 66 | 
                        +# This is intended to be set by the user when using ebuilds that may  | 
                    |
| 67 | 
                        +# have unknown (newer) implementations in PYTHON_COMPAT. The assumption  | 
                    |
| 68 | 
                        +# is that the ebuilds are intended to be used within multiple contexts  | 
                    |
| 69 | 
                        +# which can involve revisions of this eclass that support a different  | 
                    |
| 70 | 
                        +# set of Python implementations.  | 
                    |
| 71 | 
                        +  | 
                    |
| 72 | 
                        +# @FUNCTION: _python_verify_patterns  | 
                    |
| 73 | 
                        +# @USAGE: <pattern>...  | 
                    |
| 74 | 
                        +# @INTERNAL  | 
                    |
| 75 | 
                        +# @DESCRIPTION:  | 
                    |
| 76 | 
                        +# Verify whether the patterns passed to the eclass function are correct  | 
                    |
| 77 | 
                        +# (i.e. can match any valid implementation). Dies on wrong pattern.  | 
                    |
| 78 | 
                        +_python_verify_patterns() {
                       | 
                    |
| 79 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 80 | 
                        +  | 
                    |
| 81 | 
                        + local impl pattern  | 
                    |
| 82 | 
                        + for pattern; do  | 
                    |
| 83 | 
                        +		[[ ${pattern} == -[23] ]] && continue
                       | 
                    |
| 84 | 
                        +  | 
                    |
| 85 | 
                        +		for impl in "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"
                       | 
                    |
| 86 | 
                        + do  | 
                    |
| 87 | 
                        +			[[ ${impl} == ${pattern/./_} ]] && continue 2
                       | 
                    |
| 88 | 
                        + done  | 
                    |
| 89 | 
                        +  | 
                    |
| 90 | 
                        +		die "Invalid implementation pattern: ${pattern}"
                       | 
                    |
| 91 | 
                        + done  | 
                    |
| 92 | 
                        +}  | 
                    |
| 93 | 
                        +  | 
                    |
| 94 | 
                        +# @FUNCTION: _python_set_impls  | 
                    |
| 95 | 
                        +# @INTERNAL  | 
                    |
| 96 | 
                        +# @DESCRIPTION:  | 
                    |
| 97 | 
                        +# Check PYTHON_COMPAT for well-formedness and validity, then set  | 
                    |
| 98 | 
                        +# two global variables:  | 
                    |
| 99 | 
                        +#  | 
                    |
| 100 | 
                        +# - _PYTHON_SUPPORTED_IMPLS containing valid implementations supported  | 
                    |
| 101 | 
                        +# by the ebuild (PYTHON_COMPAT - dead implementations),  | 
                    |
| 102 | 
                        +#  | 
                    |
| 103 | 
                        +# - and _PYTHON_UNSUPPORTED_IMPLS containing valid implementations that  | 
                    |
| 104 | 
                        +# are not supported by the ebuild.  | 
                    |
| 105 | 
                        +#  | 
                    |
| 106 | 
                        +# Implementations in both variables are ordered using the pre-defined  | 
                    |
| 107 | 
                        +# eclass implementation ordering.  | 
                    |
| 108 | 
                        +#  | 
                    |
| 109 | 
                        +# This function must be called once in global scope by an eclass  | 
                    |
| 110 | 
                        +# utilizing PYTHON_COMPAT.  | 
                    |
| 111 | 
                        +_python_set_impls() {
                       | 
                    |
| 112 | 
                        + local i  | 
                    |
| 113 | 
                        +  | 
                    |
| 114 | 
                        + if ! declare -p PYTHON_COMPAT &>/dev/null; then  | 
                    |
| 115 | 
                        + die 'PYTHON_COMPAT not declared.'  | 
                    |
| 116 | 
                        + fi  | 
                    |
| 117 | 
                        + if [[ $(declare -p PYTHON_COMPAT) != "declare -a"* ]]; then  | 
                    |
| 118 | 
                        + die 'PYTHON_COMPAT must be an array.'  | 
                    |
| 119 | 
                        + fi  | 
                    |
| 120 | 
                        +	if [[ ! ${PYTHON_COMPAT_NO_STRICT} ]]; then
                       | 
                    |
| 121 | 
                        +		for i in "${PYTHON_COMPAT[@]}"; do
                       | 
                    |
| 122 | 
                        + # check for incorrect implementations  | 
                    |
| 123 | 
                        + # we're using pattern matching as an optimization  | 
                    |
| 124 | 
                        + # please keep them in sync with _PYTHON_ALL_IMPLS  | 
                    |
| 125 | 
                        + # and _PYTHON_HISTORICAL_IMPLS  | 
                    |
| 126 | 
                        +			case ${i} in
                       | 
                    |
| 127 | 
                        + jython2_7|pypy|pypy1_[89]|pypy2_0|pypy3|python2_[5-7]|python3_[1-9])  | 
                    |
| 128 | 
                        + ;;  | 
                    |
| 129 | 
                        + *)  | 
                    |
| 130 | 
                        +					if has "${i}" "${_PYTHON_ALL_IMPLS[@]}" \
                       | 
                    |
| 131 | 
                        +						"${_PYTHON_HISTORICAL_IMPLS[@]}"
                       | 
                    |
| 132 | 
                        + then  | 
                    |
| 133 | 
                        +						die "Mis-synced patterns in _python_set_impls: missing ${i}"
                       | 
                    |
| 134 | 
                        + else  | 
                    |
| 135 | 
                        +						die "Invalid implementation in PYTHON_COMPAT: ${i}"
                       | 
                    |
| 136 | 
                        + fi  | 
                    |
| 137 | 
                        + esac  | 
                    |
| 138 | 
                        + done  | 
                    |
| 139 | 
                        + fi  | 
                    |
| 140 | 
                        +  | 
                    |
| 141 | 
                        + local supp=() unsupp=()  | 
                    |
| 142 | 
                        +  | 
                    |
| 143 | 
                        +	for i in "${_PYTHON_ALL_IMPLS[@]}"; do
                       | 
                    |
| 144 | 
                        +		if has "${i}" "${PYTHON_COMPAT[@]}"; then
                       | 
                    |
| 145 | 
                        +			supp+=( "${i}" )
                       | 
                    |
| 146 | 
                        + else  | 
                    |
| 147 | 
                        +			unsupp+=( "${i}" )
                       | 
                    |
| 148 | 
                        + fi  | 
                    |
| 149 | 
                        + done  | 
                    |
| 150 | 
                        +  | 
                    |
| 151 | 
                        +	if [[ ! ${supp[@]} ]]; then
                       | 
                    |
| 152 | 
                        + die "No supported implementation in PYTHON_COMPAT."  | 
                    |
| 153 | 
                        + fi  | 
                    |
| 154 | 
                        +  | 
                    |
| 155 | 
                        +	if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then
                       | 
                    |
| 156 | 
                        + # set once already, verify integrity  | 
                    |
| 157 | 
                        +		if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then
                       | 
                    |
| 158 | 
                        + eerror "Supported impls (PYTHON_COMPAT) changed between inherits!"  | 
                    |
| 159 | 
                        +			eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}"
                       | 
                    |
| 160 | 
                        +			eerror "Now   : ${supp[*]}"
                       | 
                    |
| 161 | 
                        + die "_PYTHON_SUPPORTED_IMPLS integrity check failed"  | 
                    |
| 162 | 
                        + fi  | 
                    |
| 163 | 
                        +		if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then
                       | 
                    |
| 164 | 
                        + eerror "Unsupported impls changed between inherits!"  | 
                    |
| 165 | 
                        +			eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}"
                       | 
                    |
| 166 | 
                        +			eerror "Now   : ${unsupp[*]}"
                       | 
                    |
| 167 | 
                        + die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed"  | 
                    |
| 168 | 
                        + fi  | 
                    |
| 169 | 
                        + else  | 
                    |
| 170 | 
                        +		_PYTHON_SUPPORTED_IMPLS=( "${supp[@]}" )
                       | 
                    |
| 171 | 
                        +		_PYTHON_UNSUPPORTED_IMPLS=( "${unsupp[@]}" )
                       | 
                    |
| 172 | 
                        + readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS  | 
                    |
| 173 | 
                        + fi  | 
                    |
| 174 | 
                        +}  | 
                    |
| 175 | 
                        +  | 
                    |
| 176 | 
                        +# @FUNCTION: _python_impl_matches  | 
                    |
| 177 | 
                        +# @USAGE: <impl> [<pattern>...]  | 
                    |
| 178 | 
                        +# @INTERNAL  | 
                    |
| 179 | 
                        +# @DESCRIPTION:  | 
                    |
| 180 | 
                        +# Check whether the specified <impl> matches at least one  | 
                    |
| 181 | 
                        +# of the patterns following it. Return 0 if it does, 1 otherwise.  | 
                    |
| 182 | 
                        +# Matches if no patterns are provided.  | 
                    |
| 183 | 
                        +#  | 
                    |
| 184 | 
                        +# <impl> can be in PYTHON_COMPAT or EPYTHON form. The patterns can be  | 
                    |
| 185 | 
                        +# either:  | 
                    |
| 186 | 
                        +# a) fnmatch-style patterns, e.g. 'python2*', 'pypy'...  | 
                    |
| 187 | 
                        +# b) '-2' to indicate all Python 2 variants (= !python_is_python3)  | 
                    |
| 188 | 
                        +# c) '-3' to indicate all Python 3 variants (= python_is_python3)  | 
                    |
| 189 | 
                        +_python_impl_matches() {
                       | 
                    |
| 190 | 
                        +	[[ ${#} -ge 1 ]] || die "${FUNCNAME}: takes at least 1 parameter"
                       | 
                    |
| 191 | 
                        +	[[ ${#} -eq 1 ]] && return 0
                       | 
                    |
| 192 | 
                        +  | 
                    |
| 193 | 
                        +	local impl=${1} pattern
                       | 
                    |
| 194 | 
                        + shift  | 
                    |
| 195 | 
                        +  | 
                    |
| 196 | 
                        + for pattern; do  | 
                    |
| 197 | 
                        +		if [[ ${pattern} == -2 ]]; then
                       | 
                    |
| 198 | 
                        +			python_is_python3 "${impl}" || return 0
                       | 
                    |
| 199 | 
                        +		elif [[ ${pattern} == -3 ]]; then
                       | 
                    |
| 200 | 
                        +			python_is_python3 "${impl}" && return 0
                       | 
                    |
| 201 | 
                        + return  | 
                    |
| 202 | 
                        + # unify value style to allow lax matching  | 
                    |
| 203 | 
                        +		elif [[ ${impl/./_} == ${pattern/./_} ]]; then
                       | 
                    |
| 204 | 
                        + return 0  | 
                    |
| 205 | 
                        + fi  | 
                    |
| 206 | 
                        + done  | 
                    |
| 207 | 
                        +  | 
                    |
| 208 | 
                        + return 1  | 
                    |
| 209 | 
                        +}  | 
                    |
| 210 | 
                        +  | 
                    |
| 211 | 
                        +# @ECLASS-VARIABLE: PYTHON  | 
                    |
| 212 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 213 | 
                        +# @DESCRIPTION:  | 
                    |
| 214 | 
                        +# The absolute path to the current Python interpreter.  | 
                    |
| 215 | 
                        +#  | 
                    |
| 216 | 
                        +# This variable is set automatically in the following contexts:  | 
                    |
| 217 | 
                        +#  | 
                    |
| 218 | 
                        +# python-r1: Set in functions called by python_foreach_impl() or after  | 
                    |
| 219 | 
                        +# calling python_setup().  | 
                    |
| 220 | 
                        +#  | 
                    |
| 221 | 
                        +# python-single-r1: Set after calling python-single-r1_pkg_setup().  | 
                    |
| 222 | 
                        +#  | 
                    |
| 223 | 
                        +# distutils-r1: Set within any of the python sub-phase functions.  | 
                    |
| 224 | 
                        +#  | 
                    |
| 225 | 
                        +# Example value:  | 
                    |
| 226 | 
                        +# @CODE  | 
                    |
| 227 | 
                        +# /usr/bin/python2.7  | 
                    |
| 228 | 
                        +# @CODE  | 
                    |
| 229 | 
                        +  | 
                    |
| 230 | 
                        +# @ECLASS-VARIABLE: EPYTHON  | 
                    |
| 231 | 
                        +# @DEFAULT_UNSET  | 
                    |
| 232 | 
                        +# @DESCRIPTION:  | 
                    |
| 233 | 
                        +# The executable name of the current Python interpreter.  | 
                    |
| 234 | 
                        +#  | 
                    |
| 235 | 
                        +# This variable is set automatically in the following contexts:  | 
                    |
| 236 | 
                        +#  | 
                    |
| 237 | 
                        +# python-r1: Set in functions called by python_foreach_impl() or after  | 
                    |
| 238 | 
                        +# calling python_setup().  | 
                    |
| 239 | 
                        +#  | 
                    |
| 240 | 
                        +# python-single-r1: Set after calling python-single-r1_pkg_setup().  | 
                    |
| 241 | 
                        +#  | 
                    |
| 242 | 
                        +# distutils-r1: Set within any of the python sub-phase functions.  | 
                    |
| 243 | 
                        +#  | 
                    |
| 244 | 
                        +# Example value:  | 
                    |
| 245 | 
                        +# @CODE  | 
                    |
| 246 | 
                        +# python2.7  | 
                    |
| 247 | 
                        +# @CODE  | 
                    |
| 248 | 
                        +  | 
                    |
| 249 | 
                        +# @FUNCTION: python_export  | 
                    |
| 250 | 
                        +# @USAGE: [<impl>] <variables>...  | 
                    |
| 251 | 
                        +# @INTERNAL  | 
                    |
| 252 | 
                        +# @DESCRIPTION:  | 
                    |
| 253 | 
                        +# Backwards compatibility function. The relevant API is now considered  | 
                    |
| 254 | 
                        +# private, please use python_get* instead.  | 
                    |
| 255 | 
                        +python_export() {
                       | 
                    |
| 256 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 257 | 
                        +  | 
                    |
| 258 | 
                        + eqawarn "python_export() is part of private eclass API."  | 
                    |
| 259 | 
                        + eqawarn "Please call python_get*() instead."  | 
                    |
| 260 | 
                        +  | 
                    |
| 261 | 
                        +	_python_export "${@}"
                       | 
                    |
| 262 | 
                        +}  | 
                    |
| 263 | 
                        +  | 
                    |
| 264 | 
                        +# @FUNCTION: _python_export  | 
                    |
| 265 | 
                        +# @USAGE: [<impl>] <variables>...  | 
                    |
| 266 | 
                        +# @INTERNAL  | 
                    |
| 267 | 
                        +# @DESCRIPTION:  | 
                    |
| 268 | 
                        +# Set and export the Python implementation-relevant variables passed  | 
                    |
| 269 | 
                        +# as parameters.  | 
                    |
| 270 | 
                        +#  | 
                    |
| 271 | 
                        +# The optional first parameter may specify the requested Python  | 
                    |
| 272 | 
                        +# implementation (either as PYTHON_TARGETS value, e.g. python2_7,  | 
                    |
| 273 | 
                        +# or an EPYTHON one, e.g. python2.7). If no implementation passed,  | 
                    |
| 274 | 
                        +# the current one will be obtained from ${EPYTHON}.
                       | 
                    |
| 275 | 
                        +#  | 
                    |
| 276 | 
                        +# The variables which can be exported are: PYTHON, EPYTHON,  | 
                    |
| 277 | 
                        +# PYTHON_SITEDIR. They are described more completely in the eclass  | 
                    |
| 278 | 
                        +# variable documentation.  | 
                    |
| 279 | 
                        +_python_export() {
                       | 
                    |
| 280 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 281 | 
                        +  | 
                    |
| 282 | 
                        + local impl var  | 
                    |
| 283 | 
                        +  | 
                    |
| 284 | 
                        +	case "${1}" in
                       | 
                    |
| 285 | 
                        + python*|jython*)  | 
                    |
| 286 | 
                        +			impl=${1/_/.}
                       | 
                    |
| 287 | 
                        + shift  | 
                    |
| 288 | 
                        + ;;  | 
                    |
| 289 | 
                        + pypy|pypy3)  | 
                    |
| 290 | 
                        +			impl=${1}
                       | 
                    |
| 291 | 
                        + shift  | 
                    |
| 292 | 
                        + ;;  | 
                    |
| 293 | 
                        + *)  | 
                    |
| 294 | 
                        +			impl=${EPYTHON}
                       | 
                    |
| 295 | 
                        +			if [[ -z ${impl} ]]; then
                       | 
                    |
| 296 | 
                        + die "_python_export called without a python implementation and EPYTHON is unset"  | 
                    |
| 297 | 
                        + fi  | 
                    |
| 298 | 
                        + ;;  | 
                    |
| 299 | 
                        + esac  | 
                    |
| 300 | 
                        +	debug-print "${FUNCNAME}: implementation: ${impl}"
                       | 
                    |
| 301 | 
                        +  | 
                    |
| 302 | 
                        + for var; do  | 
                    |
| 303 | 
                        +		case "${var}" in
                       | 
                    |
| 304 | 
                        + EPYTHON)  | 
                    |
| 305 | 
                        +				export EPYTHON=${impl}
                       | 
                    |
| 306 | 
                        +				debug-print "${FUNCNAME}: EPYTHON = ${EPYTHON}"
                       | 
                    |
| 307 | 
                        + ;;  | 
                    |
| 308 | 
                        + PYTHON)  | 
                    |
| 309 | 
                        +				export PYTHON=${EPREFIX}/usr/bin/${impl}
                       | 
                    |
| 310 | 
                        +				debug-print "${FUNCNAME}: PYTHON = ${PYTHON}"
                       | 
                    |
| 311 | 
                        + ;;  | 
                    |
| 312 | 
                        + PYTHON_SITEDIR)  | 
                    |
| 313 | 
                        +				[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"
                       | 
                    |
| 314 | 
                        + # sysconfig can't be used because:  | 
                    |
| 315 | 
                        + # 1) pypy doesn't give site-packages but stdlib  | 
                    |
| 316 | 
                        + # 2) jython gives paths with wrong case  | 
                    |
| 317 | 
                        +				PYTHON_SITEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_lib())') || die
                       | 
                    |
| 318 | 
                        + export PYTHON_SITEDIR  | 
                    |
| 319 | 
                        +				debug-print "${FUNCNAME}: PYTHON_SITEDIR = ${PYTHON_SITEDIR}"
                       | 
                    |
| 320 | 
                        + ;;  | 
                    |
| 321 | 
                        + PYTHON_INCLUDEDIR)  | 
                    |
| 322 | 
                        +				[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"
                       | 
                    |
| 323 | 
                        +				PYTHON_INCLUDEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())') || die
                       | 
                    |
| 324 | 
                        + export PYTHON_INCLUDEDIR  | 
                    |
| 325 | 
                        +				debug-print "${FUNCNAME}: PYTHON_INCLUDEDIR = ${PYTHON_INCLUDEDIR}"
                       | 
                    |
| 326 | 
                        +  | 
                    |
| 327 | 
                        + # Jython gives a non-existing directory  | 
                    |
| 328 | 
                        +				if [[ ! -d ${PYTHON_INCLUDEDIR} ]]; then
                       | 
                    |
| 329 | 
                        +					die "${impl} does not install any header files!"
                       | 
                    |
| 330 | 
                        + fi  | 
                    |
| 331 | 
                        + ;;  | 
                    |
| 332 | 
                        + PYTHON_LIBPATH)  | 
                    |
| 333 | 
                        +				[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"
                       | 
                    |
| 334 | 
                        +				PYTHON_LIBPATH=$("${PYTHON}" -c 'import os.path, sysconfig; print(os.path.join(sysconfig.get_config_var("LIBDIR"), sysconfig.get_config_var("LDLIBRARY")) if sysconfig.get_config_var("LDLIBRARY") else "")') || die
                       | 
                    |
| 335 | 
                        + export PYTHON_LIBPATH  | 
                    |
| 336 | 
                        +				debug-print "${FUNCNAME}: PYTHON_LIBPATH = ${PYTHON_LIBPATH}"
                       | 
                    |
| 337 | 
                        +  | 
                    |
| 338 | 
                        +				if [[ ! ${PYTHON_LIBPATH} ]]; then
                       | 
                    |
| 339 | 
                        +					die "${impl} lacks a (usable) dynamic library"
                       | 
                    |
| 340 | 
                        + fi  | 
                    |
| 341 | 
                        + ;;  | 
                    |
| 342 | 
                        + PYTHON_CFLAGS)  | 
                    |
| 343 | 
                        + local val  | 
                    |
| 344 | 
                        +  | 
                    |
| 345 | 
                        +				case "${impl}" in
                       | 
                    |
| 346 | 
                        + python*)  | 
                    |
| 347 | 
                        + # python-2.7, python-3.2, etc.  | 
                    |
| 348 | 
                        +						val=$($(tc-getPKG_CONFIG) --cflags ${impl/n/n-}) || die
                       | 
                    |
| 349 | 
                        + ;;  | 
                    |
| 350 | 
                        + *)  | 
                    |
| 351 | 
                        +						die "${impl}: obtaining ${var} not supported"
                       | 
                    |
| 352 | 
                        + ;;  | 
                    |
| 353 | 
                        + esac  | 
                    |
| 354 | 
                        +  | 
                    |
| 355 | 
                        +				export PYTHON_CFLAGS=${val}
                       | 
                    |
| 356 | 
                        +				debug-print "${FUNCNAME}: PYTHON_CFLAGS = ${PYTHON_CFLAGS}"
                       | 
                    |
| 357 | 
                        + ;;  | 
                    |
| 358 | 
                        + PYTHON_LIBS)  | 
                    |
| 359 | 
                        + local val  | 
                    |
| 360 | 
                        +  | 
                    |
| 361 | 
                        +				case "${impl}" in
                       | 
                    |
| 362 | 
                        + python2*|python3.6|python3.7*)  | 
                    |
| 363 | 
                        + # python* up to 3.7  | 
                    |
| 364 | 
                        +						val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}) || die
                       | 
                    |
| 365 | 
                        + ;;  | 
                    |
| 366 | 
                        + python*)  | 
                    |
| 367 | 
                        + # python3.8+  | 
                    |
| 368 | 
                        +						val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}-embed) || die
                       | 
                    |
| 369 | 
                        + ;;  | 
                    |
| 370 | 
                        + *)  | 
                    |
| 371 | 
                        +						die "${impl}: obtaining ${var} not supported"
                       | 
                    |
| 372 | 
                        + ;;  | 
                    |
| 373 | 
                        + esac  | 
                    |
| 374 | 
                        +  | 
                    |
| 375 | 
                        +				export PYTHON_LIBS=${val}
                       | 
                    |
| 376 | 
                        +				debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}"
                       | 
                    |
| 377 | 
                        + ;;  | 
                    |
| 378 | 
                        + PYTHON_CONFIG)  | 
                    |
| 379 | 
                        + local flags val  | 
                    |
| 380 | 
                        +  | 
                    |
| 381 | 
                        +				case "${impl}" in
                       | 
                    |
| 382 | 
                        + python*)  | 
                    |
| 383 | 
                        +						[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"
                       | 
                    |
| 384 | 
                        +						flags=$("${PYTHON}" -c 'import sysconfig; print(sysconfig.get_config_var("ABIFLAGS") or "")') || die
                       | 
                    |
| 385 | 
                        +						val=${PYTHON}${flags}-config
                       | 
                    |
| 386 | 
                        + ;;  | 
                    |
| 387 | 
                        + *)  | 
                    |
| 388 | 
                        +						die "${impl}: obtaining ${var} not supported"
                       | 
                    |
| 389 | 
                        + ;;  | 
                    |
| 390 | 
                        + esac  | 
                    |
| 391 | 
                        +  | 
                    |
| 392 | 
                        +				export PYTHON_CONFIG=${val}
                       | 
                    |
| 393 | 
                        +				debug-print "${FUNCNAME}: PYTHON_CONFIG = ${PYTHON_CONFIG}"
                       | 
                    |
| 394 | 
                        + ;;  | 
                    |
| 395 | 
                        + PYTHON_PKG_DEP)  | 
                    |
| 396 | 
                        + local d  | 
                    |
| 397 | 
                        +				case ${impl} in
                       | 
                    |
| 398 | 
                        + python2.7)  | 
                    |
| 399 | 
                        + PYTHON_PKG_DEP='>=dev-lang/python-2.7.5-r2:2.7';;  | 
                    |
| 400 | 
                        + python*)  | 
                    |
| 401 | 
                        +						PYTHON_PKG_DEP="dev-lang/python:${impl#python}";;
                       | 
                    |
| 402 | 
                        + pypy)  | 
                    |
| 403 | 
                        + PYTHON_PKG_DEP='>=dev-python/pypy-7.3.0:0=';;  | 
                    |
| 404 | 
                        + pypy3)  | 
                    |
| 405 | 
                        + PYTHON_PKG_DEP='>=dev-python/pypy3-7.3.0:0=';;  | 
                    |
| 406 | 
                        + *)  | 
                    |
| 407 | 
                        +						die "Invalid implementation: ${impl}"
                       | 
                    |
| 408 | 
                        + esac  | 
                    |
| 409 | 
                        +  | 
                    |
| 410 | 
                        + # use-dep  | 
                    |
| 411 | 
                        +				if [[ ${PYTHON_REQ_USE} ]]; then
                       | 
                    |
| 412 | 
                        +					PYTHON_PKG_DEP+=[${PYTHON_REQ_USE}]
                       | 
                    |
| 413 | 
                        + fi  | 
                    |
| 414 | 
                        +  | 
                    |
| 415 | 
                        + export PYTHON_PKG_DEP  | 
                    |
| 416 | 
                        +				debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}"
                       | 
                    |
| 417 | 
                        + ;;  | 
                    |
| 418 | 
                        + PYTHON_SCRIPTDIR)  | 
                    |
| 419 | 
                        + local dir  | 
                    |
| 420 | 
                        +				export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl}
                       | 
                    |
| 421 | 
                        +				debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}"
                       | 
                    |
| 422 | 
                        + ;;  | 
                    |
| 423 | 
                        + *)  | 
                    |
| 424 | 
                        +				die "_python_export: unknown variable ${var}"
                       | 
                    |
| 425 | 
                        + esac  | 
                    |
| 426 | 
                        + done  | 
                    |
| 427 | 
                        +}  | 
                    |
| 428 | 
                        +  | 
                    |
| 429 | 
                        +# @FUNCTION: python_get_sitedir  | 
                    |
| 430 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 431 | 
                        +# @DESCRIPTION:  | 
                    |
| 432 | 
                        +# Obtain and print the 'site-packages' path for the given  | 
                    |
| 433 | 
                        +# implementation. If no implementation is provided, ${EPYTHON} will
                       | 
                    |
| 434 | 
                        +# be used.  | 
                    |
| 435 | 
                        +python_get_sitedir() {
                       | 
                    |
| 436 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 437 | 
                        +  | 
                    |
| 438 | 
                        +	_python_export "${@}" PYTHON_SITEDIR
                       | 
                    |
| 439 | 
                        +	echo "${PYTHON_SITEDIR}"
                       | 
                    |
| 440 | 
                        +}  | 
                    |
| 441 | 
                        +  | 
                    |
| 442 | 
                        +# @FUNCTION: python_get_includedir  | 
                    |
| 443 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 444 | 
                        +# @DESCRIPTION:  | 
                    |
| 445 | 
                        +# Obtain and print the include path for the given implementation. If no  | 
                    |
| 446 | 
                        +# implementation is provided, ${EPYTHON} will be used.
                       | 
                    |
| 447 | 
                        +python_get_includedir() {
                       | 
                    |
| 448 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 449 | 
                        +  | 
                    |
| 450 | 
                        +	_python_export "${@}" PYTHON_INCLUDEDIR
                       | 
                    |
| 451 | 
                        +	echo "${PYTHON_INCLUDEDIR}"
                       | 
                    |
| 452 | 
                        +}  | 
                    |
| 453 | 
                        +  | 
                    |
| 454 | 
                        +# @FUNCTION: python_get_library_path  | 
                    |
| 455 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 456 | 
                        +# @DESCRIPTION:  | 
                    |
| 457 | 
                        +# Obtain and print the Python library path for the given implementation.  | 
                    |
| 458 | 
                        +# If no implementation is provided, ${EPYTHON} will be used.
                       | 
                    |
| 459 | 
                        +#  | 
                    |
| 460 | 
                        +# Please note that this function can be used with CPython only. Use  | 
                    |
| 461 | 
                        +# in another implementation will result in a fatal failure.  | 
                    |
| 462 | 
                        +python_get_library_path() {
                       | 
                    |
| 463 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 464 | 
                        +  | 
                    |
| 465 | 
                        +	_python_export "${@}" PYTHON_LIBPATH
                       | 
                    |
| 466 | 
                        +	echo "${PYTHON_LIBPATH}"
                       | 
                    |
| 467 | 
                        +}  | 
                    |
| 468 | 
                        +  | 
                    |
| 469 | 
                        +# @FUNCTION: python_get_CFLAGS  | 
                    |
| 470 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 471 | 
                        +# @DESCRIPTION:  | 
                    |
| 472 | 
                        +# Obtain and print the compiler flags for building against Python,  | 
                    |
| 473 | 
                        +# for the given implementation. If no implementation is provided,  | 
                    |
| 474 | 
                        +# ${EPYTHON} will be used.
                       | 
                    |
| 475 | 
                        +#  | 
                    |
| 476 | 
                        +# Please note that this function can be used with CPython only.  | 
                    |
| 477 | 
                        +# It requires Python and pkg-config installed, and therefore proper  | 
                    |
| 478 | 
                        +# build-time dependencies need be added to the ebuild.  | 
                    |
| 479 | 
                        +python_get_CFLAGS() {
                       | 
                    |
| 480 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 481 | 
                        +  | 
                    |
| 482 | 
                        +	_python_export "${@}" PYTHON_CFLAGS
                       | 
                    |
| 483 | 
                        +	echo "${PYTHON_CFLAGS}"
                       | 
                    |
| 484 | 
                        +}  | 
                    |
| 485 | 
                        +  | 
                    |
| 486 | 
                        +# @FUNCTION: python_get_LIBS  | 
                    |
| 487 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 488 | 
                        +# @DESCRIPTION:  | 
                    |
| 489 | 
                        +# Obtain and print the compiler flags for linking against Python,  | 
                    |
| 490 | 
                        +# for the given implementation. If no implementation is provided,  | 
                    |
| 491 | 
                        +# ${EPYTHON} will be used.
                       | 
                    |
| 492 | 
                        +#  | 
                    |
| 493 | 
                        +# Please note that this function can be used with CPython only.  | 
                    |
| 494 | 
                        +# It requires Python and pkg-config installed, and therefore proper  | 
                    |
| 495 | 
                        +# build-time dependencies need be added to the ebuild.  | 
                    |
| 496 | 
                        +python_get_LIBS() {
                       | 
                    |
| 497 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 498 | 
                        +  | 
                    |
| 499 | 
                        +	_python_export "${@}" PYTHON_LIBS
                       | 
                    |
| 500 | 
                        +	echo "${PYTHON_LIBS}"
                       | 
                    |
| 501 | 
                        +}  | 
                    |
| 502 | 
                        +  | 
                    |
| 503 | 
                        +# @FUNCTION: python_get_PYTHON_CONFIG  | 
                    |
| 504 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 505 | 
                        +# @DESCRIPTION:  | 
                    |
| 506 | 
                        +# Obtain and print the PYTHON_CONFIG location for the given  | 
                    |
| 507 | 
                        +# implementation. If no implementation is provided, ${EPYTHON} will be
                       | 
                    |
| 508 | 
                        +# used.  | 
                    |
| 509 | 
                        +#  | 
                    |
| 510 | 
                        +# Please note that this function can be used with CPython only.  | 
                    |
| 511 | 
                        +# It requires Python installed, and therefore proper build-time  | 
                    |
| 512 | 
                        +# dependencies need be added to the ebuild.  | 
                    |
| 513 | 
                        +python_get_PYTHON_CONFIG() {
                       | 
                    |
| 514 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 515 | 
                        +  | 
                    |
| 516 | 
                        +	_python_export "${@}" PYTHON_CONFIG
                       | 
                    |
| 517 | 
                        +	echo "${PYTHON_CONFIG}"
                       | 
                    |
| 518 | 
                        +}  | 
                    |
| 519 | 
                        +  | 
                    |
| 520 | 
                        +# @FUNCTION: python_get_scriptdir  | 
                    |
| 521 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 522 | 
                        +# @DESCRIPTION:  | 
                    |
| 523 | 
                        +# Obtain and print the script install path for the given  | 
                    |
| 524 | 
                        +# implementation. If no implementation is provided, ${EPYTHON} will
                       | 
                    |
| 525 | 
                        +# be used.  | 
                    |
| 526 | 
                        +python_get_scriptdir() {
                       | 
                    |
| 527 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 528 | 
                        +  | 
                    |
| 529 | 
                        +	_python_export "${@}" PYTHON_SCRIPTDIR
                       | 
                    |
| 530 | 
                        +	echo "${PYTHON_SCRIPTDIR}"
                       | 
                    |
| 531 | 
                        +}  | 
                    |
| 532 | 
                        +  | 
                    |
| 533 | 
                        +# @FUNCTION: _python_ln_rel  | 
                    |
| 534 | 
                        +# @USAGE: <from> <to>  | 
                    |
| 535 | 
                        +# @INTERNAL  | 
                    |
| 536 | 
                        +# @DESCRIPTION:  | 
                    |
| 537 | 
                        +# Create a relative symlink.  | 
                    |
| 538 | 
                        +_python_ln_rel() {
                       | 
                    |
| 539 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 540 | 
                        +  | 
                    |
| 541 | 
                        +	local target=${1}
                       | 
                    |
| 542 | 
                        +	local symname=${2}
                       | 
                    |
| 543 | 
                        +  | 
                    |
| 544 | 
                        +	local tgpath=${target%/*}/
                       | 
                    |
| 545 | 
                        +	local sympath=${symname%/*}/
                       | 
                    |
| 546 | 
                        + local rel_target=  | 
                    |
| 547 | 
                        +  | 
                    |
| 548 | 
                        +	while [[ ${sympath} ]]; do
                       | 
                    |
| 549 | 
                        + local tgseg= symseg=  | 
                    |
| 550 | 
                        +  | 
                    |
| 551 | 
                        +		while [[ ! ${tgseg} && ${tgpath} ]]; do
                       | 
                    |
| 552 | 
                        +			tgseg=${tgpath%%/*}
                       | 
                    |
| 553 | 
                        +			tgpath=${tgpath#${tgseg}/}
                       | 
                    |
| 554 | 
                        + done  | 
                    |
| 555 | 
                        +  | 
                    |
| 556 | 
                        +		while [[ ! ${symseg} && ${sympath} ]]; do
                       | 
                    |
| 557 | 
                        +			symseg=${sympath%%/*}
                       | 
                    |
| 558 | 
                        +			sympath=${sympath#${symseg}/}
                       | 
                    |
| 559 | 
                        + done  | 
                    |
| 560 | 
                        +  | 
                    |
| 561 | 
                        +		if [[ ${tgseg} != ${symseg} ]]; then
                       | 
                    |
| 562 | 
                        +			rel_target=../${rel_target}${tgseg:+${tgseg}/}
                       | 
                    |
| 563 | 
                        + fi  | 
                    |
| 564 | 
                        + done  | 
                    |
| 565 | 
                        +	rel_target+=${tgpath}${target##*/}
                       | 
                    |
| 566 | 
                        +  | 
                    |
| 567 | 
                        +	debug-print "${FUNCNAME}: ${symname} -> ${target}"
                       | 
                    |
| 568 | 
                        +	debug-print "${FUNCNAME}: rel_target = ${rel_target}"
                       | 
                    |
| 569 | 
                        +  | 
                    |
| 570 | 
                        +	ln -fs "${rel_target}" "${symname}"
                       | 
                    |
| 571 | 
                        +}  | 
                    |
| 572 | 
                        +  | 
                    |
| 573 | 
                        +# @FUNCTION: python_optimize  | 
                    |
| 574 | 
                        +# @USAGE: [<directory>...]  | 
                    |
| 575 | 
                        +# @DESCRIPTION:  | 
                    |
| 576 | 
                        +# Compile and optimize Python modules in specified directories (absolute  | 
                    |
| 577 | 
                        +# paths). If no directories are provided, the default system paths  | 
                    |
| 578 | 
                        +# are used (prepended with ${D}).
                       | 
                    |
| 579 | 
                        +python_optimize() {
                       | 
                    |
| 580 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 581 | 
                        +  | 
                    |
| 582 | 
                        +	if [[ ${EBUILD_PHASE} == pre* || ${EBUILD_PHASE} == post* ]]; then
                       | 
                    |
| 583 | 
                        + eerror "The new Python eclasses expect the compiled Python files to"  | 
                    |
| 584 | 
                        + eerror "be controlled by the Package Manager. For this reason,"  | 
                    |
| 585 | 
                        + eerror "the python_optimize function can be used only during src_* phases"  | 
                    |
| 586 | 
                        + eerror "(src_install most commonly) and not during pkg_* phases."  | 
                    |
| 587 | 
                        + echo  | 
                    |
| 588 | 
                        + die "python_optimize is not to be used in pre/post* phases"  | 
                    |
| 589 | 
                        + fi  | 
                    |
| 590 | 
                        +  | 
                    |
| 591 | 
                        +	[[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'
                       | 
                    |
| 592 | 
                        +  | 
                    |
| 593 | 
                        +	local PYTHON=${PYTHON}
                       | 
                    |
| 594 | 
                        +	[[ ${PYTHON} ]] || _python_export PYTHON
                       | 
                    |
| 595 | 
                        +	[[ -x ${PYTHON} ]] || die "PYTHON (${PYTHON}) is not executable"
                       | 
                    |
| 596 | 
                        +  | 
                    |
| 597 | 
                        + # default to sys.path  | 
                    |
| 598 | 
                        +	if [[ ${#} -eq 0 ]]; then
                       | 
                    |
| 599 | 
                        + local f  | 
                    |
| 600 | 
                        + while IFS= read -r -d '' f; do  | 
                    |
| 601 | 
                        + # 1) accept only absolute paths  | 
                    |
| 602 | 
                        + # (i.e. skip '', '.' or anything like that)  | 
                    |
| 603 | 
                        + # 2) skip paths which do not exist  | 
                    |
| 604 | 
                        + # (python2.6 complains about them verbosely)  | 
                    |
| 605 | 
                        +  | 
                    |
| 606 | 
                        +			if [[ ${f} == /* && -d ${D%/}${f} ]]; then
                       | 
                    |
| 607 | 
                        +				set -- "${D%/}${f}" "${@}"
                       | 
                    |
| 608 | 
                        + fi  | 
                    |
| 609 | 
                        +		done < <("${PYTHON}" -c 'import sys; print("".join(x + "\0" for x in sys.path))' || die)
                       | 
                    |
| 610 | 
                        +  | 
                    |
| 611 | 
                        +		debug-print "${FUNCNAME}: using sys.path: ${*/%/;}"
                       | 
                    |
| 612 | 
                        + fi  | 
                    |
| 613 | 
                        +  | 
                    |
| 614 | 
                        + local d  | 
                    |
| 615 | 
                        + for d; do  | 
                    |
| 616 | 
                        + # make sure to get a nice path without //  | 
                    |
| 617 | 
                        +		local instpath=${d#${D%/}}
                       | 
                    |
| 618 | 
                        +		instpath=/${instpath##/}
                       | 
                    |
| 619 | 
                        +  | 
                    |
| 620 | 
                        +		case "${EPYTHON}" in
                       | 
                    |
| 621 | 
                        + python2.7|python3.[34])  | 
                    |
| 622 | 
                        +				"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 623 | 
                        +				"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 624 | 
                        + ;;  | 
                    |
| 625 | 
                        + python*|pypy3)  | 
                    |
| 626 | 
                        + # both levels of optimization are separate since 3.5  | 
                    |
| 627 | 
                        +				"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 628 | 
                        +				"${PYTHON}" -O -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 629 | 
                        +				"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 630 | 
                        + ;;  | 
                    |
| 631 | 
                        + *)  | 
                    |
| 632 | 
                        +				"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"
                       | 
                    |
| 633 | 
                        + ;;  | 
                    |
| 634 | 
                        + esac  | 
                    |
| 635 | 
                        + done  | 
                    |
| 636 | 
                        +}  | 
                    |
| 637 | 
                        +  | 
                    |
| 638 | 
                        +# @FUNCTION: python_scriptinto  | 
                    |
| 639 | 
                        +# @USAGE: <new-path>  | 
                    |
| 640 | 
                        +# @DESCRIPTION:  | 
                    |
| 641 | 
                        +# Set the directory to which files passed to python_doexe(),  | 
                    |
| 642 | 
                        +# python_doscript(), python_newexe() and python_newscript()  | 
                    |
| 643 | 
                        +# are going to be installed. The new value needs to be relative  | 
                    |
| 644 | 
                        +# to the installation root (${ED}).
                       | 
                    |
| 645 | 
                        +#  | 
                    |
| 646 | 
                        +# If not set explicitly, the directory defaults to /usr/bin.  | 
                    |
| 647 | 
                        +#  | 
                    |
| 648 | 
                        +# Example:  | 
                    |
| 649 | 
                        +# @CODE  | 
                    |
| 650 | 
                        +# src_install() {
                       | 
                    |
| 651 | 
                        +# python_scriptinto /usr/sbin  | 
                    |
| 652 | 
                        +# python_foreach_impl python_doscript foo  | 
                    |
| 653 | 
                        +# }  | 
                    |
| 654 | 
                        +# @CODE  | 
                    |
| 655 | 
                        +python_scriptinto() {
                       | 
                    |
| 656 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 657 | 
                        +  | 
                    |
| 658 | 
                        +	python_scriptroot=${1}
                       | 
                    |
| 659 | 
                        +}  | 
                    |
| 660 | 
                        +  | 
                    |
| 661 | 
                        +# @FUNCTION: python_doexe  | 
                    |
| 662 | 
                        +# @USAGE: <files>...  | 
                    |
| 663 | 
                        +# @DESCRIPTION:  | 
                    |
| 664 | 
                        +# Install the given executables into the executable install directory,  | 
                    |
| 665 | 
                        +# for the current Python implementation (${EPYTHON}).
                       | 
                    |
| 666 | 
                        +#  | 
                    |
| 667 | 
                        +# The executable will be wrapped properly for the Python implementation,  | 
                    |
| 668 | 
                        +# though no shebang mangling will be performed.  | 
                    |
| 669 | 
                        +python_doexe() {
                       | 
                    |
| 670 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 671 | 
                        +  | 
                    |
| 672 | 
                        + local f  | 
                    |
| 673 | 
                        + for f; do  | 
                    |
| 674 | 
                        +		python_newexe "${f}" "${f##*/}"
                       | 
                    |
| 675 | 
                        + done  | 
                    |
| 676 | 
                        +}  | 
                    |
| 677 | 
                        +  | 
                    |
| 678 | 
                        +# @FUNCTION: python_newexe  | 
                    |
| 679 | 
                        +# @USAGE: <path> <new-name>  | 
                    |
| 680 | 
                        +# @DESCRIPTION:  | 
                    |
| 681 | 
                        +# Install the given executable into the executable install directory,  | 
                    |
| 682 | 
                        +# for the current Python implementation (${EPYTHON}).
                       | 
                    |
| 683 | 
                        +#  | 
                    |
| 684 | 
                        +# The executable will be wrapped properly for the Python implementation,  | 
                    |
| 685 | 
                        +# though no shebang mangling will be performed. It will be renamed  | 
                    |
| 686 | 
                        +# to <new-name>.  | 
                    |
| 687 | 
                        +python_newexe() {
                       | 
                    |
| 688 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 689 | 
                        +  | 
                    |
| 690 | 
                        +	[[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'
                       | 
                    |
| 691 | 
                        +	[[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} <path> <new-name>"
                       | 
                    |
| 692 | 
                        +  | 
                    |
| 693 | 
                        +	local wrapd=${python_scriptroot:-/usr/bin}
                       | 
                    |
| 694 | 
                        +  | 
                    |
| 695 | 
                        +	local f=${1}
                       | 
                    |
| 696 | 
                        +	local newfn=${2}
                       | 
                    |
| 697 | 
                        +  | 
                    |
| 698 | 
                        + local scriptdir=$(python_get_scriptdir)  | 
                    |
| 699 | 
                        +	local d=${scriptdir#${EPREFIX}}
                       | 
                    |
| 700 | 
                        +  | 
                    |
| 701 | 
                        + (  | 
                    |
| 702 | 
                        +		dodir "${wrapd}"
                       | 
                    |
| 703 | 
                        + exeopts -m 0755  | 
                    |
| 704 | 
                        +		exeinto "${d}"
                       | 
                    |
| 705 | 
                        +		newexe "${f}" "${newfn}" || return ${?}
                       | 
                    |
| 706 | 
                        + )  | 
                    |
| 707 | 
                        +  | 
                    |
| 708 | 
                        + # install the wrapper  | 
                    |
| 709 | 
                        +	_python_ln_rel "${ED%/}"/usr/lib/python-exec/python-exec2 \
                       | 
                    |
| 710 | 
                        +		"${ED%/}/${wrapd}/${newfn}" || die
                       | 
                    |
| 711 | 
                        +  | 
                    |
| 712 | 
                        + # don't use this at home, just call python_doscript() instead  | 
                    |
| 713 | 
                        +	if [[ ${_PYTHON_REWRITE_SHEBANG} ]]; then
                       | 
                    |
| 714 | 
                        +		python_fix_shebang -q "${ED%/}/${d}/${newfn}"
                       | 
                    |
| 715 | 
                        + fi  | 
                    |
| 716 | 
                        +}  | 
                    |
| 717 | 
                        +  | 
                    |
| 718 | 
                        +# @FUNCTION: python_doscript  | 
                    |
| 719 | 
                        +# @USAGE: <files>...  | 
                    |
| 720 | 
                        +# @DESCRIPTION:  | 
                    |
| 721 | 
                        +# Install the given scripts into the executable install directory,  | 
                    |
| 722 | 
                        +# for the current Python implementation (${EPYTHON}).
                       | 
                    |
| 723 | 
                        +#  | 
                    |
| 724 | 
                        +# All specified files must start with a 'python' shebang. The shebang  | 
                    |
| 725 | 
                        +# will be converted, and the files will be wrapped properly  | 
                    |
| 726 | 
                        +# for the Python implementation.  | 
                    |
| 727 | 
                        +#  | 
                    |
| 728 | 
                        +# Example:  | 
                    |
| 729 | 
                        +# @CODE  | 
                    |
| 730 | 
                        +# src_install() {
                       | 
                    |
| 731 | 
                        +#   python_foreach_impl python_doscript ${PN}
                       | 
                    |
| 732 | 
                        +# }  | 
                    |
| 733 | 
                        +# @CODE  | 
                    |
| 734 | 
                        +python_doscript() {
                       | 
                    |
| 735 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 736 | 
                        +  | 
                    |
| 737 | 
                        + local _PYTHON_REWRITE_SHEBANG=1  | 
                    |
| 738 | 
                        +	python_doexe "${@}"
                       | 
                    |
| 739 | 
                        +}  | 
                    |
| 740 | 
                        +  | 
                    |
| 741 | 
                        +# @FUNCTION: python_newscript  | 
                    |
| 742 | 
                        +# @USAGE: <path> <new-name>  | 
                    |
| 743 | 
                        +# @DESCRIPTION:  | 
                    |
| 744 | 
                        +# Install the given script into the executable install directory  | 
                    |
| 745 | 
                        +# for the current Python implementation (${EPYTHON}), and name it
                       | 
                    |
| 746 | 
                        +# <new-name>.  | 
                    |
| 747 | 
                        +#  | 
                    |
| 748 | 
                        +# The file must start with a 'python' shebang. The shebang will be  | 
                    |
| 749 | 
                        +# converted, and the file will be wrapped properly for the Python  | 
                    |
| 750 | 
                        +# implementation. It will be renamed to <new-name>.  | 
                    |
| 751 | 
                        +#  | 
                    |
| 752 | 
                        +# Example:  | 
                    |
| 753 | 
                        +# @CODE  | 
                    |
| 754 | 
                        +# src_install() {
                       | 
                    |
| 755 | 
                        +# python_foreach_impl python_newscript foo.py foo  | 
                    |
| 756 | 
                        +# }  | 
                    |
| 757 | 
                        +# @CODE  | 
                    |
| 758 | 
                        +python_newscript() {
                       | 
                    |
| 759 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 760 | 
                        +  | 
                    |
| 761 | 
                        + local _PYTHON_REWRITE_SHEBANG=1  | 
                    |
| 762 | 
                        +	python_newexe "${@}"
                       | 
                    |
| 763 | 
                        +}  | 
                    |
| 764 | 
                        +  | 
                    |
| 765 | 
                        +# @FUNCTION: python_moduleinto  | 
                    |
| 766 | 
                        +# @USAGE: <new-path>  | 
                    |
| 767 | 
                        +# @DESCRIPTION:  | 
                    |
| 768 | 
                        +# Set the Python module install directory for python_domodule().  | 
                    |
| 769 | 
                        +# The <new-path> can either be an absolute target system path (in which  | 
                    |
| 770 | 
                        +# case it needs to start with a slash, and ${ED} will be prepended to
                       | 
                    |
| 771 | 
                        +# it) or relative to the implementation's site-packages directory  | 
                    |
| 772 | 
                        +# (then it must not start with a slash). The relative path can be  | 
                    |
| 773 | 
                        +# specified either using the Python package notation (separated by dots)  | 
                    |
| 774 | 
                        +# or the directory notation (using slashes).  | 
                    |
| 775 | 
                        +#  | 
                    |
| 776 | 
                        +# When not set explicitly, the modules are installed to the top  | 
                    |
| 777 | 
                        +# site-packages directory.  | 
                    |
| 778 | 
                        +#  | 
                    |
| 779 | 
                        +# In the relative case, the exact path is determined directly  | 
                    |
| 780 | 
                        +# by each python_doscript/python_newscript function. Therefore,  | 
                    |
| 781 | 
                        +# python_moduleinto can be safely called before establishing the Python  | 
                    |
| 782 | 
                        +# interpreter and/or a single call can be used to set the path correctly  | 
                    |
| 783 | 
                        +# for multiple implementations, as can be seen in the following example.  | 
                    |
| 784 | 
                        +#  | 
                    |
| 785 | 
                        +# Example:  | 
                    |
| 786 | 
                        +# @CODE  | 
                    |
| 787 | 
                        +# src_install() {
                       | 
                    |
| 788 | 
                        +# python_moduleinto bar  | 
                    |
| 789 | 
                        +#   # installs ${PYTHON_SITEDIR}/bar/baz.py
                       | 
                    |
| 790 | 
                        +# python_foreach_impl python_domodule baz.py  | 
                    |
| 791 | 
                        +# }  | 
                    |
| 792 | 
                        +# @CODE  | 
                    |
| 793 | 
                        +python_moduleinto() {
                       | 
                    |
| 794 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 795 | 
                        +  | 
                    |
| 796 | 
                        +	python_moduleroot=${1}
                       | 
                    |
| 797 | 
                        +}  | 
                    |
| 798 | 
                        +  | 
                    |
| 799 | 
                        +# @FUNCTION: python_domodule  | 
                    |
| 800 | 
                        +# @USAGE: <files>...  | 
                    |
| 801 | 
                        +# @DESCRIPTION:  | 
                    |
| 802 | 
                        +# Install the given modules (or packages) into the current Python module  | 
                    |
| 803 | 
                        +# installation directory. The list can mention both modules (files)  | 
                    |
| 804 | 
                        +# and packages (directories). All listed files will be installed  | 
                    |
| 805 | 
                        +# for all enabled implementations, and compiled afterwards.  | 
                    |
| 806 | 
                        +#  | 
                    |
| 807 | 
                        +# Example:  | 
                    |
| 808 | 
                        +# @CODE  | 
                    |
| 809 | 
                        +# src_install() {
                       | 
                    |
| 810 | 
                        +#   # (${PN} being a directory)
                       | 
                    |
| 811 | 
                        +#   python_foreach_impl python_domodule ${PN}
                       | 
                    |
| 812 | 
                        +# }  | 
                    |
| 813 | 
                        +# @CODE  | 
                    |
| 814 | 
                        +python_domodule() {
                       | 
                    |
| 815 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 816 | 
                        +  | 
                    |
| 817 | 
                        +	[[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'
                       | 
                    |
| 818 | 
                        +  | 
                    |
| 819 | 
                        + local d  | 
                    |
| 820 | 
                        +	if [[ ${python_moduleroot} == /* ]]; then
                       | 
                    |
| 821 | 
                        + # absolute path  | 
                    |
| 822 | 
                        +		d=${python_moduleroot}
                       | 
                    |
| 823 | 
                        + else  | 
                    |
| 824 | 
                        + # relative to site-packages  | 
                    |
| 825 | 
                        + local sitedir=$(python_get_sitedir)  | 
                    |
| 826 | 
                        +		d=${sitedir#${EPREFIX}}/${python_moduleroot//.//}
                       | 
                    |
| 827 | 
                        + fi  | 
                    |
| 828 | 
                        +  | 
                    |
| 829 | 
                        + (  | 
                    |
| 830 | 
                        + insopts -m 0644  | 
                    |
| 831 | 
                        +		insinto "${d}"
                       | 
                    |
| 832 | 
                        +		doins -r "${@}" || return ${?}
                       | 
                    |
| 833 | 
                        + )  | 
                    |
| 834 | 
                        +  | 
                    |
| 835 | 
                        +	python_optimize "${ED%/}/${d}"
                       | 
                    |
| 836 | 
                        +}  | 
                    |
| 837 | 
                        +  | 
                    |
| 838 | 
                        +# @FUNCTION: python_doheader  | 
                    |
| 839 | 
                        +# @USAGE: <files>...  | 
                    |
| 840 | 
                        +# @DESCRIPTION:  | 
                    |
| 841 | 
                        +# Install the given headers into the implementation-specific include  | 
                    |
| 842 | 
                        +# directory. This function is unconditionally recursive, i.e. you can  | 
                    |
| 843 | 
                        +# pass directories instead of files.  | 
                    |
| 844 | 
                        +#  | 
                    |
| 845 | 
                        +# Example:  | 
                    |
| 846 | 
                        +# @CODE  | 
                    |
| 847 | 
                        +# src_install() {
                       | 
                    |
| 848 | 
                        +# python_foreach_impl python_doheader foo.h bar.h  | 
                    |
| 849 | 
                        +# }  | 
                    |
| 850 | 
                        +# @CODE  | 
                    |
| 851 | 
                        +python_doheader() {
                       | 
                    |
| 852 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 853 | 
                        +  | 
                    |
| 854 | 
                        +	[[ ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'
                       | 
                    |
| 855 | 
                        +  | 
                    |
| 856 | 
                        + local includedir=$(python_get_includedir)  | 
                    |
| 857 | 
                        +	local d=${includedir#${EPREFIX}}
                       | 
                    |
| 858 | 
                        +  | 
                    |
| 859 | 
                        + (  | 
                    |
| 860 | 
                        + insopts -m 0644  | 
                    |
| 861 | 
                        +		insinto "${d}"
                       | 
                    |
| 862 | 
                        +		doins -r "${@}" || return ${?}
                       | 
                    |
| 863 | 
                        + )  | 
                    |
| 864 | 
                        +}  | 
                    |
| 865 | 
                        +  | 
                    |
| 866 | 
                        +# @FUNCTION: python_wrapper_setup  | 
                    |
| 867 | 
                        +# @USAGE: [<path> [<impl>]]  | 
                    |
| 868 | 
                        +# @DESCRIPTION:  | 
                    |
| 869 | 
                        +# Backwards compatibility function. The relevant API is now considered  | 
                    |
| 870 | 
                        +# private, please use python_setup instead.  | 
                    |
| 871 | 
                        +python_wrapper_setup() {
                       | 
                    |
| 872 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 873 | 
                        +  | 
                    |
| 874 | 
                        + eqawarn "python_wrapper_setup() is part of private eclass API."  | 
                    |
| 875 | 
                        + eqawarn "Please call python_setup() instead."  | 
                    |
| 876 | 
                        +  | 
                    |
| 877 | 
                        +	_python_wrapper_setup "${@}"
                       | 
                    |
| 878 | 
                        +}  | 
                    |
| 879 | 
                        +  | 
                    |
| 880 | 
                        +# @FUNCTION: _python_wrapper_setup  | 
                    |
| 881 | 
                        +# @USAGE: [<path> [<impl>]]  | 
                    |
| 882 | 
                        +# @INTERNAL  | 
                    |
| 883 | 
                        +# @DESCRIPTION:  | 
                    |
| 884 | 
                        +# Create proper 'python' executable and pkg-config wrappers  | 
                    |
| 885 | 
                        +# (if available) in the directory named by <path>. Set up PATH  | 
                    |
| 886 | 
                        +# and PKG_CONFIG_PATH appropriately. <path> defaults to ${T}/${EPYTHON}.
                       | 
                    |
| 887 | 
                        +#  | 
                    |
| 888 | 
                        +# The wrappers will be created for implementation named by <impl>,  | 
                    |
| 889 | 
                        +# or for one named by ${EPYTHON} if no <impl> passed.
                       | 
                    |
| 890 | 
                        +#  | 
                    |
| 891 | 
                        +# If the named directory contains a python symlink already, it will  | 
                    |
| 892 | 
                        +# be assumed to contain proper wrappers already and only environment  | 
                    |
| 893 | 
                        +# setup will be done. If wrapper update is requested, the directory  | 
                    |
| 894 | 
                        +# shall be removed first.  | 
                    |
| 895 | 
                        +_python_wrapper_setup() {
                       | 
                    |
| 896 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 897 | 
                        +  | 
                    |
| 898 | 
                        +	local workdir=${1:-${T}/${EPYTHON}}
                       | 
                    |
| 899 | 
                        +	local impl=${2:-${EPYTHON}}
                       | 
                    |
| 900 | 
                        +  | 
                    |
| 901 | 
                        +	[[ ${workdir} ]] || die "${FUNCNAME}: no workdir specified."
                       | 
                    |
| 902 | 
                        +	[[ ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified."
                       | 
                    |
| 903 | 
                        +  | 
                    |
| 904 | 
                        +	if [[ ! -x ${workdir}/bin/python ]]; then
                       | 
                    |
| 905 | 
                        + _python_check_dead_variables  | 
                    |
| 906 | 
                        +  | 
                    |
| 907 | 
                        +		mkdir -p "${workdir}"/{bin,pkgconfig} || die
                       | 
                    |
| 908 | 
                        +  | 
                    |
| 909 | 
                        + # Clean up, in case we were supposed to do a cheap update.  | 
                    |
| 910 | 
                        +		rm -f "${workdir}"/bin/python{,2,3}{,-config} || die
                       | 
                    |
| 911 | 
                        +		rm -f "${workdir}"/bin/2to3 || die
                       | 
                    |
| 912 | 
                        +		rm -f "${workdir}"/pkgconfig/python{2,3}{,-embed}.pc || die
                       | 
                    |
| 913 | 
                        +  | 
                    |
| 914 | 
                        + local EPYTHON PYTHON  | 
                    |
| 915 | 
                        +		_python_export "${impl}" EPYTHON PYTHON
                       | 
                    |
| 916 | 
                        +  | 
                    |
| 917 | 
                        + local pyver pyother  | 
                    |
| 918 | 
                        + if python_is_python3; then  | 
                    |
| 919 | 
                        + pyver=3  | 
                    |
| 920 | 
                        + pyother=2  | 
                    |
| 921 | 
                        + else  | 
                    |
| 922 | 
                        + pyver=2  | 
                    |
| 923 | 
                        + pyother=3  | 
                    |
| 924 | 
                        + fi  | 
                    |
| 925 | 
                        +  | 
                    |
| 926 | 
                        + # Python interpreter  | 
                    |
| 927 | 
                        + # note: we don't use symlinks because python likes to do some  | 
                    |
| 928 | 
                        + # symlink reading magic that breaks stuff  | 
                    |
| 929 | 
                        + # https://bugs.gentoo.org/show_bug.cgi?id=555752  | 
                    |
| 930 | 
                        +		cat > "${workdir}/bin/python" <<-_EOF_ || die
                       | 
                    |
| 931 | 
                        + #!/bin/sh  | 
                    |
| 932 | 
                        +			exec "${PYTHON}" "\${@}"
                       | 
                    |
| 933 | 
                        + _EOF_  | 
                    |
| 934 | 
                        +		cp "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die
                       | 
                    |
| 935 | 
                        +		chmod +x "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die
                       | 
                    |
| 936 | 
                        +  | 
                    |
| 937 | 
                        +		local nonsupp=( "python${pyother}" "python${pyother}-config" )
                       | 
                    |
| 938 | 
                        +  | 
                    |
| 939 | 
                        + # CPython-specific  | 
                    |
| 940 | 
                        +		if [[ ${EPYTHON} == python* ]]; then
                       | 
                    |
| 941 | 
                        +			cat > "${workdir}/bin/python-config" <<-_EOF_ || die
                       | 
                    |
| 942 | 
                        + #!/bin/sh  | 
                    |
| 943 | 
                        +				exec "${PYTHON}-config" "\${@}"
                       | 
                    |
| 944 | 
                        + _EOF_  | 
                    |
| 945 | 
                        +			cp "${workdir}/bin/python-config" \
                       | 
                    |
| 946 | 
                        +				"${workdir}/bin/python${pyver}-config" || die
                       | 
                    |
| 947 | 
                        +			chmod +x "${workdir}/bin/python-config" \
                       | 
                    |
| 948 | 
                        +				"${workdir}/bin/python${pyver}-config" || die
                       | 
                    |
| 949 | 
                        +  | 
                    |
| 950 | 
                        + # Python 2.6+.  | 
                    |
| 951 | 
                        +			ln -s "${PYTHON/python/2to3-}" "${workdir}"/bin/2to3 || die
                       | 
                    |
| 952 | 
                        +  | 
                    |
| 953 | 
                        + # Python 2.7+.  | 
                    |
| 954 | 
                        +			ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}.pc \
                       | 
                    |
| 955 | 
                        +				"${workdir}"/pkgconfig/python${pyver}.pc || die
                       | 
                    |
| 956 | 
                        +  | 
                    |
| 957 | 
                        + # Python 3.8+.  | 
                    |
| 958 | 
                        +			if [[ ${EPYTHON} != python[23].[67] ]]; then
                       | 
                    |
| 959 | 
                        +				ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}-embed.pc \
                       | 
                    |
| 960 | 
                        +					"${workdir}"/pkgconfig/python${pyver}-embed.pc || die
                       | 
                    |
| 961 | 
                        + fi  | 
                    |
| 962 | 
                        + else  | 
                    |
| 963 | 
                        +			nonsupp+=( 2to3 python-config "python${pyver}-config" )
                       | 
                    |
| 964 | 
                        + fi  | 
                    |
| 965 | 
                        +  | 
                    |
| 966 | 
                        + local x  | 
                    |
| 967 | 
                        +		for x in "${nonsupp[@]}"; do
                       | 
                    |
| 968 | 
                        +			cat >"${workdir}"/bin/${x} <<-_EOF_ || die
                       | 
                    |
| 969 | 
                        + #!/bin/sh  | 
                    |
| 970 | 
                        +				echo "${ECLASS}: ${FUNCNAME}: ${x} is not supported by ${EPYTHON} (PYTHON_COMPAT)" >&2
                       | 
                    |
| 971 | 
                        + exit 127  | 
                    |
| 972 | 
                        + _EOF_  | 
                    |
| 973 | 
                        +			chmod +x "${workdir}"/bin/${x} || die
                       | 
                    |
| 974 | 
                        + done  | 
                    |
| 975 | 
                        + fi  | 
                    |
| 976 | 
                        +  | 
                    |
| 977 | 
                        + # Now, set the environment.  | 
                    |
| 978 | 
                        +	# But note that ${workdir} may be shared with something else,
                       | 
                    |
| 979 | 
                        + # and thus already on top of PATH.  | 
                    |
| 980 | 
                        +	if [[ ${PATH##:*} != ${workdir}/bin ]]; then
                       | 
                    |
| 981 | 
                        +		PATH=${workdir}/bin${PATH:+:${PATH}}
                       | 
                    |
| 982 | 
                        + fi  | 
                    |
| 983 | 
                        +	if [[ ${PKG_CONFIG_PATH##:*} != ${workdir}/pkgconfig ]]; then
                       | 
                    |
| 984 | 
                        +		PKG_CONFIG_PATH=${workdir}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
                       | 
                    |
| 985 | 
                        + fi  | 
                    |
| 986 | 
                        + export PATH PKG_CONFIG_PATH  | 
                    |
| 987 | 
                        +}  | 
                    |
| 988 | 
                        +  | 
                    |
| 989 | 
                        +# @FUNCTION: python_is_python3  | 
                    |
| 990 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 991 | 
                        +# @DESCRIPTION:  | 
                    |
| 992 | 
                        +# Check whether <impl> (or ${EPYTHON}) is a Python3k variant
                       | 
                    |
| 993 | 
                        +# (i.e. uses syntax and stdlib of Python 3.*).  | 
                    |
| 994 | 
                        +#  | 
                    |
| 995 | 
                        +# Returns 0 (true) if it is, 1 (false) otherwise.  | 
                    |
| 996 | 
                        +python_is_python3() {
                       | 
                    |
| 997 | 
                        +	local impl=${1:-${EPYTHON}}
                       | 
                    |
| 998 | 
                        +	[[ ${impl} ]] || die "python_is_python3: no impl nor EPYTHON"
                       | 
                    |
| 999 | 
                        +  | 
                    |
| 1000 | 
                        +	[[ ${impl} == python3* || ${impl} == pypy3 ]]
                       | 
                    |
| 1001 | 
                        +}  | 
                    |
| 1002 | 
                        +  | 
                    |
| 1003 | 
                        +# @FUNCTION: python_is_installed  | 
                    |
| 1004 | 
                        +# @USAGE: [<impl>]  | 
                    |
| 1005 | 
                        +# @DESCRIPTION:  | 
                    |
| 1006 | 
                        +# Check whether the interpreter for <impl> (or ${EPYTHON}) is installed.
                       | 
                    |
| 1007 | 
                        +# Uses has_version with a proper dependency string.  | 
                    |
| 1008 | 
                        +#  | 
                    |
| 1009 | 
                        +# Returns 0 (true) if it is, 1 (false) otherwise.  | 
                    |
| 1010 | 
                        +python_is_installed() {
                       | 
                    |
| 1011 | 
                        +	local impl=${1:-${EPYTHON}}
                       | 
                    |
| 1012 | 
                        +	[[ ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON"
                       | 
                    |
| 1013 | 
                        + local hasv_args=()  | 
                    |
| 1014 | 
                        +  | 
                    |
| 1015 | 
                        +	case ${EAPI} in
                       | 
                    |
| 1016 | 
                        + 5|6)  | 
                    |
| 1017 | 
                        + hasv_args+=( --host-root )  | 
                    |
| 1018 | 
                        + ;;  | 
                    |
| 1019 | 
                        + *)  | 
                    |
| 1020 | 
                        + hasv_args+=( -b )  | 
                    |
| 1021 | 
                        + ;;  | 
                    |
| 1022 | 
                        + esac  | 
                    |
| 1023 | 
                        +  | 
                    |
| 1024 | 
                        + local PYTHON_PKG_DEP  | 
                    |
| 1025 | 
                        +	_python_export "${impl}" PYTHON_PKG_DEP
                       | 
                    |
| 1026 | 
                        +	has_version "${hasv_args[@]}" "${PYTHON_PKG_DEP}"
                       | 
                    |
| 1027 | 
                        +}  | 
                    |
| 1028 | 
                        +  | 
                    |
| 1029 | 
                        +# @FUNCTION: python_fix_shebang  | 
                    |
| 1030 | 
                        +# @USAGE: [-f|--force] [-q|--quiet] <path>...  | 
                    |
| 1031 | 
                        +# @DESCRIPTION:  | 
                    |
| 1032 | 
                        +# Replace the shebang in Python scripts with the current Python  | 
                    |
| 1033 | 
                        +# implementation (EPYTHON). If a directory is passed, works recursively  | 
                    |
| 1034 | 
                        +# on all Python scripts.  | 
                    |
| 1035 | 
                        +#  | 
                    |
| 1036 | 
                        +# Only files having a 'python*' shebang will be modified. Files with  | 
                    |
| 1037 | 
                        +# other shebang will either be skipped when working recursively  | 
                    |
| 1038 | 
                        +# on a directory or treated as error when specified explicitly.  | 
                    |
| 1039 | 
                        +#  | 
                    |
| 1040 | 
                        +# Shebangs matching explicitly current Python version will be left  | 
                    |
| 1041 | 
                        +# unmodified. Shebangs requesting another Python version will be treated  | 
                    |
| 1042 | 
                        +# as fatal error, unless --force is given.  | 
                    |
| 1043 | 
                        +#  | 
                    |
| 1044 | 
                        +# --force causes the function to replace even shebangs that require  | 
                    |
| 1045 | 
                        +# incompatible Python version. --quiet causes the function not to list  | 
                    |
| 1046 | 
                        +# modified files verbosely.  | 
                    |
| 1047 | 
                        +python_fix_shebang() {
                       | 
                    |
| 1048 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 1049 | 
                        +  | 
                    |
| 1050 | 
                        +	[[ ${EPYTHON} ]] || die "${FUNCNAME}: EPYTHON unset (pkg_setup not called?)"
                       | 
                    |
| 1051 | 
                        +  | 
                    |
| 1052 | 
                        + local force quiet  | 
                    |
| 1053 | 
                        +	while [[ ${@} ]]; do
                       | 
                    |
| 1054 | 
                        +		case "${1}" in
                       | 
                    |
| 1055 | 
                        + -f|--force) force=1; shift;;  | 
                    |
| 1056 | 
                        + -q|--quiet) quiet=1; shift;;  | 
                    |
| 1057 | 
                        + --) shift; break;;  | 
                    |
| 1058 | 
                        + *) break;;  | 
                    |
| 1059 | 
                        + esac  | 
                    |
| 1060 | 
                        + done  | 
                    |
| 1061 | 
                        +  | 
                    |
| 1062 | 
                        +	[[ ${1} ]] || die "${FUNCNAME}: no paths given"
                       | 
                    |
| 1063 | 
                        +  | 
                    |
| 1064 | 
                        + local path f  | 
                    |
| 1065 | 
                        + for path; do  | 
                    |
| 1066 | 
                        + local any_correct any_fixed is_recursive  | 
                    |
| 1067 | 
                        +  | 
                    |
| 1068 | 
                        +		[[ -d ${path} ]] && is_recursive=1
                       | 
                    |
| 1069 | 
                        +  | 
                    |
| 1070 | 
                        + while IFS= read -r -d '' f; do  | 
                    |
| 1071 | 
                        + local shebang i  | 
                    |
| 1072 | 
                        + local error= from=  | 
                    |
| 1073 | 
                        +  | 
                    |
| 1074 | 
                        + # note: we can't ||die here since read will fail if file  | 
                    |
| 1075 | 
                        + # has no newline characters  | 
                    |
| 1076 | 
                        +			IFS= read -r shebang <"${f}"
                       | 
                    |
| 1077 | 
                        +  | 
                    |
| 1078 | 
                        + # First, check if it's shebang at all...  | 
                    |
| 1079 | 
                        +			if [[ ${shebang} == '#!'* ]]; then
                       | 
                    |
| 1080 | 
                        + local split_shebang=()  | 
                    |
| 1081 | 
                        +				read -r -a split_shebang <<<${shebang} || die
                       | 
                    |
| 1082 | 
                        +  | 
                    |
| 1083 | 
                        + # Match left-to-right in a loop, to avoid matching random  | 
                    |
| 1084 | 
                        + # repetitions like 'python2.7 python2'.  | 
                    |
| 1085 | 
                        +				for i in "${split_shebang[@]}"; do
                       | 
                    |
| 1086 | 
                        +					case "${i}" in
                       | 
                    |
| 1087 | 
                        +						*"${EPYTHON}")
                       | 
                    |
| 1088 | 
                        +							debug-print "${FUNCNAME}: in file ${f#${D%/}}"
                       | 
                    |
| 1089 | 
                        +							debug-print "${FUNCNAME}: shebang matches EPYTHON: ${shebang}"
                       | 
                    |
| 1090 | 
                        +  | 
                    |
| 1091 | 
                        + # Nothing to do, move along.  | 
                    |
| 1092 | 
                        + any_correct=1  | 
                    |
| 1093 | 
                        +							from=${EPYTHON}
                       | 
                    |
| 1094 | 
                        + break  | 
                    |
| 1095 | 
                        + ;;  | 
                    |
| 1096 | 
                        + *python|*python[23])  | 
                    |
| 1097 | 
                        +							debug-print "${FUNCNAME}: in file ${f#${D%/}}"
                       | 
                    |
| 1098 | 
                        +							debug-print "${FUNCNAME}: rewriting shebang: ${shebang}"
                       | 
                    |
| 1099 | 
                        +  | 
                    |
| 1100 | 
                        +							if [[ ${i} == *python2 ]]; then
                       | 
                    |
| 1101 | 
                        + from=python2  | 
                    |
| 1102 | 
                        +								if [[ ! ${force} ]]; then
                       | 
                    |
| 1103 | 
                        +									python_is_python3 "${EPYTHON}" && error=1
                       | 
                    |
| 1104 | 
                        + fi  | 
                    |
| 1105 | 
                        +							elif [[ ${i} == *python3 ]]; then
                       | 
                    |
| 1106 | 
                        + from=python3  | 
                    |
| 1107 | 
                        +								if [[ ! ${force} ]]; then
                       | 
                    |
| 1108 | 
                        +									python_is_python3 "${EPYTHON}" || error=1
                       | 
                    |
| 1109 | 
                        + fi  | 
                    |
| 1110 | 
                        + else  | 
                    |
| 1111 | 
                        + from=python  | 
                    |
| 1112 | 
                        + fi  | 
                    |
| 1113 | 
                        + break  | 
                    |
| 1114 | 
                        + ;;  | 
                    |
| 1115 | 
                        + *python[23].[0123456789]|*pypy|*pypy3|*jython[23].[0123456789])  | 
                    |
| 1116 | 
                        + # Explicit mismatch.  | 
                    |
| 1117 | 
                        +							if [[ ! ${force} ]]; then
                       | 
                    |
| 1118 | 
                        + error=1  | 
                    |
| 1119 | 
                        + else  | 
                    |
| 1120 | 
                        +								case "${i}" in
                       | 
                    |
| 1121 | 
                        + *python[23].[0123456789])  | 
                    |
| 1122 | 
                        + from="python[23].[0123456789]";;  | 
                    |
| 1123 | 
                        + *pypy)  | 
                    |
| 1124 | 
                        + from="pypy";;  | 
                    |
| 1125 | 
                        + *pypy3)  | 
                    |
| 1126 | 
                        + from="pypy3";;  | 
                    |
| 1127 | 
                        + *jython[23].[0123456789])  | 
                    |
| 1128 | 
                        + from="jython[23].[0123456789]";;  | 
                    |
| 1129 | 
                        + *)  | 
                    |
| 1130 | 
                        +										die "${FUNCNAME}: internal error in 2nd pattern match";;
                       | 
                    |
| 1131 | 
                        + esac  | 
                    |
| 1132 | 
                        + fi  | 
                    |
| 1133 | 
                        + break  | 
                    |
| 1134 | 
                        + ;;  | 
                    |
| 1135 | 
                        + esac  | 
                    |
| 1136 | 
                        + done  | 
                    |
| 1137 | 
                        + fi  | 
                    |
| 1138 | 
                        +  | 
                    |
| 1139 | 
                        +			if [[ ! ${error} && ! ${from} ]]; then
                       | 
                    |
| 1140 | 
                        + # Non-Python shebang. Allowed in recursive mode,  | 
                    |
| 1141 | 
                        + # disallowed when specifying file explicitly.  | 
                    |
| 1142 | 
                        +				[[ ${is_recursive} ]] && continue
                       | 
                    |
| 1143 | 
                        + error=1  | 
                    |
| 1144 | 
                        + fi  | 
                    |
| 1145 | 
                        +  | 
                    |
| 1146 | 
                        +			if [[ ! ${quiet} ]]; then
                       | 
                    |
| 1147 | 
                        +				einfo "Fixing shebang in ${f#${D%/}}."
                       | 
                    |
| 1148 | 
                        + fi  | 
                    |
| 1149 | 
                        +  | 
                    |
| 1150 | 
                        +			if [[ ! ${error} ]]; then
                       | 
                    |
| 1151 | 
                        +				# We either want to match ${from} followed by space
                       | 
                    |
| 1152 | 
                        + # or at end-of-string.  | 
                    |
| 1153 | 
                        +				if [[ ${shebang} == *${from}" "* ]]; then
                       | 
                    |
| 1154 | 
                        +					sed -i -e "1s:${from} :${EPYTHON} :" "${f}" || die
                       | 
                    |
| 1155 | 
                        + else  | 
                    |
| 1156 | 
                        +					sed -i -e "1s:${from}$:${EPYTHON}:" "${f}" || die
                       | 
                    |
| 1157 | 
                        + fi  | 
                    |
| 1158 | 
                        + any_fixed=1  | 
                    |
| 1159 | 
                        + else  | 
                    |
| 1160 | 
                        + eerror "The file has incompatible shebang:"  | 
                    |
| 1161 | 
                        +				eerror "  file: ${f#${D%/}}"
                       | 
                    |
| 1162 | 
                        +				eerror "  current shebang: ${shebang}"
                       | 
                    |
| 1163 | 
                        +				eerror "  requested impl: ${EPYTHON}"
                       | 
                    |
| 1164 | 
                        +				die "${FUNCNAME}: conversion of incompatible shebang requested"
                       | 
                    |
| 1165 | 
                        + fi  | 
                    |
| 1166 | 
                        +		done < <(find -H "${path}" -type f -print0 || die)
                       | 
                    |
| 1167 | 
                        +  | 
                    |
| 1168 | 
                        +		if [[ ! ${any_fixed} ]]; then
                       | 
                    |
| 1169 | 
                        + local cmd=eerror  | 
                    |
| 1170 | 
                        +			[[ ${EAPI} == 5 ]] && cmd=eqawarn
                       | 
                    |
| 1171 | 
                        +  | 
                    |
| 1172 | 
                        +			"${cmd}" "QA warning: ${FUNCNAME}, ${path#${D%/}} did not match any fixable files."
                       | 
                    |
| 1173 | 
                        +			if [[ ${any_correct} ]]; then
                       | 
                    |
| 1174 | 
                        +				"${cmd}" "All files have ${EPYTHON} shebang already."
                       | 
                    |
| 1175 | 
                        + else  | 
                    |
| 1176 | 
                        +				"${cmd}" "There are no Python files in specified directory."
                       | 
                    |
| 1177 | 
                        + fi  | 
                    |
| 1178 | 
                        +  | 
                    |
| 1179 | 
                        +			[[ ${cmd} == eerror ]] && die "${FUNCNAME} did not match any fixable files (QA warning fatal in EAPI ${EAPI})"
                       | 
                    |
| 1180 | 
                        + fi  | 
                    |
| 1181 | 
                        + done  | 
                    |
| 1182 | 
                        +}  | 
                    |
| 1183 | 
                        +  | 
                    |
| 1184 | 
                        +# @FUNCTION: _python_check_locale_sanity  | 
                    |
| 1185 | 
                        +# @USAGE: <locale>  | 
                    |
| 1186 | 
                        +# @RETURN: 0 if sane, 1 otherwise  | 
                    |
| 1187 | 
                        +# @INTERNAL  | 
                    |
| 1188 | 
                        +# @DESCRIPTION:  | 
                    |
| 1189 | 
                        +# Check whether the specified locale sanely maps between lowercase  | 
                    |
| 1190 | 
                        +# and uppercase ASCII characters.  | 
                    |
| 1191 | 
                        +_python_check_locale_sanity() {
                       | 
                    |
| 1192 | 
                        +	local -x LC_ALL=${1}
                       | 
                    |
| 1193 | 
                        + local IFS=  | 
                    |
| 1194 | 
                        +  | 
                    |
| 1195 | 
                        +	local lc=( {a..z} )
                       | 
                    |
| 1196 | 
                        +	local uc=( {A..Z} )
                       | 
                    |
| 1197 | 
                        +	local input="${lc[*]}${uc[*]}"
                       | 
                    |
| 1198 | 
                        +  | 
                    |
| 1199 | 
                        +	local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<<"${input}")
                       | 
                    |
| 1200 | 
                        +	[[ ${output} == "${uc[*]}${lc[*]}" ]]
                       | 
                    |
| 1201 | 
                        +}  | 
                    |
| 1202 | 
                        +  | 
                    |
| 1203 | 
                        +# @FUNCTION: python_export_utf8_locale  | 
                    |
| 1204 | 
                        +# @RETURN: 0 on success, 1 on failure.  | 
                    |
| 1205 | 
                        +# @DESCRIPTION:  | 
                    |
| 1206 | 
                        +# Attempts to export a usable UTF-8 locale in the LC_CTYPE variable. Does  | 
                    |
| 1207 | 
                        +# nothing if LC_ALL is defined, or if the current locale uses a UTF-8 charmap.  | 
                    |
| 1208 | 
                        +# This may be used to work around the quirky open() behavior of python3.  | 
                    |
| 1209 | 
                        +python_export_utf8_locale() {
                       | 
                    |
| 1210 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 1211 | 
                        +  | 
                    |
| 1212 | 
                        + # If the locale program isn't available, just return.  | 
                    |
| 1213 | 
                        + type locale >/dev/null || return 0  | 
                    |
| 1214 | 
                        +  | 
                    |
| 1215 | 
                        + if [[ $(locale charmap) != UTF-8 ]]; then  | 
                    |
| 1216 | 
                        + # Try English first, then everything else.  | 
                    |
| 1217 | 
                        + local lang locales="C.UTF-8 en_US.UTF-8 en_GB.UTF-8 $(locale -a)"  | 
                    |
| 1218 | 
                        +  | 
                    |
| 1219 | 
                        +		for lang in ${locales}; do
                       | 
                    |
| 1220 | 
                        +			if [[ $(LC_ALL=${lang} locale charmap 2>/dev/null) == UTF-8 ]]; then
                       | 
                    |
| 1221 | 
                        +				if _python_check_locale_sanity "${lang}"; then
                       | 
                    |
| 1222 | 
                        +					export LC_CTYPE=${lang}
                       | 
                    |
| 1223 | 
                        +					if [[ -n ${LC_ALL} ]]; then
                       | 
                    |
| 1224 | 
                        +						export LC_NUMERIC=${LC_ALL}
                       | 
                    |
| 1225 | 
                        +						export LC_TIME=${LC_ALL}
                       | 
                    |
| 1226 | 
                        +						export LC_COLLATE=${LC_ALL}
                       | 
                    |
| 1227 | 
                        +						export LC_MONETARY=${LC_ALL}
                       | 
                    |
| 1228 | 
                        +						export LC_MESSAGES=${LC_ALL}
                       | 
                    |
| 1229 | 
                        +						export LC_PAPER=${LC_ALL}
                       | 
                    |
| 1230 | 
                        +						export LC_NAME=${LC_ALL}
                       | 
                    |
| 1231 | 
                        +						export LC_ADDRESS=${LC_ALL}
                       | 
                    |
| 1232 | 
                        +						export LC_TELEPHONE=${LC_ALL}
                       | 
                    |
| 1233 | 
                        +						export LC_MEASUREMENT=${LC_ALL}
                       | 
                    |
| 1234 | 
                        +						export LC_IDENTIFICATION=${LC_ALL}
                       | 
                    |
| 1235 | 
                        + export LC_ALL=  | 
                    |
| 1236 | 
                        + fi  | 
                    |
| 1237 | 
                        + return 0  | 
                    |
| 1238 | 
                        + fi  | 
                    |
| 1239 | 
                        + fi  | 
                    |
| 1240 | 
                        + done  | 
                    |
| 1241 | 
                        +  | 
                    |
| 1242 | 
                        + ewarn "Could not find a UTF-8 locale. This may trigger build failures in"  | 
                    |
| 1243 | 
                        + ewarn "some python packages. Please ensure that a UTF-8 locale is listed in"  | 
                    |
| 1244 | 
                        + ewarn "/etc/locale.gen and run locale-gen."  | 
                    |
| 1245 | 
                        + return 1  | 
                    |
| 1246 | 
                        + fi  | 
                    |
| 1247 | 
                        +  | 
                    |
| 1248 | 
                        + return 0  | 
                    |
| 1249 | 
                        +}  | 
                    |
| 1250 | 
                        +  | 
                    |
| 1251 | 
                        +# @FUNCTION: build_sphinx  | 
                    |
| 1252 | 
                        +# @USAGE: <directory>  | 
                    |
| 1253 | 
                        +# @DESCRIPTION:  | 
                    |
| 1254 | 
                        +# Build HTML documentation using dev-python/sphinx in the specified  | 
                    |
| 1255 | 
                        +# <directory>. Takes care of disabling Intersphinx and appending  | 
                    |
| 1256 | 
                        +# to HTML_DOCS.  | 
                    |
| 1257 | 
                        +#  | 
                    |
| 1258 | 
                        +# If <directory> is relative to the current directory, care needs  | 
                    |
| 1259 | 
                        +# to be taken to run einstalldocs from the same directory  | 
                    |
| 1260 | 
                        +# (usually ${S}).
                       | 
                    |
| 1261 | 
                        +build_sphinx() {
                       | 
                    |
| 1262 | 
                        +	debug-print-function ${FUNCNAME} "${@}"
                       | 
                    |
| 1263 | 
                        +	[[ ${#} -eq 1 ]] || die "${FUNCNAME} takes 1 arg: <directory>"
                       | 
                    |
| 1264 | 
                        +  | 
                    |
| 1265 | 
                        +	local dir=${1}
                       | 
                    |
| 1266 | 
                        +  | 
                    |
| 1267 | 
                        + sed -i -e 's:^intersphinx_mapping:disabled_&:' \  | 
                    |
| 1268 | 
                        +		"${dir}"/conf.py || die
                       | 
                    |
| 1269 | 
                        + # not all packages include the Makefile in pypi tarball  | 
                    |
| 1270 | 
                        +	sphinx-build -b html -d "${dir}"/_build/doctrees "${dir}" \
                       | 
                    |
| 1271 | 
                        +		"${dir}"/_build/html || die
                       | 
                    |
| 1272 | 
                        +  | 
                    |
| 1273 | 
                        +	HTML_DOCS+=( "${dir}/_build/html/." )
                       | 
                    |
| 1274 | 
                        +}  | 
                    |
| 1275 | 
                        +  | 
                    |
| 1276 | 
                        +# -- python.eclass functions --  | 
                    |
| 1277 | 
                        +  | 
                    |
| 1278 | 
                        +_python_check_dead_variables() {
                       | 
                    |
| 1279 | 
                        + local v  | 
                    |
| 1280 | 
                        +  | 
                    |
| 1281 | 
                        +	for v in PYTHON_DEPEND PYTHON_USE_WITH{,_OR,_OPT} {RESTRICT,SUPPORT}_PYTHON_ABIS
                       | 
                    |
| 1282 | 
                        + do  | 
                    |
| 1283 | 
                        +		if [[ ${!v} ]]; then
                       | 
                    |
| 1284 | 
                        +			die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Ebuild_head"
                       | 
                    |
| 1285 | 
                        + fi  | 
                    |
| 1286 | 
                        + done  | 
                    |
| 1287 | 
                        +  | 
                    |
| 1288 | 
                        +	for v in PYTHON_{CPPFLAGS,CFLAGS,CXXFLAGS,LDFLAGS}
                       | 
                    |
| 1289 | 
                        + do  | 
                    |
| 1290 | 
                        +		if [[ ${!v} ]]; then
                       | 
                    |
| 1291 | 
                        +			die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#PYTHON_CFLAGS"
                       | 
                    |
| 1292 | 
                        + fi  | 
                    |
| 1293 | 
                        + done  | 
                    |
| 1294 | 
                        +  | 
                    |
| 1295 | 
                        + for v in PYTHON_TESTS_RESTRICTED_ABIS PYTHON_EXPORT_PHASE_FUNCTIONS \  | 
                    |
| 1296 | 
                        +		PYTHON_VERSIONED_{SCRIPTS,EXECUTABLES} PYTHON_NONVERSIONED_EXECUTABLES
                       | 
                    |
| 1297 | 
                        + do  | 
                    |
| 1298 | 
                        +		if [[ ${!v} ]]; then
                       | 
                    |
| 1299 | 
                        +			die "${v} is invalid for python-r1 suite"
                       | 
                    |
| 1300 | 
                        + fi  | 
                    |
| 1301 | 
                        + done  | 
                    |
| 1302 | 
                        +  | 
                    |
| 1303 | 
                        + for v in DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES DISTUTILS_SETUP_FILES \  | 
                    |
| 1304 | 
                        + DISTUTILS_GLOBAL_OPTIONS DISTUTILS_SRC_TEST PYTHON_MODNAME  | 
                    |
| 1305 | 
                        + do  | 
                    |
| 1306 | 
                        +		if [[ ${!v} ]]; then
                       | 
                    |
| 1307 | 
                        +			die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#${v}"
                       | 
                    |
| 1308 | 
                        + fi  | 
                    |
| 1309 | 
                        + done  | 
                    |
| 1310 | 
                        +  | 
                    |
| 1311 | 
                        +	if [[ ${DISTUTILS_DISABLE_TEST_DEPENDENCY} ]]; then
                       | 
                    |
| 1312 | 
                        +		die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#DISTUTILS_SRC_TEST"
                       | 
                    |
| 1313 | 
                        + fi  | 
                    |
| 1314 | 
                        +  | 
                    |
| 1315 | 
                        + # python.eclass::progress  | 
                    |
| 1316 | 
                        + for v in PYTHON_BDEPEND PYTHON_MULTIPLE_ABIS PYTHON_ABI_TYPE \  | 
                    |
| 1317 | 
                        + PYTHON_RESTRICTED_ABIS PYTHON_TESTS_FAILURES_TOLERANT_ABIS \  | 
                    |
| 1318 | 
                        + PYTHON_CFFI_MODULES_GENERATION_COMMANDS  | 
                    |
| 1319 | 
                        + do  | 
                    |
| 1320 | 
                        +		if [[ ${!v} ]]; then
                       | 
                    |
| 1321 | 
                        +			die "${v} is invalid for python-r1 suite"
                       | 
                    |
| 1322 | 
                        + fi  | 
                    |
| 1323 | 
                        + done  | 
                    |
| 1324 | 
                        +}  | 
                    |
| 1325 | 
                        +  | 
                    |
| 1326 | 
                        +python_pkg_setup() {
                       | 
                    |
| 1327 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup"
                       | 
                    |
| 1328 | 
                        +}  | 
                    |
| 1329 | 
                        +  | 
                    |
| 1330 | 
                        +python_convert_shebangs() {
                       | 
                    |
| 1331 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_convert_shebangs"
                       | 
                    |
| 1332 | 
                        +}  | 
                    |
| 1333 | 
                        +  | 
                    |
| 1334 | 
                        +python_clean_py-compile_files() {
                       | 
                    |
| 1335 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1336 | 
                        +}  | 
                    |
| 1337 | 
                        +  | 
                    |
| 1338 | 
                        +python_clean_installation_image() {
                       | 
                    |
| 1339 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1340 | 
                        +}  | 
                    |
| 1341 | 
                        +  | 
                    |
| 1342 | 
                        +python_execute_function() {
                       | 
                    |
| 1343 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_execute_function"
                       | 
                    |
| 1344 | 
                        +}  | 
                    |
| 1345 | 
                        +  | 
                    |
| 1346 | 
                        +python_generate_wrapper_scripts() {
                       | 
                    |
| 1347 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1348 | 
                        +}  | 
                    |
| 1349 | 
                        +  | 
                    |
| 1350 | 
                        +python_merge_intermediate_installation_images() {
                       | 
                    |
| 1351 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1352 | 
                        +}  | 
                    |
| 1353 | 
                        +  | 
                    |
| 1354 | 
                        +python_set_active_version() {
                       | 
                    |
| 1355 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup"
                       | 
                    |
| 1356 | 
                        +}  | 
                    |
| 1357 | 
                        +  | 
                    |
| 1358 | 
                        +python_need_rebuild() {
                       | 
                    |
| 1359 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1360 | 
                        +}  | 
                    |
| 1361 | 
                        +  | 
                    |
| 1362 | 
                        +PYTHON() {
                       | 
                    |
| 1363 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#.24.28PYTHON.29.2C_.24.7BEPYTHON.7D"
                       | 
                    |
| 1364 | 
                        +}  | 
                    |
| 1365 | 
                        +  | 
                    |
| 1366 | 
                        +python_get_implementation() {
                       | 
                    |
| 1367 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1368 | 
                        +}  | 
                    |
| 1369 | 
                        +  | 
                    |
| 1370 | 
                        +python_get_implementational_package() {
                       | 
                    |
| 1371 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1372 | 
                        +}  | 
                    |
| 1373 | 
                        +  | 
                    |
| 1374 | 
                        +python_get_libdir() {
                       | 
                    |
| 1375 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1376 | 
                        +}  | 
                    |
| 1377 | 
                        +  | 
                    |
| 1378 | 
                        +python_get_library() {
                       | 
                    |
| 1379 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1380 | 
                        +}  | 
                    |
| 1381 | 
                        +  | 
                    |
| 1382 | 
                        +python_get_version() {
                       | 
                    |
| 1383 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1384 | 
                        +}  | 
                    |
| 1385 | 
                        +  | 
                    |
| 1386 | 
                        +python_get_implementation_and_version() {
                       | 
                    |
| 1387 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1388 | 
                        +}  | 
                    |
| 1389 | 
                        +  | 
                    |
| 1390 | 
                        +python_execute_nosetests() {
                       | 
                    |
| 1391 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1392 | 
                        +}  | 
                    |
| 1393 | 
                        +  | 
                    |
| 1394 | 
                        +python_execute_py.test() {
                       | 
                    |
| 1395 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1396 | 
                        +}  | 
                    |
| 1397 | 
                        +  | 
                    |
| 1398 | 
                        +python_execute_trial() {
                       | 
                    |
| 1399 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1400 | 
                        +}  | 
                    |
| 1401 | 
                        +  | 
                    |
| 1402 | 
                        +python_enable_pyc() {
                       | 
                    |
| 1403 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1404 | 
                        +}  | 
                    |
| 1405 | 
                        +  | 
                    |
| 1406 | 
                        +python_disable_pyc() {
                       | 
                    |
| 1407 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1408 | 
                        +}  | 
                    |
| 1409 | 
                        +  | 
                    |
| 1410 | 
                        +python_mod_optimize() {
                       | 
                    |
| 1411 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation"
                       | 
                    |
| 1412 | 
                        +}  | 
                    |
| 1413 | 
                        +  | 
                    |
| 1414 | 
                        +python_mod_cleanup() {
                       | 
                    |
| 1415 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation"
                       | 
                    |
| 1416 | 
                        +}  | 
                    |
| 1417 | 
                        +  | 
                    |
| 1418 | 
                        +# python.eclass::progress  | 
                    |
| 1419 | 
                        +  | 
                    |
| 1420 | 
                        +python_abi_depend() {
                       | 
                    |
| 1421 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1422 | 
                        +}  | 
                    |
| 1423 | 
                        +  | 
                    |
| 1424 | 
                        +python_install_executables() {
                       | 
                    |
| 1425 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1426 | 
                        +}  | 
                    |
| 1427 | 
                        +  | 
                    |
| 1428 | 
                        +python_get_extension_module_suffix() {
                       | 
                    |
| 1429 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1430 | 
                        +}  | 
                    |
| 1431 | 
                        +  | 
                    |
| 1432 | 
                        +python_byte-compile_modules() {
                       | 
                    |
| 1433 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1434 | 
                        +}  | 
                    |
| 1435 | 
                        +  | 
                    |
| 1436 | 
                        +python_clean_byte-compiled_modules() {
                       | 
                    |
| 1437 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1438 | 
                        +}  | 
                    |
| 1439 | 
                        +  | 
                    |
| 1440 | 
                        +python_generate_cffi_modules() {
                       | 
                    |
| 1441 | 
                        +	die "${FUNCNAME}() is invalid for python-r1 suite"
                       | 
                    |
| 1442 | 
                        +}  | 
                    |
| 1443 | 
                        +  | 
                    |
| 1444 | 
                        +_PYTHON_UTILS_R1=1  | 
                    |
| 1445 | 
                        +fi  | 
                    |
| 0 | 1446 |