/[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 (2 years, 8 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     else
2477     if [[ -n "${separate_build_dirs}" ]]; then
2478     die "${FUNCNAME}(): Invalid usage"
2479     fi
2480 arfrever 1.88 python_test_function "$@" || die "Testing failed"
2481 arfrever 1.87 fi
2482 arfrever 1.88
2483     unset -f python_test_function
2484 arfrever 1.87 }
2485    
2486     # @FUNCTION: python_execute_py.test
2487     # @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2488     # @DESCRIPTION:
2489 arfrever 1.95 # Execute py.test for all enabled Python ABIs.
2490     # In ebuilds of packages supporting installation for multiple Python ABIs, this function calls
2491     # python_execute_py.test_pre_hook() and python_execute_py.test_post_hook(), if they are defined.
2492 arfrever 1.87 python_execute_py.test() {
2493 arfrever 1.101 _python_check_python_pkg_setup_execution
2494 arfrever 1.90 _python_set_color_variables
2495    
2496 djc 1.114 local PYTHONPATH_template separate_build_dirs
2497 arfrever 1.87
2498     while (($#)); do
2499     case "$1" in
2500     -P|--PYTHONPATH)
2501     PYTHONPATH_template="$2"
2502     shift
2503     ;;
2504     -s|--separate-build-dirs)
2505     separate_build_dirs="1"
2506     ;;
2507     --)
2508     shift
2509     break
2510     ;;
2511     -*)
2512     die "${FUNCNAME}(): Unrecognized option '$1'"
2513     ;;
2514     *)
2515     break
2516     ;;
2517     esac
2518     shift
2519     done
2520    
2521     python_test_function() {
2522 arfrever 1.101 local evaluated_PYTHONPATH
2523 arfrever 1.87
2524 arfrever 1.103 eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2525 arfrever 1.87
2526 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook pre
2527 arfrever 1.92
2528 arfrever 1.87 if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2529 arfrever 1.90 echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@"${_NORMAL}
2530 arfrever 1.92 PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@" || return "$?"
2531 arfrever 1.87 else
2532 arfrever 1.90 echo ${_BOLD}py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@"${_NORMAL}
2533 arfrever 1.92 py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@" || return "$?"
2534 arfrever 1.87 fi
2535 arfrever 1.92
2536 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook post
2537 arfrever 1.87 }
2538 arfrever 1.95 if _python_package_supporting_installation_for_multiple_python_abis; then
2539 arfrever 1.87 python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2540     else
2541     if [[ -n "${separate_build_dirs}" ]]; then
2542     die "${FUNCNAME}(): Invalid usage"
2543     fi
2544 arfrever 1.88 python_test_function "$@" || die "Testing failed"
2545 arfrever 1.87 fi
2546 arfrever 1.88
2547     unset -f python_test_function
2548 arfrever 1.87 }
2549    
2550     # @FUNCTION: python_execute_trial
2551     # @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2552     # @DESCRIPTION:
2553 arfrever 1.95 # Execute trial for all enabled Python ABIs.
2554     # In ebuilds of packages supporting installation for multiple Python ABIs, this function
2555 arfrever 1.92 # calls python_execute_trial_pre_hook() and python_execute_trial_post_hook(), if they are defined.
2556 arfrever 1.87 python_execute_trial() {
2557 arfrever 1.101 _python_check_python_pkg_setup_execution
2558 arfrever 1.90 _python_set_color_variables
2559    
2560 djc 1.114 local PYTHONPATH_template separate_build_dirs
2561 arfrever 1.87
2562     while (($#)); do
2563     case "$1" in
2564     -P|--PYTHONPATH)
2565     PYTHONPATH_template="$2"
2566     shift
2567     ;;
2568     -s|--separate-build-dirs)
2569     separate_build_dirs="1"
2570     ;;
2571     --)
2572     shift
2573     break
2574     ;;
2575     -*)
2576     die "${FUNCNAME}(): Unrecognized option '$1'"
2577     ;;
2578     *)
2579     break
2580     ;;
2581     esac
2582     shift
2583     done
2584    
2585     python_test_function() {
2586 arfrever 1.101 local evaluated_PYTHONPATH
2587 arfrever 1.87
2588 arfrever 1.103 eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2589 arfrever 1.87
2590 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook pre
2591 arfrever 1.92
2592 arfrever 1.87 if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2593 arfrever 1.90 echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}
2594 arfrever 1.92 PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"
2595 arfrever 1.87 else
2596 arfrever 1.90 echo ${_BOLD}trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}
2597 arfrever 1.92 trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"
2598 arfrever 1.87 fi
2599 arfrever 1.92
2600 djc 1.136 _PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook post
2601 arfrever 1.87 }
2602 arfrever 1.95 if _python_package_supporting_installation_for_multiple_python_abis; then
2603 arfrever 1.87 python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2604     else
2605     if [[ -n "${separate_build_dirs}" ]]; then
2606     die "${FUNCNAME}(): Invalid usage"
2607     fi
2608 arfrever 1.88 python_test_function "$@" || die "Testing failed"
2609 arfrever 1.56 fi
2610 arfrever 1.88
2611     unset -f python_test_function
2612 arfrever 1.85 }
2613 arfrever 1.56
2614 arfrever 1.85 # ================================================================================================
2615     # ======================= FUNCTIONS FOR HANDLING OF BYTE-COMPILED MODULES ========================
2616     # ================================================================================================
2617 hawking 1.37
2618 arfrever 1.85 # @FUNCTION: python_enable_pyc
2619     # @DESCRIPTION:
2620     # Tell Python to automatically recompile modules to .pyc/.pyo if the
2621     # timestamps/version stamps have changed.
2622     python_enable_pyc() {
2623 arfrever 1.101 _python_check_python_pkg_setup_execution
2624    
2625     if [[ "$#" -ne 0 ]]; then
2626     die "${FUNCNAME}() does not accept arguments"
2627     fi
2628    
2629 arfrever 1.85 unset PYTHONDONTWRITEBYTECODE
2630     }
2631 hawking 1.37
2632 arfrever 1.85 # @FUNCTION: python_disable_pyc
2633     # @DESCRIPTION:
2634     # Tell Python not to automatically recompile modules to .pyc/.pyo
2635     # even if the timestamps/version stamps do not match. This is done
2636     # to protect sandbox.
2637     python_disable_pyc() {
2638 arfrever 1.101 _python_check_python_pkg_setup_execution
2639    
2640     if [[ "$#" -ne 0 ]]; then
2641     die "${FUNCNAME}() does not accept arguments"
2642     fi
2643    
2644 arfrever 1.85 export PYTHONDONTWRITEBYTECODE="1"
2645 liquidx 1.1 }
2646    
2647 arfrever 1.97 _python_clean_compiled_modules() {
2648     _python_initialize_prefix_variables
2649     _python_set_color_variables
2650    
2651 arfrever 1.104 [[ "${FUNCNAME[1]}" =~ ^(python_mod_optimize|python_mod_cleanup)$ ]] || die "${FUNCNAME}(): Invalid usage"
2652 arfrever 1.97
2653     local base_module_name compiled_file compiled_files=() dir path py_file root
2654    
2655     # Strip trailing slash from EROOT.
2656     root="${EROOT%/}"
2657    
2658     for path in "$@"; do
2659     compiled_files=()
2660     if [[ -d "${path}" ]]; then
2661     while read -d $'\0' -r compiled_file; do
2662     compiled_files+=("${compiled_file}")
2663     done < <(find "${path}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -print0)
2664    
2665     if [[ "${EBUILD_PHASE}" == "postrm" ]]; then
2666     # Delete empty child directories.
2667     find "${path}" -type d | sort -r | while read -r dir; do
2668 arfrever 1.100 if rmdir "${dir}" 2> /dev/null; then
2669     echo "${_CYAN}<<< ${dir}${_NORMAL}"
2670     fi
2671 arfrever 1.97 done
2672     fi
2673     elif [[ "${path}" == *.py ]]; then
2674     base_module_name="${path##*/}"
2675     base_module_name="${base_module_name%.py}"
2676     if [[ -d "${path%/*}/__pycache__" ]]; then
2677     while read -d $'\0' -r compiled_file; do
2678     compiled_files+=("${compiled_file}")
2679     done < <(find "${path%/*}/__pycache__" "(" -name "${base_module_name}.*.py[co]" -o -name "${base_module_name}\$py.class" ")" -print0)
2680     fi
2681     compiled_files+=("${path}c" "${path}o" "${path%.py}\$py.class")
2682     fi
2683    
2684     for compiled_file in "${compiled_files[@]}"; do
2685     [[ ! -f "${compiled_file}" ]] && continue
2686     dir="${compiled_file%/*}"
2687     dir="${dir##*/}"
2688     if [[ "${compiled_file}" == *.py[co] ]]; then
2689     if [[ "${dir}" == "__pycache__" ]]; then
2690     base_module_name="${compiled_file##*/}"
2691 arfrever 1.98 base_module_name="${base_module_name%.*py[co]}"
2692     base_module_name="${base_module_name%.*}"
2693 arfrever 1.97 py_file="${compiled_file%__pycache__/*}${base_module_name}.py"
2694     else
2695     py_file="${compiled_file%[co]}"
2696     fi
2697     if [[ "${EBUILD_PHASE}" == "postinst" ]]; then
2698     [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue
2699     else
2700     [[ -f "${py_file}" ]] && continue
2701     fi
2702     echo "${_BLUE}<<< ${compiled_file%[co]}[co]${_NORMAL}"
2703     rm -f "${compiled_file%[co]}"[co]
2704     elif [[ "${compiled_file}" == *\$py.class ]]; then
2705     if [[ "${dir}" == "__pycache__" ]]; then
2706     base_module_name="${compiled_file##*/}"
2707     base_module_name="${base_module_name%\$py.class}"
2708     py_file="${compiled_file%__pycache__/*}${base_module_name}.py"
2709     else
2710 arfrever 1.106 py_file="${compiled_file%\$py.class}.py"
2711 arfrever 1.97 fi
2712     if [[ "${EBUILD_PHASE}" == "postinst" ]]; then
2713     [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue
2714     else
2715     [[ -f "${py_file}" ]] && continue
2716     fi
2717     echo "${_BLUE}<<< ${compiled_file}${_NORMAL}"
2718     rm -f "${compiled_file}"
2719     else
2720     die "${FUNCNAME}(): Unrecognized file type: '${compiled_file}'"
2721     fi
2722    
2723     # Delete empty parent directories.
2724     dir="${compiled_file%/*}"
2725     while [[ "${dir}" != "${root}" ]]; do
2726 arfrever 1.100 if rmdir "${dir}" 2> /dev/null; then
2727     echo "${_CYAN}<<< ${dir}${_NORMAL}"
2728 arfrever 1.97 else
2729     break
2730     fi
2731     dir="${dir%/*}"
2732     done
2733     done
2734     done
2735     }
2736    
2737 dev-zero 1.33 # @FUNCTION: python_mod_optimize
2738 arfrever 1.104 # @USAGE: [--allow-evaluated-non-sitedir-paths] [-d directory] [-f] [-l] [-q] [-x regular_expression] [--] <file|directory> [files|directories]
2739 dev-zero 1.33 # @DESCRIPTION:
2740 arfrever 1.104 # Byte-compile specified Python modules.
2741     # -d, -f, -l, -q and -x options passed to this function are passed to compileall.py.
2742 hawking 1.39 #
2743 arfrever 1.92 # This function can be used only in pkg_postinst() phase.
2744 liquidx 1.1 python_mod_optimize() {
2745 djc 1.114 if [[ "${EBUILD_PHASE}" != "postinst" ]]; then
2746     die "${FUNCNAME}() can be used only in pkg_postinst() phase"
2747     fi
2748    
2749 arfrever 1.101 _python_check_python_pkg_setup_execution
2750 arfrever 1.87 _python_initialize_prefix_variables
2751    
2752 arfrever 1.104 if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then
2753 arfrever 1.97 # PYTHON_ABI variable cannot be local in packages not supporting installation for multiple Python ABIs.
2754 djc 1.119 local allow_evaluated_non_sitedir_paths="0" dir dirs=() evaluated_dirs=() evaluated_files=() file files=() iterated_PYTHON_ABIS options=() other_dirs=() other_files=() previous_PYTHON_ABI="${PYTHON_ABI}" return_code root site_packages_dirs=() site_packages_files=() stderr stderr_line
2755 hawking 1.37
2756 arfrever 1.97 if _python_package_supporting_installation_for_multiple_python_abis; then
2757 arfrever 1.101 if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then
2758     die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"
2759 arfrever 1.97 fi
2760     iterated_PYTHON_ABIS="${PYTHON_ABIS}"
2761     else
2762 arfrever 1.101 if has "${EAPI:-0}" 0 1 2 3; then
2763     iterated_PYTHON_ABIS="${PYTHON_ABI:=$(PYTHON --ABI)}"
2764     else
2765     iterated_PYTHON_ABIS="${PYTHON_ABI}"
2766     fi
2767 arfrever 1.97 fi
2768    
2769     # Strip trailing slash from EROOT.
2770 arfrever 1.87 root="${EROOT%/}"
2771 arfrever 1.56
2772     while (($#)); do
2773     case "$1" in
2774 arfrever 1.103 --allow-evaluated-non-sitedir-paths)
2775     allow_evaluated_non_sitedir_paths="1"
2776     ;;
2777 arfrever 1.56 -l|-f|-q)
2778     options+=("$1")
2779     ;;
2780     -d|-x)
2781     options+=("$1" "$2")
2782     shift
2783     ;;
2784 arfrever 1.101 --)
2785     shift
2786     break
2787     ;;
2788 arfrever 1.56 -*)
2789 arfrever 1.101 die "${FUNCNAME}(): Unrecognized option '$1'"
2790 arfrever 1.56 ;;
2791     *)
2792 arfrever 1.98 break
2793     ;;
2794     esac
2795     shift
2796     done
2797    
2798 arfrever 1.103 if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then
2799     die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2800     fi
2801    
2802 arfrever 1.98 if [[ "$#" -eq 0 ]]; then
2803 arfrever 1.104 die "${FUNCNAME}(): Missing files or directories"
2804 arfrever 1.98 fi
2805    
2806     while (($#)); do
2807 arfrever 1.101 if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
2808     die "${FUNCNAME}(): Invalid argument '$1'"
2809     elif ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
2810 arfrever 1.98 die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"
2811     elif [[ "$1" =~ ^/ ]]; then
2812     if _python_package_supporting_installation_for_multiple_python_abis; then
2813 arfrever 1.103 if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then
2814     die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
2815     fi
2816     if [[ "$1" != *\$* ]]; then
2817     die "${FUNCNAME}(): '$1' has invalid syntax"
2818     fi
2819     if [[ "$1" == *.py ]]; then
2820     evaluated_files+=("$1")
2821     else
2822     evaluated_dirs+=("$1")
2823     fi
2824 arfrever 1.98 else
2825 arfrever 1.103 if [[ -d "${root}$1" ]]; then
2826     other_dirs+=("${root}$1")
2827     elif [[ -f "${root}$1" ]]; then
2828     other_files+=("${root}$1")
2829     elif [[ -e "${root}$1" ]]; then
2830     eerror "${FUNCNAME}(): '${root}$1' is not a regular file or a directory"
2831     else
2832     eerror "${FUNCNAME}(): '${root}$1' does not exist"
2833     fi
2834 arfrever 1.98 fi
2835     else
2836     for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
2837     if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then
2838     site_packages_dirs+=("$1")
2839     break
2840     elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then
2841     site_packages_files+=("$1")
2842     break
2843     elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then
2844 arfrever 1.101 eerror "${FUNCNAME}(): '$1' is not a regular file or a directory"
2845 arfrever 1.56 else
2846 arfrever 1.101 eerror "${FUNCNAME}(): '$1' does not exist"
2847 arfrever 1.56 fi
2848 arfrever 1.98 done
2849     fi
2850 arfrever 1.56 shift
2851     done
2852 hawking 1.37
2853 arfrever 1.56 # Set additional options.
2854     options+=("-q")
2855 liquidx 1.13
2856 arfrever 1.97 for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
2857 arfrever 1.103 if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})) || ((${#evaluated_dirs[@]})) || ((${#evaluated_files[@]})); then
2858 arfrever 1.56 return_code="0"
2859 djc 1.119 stderr=""
2860 djc 1.124 ebegin "Compilation and optimization of Python modules for $(python_get_implementation_and_version)"
2861 arfrever 1.103 if ((${#site_packages_dirs[@]})) || ((${#evaluated_dirs[@]})); then
2862 arfrever 1.56 for dir in "${site_packages_dirs[@]}"; do
2863 arfrever 1.103 dirs+=("${root}$(python_get_sitedir)/${dir}")
2864     done
2865     for dir in "${evaluated_dirs[@]}"; do
2866     eval "dirs+=(\"\${root}${dir}\")"
2867 arfrever 1.56 done
2868 djc 1.126 stderr+="${stderr:+$'\n'}$("$(PYTHON)" -m compileall "${options[@]}" "${dirs[@]}" 2>&1)" || return_code="1"
2869 djc 1.138 if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2870 djc 1.126 "$(PYTHON)" -O -m compileall "${options[@]}" "${dirs[@]}" &> /dev/null || return_code="1"
2871 arfrever 1.88 fi
2872 arfrever 1.103 _python_clean_compiled_modules "${dirs[@]}"
2873 arfrever 1.56 fi
2874 arfrever 1.103 if ((${#site_packages_files[@]})) || ((${#evaluated_files[@]})); then
2875 arfrever 1.56 for file in "${site_packages_files[@]}"; do
2876 arfrever 1.103 files+=("${root}$(python_get_sitedir)/${file}")
2877 arfrever 1.56 done
2878 arfrever 1.103 for file in "${evaluated_files[@]}"; do
2879     eval "files+=(\"\${root}${file}\")"
2880     done
2881 djc 1.126 stderr+="${stderr:+$'\n'}$("$(PYTHON)" -m py_compile "${files[@]}" 2>&1)" || return_code="1"
2882 djc 1.138 if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2883 djc 1.126 "$(PYTHON)" -O -m py_compile "${files[@]}" &> /dev/null || return_code="1"
2884 arfrever 1.88 fi
2885 arfrever 1.103 _python_clean_compiled_modules "${files[@]}"
2886 hawking 1.49 fi
2887 arfrever 1.56 eend "${return_code}"
2888 djc 1.119 if [[ -n "${stderr}" ]]; then
2889 djc 1.124 eerror "Syntax errors / warnings in Python modules for $(python_get_implementation_and_version):" &> /dev/null
2890 djc 1.119 while read stderr_line; do
2891     eerror " ${stderr_line}"
2892     done <<< "${stderr}"
2893     fi
2894 arfrever 1.56 fi
2895 arfrever 1.103 unset dirs files
2896 arfrever 1.56 done
2897    
2898 arfrever 1.97 if _python_package_supporting_installation_for_multiple_python_abis; then
2899     # Restore previous value of PYTHON_ABI.
2900     if [[ -n "${previous_PYTHON_ABI}" ]]; then
2901     PYTHON_ABI="${previous_PYTHON_ABI}"
2902     else
2903     unset PYTHON_ABI
2904     fi
2905 arfrever 1.86 fi
2906 hawking 1.36
2907 arfrever 1.56 if ((${#other_dirs[@]})) || ((${#other_files[@]})); then
2908     return_code="0"
2909 djc 1.119 stderr=""
2910 djc 1.124 ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for $(python_get_implementation_and_version)"
2911 arfrever 1.56 if ((${#other_dirs[@]})); then
2912 djc 1.126 stderr+="${stderr:+$'\n'}$("$(PYTHON ${PYTHON_ABI})" -m compileall "${options[@]}" "${other_dirs[@]}" 2>&1)" || return_code="1"
2913 djc 1.138 if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2914 djc 1.126 "$(PYTHON ${PYTHON_ABI})" -O -m compileall "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1"
2915 arfrever 1.88 fi
2916 arfrever 1.97 _python_clean_compiled_modules "${other_dirs[@]}"
2917 arfrever 1.56 fi
2918     if ((${#other_files[@]})); then
2919 djc 1.126 stderr+="${stderr:+$'\n'}$("$(PYTHON ${PYTHON_ABI})" -m py_compile "${other_files[@]}" 2>&1)" || return_code="1"
2920 djc 1.138 if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2921 djc 1.126 "$(PYTHON ${PYTHON_ABI})" -O -m py_compile "${other_files[@]}" &> /dev/null || return_code="1"
2922 arfrever 1.88 fi
2923 arfrever 1.104 _python_clean_compiled_modules "${other_files[@]}"
2924 arfrever 1.56 fi
2925     eend "${return_code}"
2926 djc 1.119 if [[ -n "${stderr}" ]]; then
2927 djc 1.124 eerror "Syntax errors / warnings in Python modules placed outside of site-packages directories for $(python_get_implementation_and_version):" &> /dev/null
2928 djc 1.119 while read stderr_line; do
2929     eerror " ${stderr_line}"
2930     done <<< "${stderr}"
2931     fi
2932 arfrever 1.56 fi
2933 pythonhead 1.7 else
2934 arfrever 1.98 # Deprecated part of python_mod_optimize()
2935 djc 1.112 ewarn
2936     ewarn "Deprecation Warning: Usage of ${FUNCNAME}() in packages not supporting installation"
2937     ewarn "for multiple Python ABIs in EAPI <=2 is deprecated and will be disallowed on 2011-08-01."
2938     ewarn "Use EAPI >=3 and call ${FUNCNAME}() with paths having appropriate syntax."
2939     ewarn "The ebuild needs to be fixed. Please report a bug, if it has not been already reported."
2940     ewarn
2941 arfrever 1.98
2942 arfrever 1.63 local myroot mydirs=() myfiles=() myopts=() return_code="0"
2943 arfrever 1.56
2944     # strip trailing slash
2945 arfrever 1.87 myroot="${EROOT%/}"
2946 arfrever 1.56
2947 arfrever 1.97 # respect EROOT and options passed to compileall.py
2948 arfrever 1.56 while (($#)); do
2949     case "$1" in
2950     -l|-f|-q)
2951     myopts+=("$1")
2952     ;;
2953     -d|-x)
2954     myopts+=("$1" "$2")
2955     shift
2956     ;;
2957 arfrever 1.101 --)
2958     shift
2959     break
2960     ;;
2961 arfrever 1.56 -*)
2962 arfrever 1.101 die "${FUNCNAME}(): Unrecognized option '$1'"
2963 arfrever 1.56 ;;
2964     *)
2965 arfrever 1.98 break
2966 arfrever 1.56 ;;
2967     esac
2968     shift
2969     done
2970    
2971 arfrever 1.98 if [[ "$#" -eq 0 ]]; then
2972 arfrever 1.104 die "${FUNCNAME}(): Missing files or directories"
2973 arfrever 1.98 fi
2974    
2975     while (($#)); do
2976 arfrever 1.101 if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
2977     die "${FUNCNAME}(): Invalid argument '$1'"
2978     elif [[ -d "${myroot}/${1#/}" ]]; then
2979 arfrever 1.98 mydirs+=("${myroot}/${1#/}")
2980     elif [[ -f "${myroot}/${1#/}" ]]; then
2981 arfrever 1.104 myfiles+=("${myroot}/${1#/}")
2982 arfrever 1.98 elif [[ -e "${myroot}/${1#/}" ]]; then
2983 arfrever 1.101 eerror "${FUNCNAME}(): ${myroot}/${1#/} is not a regular file or directory"
2984 arfrever 1.98 else
2985 arfrever 1.101 eerror "${FUNCNAME}(): ${myroot}/${1#/} does not exist"
2986 arfrever 1.98 fi
2987     shift
2988     done
2989    
2990 arfrever 1.56 # set additional opts
2991     myopts+=(-q)
2992 pythonhead 1.7
2993 arfrever 1.98 PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2994 arfrever 1.97
2995 arfrever 1.89 ebegin "Compilation and optimization of Python modules for $(python_get_implementation) $(python_get_version)"
2996 arfrever 1.56 if ((${#mydirs[@]})); then
2997 arfrever 1.90 "$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" || return_code="1"
2998     "$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" &> /dev/null || return_code="1"
2999 arfrever 1.97 _python_clean_compiled_modules "${mydirs[@]}"
3000 arfrever 1.56 fi
3001 pythonhead 1.7
3002 arfrever 1.56 if ((${#myfiles[@]})); then
3003 arfrever 1.104 "$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" || return_code="1"
3004     "$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" &> /dev/null || return_code="1"
3005     _python_clean_compiled_modules "${myfiles[@]}"
3006 arfrever 1.56 fi
3007 hawking 1.36
3008 arfrever 1.63 eend "${return_code}"
3009 hawking 1.36 fi
3010 liquidx 1.1 }
3011    
3012 dev-zero 1.33 # @FUNCTION: python_mod_cleanup
3013 arfrever 1.104 # @USAGE: [--allow-evaluated-non-sitedir-paths] [--] <file|directory> [files|directories]
3014 dev-zero 1.33 # @DESCRIPTION:
3015 arfrever 1.104 # Delete orphaned byte-compiled Python modules corresponding to specified Python modules.
3016 hawking 1.37 #
3017 arfrever 1.92 # This function can be used only in pkg_postrm() phase.
3018 liquidx 1.1 python_mod_cleanup() {
3019 djc 1.114 if [[ "${EBUILD_PHASE}" != "postrm" ]]; then
3020     die "${FUNCNAME}() can be used only in pkg_postrm() phase"
3021     fi
3022    
3023 arfrever 1.101 _python_check_python_pkg_setup_execution
3024 arfrever 1.87 _python_initialize_prefix_variables
3025    
3026 arfrever 1.103 local allow_evaluated_non_sitedir_paths="0" dir iterated_PYTHON_ABIS PYTHON_ABI="${PYTHON_ABI}" root search_paths=() sitedir
3027 liquidx 1.16
3028 arfrever 1.97 if _python_package_supporting_installation_for_multiple_python_abis; then
3029 arfrever 1.101 if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then
3030     die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"
3031 arfrever 1.97 fi
3032     iterated_PYTHON_ABIS="${PYTHON_ABIS}"
3033     else
3034 arfrever 1.101 if has "${EAPI:-0}" 0 1 2 3; then
3035     iterated_PYTHON_ABIS="${PYTHON_ABI:-$(PYTHON --ABI)}"
3036     else
3037     iterated_PYTHON_ABIS="${PYTHON_ABI}"
3038     fi
3039 arfrever 1.97 fi
3040    
3041     # Strip trailing slash from EROOT.
3042 arfrever 1.87 root="${EROOT%/}"
3043 liquidx 1.1
3044 arfrever 1.103 while (($#)); do
3045     case "$1" in
3046     --allow-evaluated-non-sitedir-paths)
3047     allow_evaluated_non_sitedir_paths="1"
3048     ;;
3049     --)
3050     shift
3051     break
3052     ;;
3053     -*)
3054     die "${FUNCNAME}(): Unrecognized option '$1'"
3055     ;;
3056     *)
3057     break
3058     ;;
3059     esac
3060     shift
3061     done
3062    
3063     if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then
3064     die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
3065     fi
3066    
3067 arfrever 1.104 if [[ "$#" -eq 0 ]]; then
3068     die "${FUNCNAME}(): Missing files or directories"
3069     fi
3070    
3071     if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then
3072     while (($#)); do
3073     if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
3074     die "${FUNCNAME}(): Invalid argument '$1'"
3075     elif ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
3076     die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"
3077     elif [[ "$1" =~ ^/ ]]; then
3078     if _python_package_supporting_installation_for_multiple_python_abis; then
3079     if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then
3080     die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
3081     fi
3082     if [[ "$1" != *\$* ]]; then
3083     die "${FUNCNAME}(): '$1' has invalid syntax"
3084 arfrever 1.97 fi
3085     for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
3086 arfrever 1.104 eval "search_paths+=(\"\${root}$1\")"
3087 arfrever 1.56 done
3088 arfrever 1.104 else
3089     search_paths+=("${root}$1")
3090 arfrever 1.56 fi
3091 arfrever 1.104 else
3092     for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
3093     search_paths+=("${root}$(python_get_sitedir)/$1")
3094 arfrever 1.78 done
3095     fi
3096 arfrever 1.104 shift
3097 arfrever 1.78 done
3098 arfrever 1.104 else
3099     # Deprecated part of python_mod_cleanup()
3100 djc 1.112 ewarn
3101     ewarn "Deprecation Warning: Usage of ${FUNCNAME}() in packages not supporting installation"
3102     ewarn "for multiple Python ABIs in EAPI <=2 is deprecated and will be disallowed on 2011-08-01."
3103     ewarn "Use EAPI >=3 and call ${FUNCNAME}() with paths having appropriate syntax."
3104     ewarn "The ebuild needs to be fixed. Please report a bug, if it has not been already reported."
3105     ewarn
3106 arfrever 1.104
3107     search_paths=("${@#/}")
3108     search_paths=("${search_paths[@]/#/${root}/}")
3109 arfrever 1.78 fi
3110    
3111 arfrever 1.97 _python_clean_compiled_modules "${search_paths[@]}"
3112 liquidx 1.1 }
3113 arfrever 1.85
3114     # ================================================================================================
3115     # ===================================== DEPRECATED FUNCTIONS =====================================
3116     # ================================================================================================

  ViewVC Help
Powered by ViewVC 1.1.20