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

Contents of /eclass/python.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.103 - (hide annotations) (download)
Sun Oct 3 00:38:13 2010 UTC (4 years ago) by arfrever
Branch: MAIN
Changes since 1.102: +87 -31 lines
Fix preservation of whitespace in python_execute_function(), python_execute_nosetests(), python_execute_py.test() and python_execute_trial().
Support --allow-evaluated-non-sitedir-paths option in python_mod_optimize() and python_mod_cleanup().

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

  ViewVC Help
Powered by ViewVC 1.1.20