| 1 | # Copyright 1999-2009 Gentoo Foundation |
1 | # Copyright 1999-2009 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.72 2009/09/11 19:55:05 arfrever Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.78 2009/11/15 14:25:55 arfrever Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: python.eclass |
5 | # @ECLASS: python.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # python@gentoo.org |
7 | # python@gentoo.org |
| 8 | # |
|
|
| 9 | # original author: Alastair Tse <liquidx@gentoo.org> |
|
|
| 10 | # @BLURB: A Utility Eclass that should be inherited by anything that deals with Python or Python modules. |
8 | # @BLURB: A utility eclass that should be inherited by anything that deals with Python or Python modules. |
| 11 | # @DESCRIPTION: |
9 | # @DESCRIPTION: |
| 12 | # Some useful functions for dealing with Python. |
10 | # Some useful functions for dealing with Python. |
| 13 | |
11 | |
| 14 | inherit multilib |
12 | inherit multilib |
| 15 | |
13 | |
| 16 | if [[ -n "${NEED_PYTHON}" ]] ; then |
14 | if [[ -n "${NEED_PYTHON}" ]]; then |
| 17 | PYTHON_ATOM=">=dev-lang/python-${NEED_PYTHON}" |
15 | PYTHON_ATOM=">=dev-lang/python-${NEED_PYTHON}" |
| 18 | DEPEND="${PYTHON_ATOM}" |
16 | DEPEND="${PYTHON_ATOM}" |
| 19 | RDEPEND="${DEPEND}" |
17 | RDEPEND="${DEPEND}" |
| 20 | else |
18 | else |
| 21 | PYTHON_ATOM="dev-lang/python" |
19 | PYTHON_ATOM="dev-lang/python" |
| 22 | fi |
20 | fi |
| 23 | |
21 | |
| 24 | DEPEND="${DEPEND} >=app-shells/bash-3.2" |
|
|
| 25 | if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then |
|
|
| 26 | DEPEND="${DEPEND} >=app-admin/eselect-python-20090804" |
22 | DEPEND+=" >=app-admin/eselect-python-20090804 |
| 27 | fi |
23 | >=app-shells/bash-3.2" |
| 28 | |
24 | |
| 29 | __python_eclass_test() { |
25 | __python_eclass_test() { |
| 30 | __python_version_extract 2.3 |
26 | __python_version_extract 2.3 |
| 31 | echo -n "2.3 -> PYVER: $PYVER PYVER_MAJOR: $PYVER_MAJOR" |
27 | echo -n "2.3 -> PYVER: $PYVER PYVER_MAJOR: $PYVER_MAJOR" |
| 32 | echo " PYVER_MINOR: $PYVER_MINOR PYVER_MICRO: $PYVER_MICRO" |
28 | echo " PYVER_MINOR: $PYVER_MINOR PYVER_MICRO: $PYVER_MICRO" |
| … | |
… | |
| 108 | if [[ "${absolute_path}" == "1" ]]; then |
104 | if [[ "${absolute_path}" == "1" ]]; then |
| 109 | echo -n "/usr/bin/python${slot}" |
105 | echo -n "/usr/bin/python${slot}" |
| 110 | else |
106 | else |
| 111 | echo -n "python${slot}" |
107 | echo -n "python${slot}" |
| 112 | fi |
108 | fi |
|
|
109 | |
|
|
110 | if [[ "${ABI}" != "${DEFAULT_ABI}" ]]; then |
|
|
111 | echo -n "-${ABI}" |
|
|
112 | fi |
| 113 | } |
113 | } |
|
|
114 | |
|
|
115 | unset PYTHON_ABIS |
|
|
116 | unset PYTHON_ABIS_SANITY_CHECKS |
| 114 | |
117 | |
| 115 | # @FUNCTION: validate_PYTHON_ABIS |
118 | # @FUNCTION: validate_PYTHON_ABIS |
| 116 | # @DESCRIPTION: |
119 | # @DESCRIPTION: |
| 117 | # Make sure PYTHON_ABIS variable has valid value. |
120 | # Ensure that PYTHON_ABIS variable has valid value. |
| 118 | validate_PYTHON_ABIS() { |
121 | validate_PYTHON_ABIS() { |
| 119 | # Ensure that some functions cannot be accidentally successfully used in EAPI <= 2 without setting SUPPORT_PYTHON_ABIS variable. |
122 | # Ensure that some functions cannot be accidentally successfully used in EAPI <= 2 without setting SUPPORT_PYTHON_ABIS variable. |
| 120 | if has "${EAPI:-0}" 0 1 2 && [[ -z "${SUPPORT_PYTHON_ABIS}" ]]; then |
123 | if has "${EAPI:-0}" 0 1 2 && [[ -z "${SUPPORT_PYTHON_ABIS}" ]]; then |
| 121 | die "${FUNCNAME}() cannot be used in this EAPI without setting SUPPORT_PYTHON_ABIS variable" |
124 | die "${FUNCNAME}() cannot be used in this EAPI without setting SUPPORT_PYTHON_ABIS variable" |
| 122 | fi |
125 | fi |
| … | |
… | |
| 129 | die "'/usr/bin/python-config' isn't valid script" |
132 | die "'/usr/bin/python-config' isn't valid script" |
| 130 | fi |
133 | fi |
| 131 | |
134 | |
| 132 | # USE_${ABI_TYPE^^} and RESTRICT_${ABI_TYPE^^}_ABIS variables hopefully will be included in EAPI >= 4. |
135 | # USE_${ABI_TYPE^^} and RESTRICT_${ABI_TYPE^^}_ABIS variables hopefully will be included in EAPI >= 4. |
| 133 | if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]] && has "${EAPI:-0}" 0 1 2 3; then |
136 | if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]] && has "${EAPI:-0}" 0 1 2 3; then |
| 134 | local ABI support_ABI supported_PYTHON_ABIS= restricted_ABI |
137 | local PYTHON_ABI python2_supported_versions python3_supported_versions restricted_ABI support_ABI supported_PYTHON_ABIS= |
| 135 | PYTHON_ABI_SUPPORTED_VALUES="2.4 2.5 2.6 2.7 3.0 3.1 3.2" |
138 | PYTHON_ABI_SUPPORTED_VALUES="2.4 2.5 2.6 2.7 3.0 3.1 3.2" |
|
|
139 | python2_supported_versions="2.4 2.5 2.6 2.7" |
|
|
140 | python3_supported_versions="3.0 3.1 3.2" |
| 136 | |
141 | |
| 137 | if [[ "$(declare -p USE_PYTHON 2> /dev/null)" == "declare -x USE_PYTHON="* ]]; then |
142 | if [[ "$(declare -p USE_PYTHON 2> /dev/null)" == "declare -x USE_PYTHON="* ]]; then |
|
|
143 | local python2_enabled="0" python3_enabled="0" |
|
|
144 | |
| 138 | if [[ -z "${USE_PYTHON}" ]]; then |
145 | if [[ -z "${USE_PYTHON}" ]]; then |
| 139 | die "USE_PYTHON variable is empty" |
146 | die "USE_PYTHON variable is empty" |
| 140 | fi |
147 | fi |
| 141 | |
148 | |
| 142 | for ABI in ${USE_PYTHON}; do |
149 | for PYTHON_ABI in ${USE_PYTHON}; do |
| 143 | if ! has "${ABI}" ${PYTHON_ABI_SUPPORTED_VALUES}; then |
150 | if ! has "${PYTHON_ABI}" ${PYTHON_ABI_SUPPORTED_VALUES}; then |
| 144 | die "USE_PYTHON variable contains invalid value '${ABI}'" |
151 | die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'" |
| 145 | fi |
152 | fi |
|
|
153 | |
|
|
154 | if has "${PYTHON_ABI}" ${python2_supported_versions}; then |
|
|
155 | python2_enabled="1" |
|
|
156 | fi |
|
|
157 | if has "${PYTHON_ABI}" ${python3_supported_versions}; then |
|
|
158 | python3_enabled="1" |
|
|
159 | fi |
|
|
160 | |
| 146 | support_ABI="1" |
161 | support_ABI="1" |
| 147 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
162 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
| 148 | if python -c "from fnmatch import fnmatch; exit(not fnmatch('${ABI}', '${restricted_ABI}'))"; then |
163 | if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then |
| 149 | support_ABI="0" |
164 | support_ABI="0" |
| 150 | break |
165 | break |
| 151 | fi |
166 | fi |
| 152 | done |
167 | done |
| 153 | [[ "${support_ABI}" == "1" ]] && supported_PYTHON_ABIS+=" ${ABI}" |
168 | [[ "${support_ABI}" == "1" ]] && supported_PYTHON_ABIS+=" ${PYTHON_ABI}" |
| 154 | done |
169 | done |
| 155 | export PYTHON_ABIS="${supported_PYTHON_ABIS# }" |
170 | export PYTHON_ABIS="${supported_PYTHON_ABIS# }" |
| 156 | |
171 | |
| 157 | if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then |
172 | if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then |
| 158 | die "USE_PYTHON variable doesn't enable any Python version supported by ${CATEGORY}/${PF}" |
173 | die "USE_PYTHON variable doesn't enable any version of Python supported by ${CATEGORY}/${PF}" |
|
|
174 | fi |
|
|
175 | |
|
|
176 | if [[ "${python2_enabled}" == "0" ]]; then |
|
|
177 | ewarn "USE_PYTHON variable doesn't enable any version of Python 2. This configuration is unsupported." |
|
|
178 | fi |
|
|
179 | if [[ "${python3_enabled}" == "0" ]]; then |
|
|
180 | ewarn "USE_PYTHON variable doesn't enable any version of Python 3. This configuration is unsupported." |
| 159 | fi |
181 | fi |
| 160 | else |
182 | else |
| 161 | local restricted_ABI |
183 | local python_version python2_version= python3_version= support_python_major_version |
| 162 | python_version |
|
|
| 163 | |
184 | |
|
|
185 | python_version="$(/usr/bin/python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" |
|
|
186 | |
|
|
187 | if has_version "=dev-lang/python-2*"; then |
|
|
188 | if [[ "$(readlink /usr/bin/python2)" != "python2."* ]]; then |
|
|
189 | die "'/usr/bin/python2' isn't valid symlink" |
|
|
190 | fi |
|
|
191 | |
|
|
192 | python2_version="$(/usr/bin/python2 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" |
|
|
193 | |
|
|
194 | for PYTHON_ABI in ${python2_supported_versions}; do |
|
|
195 | support_python_major_version="1" |
| 164 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
196 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
| 165 | if python -c "from fnmatch import fnmatch; exit(not fnmatch('${PYVER}', '${restricted_ABI}'))"; then |
197 | if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then |
| 166 | die "Active Python version isn't supported by ${CATEGORY}/${PF}" |
198 | support_python_major_version="0" |
| 167 | fi |
199 | fi |
|
|
200 | done |
|
|
201 | [[ "${support_python_major_version}" == "1" ]] && break |
| 168 | done |
202 | done |
| 169 | export PYTHON_ABIS="${PYVER}" |
203 | if [[ "${support_python_major_version}" == "1" ]]; then |
|
|
204 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
|
|
205 | if [[ "${python2_version}" == ${restricted_ABI} ]]; then |
|
|
206 | die "Active version of Python 2 isn't supported by ${CATEGORY}/${PF}" |
|
|
207 | fi |
|
|
208 | done |
|
|
209 | else |
|
|
210 | python2_version="" |
|
|
211 | fi |
| 170 | fi |
212 | fi |
|
|
213 | |
|
|
214 | if has_version "=dev-lang/python-3*"; then |
|
|
215 | if [[ "$(readlink /usr/bin/python3)" != "python3."* ]]; then |
|
|
216 | die "'/usr/bin/python3' isn't valid symlink" |
|
|
217 | fi |
|
|
218 | |
|
|
219 | python3_version="$(/usr/bin/python3 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" |
|
|
220 | |
|
|
221 | for PYTHON_ABI in ${python3_supported_versions}; do |
|
|
222 | support_python_major_version="1" |
|
|
223 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
|
|
224 | if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then |
|
|
225 | support_python_major_version="0" |
|
|
226 | fi |
|
|
227 | done |
|
|
228 | [[ "${support_python_major_version}" == "1" ]] && break |
|
|
229 | done |
|
|
230 | if [[ "${support_python_major_version}" == "1" ]]; then |
|
|
231 | for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do |
|
|
232 | if [[ "${python3_version}" == ${restricted_ABI} ]]; then |
|
|
233 | die "Active version of Python 3 isn't supported by ${CATEGORY}/${PF}" |
|
|
234 | fi |
|
|
235 | done |
|
|
236 | else |
|
|
237 | python3_version="" |
|
|
238 | fi |
|
|
239 | fi |
|
|
240 | |
|
|
241 | if ! has "${python_version}" "${python2_version}" "${python3_version}"; then |
|
|
242 | eerror "Python wrapper is configured incorrectly or /usr/bin/python2 or /usr/bin/python3 symlink" |
|
|
243 | eerror "is set incorrectly. Use \`eselect python\` to fix configuration." |
|
|
244 | die "Incorrect configuration of Python" |
|
|
245 | fi |
|
|
246 | |
|
|
247 | PYTHON_ABIS="${python2_version} ${python3_version}" |
|
|
248 | PYTHON_ABIS="${PYTHON_ABIS# }" |
|
|
249 | export PYTHON_ABIS="${PYTHON_ABIS% }" |
| 171 | fi |
250 | fi |
|
|
251 | fi |
| 172 | |
252 | |
|
|
253 | if [[ "$(declare -p PYTHON_ABIS_SANITY_CHECKS 2> /dev/null)" != "declare -- PYTHON_ABIS_SANITY_CHECKS="* ]]; then |
| 173 | local PYTHON_ABI |
254 | local PYTHON_ABI |
| 174 | for PYTHON_ABI in ${PYTHON_ABIS}; do |
255 | for PYTHON_ABI in ${PYTHON_ABIS}; do |
| 175 | # Ensure that appropriate Python version is installed. |
256 | # Ensure that appropriate Python version is installed. |
| 176 | if ! has_version "dev-lang/python:${PYTHON_ABI}"; then |
257 | if ! has_version "dev-lang/python:${PYTHON_ABI}"; then |
| 177 | die "dev-lang/python:${PYTHON_ABI} isn't installed" |
258 | die "dev-lang/python:${PYTHON_ABI} isn't installed" |
| 178 | fi |
259 | fi |
| 179 | |
260 | |
| 180 | # Ensure that EPYTHON variable is respected. |
261 | # Ensure that EPYTHON variable is respected. |
| 181 | if [[ "$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" != "${PYTHON_ABI}" ]]; then |
262 | if [[ "$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" != "${PYTHON_ABI}" ]]; then |
| 182 | die "'python' doesn't respect EPYTHON variable" |
263 | die "'python' doesn't respect EPYTHON variable" |
| 183 | fi |
264 | fi |
| 184 | done |
265 | done |
|
|
266 | PYTHON_ABIS_SANITY_CHECKS="1" |
|
|
267 | fi |
| 185 | } |
268 | } |
| 186 | |
269 | |
| 187 | # @FUNCTION: python_copy_sources |
270 | # @FUNCTION: python_copy_sources |
| 188 | # @USAGE: [--no-link] [--] [directory] |
271 | # @USAGE: [--no-link] [--] [directory] |
| 189 | # @DESCRIPTION: |
272 | # @DESCRIPTION: |
| … | |
… | |
| 249 | # @USAGE: [--action-message message] [-d|--default-function] [--failure-message message] [--nonfatal] [-q|--quiet] [-s|--separate-build-dirs] [--] <function> [arguments] |
332 | # @USAGE: [--action-message message] [-d|--default-function] [--failure-message message] [--nonfatal] [-q|--quiet] [-s|--separate-build-dirs] [--] <function> [arguments] |
| 250 | # @DESCRIPTION: |
333 | # @DESCRIPTION: |
| 251 | # Execute specified function for each value of PYTHON_ABIS, optionally passing additional |
334 | # Execute specified function for each value of PYTHON_ABIS, optionally passing additional |
| 252 | # arguments. The specified function can use PYTHON_ABI and BUILDDIR variables. |
335 | # arguments. The specified function can use PYTHON_ABI and BUILDDIR variables. |
| 253 | python_execute_function() { |
336 | python_execute_function() { |
| 254 | local action action_message action_message_template= default_function="0" failure_message failure_message_template= function nonfatal="0" previous_directory_stack_length PYTHON_ABI quiet="0" separate_build_dirs="0" |
337 | local action action_message action_message_template= default_function="0" failure_message failure_message_template= function nonfatal="0" previous_directory previous_directory_stack previous_directory_stack_length PYTHON_ABI quiet="0" separate_build_dirs="0" |
| 255 | |
338 | |
| 256 | while (($#)); do |
339 | while (($#)); do |
| 257 | case "$1" in |
340 | case "$1" in |
| 258 | --action-message) |
341 | --action-message) |
| 259 | action_message_template="$2" |
342 | action_message_template="$2" |
| … | |
… | |
| 381 | pushd "${BUILDDIR}" > /dev/null || die "pushd failed" |
464 | pushd "${BUILDDIR}" > /dev/null || die "pushd failed" |
| 382 | else |
465 | else |
| 383 | export BUILDDIR="${S}" |
466 | export BUILDDIR="${S}" |
| 384 | fi |
467 | fi |
| 385 | |
468 | |
| 386 | previous_directory_stack_length="${#DIRSTACK[@]}" |
469 | previous_directory="$(pwd)" |
|
|
470 | previous_directory_stack="$(dirs -p)" |
|
|
471 | previous_directory_stack_length="$(dirs -p | wc -l)" |
| 387 | |
472 | |
| 388 | if ! has "${EAPI}" 0 1 2 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then |
473 | if ! has "${EAPI}" 0 1 2 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then |
| 389 | EPYTHON="$(PYTHON)" nonfatal "${function}" "$@" |
474 | EPYTHON="$(PYTHON)" nonfatal "${function}" "$@" |
| 390 | else |
475 | else |
| 391 | EPYTHON="$(PYTHON)" "${function}" "$@" |
476 | EPYTHON="$(PYTHON)" "${function}" "$@" |
| … | |
… | |
| 402 | if [[ "${quiet}" == "0" ]]; then |
487 | if [[ "${quiet}" == "0" ]]; then |
| 403 | ewarn "${RED}${failure_message}${NORMAL}" |
488 | ewarn "${RED}${failure_message}${NORMAL}" |
| 404 | fi |
489 | fi |
| 405 | elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then |
490 | elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then |
| 406 | if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then |
491 | if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then |
| 407 | local ABI enabled_PYTHON_ABIS= |
492 | local enabled_PYTHON_ABIS= other_PYTHON_ABI |
| 408 | for ABI in ${PYTHON_ABIS}; do |
493 | for other_PYTHON_ABI in ${PYTHON_ABIS}; do |
| 409 | [[ "${ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+=" ${ABI}" |
494 | [[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+=" ${other_PYTHON_ABI}" |
| 410 | done |
495 | done |
| 411 | export PYTHON_ABIS="${enabled_PYTHON_ABIS# }" |
496 | export PYTHON_ABIS="${enabled_PYTHON_ABIS# }" |
| 412 | fi |
497 | fi |
| 413 | if [[ "${quiet}" == "0" ]]; then |
498 | if [[ "${quiet}" == "0" ]]; then |
| 414 | ewarn "${RED}${failure_message}${NORMAL}" |
499 | ewarn "${RED}${failure_message}${NORMAL}" |
| … | |
… | |
| 419 | else |
504 | else |
| 420 | die "${failure_message}" |
505 | die "${failure_message}" |
| 421 | fi |
506 | fi |
| 422 | fi |
507 | fi |
| 423 | |
508 | |
|
|
509 | # Ensure that directory stack hasn't been decreased. |
| 424 | if [[ "${#DIRSTACK[@]}" -lt "${previous_directory_stack_length}" ]]; then |
510 | if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then |
| 425 | die "Directory stack decreased illegally" |
511 | die "Directory stack decreased illegally" |
| 426 | fi |
512 | fi |
| 427 | |
513 | |
|
|
514 | # Avoid side effects of earlier returning from the specified function. |
| 428 | while [[ "${#DIRSTACK[@]}" -gt "${previous_directory_stack_length}" ]]; do |
515 | while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do |
| 429 | popd > /dev/null || die "popd failed" |
516 | popd > /dev/null || die "popd failed" |
| 430 | done |
517 | done |
| 431 | |
518 | |
|
|
519 | # Ensure that the bottom part of directory stack hasn't been changed. Restore |
|
|
520 | # previous directory (from before running of the specified function) before |
|
|
521 | # comparison of directory stacks to avoid mismatch of directory stacks after |
|
|
522 | # potential using of 'cd' to change current directory. Restoration of previous |
|
|
523 | # directory allows to safely use 'cd' to change current directory in the |
|
|
524 | # specified function without changing it back to original directory. |
|
|
525 | cd "${previous_directory}" |
|
|
526 | if [[ "$(dirs -p)" != "${previous_directory_stack}" ]]; then |
|
|
527 | die "Directory stack changed illegally" |
|
|
528 | fi |
|
|
529 | |
| 432 | if [[ "${separate_build_dirs}" == "1" ]]; then |
530 | if [[ "${separate_build_dirs}" == "1" ]]; then |
| 433 | popd > /dev/null || die "popd failed" |
531 | popd > /dev/null || die "popd failed" |
| 434 | fi |
532 | fi |
| 435 | unset BUILDDIR |
533 | unset BUILDDIR |
| 436 | done |
534 | done |
| … | |
… | |
| 438 | if [[ "${default_function}" == "1" ]]; then |
536 | if [[ "${default_function}" == "1" ]]; then |
| 439 | unset -f python_default_function |
537 | unset -f python_default_function |
| 440 | fi |
538 | fi |
| 441 | } |
539 | } |
| 442 | |
540 | |
|
|
541 | # @FUNCTION: python_convert_shebangs |
|
|
542 | # @USAGE: [-q|--quiet] [-r|--recursive] [-x|--only-executables] [--] <Python_version> <file|directory> [files|directories] |
|
|
543 | # @DESCRIPTION: |
|
|
544 | # Convert shebangs in specified files. Directories can be specified only with --recursive option. |
|
|
545 | python_convert_shebangs() { |
|
|
546 | local argument file files=() only_executables="0" python_version quiet="0" recursive="0" |
|
|
547 | |
|
|
548 | while (($#)); do |
|
|
549 | case "$1" in |
|
|
550 | -r|--recursive) |
|
|
551 | recursive="1" |
|
|
552 | ;; |
|
|
553 | -q|--quiet) |
|
|
554 | quiet="1" |
|
|
555 | ;; |
|
|
556 | -x|--only-executables) |
|
|
557 | only_executables="1" |
|
|
558 | ;; |
|
|
559 | --) |
|
|
560 | break |
|
|
561 | ;; |
|
|
562 | -*) |
|
|
563 | die "${FUNCNAME}(): Unrecognized option '$1'" |
|
|
564 | ;; |
|
|
565 | *) |
|
|
566 | break |
|
|
567 | ;; |
|
|
568 | esac |
|
|
569 | shift |
|
|
570 | done |
|
|
571 | |
|
|
572 | if [[ "$#" -eq 0 ]]; then |
|
|
573 | die "${FUNCNAME}(): Missing Python version and files or directories" |
|
|
574 | elif [[ "$#" -eq 1 ]]; then |
|
|
575 | die "${FUNCNAME}(): Missing files or directories" |
|
|
576 | fi |
|
|
577 | |
|
|
578 | python_version="$1" |
|
|
579 | shift |
|
|
580 | |
|
|
581 | for argument in "$@"; do |
|
|
582 | if [[ ! -e "${argument}" ]]; then |
|
|
583 | die "${FUNCNAME}(): '${argument}' doesn't exist" |
|
|
584 | elif [[ -f "${argument}" ]]; then |
|
|
585 | files+=("${argument}") |
|
|
586 | elif [[ -d "${argument}" ]]; then |
|
|
587 | if [[ "${recursive}" == "1" ]]; then |
|
|
588 | if [[ "${only_executables}" == "1" ]]; then |
|
|
589 | files+=($(find "${argument}" -perm /111 -type f)) |
|
|
590 | else |
|
|
591 | files+=($(find "${argument}" -type f)) |
|
|
592 | fi |
|
|
593 | else |
|
|
594 | die "${FUNCNAME}(): '${argument}' isn't a regular file" |
|
|
595 | fi |
|
|
596 | else |
|
|
597 | die "${FUNCNAME}(): '${argument}' isn't a regular file or a directory" |
|
|
598 | fi |
|
|
599 | done |
|
|
600 | |
|
|
601 | for file in "${files[@]}"; do |
|
|
602 | file="${file#./}" |
|
|
603 | [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue |
|
|
604 | |
|
|
605 | if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then |
|
|
606 | [[ "${quiet}" == "0" ]] && einfo "Converting shebang in '${file}'" |
|
|
607 | sed -e "1s/python\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?/python${python_version}/" -i "${file}" || die "Conversion of shebang in '${file}' failed" |
|
|
608 | |
|
|
609 | # Delete potential whitespace after "#!". |
|
|
610 | sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed" |
|
|
611 | fi |
|
|
612 | done |
|
|
613 | } |
| 443 | |
614 | |
| 444 | # @ECLASS-VARIABLE: PYTHON_USE_WITH |
615 | # @ECLASS-VARIABLE: PYTHON_USE_WITH |
| 445 | # @DESCRIPTION: |
616 | # @DESCRIPTION: |
| 446 | # Set this to a space separated list of use flags |
617 | # Set this to a space separated list of use flags |
| 447 | # the python slot in use must be built with. |
618 | # the python slot in use must be built with. |
| … | |
… | |
| 460 | # @FUNCTION: python_pkg_setup |
631 | # @FUNCTION: python_pkg_setup |
| 461 | # @DESCRIPTION: |
632 | # @DESCRIPTION: |
| 462 | # Makes sure PYTHON_USE_WITH or PYTHON_USE_WITH_OR listed use flags |
633 | # Makes sure PYTHON_USE_WITH or PYTHON_USE_WITH_OR listed use flags |
| 463 | # are respected. Only exported if one of those variables is set. |
634 | # are respected. Only exported if one of those variables is set. |
| 464 | if ! has "${EAPI:-0}" 0 1 && [[ -n ${PYTHON_USE_WITH} || -n ${PYTHON_USE_WITH_OR} ]]; then |
635 | if ! has "${EAPI:-0}" 0 1 && [[ -n ${PYTHON_USE_WITH} || -n ${PYTHON_USE_WITH_OR} ]]; then |
|
|
636 | python_pkg_setup() { |
| 465 | python_pkg_setup_fail() { |
637 | python_pkg_setup_fail() { |
| 466 | eerror "${1}" |
638 | eerror "${1}" |
| 467 | die "${1}" |
639 | die "${1}" |
|
|
640 | } |
|
|
641 | |
|
|
642 | [[ ${PYTHON_USE_WITH_OPT} ]] && use !${PYTHON_USE_WITH_OPT} && return |
|
|
643 | |
|
|
644 | python_pkg_setup_check_USE_flags() { |
|
|
645 | local pyatom use |
|
|
646 | if [[ -n "${PYTHON_ABI}" ]]; then |
|
|
647 | pyatom="dev-lang/python:${PYTHON_ABI}" |
|
|
648 | else |
|
|
649 | python_version |
|
|
650 | pyatom="dev-lang/python:${PYVER}" |
|
|
651 | fi |
|
|
652 | |
|
|
653 | for use in ${PYTHON_USE_WITH}; do |
|
|
654 | if ! has_version "${pyatom}[${use}]"; then |
|
|
655 | python_pkg_setup_fail "Please rebuild ${pyatom} with the following USE flags enabled: ${PYTHON_USE_WITH}" |
|
|
656 | fi |
|
|
657 | done |
|
|
658 | |
|
|
659 | for use in ${PYTHON_USE_WITH_OR}; do |
|
|
660 | if has_version "${pyatom}[${use}]"; then |
|
|
661 | return |
|
|
662 | fi |
|
|
663 | done |
|
|
664 | |
|
|
665 | if [[ ${PYTHON_USE_WITH_OR} ]]; then |
|
|
666 | python_pkg_setup_fail "Please rebuild ${pyatom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}" |
|
|
667 | fi |
|
|
668 | } |
|
|
669 | |
|
|
670 | if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then |
|
|
671 | python_execute_function -q python_pkg_setup_check_USE_flags |
|
|
672 | else |
|
|
673 | python_pkg_setup_check_USE_flags |
|
|
674 | fi |
| 468 | } |
675 | } |
| 469 | |
676 | |
| 470 | python_pkg_setup() { |
|
|
| 471 | [[ ${PYTHON_USE_WITH_OPT} ]] && use !${PYTHON_USE_WITH_OPT} && return |
|
|
| 472 | |
|
|
| 473 | python_version |
|
|
| 474 | local failed |
|
|
| 475 | local pyatom="dev-lang/python:${PYVER}" |
|
|
| 476 | |
|
|
| 477 | for use in ${PYTHON_USE_WITH}; do |
|
|
| 478 | if ! has_version "${pyatom}[${use}]"; then |
|
|
| 479 | python_pkg_setup_fail \ |
|
|
| 480 | "Please rebuild ${pyatom} with use flags: ${PYTHON_USE_WITH}" |
|
|
| 481 | fi |
|
|
| 482 | done |
|
|
| 483 | |
|
|
| 484 | for use in ${PYTHON_USE_WITH_OR}; do |
|
|
| 485 | if has_version "${pyatom}[${use}]"; then |
|
|
| 486 | return |
|
|
| 487 | fi |
|
|
| 488 | done |
|
|
| 489 | |
|
|
| 490 | if [[ ${PYTHON_USE_WITH_OR} ]]; then |
|
|
| 491 | python_pkg_setup_fail \ |
|
|
| 492 | "Please rebuild ${pyatom} with one of: ${PYTHON_USE_WITH_OR}" |
|
|
| 493 | fi |
|
|
| 494 | } |
|
|
| 495 | |
|
|
| 496 | EXPORT_FUNCTIONS pkg_setup |
677 | EXPORT_FUNCTIONS pkg_setup |
| 497 | |
678 | |
| 498 | if [[ ${PYTHON_USE_WITH} ]]; then |
679 | if [[ -n "${PYTHON_USE_WITH}" ]]; then |
| 499 | PYTHON_USE_WITH_ATOM="${PYTHON_ATOM}[${PYTHON_USE_WITH/ /,}]" |
680 | PYTHON_USE_WITH_ATOM="${PYTHON_ATOM}[${PYTHON_USE_WITH/ /,}]" |
| 500 | elif [[ ${PYTHON_USE_WITH_OR} ]]; then |
681 | elif [[ -n "${PYTHON_USE_WITH_OR}" ]]; then |
| 501 | PYTHON_USE_WITH_ATOM="|| ( " |
682 | PYTHON_USE_WITH_ATOM="|| ( " |
| 502 | for use in ${PYTHON_USE_WITH_OR}; do |
683 | for use in ${PYTHON_USE_WITH_OR}; do |
| 503 | PYTHON_USE_WITH_ATOM=" |
684 | PYTHON_USE_WITH_ATOM+=" ${PYTHON_ATOM}[${use}]" |
| 504 | ${PYTHON_USE_WITH_ATOM} |
|
|
| 505 | ${PYTHON_ATOM}[${use}]" |
|
|
| 506 | done |
685 | done |
| 507 | PYTHON_USE_WITH_ATOM="${PYTHON_USE_WITH_ATOM} )" |
686 | unset use |
|
|
687 | PYTHON_USE_WITH_ATOM+=" )" |
| 508 | fi |
688 | fi |
| 509 | if [[ ${PYTHON_USE_WITH_OPT} ]]; then |
689 | if [[ -n "${PYTHON_USE_WITH_OPT}" ]]; then |
| 510 | PYTHON_USE_WITH_ATOM="${PYTHON_USE_WITH_OPT}? ( ${PYTHON_USE_WITH_ATOM} )" |
690 | PYTHON_USE_WITH_ATOM="${PYTHON_USE_WITH_OPT}? ( ${PYTHON_USE_WITH_ATOM} )" |
| 511 | fi |
691 | fi |
| 512 | DEPEND="${PYTHON_USE_WITH_ATOM}" |
692 | DEPEND+=" ${PYTHON_USE_WITH_ATOM}" |
| 513 | RDEPEND="${PYTHON_USE_WITH_ATOM}" |
693 | RDEPEND+=" ${PYTHON_USE_WITH_ATOM}" |
| 514 | fi |
694 | fi |
| 515 | |
695 | |
| 516 | # @ECLASS-VARIABLE: PYTHON_DEFINE_DEFAULT_FUNCTIONS |
696 | # @ECLASS-VARIABLE: PYTHON_DEFINE_DEFAULT_FUNCTIONS |
| 517 | # @DESCRIPTION: |
697 | # @DESCRIPTION: |
| 518 | # Set this to define default functions for the following ebuild phases: |
698 | # Set this to define default functions for the following ebuild phases: |
| … | |
… | |
| 544 | # Tell Python to automatically recompile modules to .pyc/.pyo if the |
724 | # Tell Python to automatically recompile modules to .pyc/.pyo if the |
| 545 | # timestamps/version stamps have changed. |
725 | # timestamps/version stamps have changed. |
| 546 | python_enable_pyc() { |
726 | python_enable_pyc() { |
| 547 | unset PYTHONDONTWRITEBYTECODE |
727 | unset PYTHONDONTWRITEBYTECODE |
| 548 | } |
728 | } |
| 549 | |
|
|
| 550 | python_disable_pyc |
|
|
| 551 | |
729 | |
| 552 | # @FUNCTION: python_need_rebuild |
730 | # @FUNCTION: python_need_rebuild |
| 553 | # @DESCRIPTION: Run without arguments, specifies that the package should be |
731 | # @DESCRIPTION: Run without arguments, specifies that the package should be |
| 554 | # rebuilt after a python upgrade. |
732 | # rebuilt after a python upgrade. |
| 555 | python_need_rebuild() { |
733 | python_need_rebuild() { |
| … | |
… | |
| 761 | # Don't use PYTHON_ABI in next calls to python_get_libdir(). |
939 | # Don't use PYTHON_ABI in next calls to python_get_libdir(). |
| 762 | unset PYTHON_ABI |
940 | unset PYTHON_ABI |
| 763 | |
941 | |
| 764 | if ((${#other_dirs[@]})) || ((${#other_files[@]})); then |
942 | if ((${#other_dirs[@]})) || ((${#other_files[@]})); then |
| 765 | return_code="0" |
943 | return_code="0" |
| 766 | ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for Python ${PYVER}..." |
944 | ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for Python ${PYVER}" |
| 767 | if ((${#other_dirs[@]})); then |
945 | if ((${#other_dirs[@]})); then |
| 768 | python${PYVER} "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" || return_code="1" |
946 | python${PYVER} "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" || return_code="1" |
| 769 | python${PYVER} -O "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1" |
947 | python${PYVER} -O "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1" |
| 770 | fi |
948 | fi |
| 771 | if ((${#other_files[@]})); then |
949 | if ((${#other_files[@]})); then |
| … | |
… | |
| 817 | fi |
995 | fi |
| 818 | |
996 | |
| 819 | # set additional opts |
997 | # set additional opts |
| 820 | myopts+=(-q) |
998 | myopts+=(-q) |
| 821 | |
999 | |
| 822 | ebegin "Byte compiling python modules for python-${PYVER} .." |
1000 | ebegin "Compilation and optimization of Python modules for Python ${PYVER}" |
| 823 | if ((${#mydirs[@]})); then |
1001 | if ((${#mydirs[@]})); then |
| 824 | python${PYVER} \ |
1002 | python${PYVER} \ |
| 825 | "${myroot}"/usr/$(get_libdir)/python${PYVER}/compileall.py \ |
1003 | "${myroot}"/usr/$(get_libdir)/python${PYVER}/compileall.py \ |
| 826 | "${myopts[@]}" "${mydirs[@]}" || return_code="1" |
1004 | "${myopts[@]}" "${mydirs[@]}" || return_code="1" |
| 827 | python${PYVER} -O \ |
1005 | python${PYVER} -O \ |
| … | |
… | |
| 847 | # determine if they are orphaned (i.e. their corresponding .py files are missing.) |
1025 | # determine if they are orphaned (i.e. their corresponding .py files are missing.) |
| 848 | # If they are, then it will remove their corresponding .pyc and .pyo files. |
1026 | # If they are, then it will remove their corresponding .pyc and .pyo files. |
| 849 | # |
1027 | # |
| 850 | # This function should only be run in pkg_postrm(). |
1028 | # This function should only be run in pkg_postrm(). |
| 851 | python_mod_cleanup() { |
1029 | python_mod_cleanup() { |
| 852 | local PYTHON_ABI SEARCH_PATH=() root src_py |
1030 | local path py_file PYTHON_ABI SEARCH_PATH=() root |
| 853 | |
1031 | |
| 854 | # Check if phase is pkg_postrm(). |
1032 | # Check if phase is pkg_postrm(). |
| 855 | [[ ${EBUILD_PHASE} != "postrm" ]] && die "${FUNCNAME} should only be run in pkg_postrm()" |
1033 | [[ ${EBUILD_PHASE} != "postrm" ]] && die "${FUNCNAME} should only be run in pkg_postrm()" |
| 856 | |
1034 | |
| 857 | # Strip trailing slash from ROOT. |
1035 | # Strip trailing slash from ROOT. |
| … | |
… | |
| 874 | else |
1052 | else |
| 875 | SEARCH_PATH=("${@#/}") |
1053 | SEARCH_PATH=("${@#/}") |
| 876 | SEARCH_PATH=("${SEARCH_PATH[@]/#/${root}/}") |
1054 | SEARCH_PATH=("${SEARCH_PATH[@]/#/${root}/}") |
| 877 | fi |
1055 | fi |
| 878 | else |
1056 | else |
| 879 | SEARCH_PATH=("${root}"/usr/lib*/python*/site-packages) |
1057 | local dir sitedir |
|
|
1058 | for dir in "${root}"/usr/lib*; do |
|
|
1059 | if [[ -d "${dir}" && ! -L "${dir}" ]]; then |
|
|
1060 | for sitedir in "${dir}"/python*/site-packages; do |
|
|
1061 | if [[ -d "${sitedir}" ]]; then |
|
|
1062 | SEARCH_PATH+=("${sitedir}") |
|
|
1063 | fi |
|
|
1064 | done |
|
|
1065 | fi |
|
|
1066 | done |
|
|
1067 | fi |
|
|
1068 | |
|
|
1069 | local BLUE CYAN NORMAL |
|
|
1070 | if [[ "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then |
|
|
1071 | BLUE=$'\e[34m' |
|
|
1072 | CYAN=$'\e[36m' |
|
|
1073 | NORMAL=$'\e[0m' |
|
|
1074 | else |
|
|
1075 | BLUE= |
|
|
1076 | CYAN= |
|
|
1077 | NORMAL= |
| 880 | fi |
1078 | fi |
| 881 | |
1079 | |
| 882 | for path in "${SEARCH_PATH[@]}"; do |
1080 | for path in "${SEARCH_PATH[@]}"; do |
| 883 | [[ ! -d "${path}" ]] && continue |
1081 | if [[ -d "${path}" ]]; then |
| 884 | einfo "Cleaning orphaned Python bytecode from ${path} .." |
|
|
| 885 | find "${path}" -name '*.py[co]' -print0 | while read -rd ''; do |
1082 | find "${path}" -name '*.py[co]' -print0 | while read -rd ''; do |
| 886 | src_py="${REPLY%[co]}" |
1083 | py_file="${REPLY%[co]}" |
| 887 | [[ -f "${src_py}" || (! -f "${src_py}c" && ! -f "${src_py}o") ]] && continue |
1084 | [[ -f "${py_file}" || (! -f "${py_file}c" && ! -f "${py_file}o") ]] && continue |
| 888 | einfo "Purging ${src_py}[co]" |
1085 | einfo "${BLUE}<<< ${py_file}[co]${NORMAL}" |
| 889 | rm -f "${src_py}"[co] |
1086 | rm -f "${py_file}"[co] |
| 890 | done |
1087 | done |
| 891 | |
1088 | |
| 892 | # Attempt to remove directories that may be empty. |
1089 | # Attempt to delete directories, which may be empty. |
| 893 | find "${path}" -type d | sort -r | while read -r dir; do |
1090 | find "${path}" -type d | sort -r | while read -r dir; do |
| 894 | rmdir "${dir}" 2>/dev/null && einfo "Removing empty directory ${dir}" |
1091 | rmdir "${dir}" 2>/dev/null && einfo "${CYAN}<<< ${dir}${NORMAL}" |
| 895 | done |
1092 | done |
|
|
1093 | elif [[ "${path}" == *.py && ! -f "${path}" && (-f "${path}c" || -f "${path}o") ]]; then |
|
|
1094 | einfo "${BLUE}<<< ${path}[co]${NORMAL}" |
|
|
1095 | rm -f "${path}"[co] |
|
|
1096 | fi |
| 896 | done |
1097 | done |
| 897 | } |
1098 | } |