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

Contents of /eclass/python.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.105 - (hide annotations) (download)
Fri Oct 29 19:09:08 2010 UTC (3 years, 8 months ago) by arfrever
Branch: MAIN
Changes since 1.104: +1 -155 lines
Temporarily delete some code.

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

  ViewVC Help
Powered by ViewVC 1.1.20