/[gentoo-x86]/eclass/python.eclass
Gentoo

Contents of /eclass/python.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.142 - (hide annotations) (download)
Sun Dec 18 23:38:11 2011 UTC (4 years, 7 months ago) by robbat2
Branch: MAIN
Changes since 1.141: +8 -2 lines
Bug #390691: Be careful about cp call to coreutils with --no-preserve option that might not be available until later in an upgrade.

1 arfrever 1.109 # Copyright 1999-2011 Gentoo Foundation
2 liquidx 1.1 # Distributed under the terms of the GNU General Public License v2
3 robbat2 1.142 # $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.141 2011/11/30 08:55:18 djc Exp $
4 liquidx 1.1
5 dev-zero 1.33 # @ECLASS: python.eclass
6     # @MAINTAINER:
7 arfrever 1.88 # Gentoo Python Project <python@gentoo.org>
8     # @BLURB: Eclass for Python packages
9 dev-zero 1.33 # @DESCRIPTION:
10 arfrever 1.88 # The python eclass contains miscellaneous, useful functions for Python packages.
11 liquidx 1.1
12 arfrever 1.65 inherit multilib
13 liquidx 1.2
14 phajdan.jr 1.139 if ! has "${EAPI:-0}" 0 1 2 3 4; then
15 arfrever 1.83 die "API of python.eclass in EAPI=\"${EAPI}\" not established"
16     fi
17    
18 arfrever 1.106 _CPYTHON2_GLOBALLY_SUPPORTED_ABIS=(2.4 2.5 2.6 2.7)
19 djc 1.132 _CPYTHON3_GLOBALLY_SUPPORTED_ABIS=(3.1 3.2)
20 arfrever 1.106 _JYTHON_GLOBALLY_SUPPORTED_ABIS=(2.5-jython)
21 djc 1.141 _PYPY_GLOBALLY_SUPPORTED_ABIS=(2.7-pypy-1.7)
22 djc 1.126 _PYTHON_GLOBALLY_SUPPORTED_ABIS=(${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]} ${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]} ${_JYTHON_GLOBALLY_SUPPORTED_ABIS[@]} ${_PYPY_GLOBALLY_SUPPORTED_ABIS[@]})
23 arfrever 1.104
24     # ================================================================================================
25     # ===================================== HANDLING OF METADATA =====================================
26     # ================================================================================================
27    
28 djc 1.120 _PYTHON_ABI_PATTERN_REGEX="([[:alnum:]]|\.|-|\*|\[|\])+"
29    
30 arfrever 1.106 _python_check_python_abi_matching() {
31 djc 1.115 local pattern patterns patterns_list="0" PYTHON_ABI
32    
33     while (($#)); do
34     case "$1" in
35     --patterns-list)
36     patterns_list="1"
37     ;;
38     --)
39     shift
40     break
41     ;;
42     -*)
43     die "${FUNCNAME}(): Unrecognized option '$1'"
44     ;;
45     *)
46     break
47     ;;
48     esac
49     shift
50     done
51    
52 arfrever 1.106 if [[ "$#" -ne 2 ]]; then
53     die "${FUNCNAME}() requires 2 arguments"
54     fi
55    
56 djc 1.115 PYTHON_ABI="$1"
57    
58     if [[ "${patterns_list}" == "0" ]]; then
59     pattern="$2"
60    
61     if [[ "${pattern}" == *"-cpython" ]]; then
62     [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "${PYTHON_ABI}" == ${pattern%-cpython} ]]
63     elif [[ "${pattern}" == *"-jython" ]]; then
64     [[ "${PYTHON_ABI}" == ${pattern} ]]
65 djc 1.126 elif [[ "${pattern}" == *"-pypy-"* ]]; then
66     [[ "${PYTHON_ABI}" == ${pattern} ]]
67 djc 1.115 else
68     if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
69     [[ "${PYTHON_ABI}" == ${pattern} ]]
70     elif [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
71     [[ "${PYTHON_ABI%-jython}" == ${pattern} ]]
72 djc 1.126 elif [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then
73     [[ "${PYTHON_ABI%-pypy-*}" == ${pattern} ]]
74 djc 1.115 else
75     die "${FUNCNAME}(): Unrecognized Python ABI '${PYTHON_ABI}'"
76     fi
77 arfrever 1.106 fi
78 djc 1.115 else
79     patterns="${2// /$'\n'}"
80    
81     while read pattern; do
82     if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
83     return 0
84     fi
85     done <<< "${patterns}"
86    
87     return 1
88 arfrever 1.106 fi
89     }
90    
91 djc 1.121 _python_package_supporting_installation_for_multiple_python_abis() {
92     if has "${EAPI:-0}" 0 1 2 3 4; then
93     if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
94     return 0
95     else
96     return 1
97     fi
98     else
99     die "${FUNCNAME}(): Support for EAPI=\"${EAPI}\" not implemented"
100     fi
101     }
102    
103 arfrever 1.87 # @ECLASS-VARIABLE: PYTHON_DEPEND
104     # @DESCRIPTION:
105     # Specification of dependency on dev-lang/python.
106     # Syntax:
107     # PYTHON_DEPEND: [[!]USE_flag? ]<version_components_group>[ version_components_group]
108     # version_components_group: <major_version[:[minimal_version][:maximal_version]]>
109     # major_version: <2|3|*>
110     # minimal_version: <minimal_major_version.minimal_minor_version>
111     # maximal_version: <maximal_major_version.maximal_minor_version>
112    
113 arfrever 1.104 _python_parse_PYTHON_DEPEND() {
114 arfrever 1.88 local major_version maximal_version minimal_version python_all="0" python_maximal_version python_minimal_version python_versions=() python2="0" python2_maximal_version python2_minimal_version python3="0" python3_maximal_version python3_minimal_version USE_flag= version_components_group version_components_group_regex version_components_groups
115 arfrever 1.87
116     version_components_group_regex="(2|3|\*)(:([[:digit:]]+\.[[:digit:]]+)?(:([[:digit:]]+\.[[:digit:]]+)?)?)?"
117     version_components_groups="${PYTHON_DEPEND}"
118    
119     if [[ "${version_components_groups}" =~ ^((\!)?[[:alnum:]_-]+\?\ )?${version_components_group_regex}(\ ${version_components_group_regex})?$ ]]; then
120     if [[ "${version_components_groups}" =~ ^(\!)?[[:alnum:]_-]+\? ]]; then
121     USE_flag="${version_components_groups%\? *}"
122     version_components_groups="${version_components_groups#* }"
123     fi
124     if [[ "${version_components_groups}" =~ ("*".*" "|" *"|^2.*\ (2|\*)|^3.*\ (3|\*)) ]]; then
125     die "Invalid syntax of PYTHON_DEPEND: Incorrectly specified groups of versions"
126     fi
127    
128     version_components_groups="${version_components_groups// /$'\n'}"
129     while read version_components_group; do
130     major_version="${version_components_group:0:1}"
131     minimal_version="${version_components_group:2}"
132     minimal_version="${minimal_version%:*}"
133     maximal_version="${version_components_group:$((3 + ${#minimal_version}))}"
134    
135     if [[ "${major_version}" =~ ^(2|3)$ ]]; then
136     if [[ -n "${minimal_version}" && "${major_version}" != "${minimal_version:0:1}" ]]; then
137     die "Invalid syntax of PYTHON_DEPEND: Minimal version '${minimal_version}' not in specified group of versions"
138     fi
139     if [[ -n "${maximal_version}" && "${major_version}" != "${maximal_version:0:1}" ]]; then
140     die "Invalid syntax of PYTHON_DEPEND: Maximal version '${maximal_version}' not in specified group of versions"
141     fi
142     fi
143    
144     if [[ "${major_version}" == "2" ]]; then
145     python2="1"
146 arfrever 1.106 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
147 arfrever 1.87 python2_minimal_version="${minimal_version}"
148     python2_maximal_version="${maximal_version}"
149     elif [[ "${major_version}" == "3" ]]; then
150     python3="1"
151 arfrever 1.106 python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
152 arfrever 1.87 python3_minimal_version="${minimal_version}"
153     python3_maximal_version="${maximal_version}"
154     else
155     python_all="1"
156 arfrever 1.106 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
157 arfrever 1.87 python_minimal_version="${minimal_version}"
158     python_maximal_version="${maximal_version}"
159     fi
160    
161     if [[ -n "${minimal_version}" ]] && ! has "${minimal_version}" "${python_versions[@]}"; then
162     die "Invalid syntax of PYTHON_DEPEND: Unrecognized minimal version '${minimal_version}'"
163     fi
164     if [[ -n "${maximal_version}" ]] && ! has "${maximal_version}" "${python_versions[@]}"; then
165     die "Invalid syntax of PYTHON_DEPEND: Unrecognized maximal version '${maximal_version}'"
166     fi
167    
168     if [[ -n "${minimal_version}" && -n "${maximal_version}" && "${minimal_version}" > "${maximal_version}" ]]; then
169     die "Invalid syntax of PYTHON_DEPEND: Minimal version '${minimal_version}' greater than maximal version '${maximal_version}'"
170     fi
171     done <<< "${version_components_groups}"
172    
173 arfrever 1.88 _PYTHON_ATOMS=()
174    
175     _append_accepted_versions_range() {
176 arfrever 1.87 local accepted_version="0" i
177     for ((i = "${#python_versions[@]}"; i >= 0; i--)); do
178     if [[ "${python_versions[${i}]}" == "${python_maximal_version}" ]]; then
179     accepted_version="1"
180     fi
181     if [[ "${accepted_version}" == "1" ]]; then
182 arfrever 1.88 _PYTHON_ATOMS+=("=dev-lang/python-${python_versions[${i}]}*")
183 arfrever 1.87 fi
184     if [[ "${python_versions[${i}]}" == "${python_minimal_version}" ]]; then
185     accepted_version="0"
186     fi
187     done
188     }
189    
190     if [[ "${python_all}" == "1" ]]; then
191 arfrever 1.88 if [[ -z "${python_minimal_version}" && -z "${python_maximal_version}" ]]; then
192     _PYTHON_ATOMS+=("dev-lang/python")
193     else
194 arfrever 1.106 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
195 arfrever 1.88 python_minimal_version="${python_minimal_version:-${python_versions[0]}}"
196     python_maximal_version="${python_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
197     _append_accepted_versions_range
198     fi
199 arfrever 1.87 else
200     if [[ "${python3}" == "1" ]]; then
201 arfrever 1.88 if [[ -z "${python3_minimal_version}" && -z "${python3_maximal_version}" ]]; then
202     _PYTHON_ATOMS+=("=dev-lang/python-3*")
203     else
204 arfrever 1.106 python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
205 arfrever 1.88 python_minimal_version="${python3_minimal_version:-${python_versions[0]}}"
206     python_maximal_version="${python3_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
207     _append_accepted_versions_range
208     fi
209 arfrever 1.87 fi
210     if [[ "${python2}" == "1" ]]; then
211 arfrever 1.88 if [[ -z "${python2_minimal_version}" && -z "${python2_maximal_version}" ]]; then
212     _PYTHON_ATOMS+=("=dev-lang/python-2*")
213     else
214 arfrever 1.106 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
215 arfrever 1.88 python_minimal_version="${python2_minimal_version:-${python_versions[0]}}"
216     python_maximal_version="${python2_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
217     _append_accepted_versions_range
218     fi
219 arfrever 1.87 fi
220     fi
221    
222 arfrever 1.88 unset -f _append_accepted_versions_range
223 arfrever 1.87
224 arfrever 1.88 if [[ "${#_PYTHON_ATOMS[@]}" -gt 1 ]]; then
225     DEPEND+="${DEPEND:+ }${USE_flag}${USE_flag:+? ( }|| ( ${_PYTHON_ATOMS[@]} )${USE_flag:+ )}"
226     RDEPEND+="${RDEPEND:+ }${USE_flag}${USE_flag:+? ( }|| ( ${_PYTHON_ATOMS[@]} )${USE_flag:+ )}"
227     else
228     DEPEND+="${DEPEND:+ }${USE_flag}${USE_flag:+? ( }${_PYTHON_ATOMS[@]}${USE_flag:+ )}"
229     RDEPEND+="${RDEPEND:+ }${USE_flag}${USE_flag:+? ( }${_PYTHON_ATOMS[@]}${USE_flag:+ )}"
230     fi
231 arfrever 1.87 else
232     die "Invalid syntax of PYTHON_DEPEND"
233     fi
234     }
235    
236 arfrever 1.89 DEPEND=">=app-admin/eselect-python-20091230"
237 arfrever 1.87 RDEPEND="${DEPEND}"
238    
239 arfrever 1.104 if [[ -n "${PYTHON_DEPEND}" ]]; then
240     _python_parse_PYTHON_DEPEND
241 betelgeuse 1.55 else
242 arfrever 1.88 _PYTHON_ATOMS=("dev-lang/python")
243 carlo 1.22 fi
244 arfrever 1.104 unset -f _python_parse_PYTHON_DEPEND
245    
246     if [[ -n "${NEED_PYTHON}" ]]; then
247     eerror "Use PYTHON_DEPEND variable instead of NEED_PYTHON variable."
248     die "NEED_PYTHON variable is banned"
249     fi
250 liquidx 1.18
251 arfrever 1.85 # @ECLASS-VARIABLE: PYTHON_USE_WITH
252     # @DESCRIPTION:
253 arfrever 1.87 # Set this to a space separated list of USE flags the Python slot in use must be built with.
254 liquidx 1.18
255 arfrever 1.85 # @ECLASS-VARIABLE: PYTHON_USE_WITH_OR
256 dev-zero 1.33 # @DESCRIPTION:
257 arfrever 1.87 # Set this to a space separated list of USE flags of which one must be turned on for the slot in use.
258 liquidx 1.18
259 arfrever 1.85 # @ECLASS-VARIABLE: PYTHON_USE_WITH_OPT
260     # @DESCRIPTION:
261 arfrever 1.87 # Set this to a name of a USE flag if you need to make either PYTHON_USE_WITH or
262     # PYTHON_USE_WITH_OR atoms conditional under a USE flag.
263 liquidx 1.1
264 arfrever 1.97 if ! has "${EAPI:-0}" 0 1 && [[ -n ${PYTHON_USE_WITH} || -n ${PYTHON_USE_WITH_OR} ]]; then
265     _PYTHON_USE_WITH_ATOMS_ARRAY=()
266     if [[ -n "${PYTHON_USE_WITH}" ]]; then
267     for _PYTHON_ATOM in "${_PYTHON_ATOMS[@]}"; do
268     _PYTHON_USE_WITH_ATOMS_ARRAY+=("${_PYTHON_ATOM}[${PYTHON_USE_WITH// /,}]")
269     done
270     elif [[ -n "${PYTHON_USE_WITH_OR}" ]]; then
271     for _USE_flag in ${PYTHON_USE_WITH_OR}; do
272     for _PYTHON_ATOM in "${_PYTHON_ATOMS[@]}"; do
273     _PYTHON_USE_WITH_ATOMS_ARRAY+=("${_PYTHON_ATOM}[${_USE_flag}]")
274     done
275     done
276     unset _USE_flag
277     fi
278     if [[ "${#_PYTHON_USE_WITH_ATOMS_ARRAY[@]}" -gt 1 ]]; then
279     _PYTHON_USE_WITH_ATOMS="|| ( ${_PYTHON_USE_WITH_ATOMS_ARRAY[@]} )"
280     else
281     _PYTHON_USE_WITH_ATOMS="${_PYTHON_USE_WITH_ATOMS_ARRAY[@]}"
282     fi
283     if [[ -n "${PYTHON_USE_WITH_OPT}" ]]; then
284     _PYTHON_USE_WITH_ATOMS="${PYTHON_USE_WITH_OPT}? ( ${_PYTHON_USE_WITH_ATOMS} )"
285     fi
286     DEPEND+=" ${_PYTHON_USE_WITH_ATOMS}"
287     RDEPEND+=" ${_PYTHON_USE_WITH_ATOMS}"
288     unset _PYTHON_ATOM _PYTHON_USE_WITH_ATOMS _PYTHON_USE_WITH_ATOMS_ARRAY
289     fi
290    
291     unset _PYTHON_ATOMS
292    
293     # ================================================================================================
294     # =================================== MISCELLANEOUS FUNCTIONS ====================================
295     # ================================================================================================
296    
297     _python_implementation() {
298     if [[ "${CATEGORY}/${PN}" == "dev-lang/python" ]]; then
299     return 0
300     elif [[ "${CATEGORY}/${PN}" == "dev-java/jython" ]]; then
301     return 0
302 djc 1.126 elif [[ "${CATEGORY}/${PN}" == "dev-python/pypy" ]]; then
303     return 0
304 arfrever 1.97 else
305     return 1
306     fi
307     }
308    
309 arfrever 1.101 _python_abi-specific_local_scope() {
310     [[ " ${FUNCNAME[@]:2} " =~ " "(_python_final_sanity_checks|python_execute_function|python_mod_optimize|python_mod_cleanup)" " ]]
311     }
312    
313 arfrever 1.97 _python_initialize_prefix_variables() {
314     if has "${EAPI:-0}" 0 1 2; then
315     if [[ -n "${ROOT}" && -z "${EROOT}" ]]; then
316     EROOT="${ROOT%/}${EPREFIX}/"
317     fi
318     if [[ -n "${D}" && -z "${ED}" ]]; then
319     ED="${D%/}${EPREFIX}/"
320     fi
321     fi
322     }
323    
324 arfrever 1.101 unset PYTHON_SANITY_CHECKS_EXECUTED PYTHON_SKIP_SANITY_CHECKS
325 arfrever 1.97
326     _python_initial_sanity_checks() {
327 arfrever 1.101 if [[ "$(declare -p PYTHON_SANITY_CHECKS_EXECUTED 2> /dev/null)" != "declare -- PYTHON_SANITY_CHECKS_EXECUTED="* || " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " && -z "${PYTHON_SKIP_SANITY_CHECKS}" ]]; then
328 arfrever 1.97 # Ensure that /usr/bin/python and /usr/bin/python-config are valid.
329     if [[ "$(readlink "${EPREFIX}/usr/bin/python")" != "python-wrapper" ]]; then
330     eerror "'${EPREFIX}/usr/bin/python' is not valid symlink."
331     eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."
332     die "'${EPREFIX}/usr/bin/python' is not valid symlink"
333     fi
334     if [[ "$(<"${EPREFIX}/usr/bin/python-config")" != *"Gentoo python-config wrapper script"* ]]; then
335     eerror "'${EPREFIX}/usr/bin/python-config' is not valid script"
336     eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."
337     die "'${EPREFIX}/usr/bin/python-config' is not valid script"
338     fi
339     fi
340     }
341    
342     _python_final_sanity_checks() {
343 arfrever 1.101 if ! _python_implementation && [[ "$(declare -p PYTHON_SANITY_CHECKS_EXECUTED 2> /dev/null)" != "declare -- PYTHON_SANITY_CHECKS_EXECUTED="* || " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " && -z "${PYTHON_SKIP_SANITY_CHECKS}" ]]; then
344 arfrever 1.97 local PYTHON_ABI="${PYTHON_ABI}"
345     for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI}}; do
346     # Ensure that appropriate version of Python is installed.
347     if ! has_version "$(python_get_implementational_package)"; then
348     die "$(python_get_implementational_package) is not installed"
349     fi
350    
351     # Ensure that EPYTHON variable is respected.
352     if [[ "$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")" != "${PYTHON_ABI}" ]]; then
353     eerror "Path to 'python': '$(type -p python)'"
354     eerror "ABI: '${ABI}'"
355     eerror "DEFAULT_ABI: '${DEFAULT_ABI}'"
356     eerror "EPYTHON: '$(PYTHON)'"
357     eerror "PYTHON_ABI: '${PYTHON_ABI}'"
358     eerror "Locally active version of Python: '$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")'"
359     die "'python' does not respect EPYTHON variable"
360     fi
361     done
362     fi
363 arfrever 1.101 PYTHON_SANITY_CHECKS_EXECUTED="1"
364 arfrever 1.97 }
365    
366 arfrever 1.102 # @ECLASS-VARIABLE: PYTHON_COLORS
367     # @DESCRIPTION:
368     # User-configurable colored output.
369     PYTHON_COLORS="${PYTHON_COLORS:-0}"
370    
371 arfrever 1.97 _python_set_color_variables() {
372 arfrever 1.102 if [[ "${PYTHON_COLORS}" != "0" && "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then
373 arfrever 1.97 _BOLD=$'\e[1m'
374     _RED=$'\e[1;31m'
375     _GREEN=$'\e[1;32m'
376     _BLUE=$'\e[1;34m'
377     _CYAN=$'\e[1;36m'
378     _NORMAL=$'\e[0m'
379     else
380     _BOLD=
381     _RED=
382     _GREEN=
383     _BLUE=
384     _CYAN=
385     _NORMAL=
386     fi
387     }
388    
389 arfrever 1.101 _python_check_python_pkg_setup_execution() {
390     [[ " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " ]] && return
391    
392     if ! has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_PKG_SETUP_EXECUTED}" ]]; then
393     die "python_pkg_setup() not called"
394     fi
395     }
396    
397 arfrever 1.85 # @FUNCTION: python_pkg_setup
398 arfrever 1.56 # @DESCRIPTION:
399 arfrever 1.97 # Perform sanity checks and initialize environment.
400     #
401 lxnay 1.129 # This function is exported in EAPI 2 and 3 when PYTHON_USE_WITH or PYTHON_USE_WITH_OR variable
402     # is set and always in EAPI >=4. Calling of this function is mandatory in EAPI >=4.
403 arfrever 1.97 python_pkg_setup() {
404 djc 1.114 if [[ "${EBUILD_PHASE}" != "setup" ]]; then
405     die "${FUNCNAME}() can be used only in pkg_setup() phase"
406     fi
407 arfrever 1.97
408 arfrever 1.101 if [[ "$#" -ne 0 ]]; then
409     die "${FUNCNAME}() does not accept arguments"
410     fi
411    
412 arfrever 1.106 export JYTHON_SYSTEM_CACHEDIR="1"
413     addwrite "${EPREFIX}/var/cache/jython"
414    
415 arfrever 1.97 if _python_package_supporting_installation_for_multiple_python_abis; then
416 arfrever 1.98 _python_calculate_PYTHON_ABIS
417 arfrever 1.97 export EPYTHON="$(PYTHON -f)"
418     else
419 arfrever 1.98 PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
420 arfrever 1.97 fi
421 arfrever 1.85
422 lxnay 1.130 if ! has "${EAPI:-0}" 0 1 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; then
423 lxnay 1.129 if [[ "${PYTHON_USE_WITH_OPT}" ]]; then
424     if [[ "${PYTHON_USE_WITH_OPT}" == !* ]]; then
425     use ${PYTHON_USE_WITH_OPT#!} && return
426     else
427     use !${PYTHON_USE_WITH_OPT} && return
428     fi
429     fi
430    
431     python_pkg_setup_check_USE_flags() {
432     local python_atom USE_flag
433     python_atom="$(python_get_implementational_package)"
434    
435     for USE_flag in ${PYTHON_USE_WITH}; do
436     if ! has_version "${python_atom}[${USE_flag}]"; then
437     eerror "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"
438     die "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"
439     fi
440     done
441    
442     for USE_flag in ${PYTHON_USE_WITH_OR}; do
443     if has_version "${python_atom}[${USE_flag}]"; then
444     return
445     fi
446     done
447    
448     if [[ ${PYTHON_USE_WITH_OR} ]]; then
449     eerror "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"
450     die "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"
451     fi
452     }
453    
454     if _python_package_supporting_installation_for_multiple_python_abis; then
455     PYTHON_SKIP_SANITY_CHECKS="1" python_execute_function -q python_pkg_setup_check_USE_flags
456     else
457     python_pkg_setup_check_USE_flags
458     fi
459    
460     unset -f python_pkg_setup_check_USE_flags
461     fi
462    
463 arfrever 1.97 PYTHON_PKG_SETUP_EXECUTED="1"
464     }
465 arfrever 1.85
466 arfrever 1.104 if ! has "${EAPI:-0}" 0 1 2 3 || { has "${EAPI:-0}" 2 3 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; }; then
467 arfrever 1.85 EXPORT_FUNCTIONS pkg_setup
468 arfrever 1.97 fi
469    
470 djc 1.126 _PYTHON_SHEBANG_BASE_PART_REGEX='^#![[:space:]]*([^[:space:]]*/usr/bin/env[[:space:]]+)?([^[:space:]]*/)?(jython|pypy-c|python)'
471 arfrever 1.106
472 arfrever 1.97 # @FUNCTION: python_convert_shebangs
473 arfrever 1.106 # @USAGE: [-q|--quiet] [-r|--recursive] [-x|--only-executables] [--] <Python_ABI|Python_version> <file|directory> [files|directories]
474 arfrever 1.97 # @DESCRIPTION:
475     # Convert shebangs in specified files. Directories can be specified only with --recursive option.
476     python_convert_shebangs() {
477 arfrever 1.101 _python_check_python_pkg_setup_execution
478    
479 arfrever 1.106 local argument file files=() only_executables="0" python_interpreter quiet="0" recursive="0"
480 arfrever 1.97
481     while (($#)); do
482     case "$1" in
483     -r|--recursive)
484     recursive="1"
485     ;;
486     -q|--quiet)
487     quiet="1"
488     ;;
489     -x|--only-executables)
490     only_executables="1"
491     ;;
492     --)
493     shift
494     break
495     ;;
496     -*)
497     die "${FUNCNAME}(): Unrecognized option '$1'"
498     ;;
499     *)
500     break
501     ;;
502     esac
503     shift
504     done
505    
506     if [[ "$#" -eq 0 ]]; then
507     die "${FUNCNAME}(): Missing Python version and files or directories"
508     elif [[ "$#" -eq 1 ]]; then
509     die "${FUNCNAME}(): Missing files or directories"
510     fi
511    
512 arfrever 1.106 if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
513     python_interpreter="$(PYTHON "$1")"
514     else
515     python_interpreter="python$1"
516     fi
517 arfrever 1.97 shift
518    
519     for argument in "$@"; do
520     if [[ ! -e "${argument}" ]]; then
521     die "${FUNCNAME}(): '${argument}' does not exist"
522     elif [[ -f "${argument}" ]]; then
523     files+=("${argument}")
524     elif [[ -d "${argument}" ]]; then
525     if [[ "${recursive}" == "1" ]]; then
526     while read -d $'\0' -r file; do
527     files+=("${file}")
528     done < <(find "${argument}" $([[ "${only_executables}" == "1" ]] && echo -perm /111) -type f -print0)
529     else
530     die "${FUNCNAME}(): '${argument}' is not a regular file"
531     fi
532     else
533     die "${FUNCNAME}(): '${argument}' is not a regular file or a directory"
534     fi
535     done
536    
537     for file in "${files[@]}"; do
538     file="${file#./}"
539     [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue
540    
541 arfrever 1.106 if [[ "$(head -n1 "${file}")" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX} ]]; then
542 arfrever 1.97 [[ "$(sed -ne "2p" "${file}")" =~ ^"# Gentoo '".*"' wrapper script generated by python_generate_wrapper_scripts()"$ ]] && continue
543    
544     if [[ "${quiet}" == "0" ]]; then
545     einfo "Converting shebang in '${file}'"
546     fi
547    
548 djc 1.126 sed -e "1s:^#![[:space:]]*\([^[:space:]]*/usr/bin/env[[:space:]]\)\?[[:space:]]*\([^[:space:]]*/\)\?\(jython\|pypy-c\|python\)\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?\(\$\|[[:space:]].*\):#!\1\2${python_interpreter}\6:" -i "${file}" || die "Conversion of shebang in '${file}' failed"
549 arfrever 1.97 fi
550     done
551     }
552    
553     # @FUNCTION: python_clean_installation_image
554     # @USAGE: [-q|--quiet]
555     # @DESCRIPTION:
556     # Delete needless files in installation image.
557 djc 1.114 #
558     # This function can be used only in src_install() phase.
559 arfrever 1.97 python_clean_installation_image() {
560 djc 1.114 if [[ "${EBUILD_PHASE}" != "install" ]]; then
561     die "${FUNCNAME}() can be used only in src_install() phase"
562     fi
563    
564 arfrever 1.101 _python_check_python_pkg_setup_execution
565 arfrever 1.97 _python_initialize_prefix_variables
566    
567     local file files=() quiet="0"
568    
569     while (($#)); do
570     case "$1" in
571     -q|--quiet)
572     quiet="1"
573     ;;
574     -*)
575     die "${FUNCNAME}(): Unrecognized option '$1'"
576     ;;
577     *)
578     die "${FUNCNAME}(): Invalid usage"
579     ;;
580     esac
581     shift
582     done
583 arfrever 1.56
584 arfrever 1.97 while read -d $'\0' -r file; do
585     files+=("${file}")
586     done < <(find "${ED}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -type f -print0)
587    
588     if [[ "${#files[@]}" -gt 0 ]]; then
589     if [[ "${quiet}" == "0" ]]; then
590     ewarn "Deleting byte-compiled Python modules needlessly generated by build system:"
591     fi
592     for file in "${files[@]}"; do
593     if [[ "${quiet}" == "0" ]]; then
594     ewarn " ${file}"
595     fi
596     rm -f "${file}"
597 arfrever 1.98
598     # Delete empty __pycache__ directories.
599     if [[ "${file%/*}" == *"/__pycache__" ]]; then
600     rmdir "${file%/*}" 2> /dev/null
601     fi
602 arfrever 1.85 done
603 arfrever 1.92 fi
604 arfrever 1.97
605     python_clean_sitedirs() {
606 arfrever 1.98 if [[ -d "${ED}$(python_get_sitedir)" ]]; then
607     find "${ED}$(python_get_sitedir)" "(" -name "*.c" -o -name "*.h" -o -name "*.la" ")" -type f -print0 | xargs -0 rm -f
608     fi
609 arfrever 1.97 }
610     if _python_package_supporting_installation_for_multiple_python_abis; then
611     python_execute_function -q python_clean_sitedirs
612 arfrever 1.92 else
613 arfrever 1.97 python_clean_sitedirs
614 arfrever 1.78 fi
615 arfrever 1.56
616 arfrever 1.97 unset -f python_clean_sitedirs
617     }
618 arfrever 1.87
619 arfrever 1.85 # ================================================================================================
620 arfrever 1.95 # =========== FUNCTIONS FOR PACKAGES SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ============
621 arfrever 1.85 # ================================================================================================
622 arfrever 1.84
623 arfrever 1.86 # @ECLASS-VARIABLE: SUPPORT_PYTHON_ABIS
624     # @DESCRIPTION:
625 arfrever 1.88 # Set this in EAPI <= 4 to indicate that current package supports installation for
626 arfrever 1.95 # multiple Python ABIs.
627 arfrever 1.86
628 djc 1.116 # @ECLASS-VARIABLE: PYTHON_TESTS_RESTRICTED_ABIS
629     # @DESCRIPTION:
630     # Space-separated list of Python ABI patterns. Testing in Python ABIs matching any Python ABI
631     # patterns specified in this list is skipped.
632    
633 arfrever 1.90 # @ECLASS-VARIABLE: PYTHON_EXPORT_PHASE_FUNCTIONS
634 arfrever 1.82 # @DESCRIPTION:
635 arfrever 1.90 # Set this to export phase functions for the following ebuild phases:
636 djc 1.114 # src_prepare(), src_configure(), src_compile(), src_test(), src_install().
637 arfrever 1.94 if ! has "${EAPI:-0}" 0 1; then
638 arfrever 1.85 python_src_prepare() {
639 djc 1.114 if [[ "${EBUILD_PHASE}" != "prepare" ]]; then
640     die "${FUNCNAME}() can be used only in src_prepare() phase"
641     fi
642 arfrever 1.101
643 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
644     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
645     fi
646    
647 djc 1.114 _python_check_python_pkg_setup_execution
648    
649 arfrever 1.101 if [[ "$#" -ne 0 ]]; then
650     die "${FUNCNAME}() does not accept arguments"
651     fi
652    
653 arfrever 1.85 python_copy_sources
654     }
655 arfrever 1.82
656 djc 1.113 for python_default_function in src_configure src_compile src_test; do
657 arfrever 1.94 eval "python_${python_default_function}() {
658 djc 1.114 if [[ \"\${EBUILD_PHASE}\" != \"${python_default_function#src_}\" ]]; then
659     die \"\${FUNCNAME}() can be used only in ${python_default_function}() phase\"
660     fi
661 arfrever 1.101
662 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
663     die \"\${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs\"
664     fi
665    
666 djc 1.114 _python_check_python_pkg_setup_execution
667    
668 arfrever 1.97 python_execute_function -d -s -- \"\$@\"
669 arfrever 1.94 }"
670 arfrever 1.85 done
671     unset python_default_function
672 arfrever 1.82
673 djc 1.113 python_src_install() {
674 djc 1.114 if [[ "${EBUILD_PHASE}" != "install" ]]; then
675     die "${FUNCNAME}() can be used only in src_install() phase"
676     fi
677    
678 djc 1.113 if ! _python_package_supporting_installation_for_multiple_python_abis; then
679     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
680     fi
681    
682     _python_check_python_pkg_setup_execution
683    
684     if has "${EAPI:-0}" 0 1 2 3; then
685     python_execute_function -d -s -- "$@"
686     else
687     python_installation() {
688     emake DESTDIR="${T}/images/${PYTHON_ABI}" install "$@"
689     }
690     python_execute_function -s python_installation "$@"
691     unset python_installation
692    
693     python_merge_intermediate_installation_images "${T}/images"
694     fi
695     }
696    
697 arfrever 1.90 if [[ -n "${PYTHON_EXPORT_PHASE_FUNCTIONS}" ]]; then
698     EXPORT_FUNCTIONS src_prepare src_configure src_compile src_test src_install
699     fi
700 arfrever 1.85 fi
701 arfrever 1.82
702 arfrever 1.110 if has "${EAPI:-0}" 0 1 2 3 4; then
703 arfrever 1.104 unset PYTHON_ABIS
704     fi
705 arfrever 1.77
706 arfrever 1.98 _python_calculate_PYTHON_ABIS() {
707 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
708     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
709 arfrever 1.66 fi
710    
711 arfrever 1.90 _python_initial_sanity_checks
712 arfrever 1.57
713 arfrever 1.110 if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]] && has "${EAPI:-0}" 0 1 2 3 4; then
714 djc 1.117 local PYTHON_ABI
715 arfrever 1.68
716 arfrever 1.70 if [[ "$(declare -p USE_PYTHON 2> /dev/null)" == "declare -x USE_PYTHON="* ]]; then
717 arfrever 1.94 local cpython_enabled="0"
718 arfrever 1.75
719 arfrever 1.68 if [[ -z "${USE_PYTHON}" ]]; then
720     die "USE_PYTHON variable is empty"
721 arfrever 1.56 fi
722 arfrever 1.68
723 arfrever 1.78 for PYTHON_ABI in ${USE_PYTHON}; do
724 arfrever 1.106 if ! has "${PYTHON_ABI}" "${_PYTHON_GLOBALLY_SUPPORTED_ABIS[@]}"; then
725 arfrever 1.78 die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'"
726 arfrever 1.68 fi
727 arfrever 1.75
728 arfrever 1.106 if has "${PYTHON_ABI}" "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; then
729 arfrever 1.94 cpython_enabled="1"
730 arfrever 1.75 fi
731    
732 djc 1.117 if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
733     export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}"
734     fi
735 arfrever 1.68 done
736    
737     if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then
738 arfrever 1.95 die "USE_PYTHON variable does not enable any Python ABI supported by ${CATEGORY}/${PF}"
739 arfrever 1.66 fi
740 arfrever 1.75
741 arfrever 1.94 if [[ "${cpython_enabled}" == "0" ]]; then
742 arfrever 1.95 die "USE_PYTHON variable does not enable any CPython ABI"
743 arfrever 1.88 fi
744 arfrever 1.68 else
745 djc 1.114 local python_version python2_version python3_version support_python_major_version
746 arfrever 1.76
747 arfrever 1.97 if ! has_version "dev-lang/python"; then
748     die "${FUNCNAME}(): 'dev-lang/python' is not installed"
749     fi
750    
751 arfrever 1.88 python_version="$("${EPREFIX}/usr/bin/python" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
752 arfrever 1.74
753     if has_version "=dev-lang/python-2*"; then
754 arfrever 1.87 if [[ "$(readlink "${EPREFIX}/usr/bin/python2")" != "python2."* ]]; then
755     die "'${EPREFIX}/usr/bin/python2' is not valid symlink"
756 arfrever 1.74 fi
757    
758 arfrever 1.88 python2_version="$("${EPREFIX}/usr/bin/python2" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
759 arfrever 1.74
760 djc 1.117 support_python_major_version="0"
761 arfrever 1.106 for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
762 djc 1.117 if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
763     support_python_major_version="1"
764     break
765     fi
766 arfrever 1.74 done
767     if [[ "${support_python_major_version}" == "1" ]]; then
768 djc 1.117 if _python_check_python_abi_matching --patterns-list "${python2_version}" "${RESTRICT_PYTHON_ABIS}"; then
769     die "Active version of CPython 2 is not supported by ${CATEGORY}/${PF}"
770     fi
771 arfrever 1.74 else
772     python2_version=""
773     fi
774     fi
775 arfrever 1.56
776 arfrever 1.74 if has_version "=dev-lang/python-3*"; then
777 arfrever 1.87 if [[ "$(readlink "${EPREFIX}/usr/bin/python3")" != "python3."* ]]; then
778     die "'${EPREFIX}/usr/bin/python3' is not valid symlink"
779 arfrever 1.68 fi
780 arfrever 1.74
781 arfrever 1.88 python3_version="$("${EPREFIX}/usr/bin/python3" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
782 arfrever 1.74
783 djc 1.117 support_python_major_version="0"
784 arfrever 1.106 for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
785 djc 1.117 if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
786     support_python_major_version="1"
787     break
788     fi
789 arfrever 1.74 done
790     if [[ "${support_python_major_version}" == "1" ]]; then
791 djc 1.117 if _python_check_python_abi_matching --patterns-list "${python3_version}" "${RESTRICT_PYTHON_ABIS}"; then
792     die "Active version of CPython 3 is not supported by ${CATEGORY}/${PF}"
793     fi
794 arfrever 1.74 else
795     python3_version=""
796     fi
797     fi
798    
799 arfrever 1.82 if [[ -n "${python2_version}" && "${python_version}" == "2."* && "${python_version}" != "${python2_version}" ]]; then
800 arfrever 1.87 eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python2' symlink"
801 arfrever 1.82 eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
802     die "Incorrect configuration of Python"
803     fi
804     if [[ -n "${python3_version}" && "${python_version}" == "3."* && "${python_version}" != "${python3_version}" ]]; then
805 arfrever 1.87 eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python3' symlink"
806 arfrever 1.76 eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
807     die "Incorrect configuration of Python"
808     fi
809    
810 arfrever 1.74 PYTHON_ABIS="${python2_version} ${python3_version}"
811     PYTHON_ABIS="${PYTHON_ABIS# }"
812     export PYTHON_ABIS="${PYTHON_ABIS% }"
813 arfrever 1.68 fi
814 arfrever 1.56 fi
815 arfrever 1.66
816 arfrever 1.90 _python_final_sanity_checks
817 arfrever 1.56 }
818    
819 arfrever 1.101 _python_prepare_flags() {
820     local array=() deleted_flag element flags new_value old_flag old_value operator pattern prefix variable
821    
822     for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do
823     eval "_PYTHON_SAVED_${variable}=\"\${!variable}\""
824     for prefix in PYTHON_USER_ PYTHON_; do
825     if [[ "$(declare -p ${prefix}${variable} 2> /dev/null)" == "declare -a ${prefix}${variable}="* ]]; then
826     eval "array=(\"\${${prefix}${variable}[@]}\")"
827     for element in "${array[@]}"; do
828 djc 1.120 if [[ "${element}" =~ ^${_PYTHON_ABI_PATTERN_REGEX}\ (\+|-)\ .+ ]]; then
829 arfrever 1.101 pattern="${element%% *}"
830     element="${element#* }"
831     operator="${element%% *}"
832     flags="${element#* }"
833 arfrever 1.106 if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
834 arfrever 1.101 if [[ "${operator}" == "+" ]]; then
835     eval "export ${variable}+=\"\${variable:+ }${flags}\""
836     elif [[ "${operator}" == "-" ]]; then
837     flags="${flags// /$'\n'}"
838     old_value="${!variable// /$'\n'}"
839     new_value=""
840     while read old_flag; do
841     while read deleted_flag; do
842     if [[ "${old_flag}" == ${deleted_flag} ]]; then
843     continue 2
844     fi
845     done <<< "${flags}"
846     new_value+="${new_value:+ }${old_flag}"
847     done <<< "${old_value}"
848     eval "export ${variable}=\"\${new_value}\""
849     fi
850     fi
851     else
852     die "Element '${element}' of ${prefix}${variable} array has invalid syntax"
853     fi
854     done
855     elif [[ -n "$(declare -p ${prefix}${variable} 2> /dev/null)" ]]; then
856     die "${prefix}${variable} should be indexed array"
857     fi
858     done
859     done
860     }
861    
862     _python_restore_flags() {
863     local variable
864    
865     for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do
866     eval "${variable}=\"\${_PYTHON_SAVED_${variable}}\""
867     unset _PYTHON_SAVED_${variable}
868     done
869     }
870    
871 arfrever 1.56 # @FUNCTION: python_execute_function
872 arfrever 1.90 # @USAGE: [--action-message message] [-d|--default-function] [--failure-message message] [-f|--final-ABI] [--nonfatal] [-q|--quiet] [-s|--separate-build-dirs] [--source-dir source_directory] [--] <function> [arguments]
873 arfrever 1.56 # @DESCRIPTION:
874 arfrever 1.60 # Execute specified function for each value of PYTHON_ABIS, optionally passing additional
875     # arguments. The specified function can use PYTHON_ABI and BUILDDIR variables.
876 arfrever 1.56 python_execute_function() {
877 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
878     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
879     fi
880    
881 djc 1.114 _python_check_python_pkg_setup_execution
882 arfrever 1.90 _python_set_color_variables
883    
884 djc 1.114 local action action_message action_message_template default_function="0" failure_message failure_message_template final_ABI="0" function iterated_PYTHON_ABIS nonfatal="0" previous_directory previous_directory_stack previous_directory_stack_length PYTHON_ABI quiet="0" return_code separate_build_dirs="0" source_dir
885 arfrever 1.56
886     while (($#)); do
887     case "$1" in
888     --action-message)
889     action_message_template="$2"
890     shift
891     ;;
892 arfrever 1.58 -d|--default-function)
893     default_function="1"
894     ;;
895 arfrever 1.56 --failure-message)
896     failure_message_template="$2"
897     shift
898     ;;
899 arfrever 1.90 -f|--final-ABI)
900     final_ABI="1"
901     ;;
902 arfrever 1.56 --nonfatal)
903     nonfatal="1"
904     ;;
905     -q|--quiet)
906     quiet="1"
907     ;;
908     -s|--separate-build-dirs)
909     separate_build_dirs="1"
910     ;;
911 arfrever 1.81 --source-dir)
912     source_dir="$2"
913     shift
914     ;;
915 arfrever 1.71 --)
916 arfrever 1.87 shift
917 arfrever 1.71 break
918     ;;
919 arfrever 1.56 -*)
920 arfrever 1.67 die "${FUNCNAME}(): Unrecognized option '$1'"
921 arfrever 1.56 ;;
922     *)
923     break
924     ;;
925     esac
926     shift
927     done
928    
929 arfrever 1.81 if [[ -n "${source_dir}" && "${separate_build_dirs}" == 0 ]]; then
930     die "${FUNCNAME}(): '--source-dir' option can be specified only with '--separate-build-dirs' option"
931     fi
932    
933 arfrever 1.58 if [[ "${default_function}" == "0" ]]; then
934 arfrever 1.83 if [[ "$#" -eq 0 ]]; then
935 arfrever 1.58 die "${FUNCNAME}(): Missing function name"
936     fi
937     function="$1"
938     shift
939 arfrever 1.67
940     if [[ -z "$(type -t "${function}")" ]]; then
941 arfrever 1.84 die "${FUNCNAME}(): '${function}' function is not defined"
942 arfrever 1.67 fi
943 arfrever 1.58 else
944     if has "${EAPI:-0}" 0 1; then
945 arfrever 1.67 die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI"
946 arfrever 1.58 fi
947    
948     if [[ "${EBUILD_PHASE}" == "configure" ]]; then
949 arfrever 1.82 if has "${EAPI}" 2 3; then
950 arfrever 1.61 python_default_function() {
951 arfrever 1.94 econf "$@"
952 arfrever 1.61 }
953     else
954     python_default_function() {
955 arfrever 1.94 nonfatal econf "$@"
956 arfrever 1.61 }
957     fi
958 arfrever 1.58 elif [[ "${EBUILD_PHASE}" == "compile" ]]; then
959     python_default_function() {
960 arfrever 1.94 emake "$@"
961 arfrever 1.58 }
962     elif [[ "${EBUILD_PHASE}" == "test" ]]; then
963     python_default_function() {
964     if emake -j1 -n check &> /dev/null; then
965 arfrever 1.94 emake -j1 check "$@"
966 arfrever 1.58 elif emake -j1 -n test &> /dev/null; then
967 arfrever 1.94 emake -j1 test "$@"
968 arfrever 1.58 fi
969     }
970     elif [[ "${EBUILD_PHASE}" == "install" ]]; then
971     python_default_function() {
972 arfrever 1.94 emake DESTDIR="${D}" install "$@"
973 arfrever 1.58 }
974     else
975 arfrever 1.82 die "${FUNCNAME}(): '--default-function' option cannot be used in this ebuild phase"
976 arfrever 1.58 fi
977     function="python_default_function"
978 arfrever 1.56 fi
979    
980 arfrever 1.95 # Ensure that python_execute_function() cannot be directly or indirectly called by python_execute_function().
981 arfrever 1.101 if _python_abi-specific_local_scope; then
982     die "${FUNCNAME}(): Invalid call stack"
983     fi
984 arfrever 1.87
985 arfrever 1.56 if [[ "${quiet}" == "0" ]]; then
986     [[ "${EBUILD_PHASE}" == "setup" ]] && action="Setting up"
987     [[ "${EBUILD_PHASE}" == "unpack" ]] && action="Unpacking"
988     [[ "${EBUILD_PHASE}" == "prepare" ]] && action="Preparation"
989     [[ "${EBUILD_PHASE}" == "configure" ]] && action="Configuration"
990     [[ "${EBUILD_PHASE}" == "compile" ]] && action="Building"
991     [[ "${EBUILD_PHASE}" == "test" ]] && action="Testing"
992     [[ "${EBUILD_PHASE}" == "install" ]] && action="Installation"
993     [[ "${EBUILD_PHASE}" == "preinst" ]] && action="Preinstallation"
994     [[ "${EBUILD_PHASE}" == "postinst" ]] && action="Postinstallation"
995     [[ "${EBUILD_PHASE}" == "prerm" ]] && action="Preuninstallation"
996     [[ "${EBUILD_PHASE}" == "postrm" ]] && action="Postuninstallation"
997     fi
998    
999 arfrever 1.98 _python_calculate_PYTHON_ABIS
1000 arfrever 1.90 if [[ "${final_ABI}" == "1" ]]; then
1001     iterated_PYTHON_ABIS="$(PYTHON -f --ABI)"
1002 arfrever 1.56 else
1003 arfrever 1.90 iterated_PYTHON_ABIS="${PYTHON_ABIS}"
1004 arfrever 1.56 fi
1005 arfrever 1.90 for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
1006 djc 1.116 if [[ "${EBUILD_PHASE}" == "test" ]] && _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${PYTHON_TESTS_RESTRICTED_ABIS}"; then
1007     if [[ "${quiet}" == "0" ]]; then
1008 djc 1.124 echo " ${_GREEN}*${_NORMAL} ${_BLUE}Testing of ${CATEGORY}/${PF} with $(python_get_implementation_and_version) skipped${_NORMAL}"
1009 djc 1.116 fi
1010     continue
1011     fi
1012    
1013 arfrever 1.101 _python_prepare_flags
1014    
1015 arfrever 1.56 if [[ "${quiet}" == "0" ]]; then
1016     if [[ -n "${action_message_template}" ]]; then
1017 arfrever 1.103 eval "action_message=\"${action_message_template}\""
1018 arfrever 1.56 else
1019 djc 1.124 action_message="${action} of ${CATEGORY}/${PF} with $(python_get_implementation_and_version)..."
1020 arfrever 1.56 fi
1021 arfrever 1.90 echo " ${_GREEN}*${_NORMAL} ${_BLUE}${action_message}${_NORMAL}"
1022 arfrever 1.56 fi
1023 arfrever 1.66
1024 arfrever 1.56 if [[ "${separate_build_dirs}" == "1" ]]; then
1025 arfrever 1.81 if [[ -n "${source_dir}" ]]; then
1026     export BUILDDIR="${S}/${source_dir}-${PYTHON_ABI}"
1027     else
1028     export BUILDDIR="${S}-${PYTHON_ABI}"
1029     fi
1030 arfrever 1.60 pushd "${BUILDDIR}" > /dev/null || die "pushd failed"
1031     else
1032     export BUILDDIR="${S}"
1033 arfrever 1.56 fi
1034 arfrever 1.66
1035 arfrever 1.73 previous_directory="$(pwd)"
1036     previous_directory_stack="$(dirs -p)"
1037     previous_directory_stack_length="$(dirs -p | wc -l)"
1038 arfrever 1.72
1039 arfrever 1.82 if ! has "${EAPI}" 0 1 2 3 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
1040 arfrever 1.66 EPYTHON="$(PYTHON)" nonfatal "${function}" "$@"
1041     else
1042     EPYTHON="$(PYTHON)" "${function}" "$@"
1043     fi
1044    
1045 arfrever 1.101 return_code="$?"
1046    
1047     _python_restore_flags
1048    
1049     if [[ "${return_code}" -ne 0 ]]; then
1050 arfrever 1.56 if [[ -n "${failure_message_template}" ]]; then
1051 arfrever 1.103 eval "failure_message=\"${failure_message_template}\""
1052 arfrever 1.56 else
1053 djc 1.124 failure_message="${action} failed with $(python_get_implementation_and_version) in ${function}() function"
1054 arfrever 1.56 fi
1055 arfrever 1.66
1056 arfrever 1.69 if [[ "${nonfatal}" == "1" ]]; then
1057     if [[ "${quiet}" == "0" ]]; then
1058 arfrever 1.102 ewarn "${failure_message}"
1059 arfrever 1.69 fi
1060 arfrever 1.90 elif [[ "${final_ABI}" == "0" ]] && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
1061 arfrever 1.70 if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then
1062 arfrever 1.78 local enabled_PYTHON_ABIS= other_PYTHON_ABI
1063     for other_PYTHON_ABI in ${PYTHON_ABIS}; do
1064 arfrever 1.82 [[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+="${enabled_PYTHON_ABIS:+ }${other_PYTHON_ABI}"
1065 arfrever 1.70 done
1066 arfrever 1.82 export PYTHON_ABIS="${enabled_PYTHON_ABIS}"
1067 arfrever 1.70 fi
1068 arfrever 1.56 if [[ "${quiet}" == "0" ]]; then
1069 arfrever 1.102 ewarn "${failure_message}"
1070 arfrever 1.56 fi
1071 arfrever 1.69 if [[ -z "${PYTHON_ABIS}" ]]; then
1072 arfrever 1.95 die "${function}() function failed with all enabled Python ABIs"
1073 arfrever 1.69 fi
1074 arfrever 1.56 else
1075     die "${failure_message}"
1076     fi
1077     fi
1078 arfrever 1.66
1079 arfrever 1.84 # Ensure that directory stack has not been decreased.
1080 arfrever 1.73 if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then
1081 arfrever 1.72 die "Directory stack decreased illegally"
1082     fi
1083    
1084 arfrever 1.73 # Avoid side effects of earlier returning from the specified function.
1085     while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do
1086 arfrever 1.72 popd > /dev/null || die "popd failed"
1087     done
1088    
1089 arfrever 1.84 # Ensure that the bottom part of directory stack has not been changed. Restore
1090 arfrever 1.73 # previous directory (from before running of the specified function) before
1091     # comparison of directory stacks to avoid mismatch of directory stacks after
1092     # potential using of 'cd' to change current directory. Restoration of previous
1093     # directory allows to safely use 'cd' to change current directory in the
1094     # specified function without changing it back to original directory.
1095     cd "${previous_directory}"
1096     if [[ "$(dirs -p)" != "${previous_directory_stack}" ]]; then
1097     die "Directory stack changed illegally"
1098     fi
1099    
1100 arfrever 1.56 if [[ "${separate_build_dirs}" == "1" ]]; then
1101     popd > /dev/null || die "popd failed"
1102     fi
1103 arfrever 1.60 unset BUILDDIR
1104 arfrever 1.56 done
1105 arfrever 1.58
1106     if [[ "${default_function}" == "1" ]]; then
1107     unset -f python_default_function
1108     fi
1109 arfrever 1.56 }
1110    
1111 arfrever 1.85 # @FUNCTION: python_copy_sources
1112 arfrever 1.90 # @USAGE: <directory="${S}"> [directory]
1113 arfrever 1.77 # @DESCRIPTION:
1114 arfrever 1.88 # Copy unpacked sources of current package to separate build directory for each Python ABI.
1115 arfrever 1.85 python_copy_sources() {
1116 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
1117     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1118     fi
1119    
1120 djc 1.114 _python_check_python_pkg_setup_execution
1121    
1122 arfrever 1.90 local dir dirs=() PYTHON_ABI
1123 arfrever 1.77
1124     if [[ "$#" -eq 0 ]]; then
1125 arfrever 1.85 if [[ "${WORKDIR}" == "${S}" ]]; then
1126 arfrever 1.97 die "${FUNCNAME}() cannot be used with current value of S variable"
1127 arfrever 1.85 fi
1128 arfrever 1.94 dirs=("${S%/}")
1129 arfrever 1.85 else
1130 arfrever 1.90 dirs=("$@")
1131 arfrever 1.77 fi
1132    
1133 arfrever 1.98 _python_calculate_PYTHON_ABIS
1134 arfrever 1.85 for PYTHON_ABI in ${PYTHON_ABIS}; do
1135     for dir in "${dirs[@]}"; do
1136 arfrever 1.90 cp -pr "${dir}" "${dir}-${PYTHON_ABI}" > /dev/null || die "Copying of sources failed"
1137 arfrever 1.85 done
1138 arfrever 1.77 done
1139 arfrever 1.85 }
1140 arfrever 1.77
1141 arfrever 1.82 # @FUNCTION: python_generate_wrapper_scripts
1142     # @USAGE: [-E|--respect-EPYTHON] [-f|--force] [-q|--quiet] [--] <file> [files]
1143     # @DESCRIPTION:
1144     # Generate wrapper scripts. Existing files are overwritten only with --force option.
1145     # If --respect-EPYTHON option is specified, then generated wrapper scripts will
1146     # respect EPYTHON variable at run time.
1147 djc 1.114 #
1148     # This function can be used only in src_install() phase.
1149 arfrever 1.82 python_generate_wrapper_scripts() {
1150 djc 1.114 if [[ "${EBUILD_PHASE}" != "install" ]]; then
1151     die "${FUNCNAME}() can be used only in src_install() phase"
1152     fi
1153 arfrever 1.101
1154 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
1155     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1156     fi
1157    
1158 djc 1.114 _python_check_python_pkg_setup_execution
1159 arfrever 1.87 _python_initialize_prefix_variables
1160    
1161 arfrever 1.106 local eselect_python_option file force="0" quiet="0" PYTHON_ABI PYTHON_ABIS_list python2_enabled="0" python3_enabled="0" respect_EPYTHON="0"
1162 arfrever 1.82
1163     while (($#)); do
1164     case "$1" in
1165     -E|--respect-EPYTHON)
1166     respect_EPYTHON="1"
1167     ;;
1168     -f|--force)
1169     force="1"
1170     ;;
1171     -q|--quiet)
1172     quiet="1"
1173     ;;
1174     --)
1175 arfrever 1.87 shift
1176 arfrever 1.82 break
1177     ;;
1178     -*)
1179     die "${FUNCNAME}(): Unrecognized option '$1'"
1180     ;;
1181     *)
1182     break
1183     ;;
1184     esac
1185     shift
1186     done
1187    
1188     if [[ "$#" -eq 0 ]]; then
1189     die "${FUNCNAME}(): Missing arguments"
1190     fi
1191    
1192 arfrever 1.98 _python_calculate_PYTHON_ABIS
1193 arfrever 1.106 for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1194 arfrever 1.82 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1195     python2_enabled="1"
1196     fi
1197     done
1198 arfrever 1.106 for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1199 arfrever 1.82 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1200     python3_enabled="1"
1201     fi
1202     done
1203    
1204     if [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "1" ]]; then
1205     eselect_python_option=
1206     elif [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "0" ]]; then
1207     eselect_python_option="--python2"
1208     elif [[ "${python2_enabled}" == "0" && "${python3_enabled}" == "1" ]]; then
1209     eselect_python_option="--python3"
1210     else
1211     die "${FUNCNAME}(): Unsupported environment"
1212     fi
1213    
1214 arfrever 1.106 PYTHON_ABIS_list="$("$(PYTHON -f)" -c "print(', '.join('\"%s\"' % x for x in reversed('${PYTHON_ABIS}'.split())))")"
1215    
1216 arfrever 1.82 for file in "$@"; do
1217     if [[ -f "${file}" && "${force}" == "0" ]]; then
1218 arfrever 1.106 die "${FUNCNAME}(): '${file}' already exists"
1219 arfrever 1.82 fi
1220    
1221     if [[ "${quiet}" == "0" ]]; then
1222 arfrever 1.94 einfo "Generating '${file#${ED%/}}' wrapper script"
1223 arfrever 1.82 fi
1224    
1225     cat << EOF > "${file}"
1226     #!/usr/bin/env python
1227 arfrever 1.94 # Gentoo '${file##*/}' wrapper script generated by python_generate_wrapper_scripts()
1228 arfrever 1.82
1229     import os
1230     import re
1231     import subprocess
1232     import sys
1233    
1234 djc 1.135 cpython_ABI_re = re.compile(r"^(\d+\.\d+)$")
1235     jython_ABI_re = re.compile(r"^(\d+\.\d+)-jython$")
1236     pypy_ABI_re = re.compile(r"^\d+\.\d+-pypy-(\d+\.\d+)$")
1237     cpython_interpreter_re = re.compile(r"^python(\d+\.\d+)$")
1238     jython_interpreter_re = re.compile(r"^jython(\d+\.\d+)$")
1239     pypy_interpreter_re = re.compile(r"^pypy-c(\d+\.\d+)$")
1240 djc 1.133 cpython_shebang_re = re.compile(r"^#![ \t]*(?:${EPREFIX}/usr/bin/python|(?:${EPREFIX})?/usr/bin/env[ \t]+(?:${EPREFIX}/usr/bin/)?python)")
1241     python_shebang_options_re = re.compile(r"^#![ \t]*${EPREFIX}/usr/bin/(?:jython|pypy-c|python)(?:\d+(?:\.\d+)?)?[ \t]+(-\S)")
1242 arfrever 1.94 python_verification_output_re = re.compile("^GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n$")
1243 arfrever 1.82
1244 djc 1.126 pypy_versions_mapping = {
1245     "1.5": "2.7"
1246     }
1247    
1248 djc 1.135 def get_PYTHON_ABI(python_interpreter):
1249     cpython_matched = cpython_interpreter_re.match(python_interpreter)
1250     jython_matched = jython_interpreter_re.match(python_interpreter)
1251     pypy_matched = pypy_interpreter_re.match(python_interpreter)
1252 arfrever 1.106 if cpython_matched is not None:
1253     PYTHON_ABI = cpython_matched.group(1)
1254     elif jython_matched is not None:
1255     PYTHON_ABI = jython_matched.group(1) + "-jython"
1256 djc 1.126 elif pypy_matched is not None:
1257     PYTHON_ABI = pypy_versions_mapping[pypy_matched.group(1)] + "-pypy-" + pypy_matched.group(1)
1258 arfrever 1.106 else:
1259     PYTHON_ABI = None
1260     return PYTHON_ABI
1261    
1262 djc 1.135 def get_python_interpreter(PYTHON_ABI):
1263     cpython_matched = cpython_ABI_re.match(PYTHON_ABI)
1264     jython_matched = jython_ABI_re.match(PYTHON_ABI)
1265     pypy_matched = pypy_ABI_re.match(PYTHON_ABI)
1266     if cpython_matched is not None:
1267     python_interpreter = "python" + cpython_matched.group(1)
1268     elif jython_matched is not None:
1269     python_interpreter = "jython" + jython_matched.group(1)
1270     elif pypy_matched is not None:
1271     python_interpreter = "pypy-c" + pypy_matched.group(1)
1272     else:
1273     python_interpreter = None
1274     return python_interpreter
1275    
1276 arfrever 1.82 EOF
1277     if [[ "$?" != "0" ]]; then
1278     die "${FUNCNAME}(): Generation of '$1' failed"
1279     fi
1280     if [[ "${respect_EPYTHON}" == "1" ]]; then
1281     cat << EOF >> "${file}"
1282 djc 1.135 python_interpreter = os.environ.get("EPYTHON")
1283     if python_interpreter:
1284     PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1285 arfrever 1.106 if PYTHON_ABI is None:
1286 djc 1.135 sys.stderr.write("%s: EPYTHON variable has unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1287 arfrever 1.82 sys.exit(1)
1288     else:
1289     try:
1290 djc 1.122 environment = os.environ.copy()
1291     environment["ROOT"] = "/"
1292     eselect_process = subprocess.Popen(["${EPREFIX}/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], env=environment, stdout=subprocess.PIPE)
1293 arfrever 1.82 if eselect_process.wait() != 0:
1294     raise ValueError
1295     except (OSError, ValueError):
1296 djc 1.123 sys.stderr.write("%s: Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n" % sys.argv[0])
1297 arfrever 1.82 sys.exit(1)
1298    
1299 djc 1.135 python_interpreter = eselect_process.stdout.read()
1300     if not isinstance(python_interpreter, str):
1301 arfrever 1.82 # Python 3
1302 djc 1.135 python_interpreter = python_interpreter.decode()
1303     python_interpreter = python_interpreter.rstrip("\n")
1304 arfrever 1.82
1305 djc 1.135 PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1306 arfrever 1.106 if PYTHON_ABI is None:
1307 djc 1.135 sys.stderr.write("%s: 'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1308 arfrever 1.82 sys.exit(1)
1309 arfrever 1.106
1310     wrapper_script_path = os.path.realpath(sys.argv[0])
1311     target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1312     if not os.path.exists(target_executable_path):
1313 djc 1.123 sys.stderr.write("%s: '%s' does not exist\n" % (sys.argv[0], target_executable_path))
1314 arfrever 1.106 sys.exit(1)
1315 arfrever 1.82 EOF
1316     if [[ "$?" != "0" ]]; then
1317     die "${FUNCNAME}(): Generation of '$1' failed"
1318     fi
1319     else
1320     cat << EOF >> "${file}"
1321     try:
1322 djc 1.122 environment = os.environ.copy()
1323     environment["ROOT"] = "/"
1324     eselect_process = subprocess.Popen(["${EPREFIX}/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], env=environment, stdout=subprocess.PIPE)
1325 arfrever 1.82 if eselect_process.wait() != 0:
1326     raise ValueError
1327     except (OSError, ValueError):
1328 djc 1.123 sys.stderr.write("%s: Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n" % sys.argv[0])
1329 arfrever 1.82 sys.exit(1)
1330    
1331 djc 1.135 python_interpreter = eselect_process.stdout.read()
1332     if not isinstance(python_interpreter, str):
1333 arfrever 1.82 # Python 3
1334 djc 1.135 python_interpreter = python_interpreter.decode()
1335     python_interpreter = python_interpreter.rstrip("\n")
1336 arfrever 1.82
1337 djc 1.135 PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1338 arfrever 1.106 if PYTHON_ABI is None:
1339 djc 1.135 sys.stderr.write("%s: 'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1340 arfrever 1.106 sys.exit(1)
1341    
1342     wrapper_script_path = os.path.realpath(sys.argv[0])
1343     for PYTHON_ABI in [PYTHON_ABI, ${PYTHON_ABIS_list}]:
1344     target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1345     if os.path.exists(target_executable_path):
1346     break
1347 arfrever 1.82 else:
1348 djc 1.123 sys.stderr.write("%s: No target script exists for '%s'\n" % (sys.argv[0], wrapper_script_path))
1349 arfrever 1.82 sys.exit(1)
1350 djc 1.135
1351     python_interpreter = get_python_interpreter(PYTHON_ABI)
1352     if python_interpreter is None:
1353     sys.stderr.write("%s: Unrecognized Python ABI '%s'\n" % (sys.argv[0], PYTHON_ABI))
1354     sys.exit(1)
1355 arfrever 1.82 EOF
1356     if [[ "$?" != "0" ]]; then
1357     die "${FUNCNAME}(): Generation of '$1' failed"
1358     fi
1359     fi
1360     cat << EOF >> "${file}"
1361    
1362 arfrever 1.94 target_executable = open(target_executable_path, "rb")
1363     target_executable_first_line = target_executable.readline()
1364 djc 1.133 target_executable.close()
1365 arfrever 1.94 if not isinstance(target_executable_first_line, str):
1366     # Python 3
1367     target_executable_first_line = target_executable_first_line.decode("utf_8", "replace")
1368    
1369 djc 1.133 options = []
1370     python_shebang_options_matched = python_shebang_options_re.match(target_executable_first_line)
1371     if python_shebang_options_matched is not None:
1372     options = [python_shebang_options_matched.group(1)]
1373    
1374     cpython_shebang_matched = cpython_shebang_re.match(target_executable_first_line)
1375 arfrever 1.94
1376 djc 1.133 if cpython_shebang_matched is not None:
1377 arfrever 1.94 try:
1378 djc 1.135 python_interpreter_path = "${EPREFIX}/usr/bin/%s" % python_interpreter
1379 arfrever 1.94 os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] = "1"
1380     python_verification_process = subprocess.Popen([python_interpreter_path, "-c", "pass"], stdout=subprocess.PIPE)
1381     del os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"]
1382     if python_verification_process.wait() != 0:
1383     raise ValueError
1384    
1385     python_verification_output = python_verification_process.stdout.read()
1386     if not isinstance(python_verification_output, str):
1387     # Python 3
1388     python_verification_output = python_verification_output.decode()
1389    
1390     if not python_verification_output_re.match(python_verification_output):
1391     raise ValueError
1392    
1393 djc 1.135 if cpython_interpreter_re.match(python_interpreter) is not None:
1394 arfrever 1.106 os.environ["GENTOO_PYTHON_PROCESS_NAME"] = os.path.basename(sys.argv[0])
1395     os.environ["GENTOO_PYTHON_WRAPPER_SCRIPT_PATH"] = sys.argv[0]
1396     os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH"] = target_executable_path
1397    
1398     if hasattr(os, "execv"):
1399 djc 1.133 os.execv(python_interpreter_path, [python_interpreter_path] + options + sys.argv)
1400 arfrever 1.106 else:
1401 djc 1.133 sys.exit(subprocess.Popen([python_interpreter_path] + options + sys.argv).wait())
1402 arfrever 1.106 except (KeyboardInterrupt, SystemExit):
1403     raise
1404 arfrever 1.94 except:
1405     pass
1406 arfrever 1.106 for variable in ("GENTOO_PYTHON_PROCESS_NAME", "GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"):
1407     if variable in os.environ:
1408     del os.environ[variable]
1409 arfrever 1.94
1410 arfrever 1.106 if hasattr(os, "execv"):
1411     os.execv(target_executable_path, sys.argv)
1412     else:
1413     sys.exit(subprocess.Popen([target_executable_path] + sys.argv[1:]).wait())
1414 arfrever 1.82 EOF
1415     if [[ "$?" != "0" ]]; then
1416     die "${FUNCNAME}(): Generation of '$1' failed"
1417     fi
1418 arfrever 1.87 fperms +x "${file#${ED%/}}" || die "fperms '${file}' failed"
1419 arfrever 1.82 done
1420     }
1421    
1422 arfrever 1.106 # @ECLASS-VARIABLE: PYTHON_VERSIONED_SCRIPTS
1423     # @DESCRIPTION:
1424     # Array of regular expressions of paths to versioned Python scripts.
1425     # Python scripts in /usr/bin and /usr/sbin are versioned by default.
1426    
1427     # @ECLASS-VARIABLE: PYTHON_VERSIONED_EXECUTABLES
1428     # @DESCRIPTION:
1429     # Array of regular expressions of paths to versioned executables (including Python scripts).
1430    
1431     # @ECLASS-VARIABLE: PYTHON_NONVERSIONED_EXECUTABLES
1432     # @DESCRIPTION:
1433     # Array of regular expressions of paths to nonversioned executables (including Python scripts).
1434    
1435     # @FUNCTION: python_merge_intermediate_installation_images
1436     # @USAGE: [-q|--quiet] [--] <intermediate_installation_images_directory>
1437     # @DESCRIPTION:
1438     # Merge intermediate installation images into installation image.
1439 djc 1.114 #
1440     # This function can be used only in src_install() phase.
1441 arfrever 1.106 python_merge_intermediate_installation_images() {
1442 djc 1.114 if [[ "${EBUILD_PHASE}" != "install" ]]; then
1443     die "${FUNCNAME}() can be used only in src_install() phase"
1444     fi
1445    
1446     if ! _python_package_supporting_installation_for_multiple_python_abis; then
1447     die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1448     fi
1449    
1450 arfrever 1.106 _python_check_python_pkg_setup_execution
1451     _python_initialize_prefix_variables
1452    
1453 djc 1.127 local absolute_file b file files=() intermediate_installation_images_directory PYTHON_ABI quiet="0" regex shebang version_executable wrapper_scripts=() wrapper_scripts_set=()
1454 arfrever 1.106
1455     while (($#)); do
1456     case "$1" in
1457     -q|--quiet)
1458     quiet="1"
1459     ;;
1460     --)
1461     shift
1462     break
1463     ;;
1464     -*)
1465     die "${FUNCNAME}(): Unrecognized option '$1'"
1466     ;;
1467     *)
1468     break
1469     ;;
1470     esac
1471     shift
1472     done
1473    
1474     if [[ "$#" -ne 1 ]]; then
1475     die "${FUNCNAME}() requires 1 argument"
1476     fi
1477    
1478     intermediate_installation_images_directory="$1"
1479    
1480     if [[ ! -d "${intermediate_installation_images_directory}" ]]; then
1481     die "${FUNCNAME}(): Intermediate installation images directory '${intermediate_installation_images_directory}' does not exist"
1482     fi
1483    
1484     _python_calculate_PYTHON_ABIS
1485     if [[ "$(PYTHON -f --ABI)" == 3.* ]]; then
1486     b="b"
1487     fi
1488    
1489     while read -d $'\0' -r file; do
1490     files+=("${file}")
1491     done < <("$(PYTHON -f)" -c \
1492     "import os
1493     import sys
1494    
1495     if hasattr(sys.stdout, 'buffer'):
1496     # Python 3
1497     stdout = sys.stdout.buffer
1498     else:
1499     # Python 2
1500     stdout = sys.stdout
1501    
1502     files_set = set()
1503    
1504     os.chdir(${b}'${intermediate_installation_images_directory}')
1505    
1506     for PYTHON_ABI in ${b}'${PYTHON_ABIS}'.split():
1507     for root, dirs, files in os.walk(PYTHON_ABI + ${b}'${EPREFIX}'):
1508     root = root[len(PYTHON_ABI + ${b}'${EPREFIX}')+1:]
1509     files_set.update(root + ${b}'/' + file for file in files)
1510    
1511     for file in sorted(files_set):
1512     stdout.write(file)
1513     stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of files in intermediate installation images")
1514    
1515     for PYTHON_ABI in ${PYTHON_ABIS}; do
1516     if [[ ! -d "${intermediate_installation_images_directory}/${PYTHON_ABI}" ]]; then
1517     die "${FUNCNAME}(): Intermediate installation image for Python ABI '${PYTHON_ABI}' does not exist"
1518     fi
1519    
1520     pushd "${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}" > /dev/null || die "pushd failed"
1521    
1522     for file in "${files[@]}"; do
1523     version_executable="0"
1524     for regex in "/usr/bin/.*" "/usr/sbin/.*" "${PYTHON_VERSIONED_SCRIPTS[@]}"; do
1525     if [[ "/${file}" =~ ^${regex}$ ]]; then
1526     version_executable="1"
1527     break
1528     fi
1529     done
1530     for regex in "${PYTHON_VERSIONED_EXECUTABLES[@]}"; do
1531     if [[ "/${file}" =~ ^${regex}$ ]]; then
1532     version_executable="2"
1533     break
1534     fi
1535     done
1536     if [[ "${version_executable}" != "0" ]]; then
1537     for regex in "${PYTHON_NONVERSIONED_EXECUTABLES[@]}"; do
1538     if [[ "/${file}" =~ ^${regex}$ ]]; then
1539     version_executable="0"
1540     break
1541     fi
1542     done
1543     fi
1544    
1545 djc 1.127 [[ "${version_executable}" == "0" ]] && continue
1546 arfrever 1.106
1547 djc 1.127 if [[ -L "${file}" ]]; then
1548     absolute_file="$(readlink "${file}")"
1549     if [[ "${absolute_file}" == /* ]]; then
1550     absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file##/}"
1551     else
1552     if [[ "${file}" == */* ]]; then
1553     absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file%/*}/${absolute_file}"
1554     else
1555     absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file}"
1556     fi
1557     fi
1558     else
1559     absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file}"
1560     fi
1561    
1562     [[ ! -x "${absolute_file}" ]] && continue
1563    
1564     shebang="$(head -n1 "${absolute_file}")" || die "Extraction of shebang from '${absolute_file}' failed"
1565 arfrever 1.106
1566     if [[ "${version_executable}" == "2" ]]; then
1567     wrapper_scripts+=("${ED}${file}")
1568     elif [[ "${version_executable}" == "1" ]]; then
1569     if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}([[:digit:]]+(\.[[:digit:]]+)?)?($|[[:space:]]+) ]]; then
1570     wrapper_scripts+=("${ED}${file}")
1571     else
1572     version_executable="0"
1573     fi
1574     fi
1575    
1576     [[ "${version_executable}" == "0" ]] && continue
1577    
1578     if [[ -e "${file}-${PYTHON_ABI}" ]]; then
1579     die "${FUNCNAME}(): '${EPREFIX}/${file}-${PYTHON_ABI}' already exists"
1580     fi
1581    
1582     mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed"
1583    
1584     if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}[[:digit:]]*($|[[:space:]]+) ]]; then
1585 djc 1.127 if [[ -L "${file}-${PYTHON_ABI}" ]]; then
1586     python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${absolute_file}"
1587     else
1588     python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${file}-${PYTHON_ABI}"
1589     fi
1590 arfrever 1.106 fi
1591     done
1592    
1593     popd > /dev/null || die "popd failed"
1594    
1595 robbat2 1.142 # This is per bug #390691, without the duplication refactor, and with
1596     # the 3-way structure per comment #6. This enable users with old
1597     # coreutils to upgrade a lot easier (you need to upgrade python+portage
1598     # before coreutils can be upgraded).
1599     if ROOT="/" has_version >=sys-apps/coreutils-6.9.90; then
1600 djc 1.134 cp -fr --preserve=all --no-preserve=context "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1601 robbat2 1.142 elif ROOT="/" has_version sys-apps/coreutils; then
1602     cp -fr --preserve=all "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1603 arfrever 1.109 else
1604     cp -fpr "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1605     fi
1606 arfrever 1.106 done
1607    
1608 arfrever 1.107 rm -fr "${intermediate_installation_images_directory}"
1609    
1610 arfrever 1.106 if [[ "${#wrapper_scripts[@]}" -ge 1 ]]; then
1611     rm -f "${T}/python_wrapper_scripts"
1612    
1613     for file in "${wrapper_scripts[@]}"; do
1614     echo -n "${file}" >> "${T}/python_wrapper_scripts"
1615     echo -en "\x00" >> "${T}/python_wrapper_scripts"
1616     done
1617    
1618     while read -d $'\0' -r file; do
1619     wrapper_scripts_set+=("${file}")
1620     done < <("$(PYTHON -f)" -c \
1621     "import sys
1622    
1623     if hasattr(sys.stdout, 'buffer'):
1624     # Python 3
1625     stdout = sys.stdout.buffer
1626     else:
1627     # Python 2
1628     stdout = sys.stdout
1629    
1630 djc 1.137 python_wrapper_scripts_file = open('${T}/python_wrapper_scripts', 'rb')
1631     files = set(python_wrapper_scripts_file.read().rstrip(${b}'\x00').split(${b}'\x00'))
1632     python_wrapper_scripts_file.close()
1633 arfrever 1.106
1634     for file in sorted(files):
1635     stdout.write(file)
1636     stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of set of wrapper scripts")
1637    
1638     python_generate_wrapper_scripts $([[ "${quiet}" == "1" ]] && echo --quiet) "${wrapper_scripts_set[@]}"
1639     fi
1640     }
1641    
1642 arfrever 1.85 # ================================================================================================
1643 arfrever 1.95 # ========= FUNCTIONS FOR PACKAGES NOT SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ==========
1644 arfrever 1.85 # ================================================================================================
1645    
1646 arfrever 1.101 unset EPYTHON PYTHON_ABI
1647    
1648 arfrever 1.85 # @FUNCTION: python_set_active_version
1649 arfrever 1.106 # @USAGE: <Python_ABI|2|3>
1650 betelgeuse 1.55 # @DESCRIPTION:
1651 arfrever 1.106 # Set locally active version of Python.
1652     # If Python_ABI argument is specified, then version of Python corresponding to Python_ABI is used.
1653     # If 2 argument is specified, then active version of CPython 2 is used.
1654     # If 3 argument is specified, then active version of CPython 3 is used.
1655 arfrever 1.101 #
1656     # This function can be used only in pkg_setup() phase.
1657 arfrever 1.85 python_set_active_version() {
1658 djc 1.114 if [[ "${EBUILD_PHASE}" != "setup" ]]; then
1659     die "${FUNCNAME}() can be used only in pkg_setup() phase"
1660     fi
1661 arfrever 1.101
1662 arfrever 1.95 if _python_package_supporting_installation_for_multiple_python_abis; then
1663     die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
1664 arfrever 1.88 fi
1665    
1666 arfrever 1.87 if [[ "$#" -ne 1 ]]; then
1667 arfrever 1.85 die "${FUNCNAME}() requires 1 argument"
1668     fi
1669    
1670 arfrever 1.90 _python_initial_sanity_checks
1671    
1672 arfrever 1.101 if [[ -z "${PYTHON_ABI}" ]]; then
1673 arfrever 1.106 if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
1674     # PYTHON_ABI variable is intended to be used only in ebuilds/eclasses,
1675     # so it does not need to be exported to subprocesses.
1676     PYTHON_ABI="$1"
1677     if ! _python_implementation && ! has_version "$(python_get_implementational_package)"; then
1678     die "${FUNCNAME}(): '$(python_get_implementational_package)' is not installed"
1679 arfrever 1.101 fi
1680     export EPYTHON="$(PYTHON "$1")"
1681     elif [[ "$1" == "2" ]]; then
1682     if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then
1683     die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed"
1684     fi
1685     export EPYTHON="$(PYTHON -2)"
1686 arfrever 1.106 PYTHON_ABI="${EPYTHON#python}"
1687     PYTHON_ABI="${PYTHON_ABI%%-*}"
1688 arfrever 1.101 elif [[ "$1" == "3" ]]; then
1689     if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then
1690     die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed"
1691     fi
1692     export EPYTHON="$(PYTHON -3)"
1693 arfrever 1.106 PYTHON_ABI="${EPYTHON#python}"
1694     PYTHON_ABI="${PYTHON_ABI%%-*}"
1695 arfrever 1.101 else
1696     die "${FUNCNAME}(): Unrecognized argument '$1'"
1697 arfrever 1.85 fi
1698     fi
1699    
1700 arfrever 1.90 _python_final_sanity_checks
1701    
1702 arfrever 1.87 # python-updater checks PYTHON_REQUESTED_ACTIVE_VERSION variable.
1703     PYTHON_REQUESTED_ACTIVE_VERSION="$1"
1704 arfrever 1.85 }
1705 betelgeuse 1.55
1706 arfrever 1.85 # @FUNCTION: python_need_rebuild
1707 vapier 1.131 # @DESCRIPTION:
1708     # Mark current package for rebuilding by python-updater after
1709 arfrever 1.88 # switching of active version of Python.
1710 arfrever 1.85 python_need_rebuild() {
1711 arfrever 1.95 if _python_package_supporting_installation_for_multiple_python_abis; then
1712     die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
1713 arfrever 1.90 fi
1714    
1715 djc 1.114 _python_check_python_pkg_setup_execution
1716    
1717 arfrever 1.101 if [[ "$#" -ne 0 ]]; then
1718     die "${FUNCNAME}() does not accept arguments"
1719     fi
1720    
1721 arfrever 1.90 export PYTHON_NEED_REBUILD="$(PYTHON --ABI)"
1722 arfrever 1.85 }
1723 betelgeuse 1.55
1724 arfrever 1.85 # ================================================================================================
1725     # ======================================= GETTER FUNCTIONS =======================================
1726     # ================================================================================================
1727 betelgeuse 1.55
1728 djc 1.126 _PYTHON_ABI_EXTRACTION_COMMAND=\
1729     'import platform
1730 arfrever 1.88 import sys
1731     sys.stdout.write(".".join(str(x) for x in sys.version_info[:2]))
1732     if platform.system()[:4] == "Java":
1733 djc 1.126 sys.stdout.write("-jython")
1734     elif hasattr(platform, "python_implementation") and platform.python_implementation() == "PyPy":
1735     sys.stdout.write("-pypy-" + ".".join(str(x) for x in sys.pypy_version_info[:2]))'
1736 arfrever 1.88
1737     _python_get_implementation() {
1738 arfrever 1.106 local ignore_invalid="0"
1739    
1740     while (($#)); do
1741     case "$1" in
1742     --ignore-invalid)
1743     ignore_invalid="1"
1744     ;;
1745     --)
1746     shift
1747     break
1748     ;;
1749     -*)
1750     die "${FUNCNAME}(): Unrecognized option '$1'"
1751     ;;
1752     *)
1753     break
1754     ;;
1755     esac
1756     shift
1757     done
1758    
1759 arfrever 1.88 if [[ "$#" -ne 1 ]]; then
1760     die "${FUNCNAME}() requires 1 argument"
1761     fi
1762    
1763     if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
1764     echo "CPython"
1765     elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
1766     echo "Jython"
1767 djc 1.126 elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then
1768     echo "PyPy"
1769 arfrever 1.88 else
1770 arfrever 1.106 if [[ "${ignore_invalid}" == "0" ]]; then
1771     die "${FUNCNAME}(): Unrecognized Python ABI '$1'"
1772     fi
1773 arfrever 1.88 fi
1774     }
1775    
1776 arfrever 1.85 # @FUNCTION: PYTHON
1777 arfrever 1.90 # @USAGE: [-2] [-3] [--ABI] [-a|--absolute-path] [-f|--final-ABI] [--] <Python_ABI="${PYTHON_ABI}">
1778 betelgeuse 1.55 # @DESCRIPTION:
1779 arfrever 1.88 # Print filename of Python interpreter for specified Python ABI. If Python_ABI argument
1780 arfrever 1.85 # is ommitted, then PYTHON_ABI environment variable must be set and is used.
1781 arfrever 1.106 # If -2 option is specified, then active version of CPython 2 is used.
1782     # If -3 option is specified, then active version of CPython 3 is used.
1783 arfrever 1.85 # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1784 arfrever 1.90 # -2, -3 and --final-ABI options and Python_ABI argument cannot be specified simultaneously.
1785 arfrever 1.85 # If --ABI option is specified, then only specified Python ABI is printed instead of
1786 arfrever 1.88 # filename of Python interpreter.
1787     # If --absolute-path option is specified, then absolute path to Python interpreter is printed.
1788 arfrever 1.85 # --ABI and --absolute-path options cannot be specified simultaneously.
1789     PYTHON() {
1790 arfrever 1.101 _python_check_python_pkg_setup_execution
1791    
1792 arfrever 1.90 local ABI_output="0" absolute_path_output="0" final_ABI="0" PYTHON_ABI="${PYTHON_ABI}" python_interpreter python2="0" python3="0"
1793 betelgeuse 1.55
1794 arfrever 1.85 while (($#)); do
1795     case "$1" in
1796     -2)
1797     python2="1"
1798     ;;
1799     -3)
1800     python3="1"
1801     ;;
1802     --ABI)
1803     ABI_output="1"
1804     ;;
1805     -a|--absolute-path)
1806     absolute_path_output="1"
1807     ;;
1808     -f|--final-ABI)
1809     final_ABI="1"
1810     ;;
1811     --)
1812 arfrever 1.87 shift
1813 arfrever 1.85 break
1814     ;;
1815     -*)
1816     die "${FUNCNAME}(): Unrecognized option '$1'"
1817     ;;
1818     *)
1819     break
1820     ;;
1821     esac
1822     shift
1823     done
1824 betelgeuse 1.55
1825 arfrever 1.85 if [[ "${ABI_output}" == "1" && "${absolute_path_output}" == "1" ]]; then
1826 arfrever 1.101 die "${FUNCNAME}(): '--ABI' and '--absolute-path' options cannot be specified simultaneously"
1827 arfrever 1.85 fi
1828 arfrever 1.74
1829 arfrever 1.90 if [[ "$((${python2} + ${python3} + ${final_ABI}))" -gt 1 ]]; then
1830     die "${FUNCNAME}(): '-2', '-3' or '--final-ABI' options cannot be specified simultaneously"
1831 arfrever 1.85 fi
1832 betelgeuse 1.55
1833 arfrever 1.85 if [[ "$#" -eq 0 ]]; then
1834 arfrever 1.90 if [[ "${final_ABI}" == "1" ]]; then
1835 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
1836     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1837 arfrever 1.86 fi
1838 arfrever 1.98 _python_calculate_PYTHON_ABIS
1839 arfrever 1.88 PYTHON_ABI="${PYTHON_ABIS##* }"
1840 arfrever 1.85 elif [[ "${python2}" == "1" ]]; then
1841 djc 1.122 PYTHON_ABI="$(ROOT="/" eselect python show --python2 --ABI)"
1842 arfrever 1.88 if [[ -z "${PYTHON_ABI}" ]]; then
1843 arfrever 1.106 die "${FUNCNAME}(): Active version of CPython 2 not set"
1844 arfrever 1.89 elif [[ "${PYTHON_ABI}" != "2."* ]]; then
1845 arfrever 1.85 die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`"
1846     fi
1847     elif [[ "${python3}" == "1" ]]; then
1848 djc 1.122 PYTHON_ABI="$(ROOT="/" eselect python show --python3 --ABI)"
1849 arfrever 1.88 if [[ -z "${PYTHON_ABI}" ]]; then
1850 arfrever 1.106 die "${FUNCNAME}(): Active version of CPython 3 not set"
1851 arfrever 1.89 elif [[ "${PYTHON_ABI}" != "3."* ]]; then
1852 arfrever 1.85 die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`"
1853 betelgeuse 1.55 fi
1854 arfrever 1.101 elif _python_package_supporting_installation_for_multiple_python_abis; then
1855     if ! _python_abi-specific_local_scope; then
1856     die "${FUNCNAME}() should be used in ABI-specific local scope"
1857     fi
1858     else
1859 arfrever 1.90 PYTHON_ABI="$("${EPREFIX}/usr/bin/python" -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")"
1860 arfrever 1.97 if [[ -z "${PYTHON_ABI}" ]]; then
1861 arfrever 1.98 die "${FUNCNAME}(): Failure of extraction of locally active version of Python"
1862 arfrever 1.97 fi
1863 arfrever 1.85 fi
1864     elif [[ "$#" -eq 1 ]]; then
1865     if [[ "${final_ABI}" == "1" ]]; then
1866     die "${FUNCNAME}(): '--final-ABI' option and Python ABI cannot be specified simultaneously"
1867     fi
1868     if [[ "${python2}" == "1" ]]; then
1869     die "${FUNCNAME}(): '-2' option and Python ABI cannot be specified simultaneously"
1870     fi
1871     if [[ "${python3}" == "1" ]]; then
1872     die "${FUNCNAME}(): '-3' option and Python ABI cannot be specified simultaneously"
1873 betelgeuse 1.55 fi
1874 arfrever 1.88 PYTHON_ABI="$1"
1875 arfrever 1.85 else
1876     die "${FUNCNAME}(): Invalid usage"
1877 betelgeuse 1.55 fi
1878 hawking 1.46
1879 arfrever 1.85 if [[ "${ABI_output}" == "1" ]]; then
1880 arfrever 1.88 echo -n "${PYTHON_ABI}"
1881 arfrever 1.85 return
1882     else
1883 arfrever 1.88 if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
1884     python_interpreter="python${PYTHON_ABI}"
1885     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
1886 arfrever 1.106 python_interpreter="jython${PYTHON_ABI%-jython}"
1887 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
1888     python_interpreter="pypy-c${PYTHON_ABI#*-pypy-}"
1889 arfrever 1.88 fi
1890    
1891     if [[ "${absolute_path_output}" == "1" ]]; then
1892     echo -n "${EPREFIX}/usr/bin/${python_interpreter}"
1893     else
1894     echo -n "${python_interpreter}"
1895     fi
1896 arfrever 1.85 fi
1897 hawking 1.46
1898 arfrever 1.85 if [[ -n "${ABI}" && "${ABI}" != "${DEFAULT_ABI}" && "${DEFAULT_ABI}" != "default" ]]; then
1899     echo -n "-${ABI}"
1900     fi
1901 hawking 1.52 }
1902    
1903 arfrever 1.88 # @FUNCTION: python_get_implementation
1904     # @USAGE: [-f|--final-ABI]
1905     # @DESCRIPTION:
1906     # Print name of Python implementation.
1907     # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1908     python_get_implementation() {
1909 arfrever 1.101 _python_check_python_pkg_setup_execution
1910    
1911 arfrever 1.88 local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
1912    
1913     while (($#)); do
1914     case "$1" in
1915     -f|--final-ABI)
1916     final_ABI="1"
1917     ;;
1918     -*)
1919     die "${FUNCNAME}(): Unrecognized option '$1'"
1920     ;;
1921     *)
1922     die "${FUNCNAME}(): Invalid usage"
1923     ;;
1924     esac
1925     shift
1926     done
1927    
1928     if [[ "${final_ABI}" == "1" ]]; then
1929 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
1930     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1931     fi
1932 arfrever 1.88 PYTHON_ABI="$(PYTHON -f --ABI)"
1933 arfrever 1.101 else
1934     if _python_package_supporting_installation_for_multiple_python_abis; then
1935     if ! _python_abi-specific_local_scope; then
1936     die "${FUNCNAME}() should be used in ABI-specific local scope"
1937     fi
1938     else
1939     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
1940     fi
1941 arfrever 1.88 fi
1942    
1943     echo "$(_python_get_implementation "${PYTHON_ABI}")"
1944     }
1945    
1946     # @FUNCTION: python_get_implementational_package
1947     # @USAGE: [-f|--final-ABI]
1948     # @DESCRIPTION:
1949     # Print category, name and slot of package providing Python implementation.
1950     # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1951     python_get_implementational_package() {
1952 arfrever 1.101 _python_check_python_pkg_setup_execution
1953    
1954 arfrever 1.88 local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
1955    
1956     while (($#)); do
1957     case "$1" in
1958     -f|--final-ABI)
1959     final_ABI="1"
1960     ;;
1961     -*)
1962     die "${FUNCNAME}(): Unrecognized option '$1'"
1963     ;;
1964     *)
1965     die "${FUNCNAME}(): Invalid usage"
1966     ;;
1967     esac
1968     shift
1969     done
1970    
1971     if [[ "${final_ABI}" == "1" ]]; then
1972 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
1973     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1974     fi
1975 arfrever 1.88 PYTHON_ABI="$(PYTHON -f --ABI)"
1976 arfrever 1.101 else
1977     if _python_package_supporting_installation_for_multiple_python_abis; then
1978     if ! _python_abi-specific_local_scope; then
1979     die "${FUNCNAME}() should be used in ABI-specific local scope"
1980     fi
1981     else
1982     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
1983     fi
1984 arfrever 1.88 fi
1985    
1986 arfrever 1.104 if [[ "${EAPI:-0}" == "0" ]]; then
1987     if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
1988     echo "=dev-lang/python-${PYTHON_ABI}*"
1989     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
1990     echo "=dev-java/jython-${PYTHON_ABI%-jython}*"
1991 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
1992     echo "=dev-python/pypy-${PYTHON_ABI#*-pypy-}*"
1993 arfrever 1.104 fi
1994     else
1995     if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
1996     echo "dev-lang/python:${PYTHON_ABI}"
1997     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
1998     echo "dev-java/jython:${PYTHON_ABI%-jython}"
1999 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2000     echo "dev-python/pypy:${PYTHON_ABI#*-pypy-}"
2001 arfrever 1.104 fi
2002 arfrever 1.88 fi
2003     }
2004    
2005 arfrever 1.56 # @FUNCTION: python_get_includedir
2006 arfrever 1.101 # @USAGE: [-b|--base-path] [-f|--final-ABI]
2007 arfrever 1.56 # @DESCRIPTION:
2008 arfrever 1.87 # Print path to Python include directory.
2009 arfrever 1.101 # If --base-path option is specified, then path not prefixed with "/" is printed.
2010 arfrever 1.86 # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2011 arfrever 1.56 python_get_includedir() {
2012 arfrever 1.101 _python_check_python_pkg_setup_execution
2013    
2014     local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2015 arfrever 1.86
2016     while (($#)); do
2017     case "$1" in
2018 arfrever 1.101 -b|--base-path)
2019     base_path="1"
2020     ;;
2021 arfrever 1.86 -f|--final-ABI)
2022     final_ABI="1"
2023     ;;
2024     -*)
2025     die "${FUNCNAME}(): Unrecognized option '$1'"
2026     ;;
2027     *)
2028     die "${FUNCNAME}(): Invalid usage"
2029     ;;
2030     esac
2031     shift
2032     done
2033    
2034 arfrever 1.101 if [[ "${base_path}" == "0" ]]; then
2035     prefix="/"
2036     fi
2037    
2038 arfrever 1.86 if [[ "${final_ABI}" == "1" ]]; then
2039 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
2040     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2041     fi
2042 arfrever 1.88 PYTHON_ABI="$(PYTHON -f --ABI)"
2043 arfrever 1.101 else
2044     if _python_package_supporting_installation_for_multiple_python_abis; then
2045     if ! _python_abi-specific_local_scope; then
2046     die "${FUNCNAME}() should be used in ABI-specific local scope"
2047     fi
2048     else
2049     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2050     fi
2051 arfrever 1.88 fi
2052    
2053     if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2054 arfrever 1.101 echo "${prefix}usr/include/python${PYTHON_ABI}"
2055 arfrever 1.88 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2056 arfrever 1.101 echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Include"
2057 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2058     echo "${prefix}usr/$(get_libdir)/pypy${PYTHON_ABI#*-pypy-}/include"
2059 arfrever 1.56 fi
2060     }
2061    
2062 pythonhead 1.43 # @FUNCTION: python_get_libdir
2063 arfrever 1.101 # @USAGE: [-b|--base-path] [-f|--final-ABI]
2064 pythonhead 1.43 # @DESCRIPTION:
2065 djc 1.126 # Print path to Python standard library directory.
2066 arfrever 1.101 # If --base-path option is specified, then path not prefixed with "/" is printed.
2067 arfrever 1.86 # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2068 pythonhead 1.43 python_get_libdir() {
2069 arfrever 1.101 _python_check_python_pkg_setup_execution
2070    
2071     local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2072 arfrever 1.86
2073     while (($#)); do
2074     case "$1" in
2075 arfrever 1.101 -b|--base-path)
2076     base_path="1"
2077     ;;
2078 arfrever 1.86 -f|--final-ABI)
2079     final_ABI="1"
2080     ;;
2081     -*)
2082     die "${FUNCNAME}(): Unrecognized option '$1'"
2083     ;;
2084     *)
2085     die "${FUNCNAME}(): Invalid usage"
2086     ;;
2087     esac
2088     shift
2089     done
2090    
2091 arfrever 1.101 if [[ "${base_path}" == "0" ]]; then
2092     prefix="/"
2093     fi
2094    
2095 arfrever 1.86 if [[ "${final_ABI}" == "1" ]]; then
2096 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
2097     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2098     fi
2099 arfrever 1.88 PYTHON_ABI="$(PYTHON -f --ABI)"
2100 arfrever 1.101 else
2101     if _python_package_supporting_installation_for_multiple_python_abis; then
2102     if ! _python_abi-specific_local_scope; then
2103     die "${FUNCNAME}() should be used in ABI-specific local scope"
2104     fi
2105     else
2106     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2107     fi
2108 arfrever 1.88 fi
2109    
2110     if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2111 arfrever 1.101 echo "${prefix}usr/$(get_libdir)/python${PYTHON_ABI}"
2112 arfrever 1.88 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2113 arfrever 1.101 echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Lib"
2114 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2115     die "${FUNCNAME}(): PyPy has multiple standard library directories"
2116 arfrever 1.56 fi
2117 pythonhead 1.42 }
2118    
2119 pythonhead 1.43 # @FUNCTION: python_get_sitedir
2120 arfrever 1.101 # @USAGE: [-b|--base-path] [-f|--final-ABI]
2121 pythonhead 1.43 # @DESCRIPTION:
2122 arfrever 1.87 # Print path to Python site-packages directory.
2123 arfrever 1.101 # If --base-path option is specified, then path not prefixed with "/" is printed.
2124 arfrever 1.86 # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2125 pythonhead 1.43 python_get_sitedir() {
2126 arfrever 1.101 _python_check_python_pkg_setup_execution
2127    
2128 djc 1.126 local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2129 arfrever 1.86
2130     while (($#)); do
2131     case "$1" in
2132 arfrever 1.101 -b|--base-path)
2133 djc 1.126 base_path="1"
2134 arfrever 1.101 ;;
2135 arfrever 1.86 -f|--final-ABI)
2136 arfrever 1.101 final_ABI="1"
2137 arfrever 1.86 ;;
2138     -*)
2139     die "${FUNCNAME}(): Unrecognized option '$1'"
2140     ;;
2141     *)
2142     die "${FUNCNAME}(): Invalid usage"
2143     ;;
2144     esac
2145     shift
2146     done
2147    
2148 djc 1.126 if [[ "${base_path}" == "0" ]]; then
2149     prefix="/"
2150     fi
2151    
2152 arfrever 1.101 if [[ "${final_ABI}" == "1" ]]; then
2153     if ! _python_package_supporting_installation_for_multiple_python_abis; then
2154     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2155     fi
2156 djc 1.126 PYTHON_ABI="$(PYTHON -f --ABI)"
2157 arfrever 1.101 else
2158 djc 1.126 if _python_package_supporting_installation_for_multiple_python_abis; then
2159     if ! _python_abi-specific_local_scope; then
2160     die "${FUNCNAME}() should be used in ABI-specific local scope"
2161     fi
2162     else
2163     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2164 arfrever 1.101 fi
2165     fi
2166    
2167 djc 1.126 if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2168     echo "${prefix}usr/$(get_libdir)/python${PYTHON_ABI}/site-packages"
2169     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2170     echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Lib/site-packages"
2171     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2172     echo "${prefix}usr/$(get_libdir)/pypy${PYTHON_ABI#*-pypy-}/site-packages"
2173     fi
2174 pythonhead 1.42 }
2175    
2176 arfrever 1.87 # @FUNCTION: python_get_library
2177 arfrever 1.101 # @USAGE: [-b|--base-path] [-f|--final-ABI] [-l|--linker-option]
2178 arfrever 1.87 # @DESCRIPTION:
2179     # Print path to Python library.
2180 arfrever 1.101 # If --base-path option is specified, then path not prefixed with "/" is printed.
2181 arfrever 1.87 # If --linker-option is specified, then "-l${library}" linker option is printed.
2182     # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2183     python_get_library() {
2184 arfrever 1.101 _python_check_python_pkg_setup_execution
2185    
2186     local base_path="0" final_ABI="0" linker_option="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2187 arfrever 1.87
2188     while (($#)); do
2189     case "$1" in
2190 arfrever 1.101 -b|--base-path)
2191     base_path="1"
2192     ;;
2193 arfrever 1.87 -f|--final-ABI)
2194     final_ABI="1"
2195     ;;
2196     -l|--linker-option)
2197     linker_option="1"
2198     ;;
2199     -*)
2200     die "${FUNCNAME}(): Unrecognized option '$1'"
2201     ;;
2202     *)
2203     die "${FUNCNAME}(): Invalid usage"
2204     ;;
2205     esac
2206     shift
2207     done
2208    
2209 arfrever 1.101 if [[ "${base_path}" == "0" ]]; then
2210     prefix="/"
2211     fi
2212    
2213     if [[ "${base_path}" == "1" && "${linker_option}" == "1" ]]; then
2214     die "${FUNCNAME}(): '--base-path' and '--linker-option' options cannot be specified simultaneously"
2215     fi
2216    
2217 arfrever 1.87 if [[ "${final_ABI}" == "1" ]]; then
2218 arfrever 1.95 if ! _python_package_supporting_installation_for_multiple_python_abis; then
2219     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2220     fi
2221 arfrever 1.88 PYTHON_ABI="$(PYTHON -f --ABI)"
2222 arfrever 1.101 else
2223     if _python_package_supporting_installation_for_multiple_python_abis; then
2224     if ! _python_abi-specific_local_scope; then
2225     die "${FUNCNAME}() should be used in ABI-specific local scope"
2226     fi
2227     else
2228     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2229     fi
2230 arfrever 1.87 fi
2231    
2232 arfrever 1.88 if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2233     if [[ "${linker_option}" == "1" ]]; then
2234     echo "-lpython${PYTHON_ABI}"
2235     else
2236 arfrever 1.101 echo "${prefix}usr/$(get_libdir)/libpython${PYTHON_ABI}$(get_libname)"
2237 arfrever 1.88 fi
2238     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2239     die "${FUNCNAME}(): Jython does not have shared library"
2240 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2241     die "${FUNCNAME}(): PyPy does not have shared library"
2242 arfrever 1.87 fi
2243     }
2244    
2245     # @FUNCTION: python_get_version
2246 djc 1.118 # @USAGE: [-f|--final-ABI] [-l|--language] [--full] [--major] [--minor] [--micro]
2247 arfrever 1.87 # @DESCRIPTION:
2248 djc 1.124 # Print version of Python implementation.
2249 arfrever 1.92 # --full, --major, --minor and --micro options cannot be specified simultaneously.
2250     # If --full, --major, --minor and --micro options are not specified, then "${major_version}.${minor_version}" is printed.
2251 djc 1.124 # If --language option is specified, then version of Python language is printed.
2252 djc 1.118 # --language and --full options cannot be specified simultaneously.
2253     # --language and --micro options cannot be specified simultaneously.
2254 arfrever 1.87 # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2255     python_get_version() {
2256 arfrever 1.101 _python_check_python_pkg_setup_execution
2257    
2258 djc 1.118 local final_ABI="0" language="0" language_version full="0" major="0" minor="0" micro="0" PYTHON_ABI="${PYTHON_ABI}" python_command
2259 arfrever 1.87
2260     while (($#)); do
2261     case "$1" in
2262     -f|--final-ABI)
2263     final_ABI="1"
2264     ;;
2265 djc 1.118 -l|--language)
2266     language="1"
2267     ;;
2268 arfrever 1.92 --full)
2269     full="1"
2270     ;;
2271 arfrever 1.87 --major)
2272     major="1"
2273     ;;
2274     --minor)
2275     minor="1"
2276     ;;
2277     --micro)
2278     micro="1"
2279     ;;
2280     -*)
2281     die "${FUNCNAME}(): Unrecognized option '$1'"
2282     ;;
2283     *)
2284     die "${FUNCNAME}(): Invalid usage"
2285     ;;
2286     esac
2287     shift
2288     done
2289    
2290 djc 1.118 if [[ "${final_ABI}" == "1" ]]; then
2291     if ! _python_package_supporting_installation_for_multiple_python_abis; then
2292     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2293     fi
2294     else
2295     if _python_package_supporting_installation_for_multiple_python_abis && ! _python_abi-specific_local_scope; then
2296     die "${FUNCNAME}() should be used in ABI-specific local scope"
2297     fi
2298     fi
2299    
2300 arfrever 1.92 if [[ "$((${full} + ${major} + ${minor} + ${micro}))" -gt 1 ]]; then
2301     die "${FUNCNAME}(): '--full', '--major', '--minor' or '--micro' options cannot be specified simultaneously"
2302 arfrever 1.87 fi
2303    
2304 djc 1.118 if [[ "${language}" == "1" ]]; then
2305     if [[ "${final_ABI}" == "1" ]]; then
2306     PYTHON_ABI="$(PYTHON -f --ABI)"
2307     elif [[ -z "${PYTHON_ABI}" ]]; then
2308     PYTHON_ABI="$(PYTHON --ABI)"
2309     fi
2310     language_version="${PYTHON_ABI%%-*}"
2311     if [[ "${full}" == "1" ]]; then
2312     die "${FUNCNAME}(): '--language' and '--full' options cannot be specified simultaneously"
2313     elif [[ "${major}" == "1" ]]; then
2314     echo "${language_version%.*}"
2315     elif [[ "${minor}" == "1" ]]; then
2316     echo "${language_version#*.}"
2317     elif [[ "${micro}" == "1" ]]; then
2318     die "${FUNCNAME}(): '--language' and '--micro' options cannot be specified simultaneously"
2319     else
2320     echo "${language_version}"
2321     fi
2322     else
2323     if [[ "${full}" == "1" ]]; then
2324 djc 1.126 python_command="import sys; print('.'.join(str(x) for x in getattr(sys, 'pypy_version_info', sys.version_info)[:3]))"
2325 djc 1.118 elif [[ "${major}" == "1" ]]; then
2326 djc 1.126 python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[0])"
2327 djc 1.118 elif [[ "${minor}" == "1" ]]; then
2328 djc 1.126 python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[1])"
2329 djc 1.118 elif [[ "${micro}" == "1" ]]; then
2330 djc 1.126 python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[2])"
2331 djc 1.118 else
2332     if [[ -n "${PYTHON_ABI}" && "${final_ABI}" == "0" ]]; then
2333     if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2334     echo "${PYTHON_ABI}"
2335     elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2336     echo "${PYTHON_ABI%-jython}"
2337 djc 1.126 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2338     echo "${PYTHON_ABI#*-pypy-}"
2339 djc 1.118 fi
2340     return
2341 arfrever 1.92 fi
2342 djc 1.118 python_command="from sys import version_info; print('.'.join(str(x) for x in version_info[:2]))"
2343 arfrever 1.92 fi
2344 arfrever 1.87
2345 djc 1.118 if [[ "${final_ABI}" == "1" ]]; then
2346     "$(PYTHON -f)" -c "${python_command}"
2347     else
2348     "$(PYTHON ${PYTHON_ABI})" -c "${python_command}"
2349 arfrever 1.101 fi
2350 arfrever 1.87 fi
2351     }
2352    
2353 djc 1.124 # @FUNCTION: python_get_implementation_and_version
2354     # @USAGE: [-f|--final-ABI]
2355     # @DESCRIPTION:
2356     # Print name and version of Python implementation.
2357     # If version of Python implementation is not bound to version of Python language, then
2358     # version of Python language is additionally printed.
2359     # If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2360     python_get_implementation_and_version() {
2361     _python_check_python_pkg_setup_execution
2362    
2363     local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
2364    
2365     while (($#)); do
2366     case "$1" in
2367     -f|--final-ABI)
2368     final_ABI="1"
2369     ;;
2370     -*)
2371     die "${FUNCNAME}(): Unrecognized option '$1'"
2372     ;;
2373     *)
2374     die "${FUNCNAME}(): Invalid usage"
2375     ;;
2376     esac
2377     shift
2378     done
2379    
2380     if [[ "${final_ABI}" == "1" ]]; then
2381     if ! _python_package_supporting_installation_for_multiple_python_abis; then
2382     die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2383     fi
2384     PYTHON_ABI="$(PYTHON -f --ABI)"
2385     else
2386     if _python_package_supporting_installation_for_multiple_python_abis; then
2387     if ! _python_abi-specific_local_scope; then
2388     die "${FUNCNAME}() should be used in ABI-specific local scope"
2389     fi
2390     else
2391     PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2392     fi
2393     fi
2394    
2395     if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-[[:alnum:]]+-[[:digit:]]+\.[[:digit:]]+$ ]]; then
2396     echo "$(_python_get_implementation "${PYTHON_ABI}") ${PYTHON_ABI##*-} (Python ${PYTHON_ABI%%-*})"
2397     else
2398     echo "$(_python_get_implementation "${PYTHON_ABI}") ${PYTHON_ABI%%-*}"
2399     fi
2400     }
2401    
2402 arfrever 1.85 # ================================================================================================
2403 arfrever 1.87 # ================================ FUNCTIONS FOR RUNNING OF TESTS ================================
2404     # ================================================================================================
2405    
2406     # @ECLASS-VARIABLE: PYTHON_TEST_VERBOSITY
2407     # @DESCRIPTION:
2408     # User-configurable verbosity of tests of Python modules.
2409     # Supported values: 0, 1, 2, 3, 4.
2410     PYTHON_TEST_VERBOSITY="${PYTHON_TEST_VERBOSITY:-1}"
2411    
2412 arfrever 1.92 _python_test_hook() {
2413     if [[ "$#" -ne 1 ]]; then
2414     die "${FUNCNAME}() requires 1 argument"
2415     fi
2416    
2417 djc 1.136 if _python_package_supporting_installation_for_multiple_python_abis && [[ "$(type -t "${_PYTHON_TEST_FUNCTION}_$1_hook")" == "function" ]]; then
2418     "${_PYTHON_TEST_FUNCTION}_$1_hook"
2419 arfrever 1.92 fi
2420     }
2421    
2422 arfrever 1.87 # @FUNCTION: python_execute_nosetests
2423     # @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2424     # @DESCRIPTION:
2425 arfrever 1.95 # Execute nosetests for all enabled Python ABIs.
2426     # In ebuilds of packages supporting installation for multiple Python ABIs, this function calls
2427     # python_execute_nosetests_pre_hook() and python_execute_nosetests_post_hook(), if they are defined.
2428 arfrever 1.87 python_execute_nosetests() {
2429 arfrever 1.101 _python_check_python_pkg_setup_execution
2430 arfrever 1.90 _python_set_color_variables
2431    
2432 djc 1.114 local PYTHONPATH_template separate_build_dirs
2433 arfrever 1.87
2434     while (($#)); do
2435     case "$1" in
2436     -P|--PYTHONPATH)
2437     PYTHONPATH_template="$2"
2438     shift
2439     ;;
2440     -s|--separate-build-dirs)
2441     separate_build_dirs="1"
2442     ;;
2443     --)
2444     shift
2445     break
2446     ;;
2447     -*)
2448     die "${FUNCNAME}(): Unrecognized option '$1'"
2449     ;;
2450     *)
2451     break
2452     ;;
2453     esac
2454     shift
2455     done
2456    
2457     python_test_function() {
2458 arfrever 1.101 local evaluated_PYTHONPATH
2459 arfrever 1.87
2460 arfrever 1.103 eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2461 arfrever 1.87
2462 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook pre
2463 arfrever 1.92
2464 arfrever 1.87 if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2465 arfrever 1.90 echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}
2466 arfrever 1.92 PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"
2467 arfrever 1.87 else
2468 arfrever 1.90 echo ${_BOLD}nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}
2469 arfrever 1.92 nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"
2470 arfrever 1.87 fi
2471 arfrever 1.92
2472 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook post
2473 arfrever 1.87 }
2474 arfrever 1.95 if _python_package_supporting_installation_for_multiple_python_abis; then
2475 arfrever 1.87 python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2476