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