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

Diff of /eclass/python.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.105 Revision 1.106
1# Copyright 1999-2010 Gentoo Foundation 1# Copyright 1999-2010 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.105 2010/10/29 19:09:08 arfrever Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.106 2010/12/24 15:01:09 arfrever Exp $
4 4
5# @ECLASS: python.eclass 5# @ECLASS: python.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Gentoo Python Project <python@gentoo.org> 7# Gentoo Python Project <python@gentoo.org>
8# @BLURB: Eclass for Python packages 8# @BLURB: Eclass for Python packages
13 13
14if ! has "${EAPI:-0}" 0 1 2 3; then 14if ! has "${EAPI:-0}" 0 1 2 3; then
15 die "API of python.eclass in EAPI=\"${EAPI}\" not established" 15 die "API of python.eclass in EAPI=\"${EAPI}\" not established"
16fi 16fi
17 17
18_CPYTHON2_SUPPORTED_ABIS=(2.4 2.5 2.6 2.7) 18_CPYTHON2_GLOBALLY_SUPPORTED_ABIS=(2.4 2.5 2.6 2.7)
19_CPYTHON3_SUPPORTED_ABIS=(3.0 3.1 3.2) 19_CPYTHON3_GLOBALLY_SUPPORTED_ABIS=(3.0 3.1 3.2)
20_JYTHON_SUPPORTED_ABIS=(2.5-jython) 20_JYTHON_GLOBALLY_SUPPORTED_ABIS=(2.5-jython)
21_PYTHON_SUPPORTED_ABIS=(${_CPYTHON2_SUPPORTED_ABIS[@]} ${_CPYTHON3_SUPPORTED_ABIS[@]} ${_JYTHON_SUPPORTED_ABIS[@]}) 21_PYTHON_GLOBALLY_SUPPORTED_ABIS=(${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]} ${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]} ${_JYTHON_GLOBALLY_SUPPORTED_ABIS[@]})
22 22
23# ================================================================================================ 23# ================================================================================================
24# ===================================== HANDLING OF METADATA ===================================== 24# ===================================== HANDLING OF METADATA =====================================
25# ================================================================================================ 25# ================================================================================================
26
27_python_check_python_abi_matching() {
28 if [[ "$#" -ne 2 ]]; then
29 die "${FUNCNAME}() requires 2 arguments"
30 fi
31
32 if [[ "$2" == *"-cpython" ]]; then
33 [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "$1" == ${2%-cpython} ]]
34 elif [[ "$2" == *"-jython" ]]; then
35 [[ "$1" == $2 ]]
36 else
37 if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
38 [[ "$1" == $2 ]]
39 elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
40 [[ "${1%-jython}" == $2 ]]
41 else
42 die "${FUNCNAME}(): Unrecognized Python ABI '$1'"
43 fi
44 fi
45}
26 46
27# @ECLASS-VARIABLE: PYTHON_DEPEND 47# @ECLASS-VARIABLE: PYTHON_DEPEND
28# @DESCRIPTION: 48# @DESCRIPTION:
29# Specification of dependency on dev-lang/python. 49# Specification of dependency on dev-lang/python.
30# Syntax: 50# Syntax:
65 fi 85 fi
66 fi 86 fi
67 87
68 if [[ "${major_version}" == "2" ]]; then 88 if [[ "${major_version}" == "2" ]]; then
69 python2="1" 89 python2="1"
70 python_versions=("${_CPYTHON2_SUPPORTED_ABIS[@]}") 90 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
71 python2_minimal_version="${minimal_version}" 91 python2_minimal_version="${minimal_version}"
72 python2_maximal_version="${maximal_version}" 92 python2_maximal_version="${maximal_version}"
73 elif [[ "${major_version}" == "3" ]]; then 93 elif [[ "${major_version}" == "3" ]]; then
74 python3="1" 94 python3="1"
75 python_versions=("${_CPYTHON3_SUPPORTED_ABIS[@]}") 95 python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
76 python3_minimal_version="${minimal_version}" 96 python3_minimal_version="${minimal_version}"
77 python3_maximal_version="${maximal_version}" 97 python3_maximal_version="${maximal_version}"
78 else 98 else
79 python_all="1" 99 python_all="1"
80 python_versions=("${_CPYTHON2_SUPPORTED_ABIS[@]}" "${_CPYTHON3_SUPPORTED_ABIS[@]}") 100 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
81 python_minimal_version="${minimal_version}" 101 python_minimal_version="${minimal_version}"
82 python_maximal_version="${maximal_version}" 102 python_maximal_version="${maximal_version}"
83 fi 103 fi
84 104
85 if [[ -n "${minimal_version}" ]] && ! has "${minimal_version}" "${python_versions[@]}"; then 105 if [[ -n "${minimal_version}" ]] && ! has "${minimal_version}" "${python_versions[@]}"; then
113 133
114 if [[ "${python_all}" == "1" ]]; then 134 if [[ "${python_all}" == "1" ]]; then
115 if [[ -z "${python_minimal_version}" && -z "${python_maximal_version}" ]]; then 135 if [[ -z "${python_minimal_version}" && -z "${python_maximal_version}" ]]; then
116 _PYTHON_ATOMS+=("dev-lang/python") 136 _PYTHON_ATOMS+=("dev-lang/python")
117 else 137 else
118 python_versions=("${_CPYTHON2_SUPPORTED_ABIS[@]}" "${_CPYTHON3_SUPPORTED_ABIS[@]}") 138 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
119 python_minimal_version="${python_minimal_version:-${python_versions[0]}}" 139 python_minimal_version="${python_minimal_version:-${python_versions[0]}}"
120 python_maximal_version="${python_maximal_version:-${python_versions[${#python_versions[@]}-1]}}" 140 python_maximal_version="${python_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
121 _append_accepted_versions_range 141 _append_accepted_versions_range
122 fi 142 fi
123 else 143 else
124 if [[ "${python3}" == "1" ]]; then 144 if [[ "${python3}" == "1" ]]; then
125 if [[ -z "${python3_minimal_version}" && -z "${python3_maximal_version}" ]]; then 145 if [[ -z "${python3_minimal_version}" && -z "${python3_maximal_version}" ]]; then
126 _PYTHON_ATOMS+=("=dev-lang/python-3*") 146 _PYTHON_ATOMS+=("=dev-lang/python-3*")
127 else 147 else
128 python_versions=("${_CPYTHON3_SUPPORTED_ABIS[@]}") 148 python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
129 python_minimal_version="${python3_minimal_version:-${python_versions[0]}}" 149 python_minimal_version="${python3_minimal_version:-${python_versions[0]}}"
130 python_maximal_version="${python3_maximal_version:-${python_versions[${#python_versions[@]}-1]}}" 150 python_maximal_version="${python3_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
131 _append_accepted_versions_range 151 _append_accepted_versions_range
132 fi 152 fi
133 fi 153 fi
134 if [[ "${python2}" == "1" ]]; then 154 if [[ "${python2}" == "1" ]]; then
135 if [[ -z "${python2_minimal_version}" && -z "${python2_maximal_version}" ]]; then 155 if [[ -z "${python2_minimal_version}" && -z "${python2_maximal_version}" ]]; then
136 _PYTHON_ATOMS+=("=dev-lang/python-2*") 156 _PYTHON_ATOMS+=("=dev-lang/python-2*")
137 else 157 else
138 python_versions=("${_CPYTHON2_SUPPORTED_ABIS[@]}") 158 python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
139 python_minimal_version="${python2_minimal_version:-${python_versions[0]}}" 159 python_minimal_version="${python2_minimal_version:-${python_versions[0]}}"
140 python_maximal_version="${python2_maximal_version:-${python_versions[${#python_versions[@]}-1]}}" 160 python_maximal_version="${python2_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
141 _append_accepted_versions_range 161 _append_accepted_versions_range
142 fi 162 fi
143 fi 163 fi
348 368
349 if [[ "$#" -ne 0 ]]; then 369 if [[ "$#" -ne 0 ]]; then
350 die "${FUNCNAME}() does not accept arguments" 370 die "${FUNCNAME}() does not accept arguments"
351 fi 371 fi
352 372
373 export JYTHON_SYSTEM_CACHEDIR="1"
374 addwrite "${EPREFIX}/var/cache/jython"
375
353 if _python_package_supporting_installation_for_multiple_python_abis; then 376 if _python_package_supporting_installation_for_multiple_python_abis; then
354 _python_calculate_PYTHON_ABIS 377 _python_calculate_PYTHON_ABIS
355 export EPYTHON="$(PYTHON -f)" 378 export EPYTHON="$(PYTHON -f)"
356 else 379 else
357 PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}" 380 PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
403 426
404if ! has "${EAPI:-0}" 0 1 2 3 || { has "${EAPI:-0}" 2 3 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; }; then 427if ! has "${EAPI:-0}" 0 1 2 3 || { has "${EAPI:-0}" 2 3 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; }; then
405 EXPORT_FUNCTIONS pkg_setup 428 EXPORT_FUNCTIONS pkg_setup
406fi 429fi
407 430
431_PYTHON_SHEBANG_BASE_PART_REGEX='^#![[:space:]]*([^[:space:]]*/usr/bin/env[[:space:]]+)?([^[:space:]]*/)?(jython|python)'
432
408# @FUNCTION: python_convert_shebangs 433# @FUNCTION: python_convert_shebangs
409# @USAGE: [-q|--quiet] [-r|--recursive] [-x|--only-executables] [--] <Python_version> <file|directory> [files|directories] 434# @USAGE: [-q|--quiet] [-r|--recursive] [-x|--only-executables] [--] <Python_ABI|Python_version> <file|directory> [files|directories]
410# @DESCRIPTION: 435# @DESCRIPTION:
411# Convert shebangs in specified files. Directories can be specified only with --recursive option. 436# Convert shebangs in specified files. Directories can be specified only with --recursive option.
412python_convert_shebangs() { 437python_convert_shebangs() {
413 _python_check_python_pkg_setup_execution 438 _python_check_python_pkg_setup_execution
414 439
415 local argument file files=() only_executables="0" python_version quiet="0" recursive="0" 440 local argument file files=() only_executables="0" python_interpreter quiet="0" recursive="0"
416 441
417 while (($#)); do 442 while (($#)); do
418 case "$1" in 443 case "$1" in
419 -r|--recursive) 444 -r|--recursive)
420 recursive="1" 445 recursive="1"
443 die "${FUNCNAME}(): Missing Python version and files or directories" 468 die "${FUNCNAME}(): Missing Python version and files or directories"
444 elif [[ "$#" -eq 1 ]]; then 469 elif [[ "$#" -eq 1 ]]; then
445 die "${FUNCNAME}(): Missing files or directories" 470 die "${FUNCNAME}(): Missing files or directories"
446 fi 471 fi
447 472
448 python_version="$1" 473 if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
474 python_interpreter="$(PYTHON "$1")"
475 else
476 python_interpreter="python$1"
477 fi
449 shift 478 shift
450 479
451 for argument in "$@"; do 480 for argument in "$@"; do
452 if [[ ! -e "${argument}" ]]; then 481 if [[ ! -e "${argument}" ]]; then
453 die "${FUNCNAME}(): '${argument}' does not exist" 482 die "${FUNCNAME}(): '${argument}' does not exist"
468 497
469 for file in "${files[@]}"; do 498 for file in "${files[@]}"; do
470 file="${file#./}" 499 file="${file#./}"
471 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue 500 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue
472 501
473 if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then 502 if [[ "$(head -n1 "${file}")" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX} ]]; then
474 [[ "$(sed -ne "2p" "${file}")" =~ ^"# Gentoo '".*"' wrapper script generated by python_generate_wrapper_scripts()"$ ]] && continue 503 [[ "$(sed -ne "2p" "${file}")" =~ ^"# Gentoo '".*"' wrapper script generated by python_generate_wrapper_scripts()"$ ]] && continue
475 504
476 if [[ "${quiet}" == "0" ]]; then 505 if [[ "${quiet}" == "0" ]]; then
477 einfo "Converting shebang in '${file}'" 506 einfo "Converting shebang in '${file}'"
478 fi 507 fi
479 508
480 sed -e "1s/python\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?/python${python_version}/" -i "${file}" || die "Conversion of shebang in '${file}' failed" 509 sed -e "1s:^#![[:space:]]*\([^[:space:]]*/usr/bin/env[[:space:]]\)\?[[:space:]]*\([^[:space:]]*/\)\?\(jython\|python\)\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?\(\$\|[[:space:]].*\):#!\1\2${python_interpreter}\6:" -i "${file}" || die "Conversion of shebang in '${file}' failed"
481
482 # Delete potential whitespace after "#!".
483 sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed"
484 fi 510 fi
485 done 511 done
486} 512}
487 513
488# @FUNCTION: python_clean_installation_image 514# @FUNCTION: python_clean_installation_image
616 if [[ -z "${USE_PYTHON}" ]]; then 642 if [[ -z "${USE_PYTHON}" ]]; then
617 die "USE_PYTHON variable is empty" 643 die "USE_PYTHON variable is empty"
618 fi 644 fi
619 645
620 for PYTHON_ABI in ${USE_PYTHON}; do 646 for PYTHON_ABI in ${USE_PYTHON}; do
621 if ! has "${PYTHON_ABI}" ${_PYTHON_SUPPORTED_ABIS[@]}; then 647 if ! has "${PYTHON_ABI}" "${_PYTHON_GLOBALLY_SUPPORTED_ABIS[@]}"; then
622 die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'" 648 die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'"
623 fi 649 fi
624 650
625 if has "${PYTHON_ABI}" "${_CPYTHON2_SUPPORTED_ABIS[@]}" "${_CPYTHON3_SUPPORTED_ABIS[@]}"; then 651 if has "${PYTHON_ABI}" "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; then
626 cpython_enabled="1" 652 cpython_enabled="1"
627 fi 653 fi
628 654
629 support_ABI="1" 655 support_ABI="1"
630 while read restricted_ABI; do 656 while read restricted_ABI; do
631 if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then 657 if _python_check_python_abi_matching "${PYTHON_ABI}" "${restricted_ABI}"; then
632 support_ABI="0" 658 support_ABI="0"
633 break 659 break
634 fi 660 fi
635 done <<< "${restricted_ABIs}" 661 done <<< "${restricted_ABIs}"
636 [[ "${support_ABI}" == "1" ]] && export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}" 662 [[ "${support_ABI}" == "1" ]] && export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}"
657 die "'${EPREFIX}/usr/bin/python2' is not valid symlink" 683 die "'${EPREFIX}/usr/bin/python2' is not valid symlink"
658 fi 684 fi
659 685
660 python2_version="$("${EPREFIX}/usr/bin/python2" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')" 686 python2_version="$("${EPREFIX}/usr/bin/python2" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
661 687
662 for PYTHON_ABI in "${_CPYTHON2_SUPPORTED_ABIS[@]}"; do 688 for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
663 support_python_major_version="1" 689 support_python_major_version="1"
664 while read restricted_ABI; do 690 while read restricted_ABI; do
665 if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then 691 if _python_check_python_abi_matching "${PYTHON_ABI}" "${restricted_ABI}"; then
666 support_python_major_version="0" 692 support_python_major_version="0"
667 fi 693 fi
668 done <<< "${restricted_ABIs}" 694 done <<< "${restricted_ABIs}"
669 [[ "${support_python_major_version}" == "1" ]] && break 695 [[ "${support_python_major_version}" == "1" ]] && break
670 done 696 done
671 if [[ "${support_python_major_version}" == "1" ]]; then 697 if [[ "${support_python_major_version}" == "1" ]]; then
672 while read restricted_ABI; do 698 while read restricted_ABI; do
673 if [[ "${python2_version}" == ${restricted_ABI} ]]; then 699 if _python_check_python_abi_matching "${python2_version}" "${restricted_ABI}"; then
674 die "Active version of Python 2 is not supported by ${CATEGORY}/${PF}" 700 die "Active version of CPython 2 is not supported by ${CATEGORY}/${PF}"
675 fi 701 fi
676 done <<< "${restricted_ABIs}" 702 done <<< "${restricted_ABIs}"
677 else 703 else
678 python2_version="" 704 python2_version=""
679 fi 705 fi
684 die "'${EPREFIX}/usr/bin/python3' is not valid symlink" 710 die "'${EPREFIX}/usr/bin/python3' is not valid symlink"
685 fi 711 fi
686 712
687 python3_version="$("${EPREFIX}/usr/bin/python3" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')" 713 python3_version="$("${EPREFIX}/usr/bin/python3" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
688 714
689 for PYTHON_ABI in "${_CPYTHON3_SUPPORTED_ABIS[@]}"; do 715 for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
690 support_python_major_version="1" 716 support_python_major_version="1"
691 while read restricted_ABI; do 717 while read restricted_ABI; do
692 if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then 718 if _python_check_python_abi_matching "${PYTHON_ABI}" "${restricted_ABI}"; then
693 support_python_major_version="0" 719 support_python_major_version="0"
694 fi 720 fi
695 done <<< "${restricted_ABIs}" 721 done <<< "${restricted_ABIs}"
696 [[ "${support_python_major_version}" == "1" ]] && break 722 [[ "${support_python_major_version}" == "1" ]] && break
697 done 723 done
698 if [[ "${support_python_major_version}" == "1" ]]; then 724 if [[ "${support_python_major_version}" == "1" ]]; then
699 while read restricted_ABI; do 725 while read restricted_ABI; do
700 if [[ "${python3_version}" == ${restricted_ABI} ]]; then 726 if _python_check_python_abi_matching "${python3_version}" "${restricted_ABI}"; then
701 die "Active version of Python 3 is not supported by ${CATEGORY}/${PF}" 727 die "Active version of CPython 3 is not supported by ${CATEGORY}/${PF}"
702 fi 728 fi
703 done <<< "${restricted_ABIs}" 729 done <<< "${restricted_ABIs}"
704 else 730 else
705 python3_version="" 731 python3_version=""
706 fi 732 fi
738 if [[ "${element}" =~ ^([[:alnum:]]|\.|-|\*|\[|\])+\ (\+|-)\ .+ ]]; then 764 if [[ "${element}" =~ ^([[:alnum:]]|\.|-|\*|\[|\])+\ (\+|-)\ .+ ]]; then
739 pattern="${element%% *}" 765 pattern="${element%% *}"
740 element="${element#* }" 766 element="${element#* }"
741 operator="${element%% *}" 767 operator="${element%% *}"
742 flags="${element#* }" 768 flags="${element#* }"
743 if [[ "${PYTHON_ABI}" == ${pattern} ]]; then 769 if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
744 if [[ "${operator}" == "+" ]]; then 770 if [[ "${operator}" == "+" ]]; then
745 eval "export ${variable}+=\"\${variable:+ }${flags}\"" 771 eval "export ${variable}+=\"\${variable:+ }${flags}\""
746 elif [[ "${operator}" == "-" ]]; then 772 elif [[ "${operator}" == "-" ]]; then
747 flags="${flags// /$'\n'}" 773 flags="${flags// /$'\n'}"
748 old_value="${!variable// /$'\n'}" 774 old_value="${!variable// /$'\n'}"
1055 die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs" 1081 die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1056 fi 1082 fi
1057 1083
1058 _python_initialize_prefix_variables 1084 _python_initialize_prefix_variables
1059 1085
1060 local eselect_python_option file force="0" quiet="0" PYTHON_ABI python2_enabled="0" python3_enabled="0" respect_EPYTHON="0" 1086 local eselect_python_option file force="0" quiet="0" PYTHON_ABI PYTHON_ABIS_list python2_enabled="0" python3_enabled="0" respect_EPYTHON="0"
1061 1087
1062 while (($#)); do 1088 while (($#)); do
1063 case "$1" in 1089 case "$1" in
1064 -E|--respect-EPYTHON) 1090 -E|--respect-EPYTHON)
1065 respect_EPYTHON="1" 1091 respect_EPYTHON="1"
1087 if [[ "$#" -eq 0 ]]; then 1113 if [[ "$#" -eq 0 ]]; then
1088 die "${FUNCNAME}(): Missing arguments" 1114 die "${FUNCNAME}(): Missing arguments"
1089 fi 1115 fi
1090 1116
1091 _python_calculate_PYTHON_ABIS 1117 _python_calculate_PYTHON_ABIS
1092 for PYTHON_ABI in "${_CPYTHON2_SUPPORTED_ABIS[@]}"; do 1118 for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1093 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then 1119 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1094 python2_enabled="1" 1120 python2_enabled="1"
1095 fi 1121 fi
1096 done 1122 done
1097 for PYTHON_ABI in "${_CPYTHON3_SUPPORTED_ABIS[@]}"; do 1123 for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1098 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then 1124 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1099 python3_enabled="1" 1125 python3_enabled="1"
1100 fi 1126 fi
1101 done 1127 done
1102 1128
1108 eselect_python_option="--python3" 1134 eselect_python_option="--python3"
1109 else 1135 else
1110 die "${FUNCNAME}(): Unsupported environment" 1136 die "${FUNCNAME}(): Unsupported environment"
1111 fi 1137 fi
1112 1138
1139 PYTHON_ABIS_list="$("$(PYTHON -f)" -c "print(', '.join('\"%s\"' % x for x in reversed('${PYTHON_ABIS}'.split())))")"
1140
1113 for file in "$@"; do 1141 for file in "$@"; do
1114 if [[ -f "${file}" && "${force}" == "0" ]]; then 1142 if [[ -f "${file}" && "${force}" == "0" ]]; then
1115 die "${FUNCNAME}(): '$1' already exists" 1143 die "${FUNCNAME}(): '${file}' already exists"
1116 fi 1144 fi
1117 1145
1118 if [[ "${quiet}" == "0" ]]; then 1146 if [[ "${quiet}" == "0" ]]; then
1119 einfo "Generating '${file#${ED%/}}' wrapper script" 1147 einfo "Generating '${file#${ED%/}}' wrapper script"
1120 fi 1148 fi
1126import os 1154import os
1127import re 1155import re
1128import subprocess 1156import subprocess
1129import sys 1157import sys
1130 1158
1131EPYTHON_re = re.compile(r"^python(\d+\.\d+)$") 1159cpython_re = re.compile(r"^python(\d+\.\d+)$")
1160jython_re = re.compile(r"^jython(\d+\.\d+)$")
1132python_shebang_re = re.compile(r"^#! *(${EPREFIX}/usr/bin/python|(${EPREFIX})?/usr/bin/env +(${EPREFIX}/usr/bin/)?python)") 1161python_shebang_re = re.compile(r"^#! *(${EPREFIX}/usr/bin/python|(${EPREFIX})?/usr/bin/env +(${EPREFIX}/usr/bin/)?python)")
1133python_verification_output_re = re.compile("^GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n$") 1162python_verification_output_re = re.compile("^GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n$")
1163
1164def get_PYTHON_ABI(EPYTHON):
1165 cpython_matched = cpython_re.match(EPYTHON)
1166 jython_matched = jython_re.match(EPYTHON)
1167 if cpython_matched is not None:
1168 PYTHON_ABI = cpython_matched.group(1)
1169 elif jython_matched is not None:
1170 PYTHON_ABI = jython_matched.group(1) + "-jython"
1171 else:
1172 PYTHON_ABI = None
1173 return PYTHON_ABI
1134 1174
1135EOF 1175EOF
1136 if [[ "$?" != "0" ]]; then 1176 if [[ "$?" != "0" ]]; then
1137 die "${FUNCNAME}(): Generation of '$1' failed" 1177 die "${FUNCNAME}(): Generation of '$1' failed"
1138 fi 1178 fi
1139 if [[ "${respect_EPYTHON}" == "1" ]]; then 1179 if [[ "${respect_EPYTHON}" == "1" ]]; then
1140 cat << EOF >> "${file}" 1180 cat << EOF >> "${file}"
1141EPYTHON = os.environ.get("EPYTHON") 1181EPYTHON = os.environ.get("EPYTHON")
1142if EPYTHON: 1182if EPYTHON:
1143 EPYTHON_matched = EPYTHON_re.match(EPYTHON) 1183 PYTHON_ABI = get_PYTHON_ABI(EPYTHON)
1144 if EPYTHON_matched: 1184 if PYTHON_ABI is None:
1145 PYTHON_ABI = EPYTHON_matched.group(1)
1146 else:
1147 sys.stderr.write("EPYTHON variable has unrecognized value '%s'\n" % EPYTHON) 1185 sys.stderr.write("EPYTHON variable has unrecognized value '%s'\n" % EPYTHON)
1148 sys.exit(1) 1186 sys.exit(1)
1149else: 1187else:
1150 try: 1188 try:
1151 eselect_process = subprocess.Popen(["${EPREFIX}/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], stdout=subprocess.PIPE) 1189 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 if not isinstance(EPYTHON, str): 1197 if not isinstance(EPYTHON, str):
1160 # Python 3 1198 # Python 3
1161 EPYTHON = EPYTHON.decode() 1199 EPYTHON = EPYTHON.decode()
1162 EPYTHON = EPYTHON.rstrip("\n") 1200 EPYTHON = EPYTHON.rstrip("\n")
1163 1201
1164 EPYTHON_matched = EPYTHON_re.match(EPYTHON) 1202 PYTHON_ABI = get_PYTHON_ABI(EPYTHON)
1165 if EPYTHON_matched: 1203 if PYTHON_ABI is None:
1166 PYTHON_ABI = EPYTHON_matched.group(1)
1167 else:
1168 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % EPYTHON) 1204 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % EPYTHON)
1169 sys.exit(1) 1205 sys.exit(1)
1206
1207wrapper_script_path = os.path.realpath(sys.argv[0])
1208target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1209if not os.path.exists(target_executable_path):
1210 sys.stderr.write("'%s' does not exist\n" % target_executable_path)
1211 sys.exit(1)
1170EOF 1212EOF
1171 if [[ "$?" != "0" ]]; then 1213 if [[ "$?" != "0" ]]; then
1172 die "${FUNCNAME}(): Generation of '$1' failed" 1214 die "${FUNCNAME}(): Generation of '$1' failed"
1173 fi 1215 fi
1174 else 1216 else
1185if not isinstance(EPYTHON, str): 1227if not isinstance(EPYTHON, str):
1186 # Python 3 1228 # Python 3
1187 EPYTHON = EPYTHON.decode() 1229 EPYTHON = EPYTHON.decode()
1188EPYTHON = EPYTHON.rstrip("\n") 1230EPYTHON = EPYTHON.rstrip("\n")
1189 1231
1190EPYTHON_matched = EPYTHON_re.match(EPYTHON) 1232PYTHON_ABI = get_PYTHON_ABI(EPYTHON)
1191if EPYTHON_matched: 1233if PYTHON_ABI is None:
1192 PYTHON_ABI = EPYTHON_matched.group(1) 1234 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % EPYTHON)
1235 sys.exit(1)
1236
1237wrapper_script_path = os.path.realpath(sys.argv[0])
1238for PYTHON_ABI in [PYTHON_ABI, ${PYTHON_ABIS_list}]:
1239 target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1240 if os.path.exists(target_executable_path):
1241 break
1193else: 1242else:
1194 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % EPYTHON) 1243 sys.stderr.write("No target script exists for '%s'\n" % wrapper_script_path)
1195 sys.exit(1) 1244 sys.exit(1)
1196EOF 1245EOF
1197 if [[ "$?" != "0" ]]; then 1246 if [[ "$?" != "0" ]]; then
1198 die "${FUNCNAME}(): Generation of '$1' failed" 1247 die "${FUNCNAME}(): Generation of '$1' failed"
1199 fi 1248 fi
1200 fi 1249 fi
1201 cat << EOF >> "${file}" 1250 cat << EOF >> "${file}"
1202
1203wrapper_script_path = os.path.realpath(sys.argv[0])
1204target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1205os.environ["GENTOO_PYTHON_PROCESS_NAME"] = os.path.basename(sys.argv[0])
1206os.environ["GENTOO_PYTHON_WRAPPER_SCRIPT_PATH"] = sys.argv[0]
1207os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH"] = target_executable_path
1208if not os.path.exists(target_executable_path):
1209 sys.stderr.write("'%s' does not exist\n" % target_executable_path)
1210 sys.exit(1)
1211 1251
1212target_executable = open(target_executable_path, "rb") 1252target_executable = open(target_executable_path, "rb")
1213target_executable_first_line = target_executable.readline() 1253target_executable_first_line = target_executable.readline()
1214if not isinstance(target_executable_first_line, str): 1254if not isinstance(target_executable_first_line, str):
1215 # Python 3 1255 # Python 3
1216 target_executable_first_line = target_executable_first_line.decode("utf_8", "replace") 1256 target_executable_first_line = target_executable_first_line.decode("utf_8", "replace")
1217 1257
1218python_shebang_matched = python_shebang_re.match(target_executable_first_line) 1258python_shebang_matched = python_shebang_re.match(target_executable_first_line)
1219target_executable.close() 1259target_executable.close()
1220 1260
1221if python_shebang_matched: 1261if python_shebang_matched is not None:
1222 try: 1262 try:
1223 python_interpreter_path = "${EPREFIX}/usr/bin/%s" % EPYTHON 1263 python_interpreter_path = "${EPREFIX}/usr/bin/%s" % EPYTHON
1224 os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] = "1" 1264 os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] = "1"
1225 python_verification_process = subprocess.Popen([python_interpreter_path, "-c", "pass"], stdout=subprocess.PIPE) 1265 python_verification_process = subprocess.Popen([python_interpreter_path, "-c", "pass"], stdout=subprocess.PIPE)
1226 del os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] 1266 del os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"]
1233 python_verification_output = python_verification_output.decode() 1273 python_verification_output = python_verification_output.decode()
1234 1274
1235 if not python_verification_output_re.match(python_verification_output): 1275 if not python_verification_output_re.match(python_verification_output):
1236 raise ValueError 1276 raise ValueError
1237 1277
1278 if cpython_re.match(EPYTHON) is not None:
1279 os.environ["GENTOO_PYTHON_PROCESS_NAME"] = os.path.basename(sys.argv[0])
1280 os.environ["GENTOO_PYTHON_WRAPPER_SCRIPT_PATH"] = sys.argv[0]
1281 os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH"] = target_executable_path
1282
1283 if hasattr(os, "execv"):
1238 os.execv(python_interpreter_path, [python_interpreter_path] + sys.argv) 1284 os.execv(python_interpreter_path, [python_interpreter_path] + sys.argv)
1285 else:
1286 sys.exit(subprocess.Popen([python_interpreter_path] + sys.argv).wait())
1287 except (KeyboardInterrupt, SystemExit):
1288 raise
1239 except: 1289 except:
1240 pass 1290 pass
1241 if "GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION" in os.environ: 1291 for variable in ("GENTOO_PYTHON_PROCESS_NAME", "GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"):
1242 del os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] 1292 if variable in os.environ:
1293 del os.environ[variable]
1243 1294
1295if hasattr(os, "execv"):
1244os.execv(target_executable_path, sys.argv) 1296 os.execv(target_executable_path, sys.argv)
1297else:
1298 sys.exit(subprocess.Popen([target_executable_path] + sys.argv[1:]).wait())
1245EOF 1299EOF
1246 if [[ "$?" != "0" ]]; then 1300 if [[ "$?" != "0" ]]; then
1247 die "${FUNCNAME}(): Generation of '$1' failed" 1301 die "${FUNCNAME}(): Generation of '$1' failed"
1248 fi 1302 fi
1249 fperms +x "${file#${ED%/}}" || die "fperms '${file}' failed" 1303 fperms +x "${file#${ED%/}}" || die "fperms '${file}' failed"
1250 done 1304 done
1251} 1305}
1252 1306
1307# @ECLASS-VARIABLE: PYTHON_VERSIONED_SCRIPTS
1308# @DESCRIPTION:
1309# Array of regular expressions of paths to versioned Python scripts.
1310# Python scripts in /usr/bin and /usr/sbin are versioned by default.
1311
1312# @ECLASS-VARIABLE: PYTHON_VERSIONED_EXECUTABLES
1313# @DESCRIPTION:
1314# Array of regular expressions of paths to versioned executables (including Python scripts).
1315
1316# @ECLASS-VARIABLE: PYTHON_NONVERSIONED_EXECUTABLES
1317# @DESCRIPTION:
1318# Array of regular expressions of paths to nonversioned executables (including Python scripts).
1319
1320# @FUNCTION: python_merge_intermediate_installation_images
1321# @USAGE: [-q|--quiet] [--] <intermediate_installation_images_directory>
1322# @DESCRIPTION:
1323# Merge intermediate installation images into installation image.
1324python_merge_intermediate_installation_images() {
1325 _python_check_python_pkg_setup_execution
1326 _python_initialize_prefix_variables
1327
1328 local b file files=() intermediate_installation_images_directory PYTHON_ABI quiet="0" regex shebang version_executable wrapper_scripts=() wrapper_scripts_set=()
1329
1330 # Check if phase is src_install().
1331 [[ "${EBUILD_PHASE}" != "install" ]] && die "${FUNCNAME}() can be used only in src_install() phase"
1332
1333 while (($#)); do
1334 case "$1" in
1335 -q|--quiet)
1336 quiet="1"
1337 ;;
1338 --)
1339 shift
1340 break
1341 ;;
1342 -*)
1343 die "${FUNCNAME}(): Unrecognized option '$1'"
1344 ;;
1345 *)
1346 break
1347 ;;
1348 esac
1349 shift
1350 done
1351
1352 if [[ "$#" -ne 1 ]]; then
1353 die "${FUNCNAME}() requires 1 argument"
1354 fi
1355
1356 intermediate_installation_images_directory="$1"
1357
1358 if [[ ! -d "${intermediate_installation_images_directory}" ]]; then
1359 die "${FUNCNAME}(): Intermediate installation images directory '${intermediate_installation_images_directory}' does not exist"
1360 fi
1361
1362 _python_calculate_PYTHON_ABIS
1363 if [[ "$(PYTHON -f --ABI)" == 3.* ]]; then
1364 b="b"
1365 fi
1366
1367 while read -d $'\0' -r file; do
1368 files+=("${file}")
1369 done < <("$(PYTHON -f)" -c \
1370"import os
1371import sys
1372
1373if hasattr(sys.stdout, 'buffer'):
1374 # Python 3
1375 stdout = sys.stdout.buffer
1376else:
1377 # Python 2
1378 stdout = sys.stdout
1379
1380files_set = set()
1381
1382os.chdir(${b}'${intermediate_installation_images_directory}')
1383
1384for PYTHON_ABI in ${b}'${PYTHON_ABIS}'.split():
1385 for root, dirs, files in os.walk(PYTHON_ABI + ${b}'${EPREFIX}'):
1386 root = root[len(PYTHON_ABI + ${b}'${EPREFIX}')+1:]
1387 files_set.update(root + ${b}'/' + file for file in files)
1388
1389for file in sorted(files_set):
1390 stdout.write(file)
1391 stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of files in intermediate installation images")
1392
1393 for PYTHON_ABI in ${PYTHON_ABIS}; do
1394 if [[ ! -d "${intermediate_installation_images_directory}/${PYTHON_ABI}" ]]; then
1395 die "${FUNCNAME}(): Intermediate installation image for Python ABI '${PYTHON_ABI}' does not exist"
1396 fi
1397
1398 pushd "${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}" > /dev/null || die "pushd failed"
1399
1400 for file in "${files[@]}"; do
1401 version_executable="0"
1402 for regex in "/usr/bin/.*" "/usr/sbin/.*" "${PYTHON_VERSIONED_SCRIPTS[@]}"; do
1403 if [[ "/${file}" =~ ^${regex}$ ]]; then
1404 version_executable="1"
1405 break
1406 fi
1407 done
1408 for regex in "${PYTHON_VERSIONED_EXECUTABLES[@]}"; do
1409 if [[ "/${file}" =~ ^${regex}$ ]]; then
1410 version_executable="2"
1411 break
1412 fi
1413 done
1414 if [[ "${version_executable}" != "0" ]]; then
1415 for regex in "${PYTHON_NONVERSIONED_EXECUTABLES[@]}"; do
1416 if [[ "/${file}" =~ ^${regex}$ ]]; then
1417 version_executable="0"
1418 break
1419 fi
1420 done
1421 fi
1422
1423 [[ "${version_executable}" == "0" || ! -x "${file}" ]] && continue
1424
1425 shebang="$(head -n1 "${file}")" || die "Extraction of shebang from '${file}' failed"
1426
1427 if [[ "${version_executable}" == "2" ]]; then
1428 wrapper_scripts+=("${ED}${file}")
1429 elif [[ "${version_executable}" == "1" ]]; then
1430 if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}([[:digit:]]+(\.[[:digit:]]+)?)?($|[[:space:]]+) ]]; then
1431 wrapper_scripts+=("${ED}${file}")
1432 else
1433 version_executable="0"
1434 fi
1435 fi
1436
1437 [[ "${version_executable}" == "0" ]] && continue
1438
1439 if [[ -e "${file}-${PYTHON_ABI}" ]]; then
1440 die "${FUNCNAME}(): '${EPREFIX}/${file}-${PYTHON_ABI}' already exists"
1441 fi
1442
1443 mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed"
1444
1445 if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}[[:digit:]]*($|[[:space:]]+) ]]; then
1446 python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${file}-${PYTHON_ABI}"
1447 fi
1448 done
1449
1450 popd > /dev/null || die "popd failed"
1451
1452 cp -fr --preserve=all "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${ED}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1453 done
1454
1455 if [[ "${#wrapper_scripts[@]}" -ge 1 ]]; then
1456 rm -f "${T}/python_wrapper_scripts"
1457
1458 for file in "${wrapper_scripts[@]}"; do
1459 echo -n "${file}" >> "${T}/python_wrapper_scripts"
1460 echo -en "\x00" >> "${T}/python_wrapper_scripts"
1461 done
1462
1463 while read -d $'\0' -r file; do
1464 wrapper_scripts_set+=("${file}")
1465 done < <("$(PYTHON -f)" -c \
1466"import sys
1467
1468if hasattr(sys.stdout, 'buffer'):
1469 # Python 3
1470 stdout = sys.stdout.buffer
1471else:
1472 # Python 2
1473 stdout = sys.stdout
1474
1475files = set(open('${T}/python_wrapper_scripts', 'rb').read().rstrip(${b}'\x00').split(${b}'\x00'))
1476
1477for file in sorted(files):
1478 stdout.write(file)
1479 stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of set of wrapper scripts")
1480
1481 python_generate_wrapper_scripts $([[ "${quiet}" == "1" ]] && echo --quiet) "${wrapper_scripts_set[@]}"
1482 fi
1483}
1484
1253# ================================================================================================ 1485# ================================================================================================
1254# ========= FUNCTIONS FOR PACKAGES NOT SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ========== 1486# ========= FUNCTIONS FOR PACKAGES NOT SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ==========
1255# ================================================================================================ 1487# ================================================================================================
1256 1488
1257unset EPYTHON PYTHON_ABI 1489unset EPYTHON PYTHON_ABI
1258 1490
1259# @FUNCTION: python_set_active_version 1491# @FUNCTION: python_set_active_version
1260# @USAGE: <CPython_ABI|2|3> 1492# @USAGE: <Python_ABI|2|3>
1261# @DESCRIPTION: 1493# @DESCRIPTION:
1262# Set specified version of CPython as active version of Python. 1494# Set locally active version of Python.
1495# If Python_ABI argument is specified, then version of Python corresponding to Python_ABI is used.
1496# If 2 argument is specified, then active version of CPython 2 is used.
1497# If 3 argument is specified, then active version of CPython 3 is used.
1263# 1498#
1264# This function can be used only in pkg_setup() phase. 1499# This function can be used only in pkg_setup() phase.
1265python_set_active_version() { 1500python_set_active_version() {
1266 # Check if phase is pkg_setup(). 1501 # Check if phase is pkg_setup().
1267 [[ "${EBUILD_PHASE}" != "setup" ]] && die "${FUNCNAME}() can be used only in pkg_setup() phase" 1502 [[ "${EBUILD_PHASE}" != "setup" ]] && die "${FUNCNAME}() can be used only in pkg_setup() phase"
1275 fi 1510 fi
1276 1511
1277 _python_initial_sanity_checks 1512 _python_initial_sanity_checks
1278 1513
1279 if [[ -z "${PYTHON_ABI}" ]]; then 1514 if [[ -z "${PYTHON_ABI}" ]]; then
1280 if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then 1515 if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
1281 if ! _python_implementation && ! has_version "dev-lang/python:$1"; then 1516 # PYTHON_ABI variable is intended to be used only in ebuilds/eclasses,
1282 die "${FUNCNAME}(): 'dev-lang/python:$1' is not installed" 1517 # so it does not need to be exported to subprocesses.
1518 PYTHON_ABI="$1"
1519 if ! _python_implementation && ! has_version "$(python_get_implementational_package)"; then
1520 die "${FUNCNAME}(): '$(python_get_implementational_package)' is not installed"
1283 fi 1521 fi
1284 export EPYTHON="$(PYTHON "$1")" 1522 export EPYTHON="$(PYTHON "$1")"
1285 elif [[ "$1" == "2" ]]; then 1523 elif [[ "$1" == "2" ]]; then
1286 if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then 1524 if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then
1287 die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed" 1525 die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed"
1288 fi 1526 fi
1289 export EPYTHON="$(PYTHON -2)" 1527 export EPYTHON="$(PYTHON -2)"
1528 PYTHON_ABI="${EPYTHON#python}"
1529 PYTHON_ABI="${PYTHON_ABI%%-*}"
1290 elif [[ "$1" == "3" ]]; then 1530 elif [[ "$1" == "3" ]]; then
1291 if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then 1531 if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then
1292 die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed" 1532 die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed"
1293 fi 1533 fi
1294 export EPYTHON="$(PYTHON -3)" 1534 export EPYTHON="$(PYTHON -3)"
1535 PYTHON_ABI="${EPYTHON#python}"
1536 PYTHON_ABI="${PYTHON_ABI%%-*}"
1295 else 1537 else
1296 die "${FUNCNAME}(): Unrecognized argument '$1'" 1538 die "${FUNCNAME}(): Unrecognized argument '$1'"
1297 fi 1539 fi
1298
1299 # PYTHON_ABI variable is intended to be used only in ebuilds/eclasses,
1300 # so it does not need to be exported to subprocesses.
1301 PYTHON_ABI="${EPYTHON#python}"
1302 PYTHON_ABI="${PYTHON_ABI%%-*}"
1303 fi 1540 fi
1304 1541
1305 _python_final_sanity_checks 1542 _python_final_sanity_checks
1306 1543
1307 # python-updater checks PYTHON_REQUESTED_ACTIVE_VERSION variable. 1544 # python-updater checks PYTHON_REQUESTED_ACTIVE_VERSION variable.
1334sys.stdout.write(".".join(str(x) for x in sys.version_info[:2])) 1571sys.stdout.write(".".join(str(x) for x in sys.version_info[:2]))
1335if platform.system()[:4] == "Java": 1572if platform.system()[:4] == "Java":
1336 sys.stdout.write("-jython")' 1573 sys.stdout.write("-jython")'
1337 1574
1338_python_get_implementation() { 1575_python_get_implementation() {
1576 local ignore_invalid="0"
1577
1578 while (($#)); do
1579 case "$1" in
1580 --ignore-invalid)
1581 ignore_invalid="1"
1582 ;;
1583 --)
1584 shift
1585 break
1586 ;;
1587 -*)
1588 die "${FUNCNAME}(): Unrecognized option '$1'"
1589 ;;
1590 *)
1591 break
1592 ;;
1593 esac
1594 shift
1595 done
1596
1339 if [[ "$#" -ne 1 ]]; then 1597 if [[ "$#" -ne 1 ]]; then
1340 die "${FUNCNAME}() requires 1 argument" 1598 die "${FUNCNAME}() requires 1 argument"
1341 fi 1599 fi
1342 1600
1343 if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then 1601 if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
1344 echo "CPython" 1602 echo "CPython"
1345 elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then 1603 elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
1346 echo "Jython" 1604 echo "Jython"
1347 else 1605 else
1606 if [[ "${ignore_invalid}" == "0" ]]; then
1348 die "${FUNCNAME}(): Unrecognized Python ABI '$1'" 1607 die "${FUNCNAME}(): Unrecognized Python ABI '$1'"
1608 fi
1349 fi 1609 fi
1350} 1610}
1351 1611
1352# @FUNCTION: PYTHON 1612# @FUNCTION: PYTHON
1353# @USAGE: [-2] [-3] [--ABI] [-a|--absolute-path] [-f|--final-ABI] [--] <Python_ABI="${PYTHON_ABI}"> 1613# @USAGE: [-2] [-3] [--ABI] [-a|--absolute-path] [-f|--final-ABI] [--] <Python_ABI="${PYTHON_ABI}">
1354# @DESCRIPTION: 1614# @DESCRIPTION:
1355# Print filename of Python interpreter for specified Python ABI. If Python_ABI argument 1615# Print filename of Python interpreter for specified Python ABI. If Python_ABI argument
1356# is ommitted, then PYTHON_ABI environment variable must be set and is used. 1616# is ommitted, then PYTHON_ABI environment variable must be set and is used.
1357# If -2 option is specified, then active version of Python 2 is used. 1617# If -2 option is specified, then active version of CPython 2 is used.
1358# If -3 option is specified, then active version of Python 3 is used. 1618# If -3 option is specified, then active version of CPython 3 is used.
1359# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used. 1619# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1360# -2, -3 and --final-ABI options and Python_ABI argument cannot be specified simultaneously. 1620# -2, -3 and --final-ABI options and Python_ABI argument cannot be specified simultaneously.
1361# If --ABI option is specified, then only specified Python ABI is printed instead of 1621# If --ABI option is specified, then only specified Python ABI is printed instead of
1362# filename of Python interpreter. 1622# filename of Python interpreter.
1363# If --absolute-path option is specified, then absolute path to Python interpreter is printed. 1623# If --absolute-path option is specified, then absolute path to Python interpreter is printed.
1414 _python_calculate_PYTHON_ABIS 1674 _python_calculate_PYTHON_ABIS
1415 PYTHON_ABI="${PYTHON_ABIS##* }" 1675 PYTHON_ABI="${PYTHON_ABIS##* }"
1416 elif [[ "${python2}" == "1" ]]; then 1676 elif [[ "${python2}" == "1" ]]; then
1417 PYTHON_ABI="$(eselect python show --python2 --ABI)" 1677 PYTHON_ABI="$(eselect python show --python2 --ABI)"
1418 if [[ -z "${PYTHON_ABI}" ]]; then 1678 if [[ -z "${PYTHON_ABI}" ]]; then
1419 die "${FUNCNAME}(): Active version of Python 2 not set" 1679 die "${FUNCNAME}(): Active version of CPython 2 not set"
1420 elif [[ "${PYTHON_ABI}" != "2."* ]]; then 1680 elif [[ "${PYTHON_ABI}" != "2."* ]]; then
1421 die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`" 1681 die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`"
1422 fi 1682 fi
1423 elif [[ "${python3}" == "1" ]]; then 1683 elif [[ "${python3}" == "1" ]]; then
1424 PYTHON_ABI="$(eselect python show --python3 --ABI)" 1684 PYTHON_ABI="$(eselect python show --python3 --ABI)"
1425 if [[ -z "${PYTHON_ABI}" ]]; then 1685 if [[ -z "${PYTHON_ABI}" ]]; then
1426 die "${FUNCNAME}(): Active version of Python 3 not set" 1686 die "${FUNCNAME}(): Active version of CPython 3 not set"
1427 elif [[ "${PYTHON_ABI}" != "3."* ]]; then 1687 elif [[ "${PYTHON_ABI}" != "3."* ]]; then
1428 die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`" 1688 die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`"
1429 fi 1689 fi
1430 elif _python_package_supporting_installation_for_multiple_python_abis; then 1690 elif _python_package_supporting_installation_for_multiple_python_abis; then
1431 if ! _python_abi-specific_local_scope; then 1691 if ! _python_abi-specific_local_scope; then
1457 return 1717 return
1458 else 1718 else
1459 if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then 1719 if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
1460 python_interpreter="python${PYTHON_ABI}" 1720 python_interpreter="python${PYTHON_ABI}"
1461 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then 1721 elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
1462 python_interpreter="jython-${PYTHON_ABI%-jython}" 1722 python_interpreter="jython${PYTHON_ABI%-jython}"
1463 fi 1723 fi
1464 1724
1465 if [[ "${absolute_path_output}" == "1" ]]; then 1725 if [[ "${absolute_path_output}" == "1" ]]; then
1466 echo -n "${EPREFIX}/usr/bin/${python_interpreter}" 1726 echo -n "${EPREFIX}/usr/bin/${python_interpreter}"
1467 else 1727 else
2174 if [[ "${dir}" == "__pycache__" ]]; then 2434 if [[ "${dir}" == "__pycache__" ]]; then
2175 base_module_name="${compiled_file##*/}" 2435 base_module_name="${compiled_file##*/}"
2176 base_module_name="${base_module_name%\$py.class}" 2436 base_module_name="${base_module_name%\$py.class}"
2177 py_file="${compiled_file%__pycache__/*}${base_module_name}.py" 2437 py_file="${compiled_file%__pycache__/*}${base_module_name}.py"
2178 else 2438 else
2179 py_file="${compiled_file%\$py.class}" 2439 py_file="${compiled_file%\$py.class}.py"
2180 fi 2440 fi
2181 if [[ "${EBUILD_PHASE}" == "postinst" ]]; then 2441 if [[ "${EBUILD_PHASE}" == "postinst" ]]; then
2182 [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue 2442 [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue
2183 else 2443 else
2184 [[ -f "${py_file}" ]] && continue 2444 [[ -f "${py_file}" ]] && continue

Legend:
Removed from v.1.105  
changed lines
  Added in v.1.106

  ViewVC Help
Powered by ViewVC 1.1.20