remove obsolete
Hanno Böck

Hanno Böck commited on 2020-05-07 09:24:11
Zeige 18 geänderte Dateien mit 0 Einfügungen und 4401 Löschungen.

... ...
@@ -1,599 +0,0 @@
1
-# Copyright 1999-2017 Gentoo Foundation
2
-# Distributed under the terms of the GNU General Public License v2
3
-
4
-# @DEAD
5
-# Removal on 2017-03-18.
6
-
7
-# @ECLASS: distutils.eclass
8
-# @MAINTAINER:
9
-# Gentoo Python Project <python@gentoo.org>
10
-# @BLURB: Eclass for packages with build systems using Distutils
11
-# @DESCRIPTION:
12
-# The distutils eclass defines phase functions for packages with build systems using Distutils.
13
-#
14
-# This eclass is DEPRECATED. Please use distutils-r1 instead.
15
-
16
-if [[ -z "${_PYTHON_ECLASS_INHERITED}" ]]; then
17
-	inherit python
18
-fi
19
-
20
-inherit multilib
21
-
22
-case "${EAPI:-0}" in
23
-	6)
24
-		die "${ECLASS}.eclass is banned in EAPI ${EAPI}"
25
-		;;
26
-	0|1)
27
-		EXPORT_FUNCTIONS src_unpack src_compile src_install pkg_postinst pkg_postrm
28
-		;;
29
-	*)
30
-		EXPORT_FUNCTIONS src_prepare src_compile src_install pkg_postinst pkg_postrm
31
-		;;
32
-esac
33
-
34
-if [[ -z "$(declare -p PYTHON_DEPEND 2> /dev/null)" ]]; then
35
-	DEPEND="dev-lang/python"
36
-	RDEPEND="${DEPEND}"
37
-fi
38
-
39
-	if has "${EAPI:-0}" 0 1 && [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
40
-		ewarn
41
-		ewarn "\"${EBUILD}\":"
42
-		ewarn "Deprecation Warning: Usage of distutils.eclass in packages supporting installation"
43
-		ewarn "for multiple Python ABIs in EAPI <=1 is deprecated."
44
-		ewarn "The ebuild should to be fixed. Please report a bug, if it has not been already reported."
45
-		ewarn
46
-	elif has "${EAPI:-0}" 0 1 2 && [[ -z "${SUPPORT_PYTHON_ABIS}" ]]; then
47
-		ewarn
48
-		ewarn "\"${EBUILD}\":"
49
-		ewarn "Deprecation Warning: Usage of distutils.eclass in packages not supporting installation"
50
-		ewarn "for multiple Python ABIs in EAPI <=2 is deprecated."
51
-		ewarn "The ebuild should to be fixed. Please report a bug, if it has not been already reported."
52
-		ewarn
53
-	fi
54
-
55
-# 'python' variable is deprecated. Use PYTHON() instead.
56
-if has "${EAPI:-0}" 0 1 2 && [[ -z "${SUPPORT_PYTHON_ABIS}" ]]; then
57
-	python="python"
58
-else
59
-	python="die"
60
-fi
61
-
62
-# @ECLASS-VARIABLE: DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES
63
-# @DESCRIPTION:
64
-# Set this to use separate source directories for each enabled version of Python.
65
-
66
-# @ECLASS-VARIABLE: DISTUTILS_SETUP_FILES
67
-# @DESCRIPTION:
68
-# Array of paths to setup files.
69
-# Syntax:
70
-#   [current_working_directory|]path_to_setup_file
71
-
72
-# @ECLASS-VARIABLE: DISTUTILS_GLOBAL_OPTIONS
73
-# @DESCRIPTION:
74
-# Array of global options passed to setup files.
75
-# Syntax in EAPI <4:
76
-#   global_option
77
-# Syntax in EAPI >=4:
78
-#   Python_ABI_pattern global_option
79
-
80
-# @ECLASS-VARIABLE: DISTUTILS_SRC_TEST
81
-# @DESCRIPTION:
82
-# Type of test command used by distutils_src_test().
83
-# IUSE and DEPEND are automatically adjusted, unless DISTUTILS_DISABLE_TEST_DEPENDENCY is set.
84
-# Valid values:
85
-#   setup.py
86
-#   nosetests
87
-#   py.test
88
-#   trial [arguments]
89
-
90
-# @ECLASS-VARIABLE: DISTUTILS_DISABLE_TEST_DEPENDENCY
91
-# @DESCRIPTION:
92
-# Disable modification of IUSE and DEPEND caused by setting of DISTUTILS_SRC_TEST.
93
-
94
-if [[ -n "${DISTUTILS_SRC_TEST}" && ! "${DISTUTILS_SRC_TEST}" =~ ^(setup\.py|nosetests|py\.test|trial(\ .*)?)$ ]]; then
95
-	die "'DISTUTILS_SRC_TEST' variable has unsupported value '${DISTUTILS_SRC_TEST}'"
96
-fi
97
-
98
-if [[ -z "${DISTUTILS_DISABLE_TEST_DEPENDENCY}" ]]; then
99
-	if [[ "${DISTUTILS_SRC_TEST}" == "nosetests" ]]; then
100
-		IUSE="test"
101
-		DEPEND+="${DEPEND:+ }test? ( dev-python/nose )"
102
-	elif [[ "${DISTUTILS_SRC_TEST}" == "py.test" ]]; then
103
-		IUSE="test"
104
-		DEPEND+="${DEPEND:+ }test? ( dev-python/pytest )"
105
-	# trial requires an argument, which is usually equal to "${PN}".
106
-	elif [[ "${DISTUTILS_SRC_TEST}" =~ ^trial(\ .*)?$ ]]; then
107
-		IUSE="test"
108
-		DEPEND+="${DEPEND:+ }test? ( dev-python/twisted-core )"
109
-	fi
110
-fi
111
-
112
-if [[ -n "${DISTUTILS_SRC_TEST}" ]]; then
113
-	EXPORT_FUNCTIONS src_test
114
-fi
115
-
116
-# Scheduled for deletion on 2011-06-01.
117
-if [[ -n "${DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS}" ]]; then
118
-	eerror "Use PYTHON_NONVERSIONED_EXECUTABLES=(\".*\") instead of DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS variable."
119
-	die "DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS variable is banned"
120
-fi
121
-
122
-# @ECLASS-VARIABLE: DOCS
123
-# @DESCRIPTION:
124
-# Additional documentation files installed by distutils_src_install().
125
-
126
-_distutils_get_build_dir() {
127
-	if _python_package_supporting_installation_for_multiple_python_abis && [[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]]; then
128
-		echo "build-${PYTHON_ABI}"
129
-	else
130
-		echo "build"
131
-	fi
132
-}
133
-
134
-_distutils_get_PYTHONPATH() {
135
-	if _python_package_supporting_installation_for_multiple_python_abis && [[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]]; then
136
-		ls -d build-${PYTHON_ABI}/lib* 2> /dev/null
137
-	else
138
-		ls -d build/lib* 2> /dev/null
139
-	fi
140
-}
141
-
142
-_distutils_hook() {
143
-	if [[ "$#" -ne 1 ]]; then
144
-		die "${FUNCNAME}() requires 1 argument"
145
-	fi
146
-	if [[ "$(type -t "distutils_src_${EBUILD_PHASE}_$1_hook")" == "function" ]]; then
147
-		"distutils_src_${EBUILD_PHASE}_$1_hook"
148
-	fi
149
-}
150
-
151
-_distutils_prepare_global_options() {
152
-	local element option pattern
153
-
154
-	if [[ -n "$(declare -p DISTUTILS_GLOBAL_OPTIONS 2> /dev/null)" && "$(declare -p DISTUTILS_GLOBAL_OPTIONS)" != "declare -a DISTUTILS_GLOBAL_OPTIONS="* ]]; then
155
-		die "DISTUTILS_GLOBAL_OPTIONS should be indexed array"
156
-	fi
157
-
158
-	if has "${EAPI:-0}" 0 1 2 3; then
159
-		_DISTUTILS_GLOBAL_OPTIONS=("${DISTUTILS_GLOBAL_OPTIONS[@]}")
160
-	else
161
-		_DISTUTILS_GLOBAL_OPTIONS=()
162
-
163
-		for element in "${DISTUTILS_GLOBAL_OPTIONS[@]}"; do
164
-			if [[ ! "${element}" =~ ^[^[:space:]]+\ . ]]; then
165
-				die "Element '${element}' of DISTUTILS_GLOBAL_OPTIONS array has invalid syntax"
166
-			fi
167
-			pattern="${element%% *}"
168
-			option="${element#* }"
169
-			if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
170
-				_DISTUTILS_GLOBAL_OPTIONS+=("${option}")
171
-			fi
172
-		done
173
-	fi
174
-}
175
-
176
-_distutils_prepare_current_working_directory() {
177
-	if [[ "$1" == *"|"*"|"* ]]; then
178
-		die "Element '$1' of DISTUTILS_SETUP_FILES array has invalid syntax"
179
-	fi
180
-
181
-	if [[ "$1" == *"|"* ]]; then
182
-		echo "${_BOLD}[${1%|*}]${_NORMAL}"
183
-		pushd "${1%|*}" > /dev/null || die "Entering directory '${1%|*}' failed"
184
-	fi
185
-}
186
-
187
-_distutils_restore_current_working_directory() {
188
-	if [[ "$1" == *"|"* ]]; then
189
-		popd > /dev/null || die "Leaving directory '${1%|*}' failed"
190
-	fi
191
-}
192
-
193
-# @FUNCTION: distutils_src_unpack
194
-# @DESCRIPTION:
195
-# The distutils src_unpack function. This function is exported.
196
-distutils_src_unpack() {
197
-	if ! has "${EAPI:-0}" 0 1; then
198
-		die "${FUNCNAME}() cannot be used in this EAPI"
199
-	fi
200
-
201
-	if [[ "${EBUILD_PHASE}" != "unpack" ]]; then
202
-		die "${FUNCNAME}() can be used only in src_unpack() phase"
203
-	fi
204
-
205
-	unpack ${A}
206
-	cd "${S}"
207
-
208
-	distutils_src_prepare
209
-}
210
-
211
-# @FUNCTION: distutils_src_prepare
212
-# @DESCRIPTION:
213
-# The distutils src_prepare function. This function is exported.
214
-distutils_src_prepare() {
215
-	if ! has "${EAPI:-0}" 0 1 && [[ "${EBUILD_PHASE}" != "prepare" ]]; then
216
-		die "${FUNCNAME}() can be used only in src_prepare() phase"
217
-	fi
218
-
219
-	_python_check_python_pkg_setup_execution
220
-
221
-	local distribute_setup_existence="0" ez_setup_existence="0"
222
-
223
-	if [[ "$#" -ne 0 ]]; then
224
-		die "${FUNCNAME}() does not accept arguments"
225
-	fi
226
-
227
-	# Delete ez_setup files to prevent packages from installing Setuptools on their own.
228
-	[[ -d ez_setup || -f ez_setup.py ]] && ez_setup_existence="1"
229
-	rm -fr ez_setup*
230
-	if [[ "${ez_setup_existence}" == "1" ]]; then
231
-		echo "def use_setuptools(*args, **kwargs): pass" > ez_setup.py
232
-	fi
233
-
234
-	# Delete distribute_setup files to prevent packages from installing Distribute on their own.
235
-	[[ -d distribute_setup || -f distribute_setup.py ]] && distribute_setup_existence="1"
236
-	rm -fr distribute_setup*
237
-	if [[ "${distribute_setup_existence}" == "1" ]]; then
238
-		echo "def use_setuptools(*args, **kwargs): pass" > distribute_setup.py
239
-	fi
240
-
241
-	if [[ -n "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]]; then
242
-		python_copy_sources
243
-	fi
244
-}
245
-
246
-# @FUNCTION: distutils_src_compile
247
-# @DESCRIPTION:
248
-# The distutils src_compile function. This function is exported.
249
-# In ebuilds of packages supporting installation for multiple versions of Python, this function
250
-# calls distutils_src_compile_pre_hook() and distutils_src_compile_post_hook(), if they are defined.
251
-distutils_src_compile() {
252
-	if [[ "${EBUILD_PHASE}" != "compile" ]]; then
253
-		die "${FUNCNAME}() can be used only in src_compile() phase"
254
-	fi
255
-
256
-	_python_check_python_pkg_setup_execution
257
-	_python_set_color_variables
258
-
259
-	local setup_file
260
-
261
-	if _python_package_supporting_installation_for_multiple_python_abis; then
262
-		distutils_building() {
263
-			_distutils_hook pre
264
-
265
-			_distutils_prepare_global_options
266
-
267
-			for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
268
-				_distutils_prepare_current_working_directory "${setup_file}"
269
-
270
-				echo ${_BOLD}"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@"${_NORMAL}
271
-				"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@" || return "$?"
272
-
273
-				_distutils_restore_current_working_directory "${setup_file}"
274
-			done
275
-
276
-			_distutils_hook post
277
-		}
278
-		python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_building "$@"
279
-		unset -f distutils_building
280
-	else
281
-		_distutils_prepare_global_options
282
-
283
-		for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
284
-			_distutils_prepare_current_working_directory "${setup_file}"
285
-
286
-			echo ${_BOLD}"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@"${_NORMAL}
287
-			"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@" || die "Building failed"
288
-
289
-			_distutils_restore_current_working_directory "${setup_file}"
290
-		done
291
-	fi
292
-}
293
-
294
-_distutils_src_test_hook() {
295
-	if [[ "$#" -ne 1 ]]; then
296
-		die "${FUNCNAME}() requires 1 arguments"
297
-	fi
298
-
299
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
300
-		return
301
-	fi
302
-
303
-	if [[ "$(type -t "distutils_src_test_pre_hook")" == "function" ]]; then
304
-		eval "python_execute_$1_pre_hook() {
305
-			distutils_src_test_pre_hook
306
-		}"
307
-	fi
308
-
309
-	if [[ "$(type -t "distutils_src_test_post_hook")" == "function" ]]; then
310
-		eval "python_execute_$1_post_hook() {
311
-			distutils_src_test_post_hook
312
-		}"
313
-	fi
314
-}
315
-
316
-# @FUNCTION: distutils_src_test
317
-# @DESCRIPTION:
318
-# The distutils src_test function. This function is exported, when DISTUTILS_SRC_TEST variable is set.
319
-# In ebuilds of packages supporting installation for multiple versions of Python, this function
320
-# calls distutils_src_test_pre_hook() and distutils_src_test_post_hook(), if they are defined.
321
-distutils_src_test() {
322
-	if [[ "${EBUILD_PHASE}" != "test" ]]; then
323
-		die "${FUNCNAME}() can be used only in src_test() phase"
324
-	fi
325
-
326
-	_python_check_python_pkg_setup_execution
327
-	_python_set_color_variables
328
-
329
-	local arguments setup_file
330
-
331
-	if [[ "${DISTUTILS_SRC_TEST}" == "setup.py" ]]; then
332
-		if _python_package_supporting_installation_for_multiple_python_abis; then
333
-			distutils_testing() {
334
-				_distutils_hook pre
335
-
336
-				_distutils_prepare_global_options
337
-
338
-				for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
339
-					_distutils_prepare_current_working_directory "${setup_file}"
340
-
341
-					echo ${_BOLD}PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@"${_NORMAL}
342
-					PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@" || return "$?"
343
-
344
-					_distutils_restore_current_working_directory "${setup_file}"
345
-				done
346
-
347
-				_distutils_hook post
348
-			}
349
-			python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_testing "$@"
350
-			unset -f distutils_testing
351
-		else
352
-			_distutils_prepare_global_options
353
-
354
-			for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
355
-				_distutils_prepare_current_working_directory "${setup_file}"
356
-
357
-				echo ${_BOLD}PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@"${_NORMAL}
358
-				PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@" || die "Testing failed"
359
-
360
-				_distutils_restore_current_working_directory "${setup_file}"
361
-			done
362
-		fi
363
-	elif [[ "${DISTUTILS_SRC_TEST}" == "nosetests" ]]; then
364
-		_distutils_src_test_hook nosetests
365
-
366
-		python_execute_nosetests -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@"
367
-	elif [[ "${DISTUTILS_SRC_TEST}" == "py.test" ]]; then
368
-		_distutils_src_test_hook py.test
369
-
370
-		python_execute_py.test -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@"
371
-	# trial requires an argument, which is usually equal to "${PN}".
372
-	elif [[ "${DISTUTILS_SRC_TEST}" =~ ^trial(\ .*)?$ ]]; then
373
-		if [[ "${DISTUTILS_SRC_TEST}" == "trial "* ]]; then
374
-			arguments="${DISTUTILS_SRC_TEST#trial }"
375
-		else
376
-			arguments="${PN}"
377
-		fi
378
-
379
-		_distutils_src_test_hook trial
380
-
381
-		python_execute_trial -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- ${arguments} "$@"
382
-	else
383
-		die "'DISTUTILS_SRC_TEST' variable has unsupported value '${DISTUTILS_SRC_TEST}'"
384
-	fi
385
-}
386
-
387
-# @FUNCTION: distutils_src_install
388
-# @DESCRIPTION:
389
-# The distutils src_install function. This function is exported.
390
-# In ebuilds of packages supporting installation for multiple versions of Python, this function
391
-# calls distutils_src_install_pre_hook() and distutils_src_install_post_hook(), if they are defined.
392
-# It also installs some standard documentation files (AUTHORS, Change*, CHANGELOG, CONTRIBUTORS,
393
-# KNOWN_BUGS, MAINTAINERS, NEWS, README*, TODO).
394
-distutils_src_install() {
395
-	if [[ "${EBUILD_PHASE}" != "install" ]]; then
396
-		die "${FUNCNAME}() can be used only in src_install() phase"
397
-	fi
398
-
399
-	_python_check_python_pkg_setup_execution
400
-	_python_initialize_prefix_variables
401
-	_python_set_color_variables
402
-
403
-	local default_docs doc line nspkg_pth_file nspkg_pth_files=() setup_file
404
-
405
-	if _python_package_supporting_installation_for_multiple_python_abis; then
406
-		distutils_installation() {
407
-			_distutils_hook pre
408
-
409
-			_distutils_prepare_global_options
410
-
411
-			for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
412
-				_distutils_prepare_current_working_directory "${setup_file}"
413
-
414
-				echo ${_BOLD}"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --no-compile --root="${T}/images/${PYTHON_ABI}" "$@"${_NORMAL}
415
-				"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --no-compile --root="${T}/images/${PYTHON_ABI}" "$@" || return "$?"
416
-
417
-				_distutils_restore_current_working_directory "${setup_file}"
418
-			done
419
-
420
-			_distutils_hook post
421
-		}
422
-		python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_installation "$@"
423
-		unset -f distutils_installation
424
-
425
-		python_merge_intermediate_installation_images "${T}/images"
426
-	else
427
-		# Mark the package to be rebuilt after a Python upgrade.
428
-		python_need_rebuild
429
-
430
-		_distutils_prepare_global_options
431
-
432
-		for setup_file in "${DISTUTILS_SETUP_FILES[@]-setup.py}"; do
433
-			_distutils_prepare_current_working_directory "${setup_file}"
434
-
435
-			echo ${_BOLD}"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@"${_NORMAL}
436
-			"$(PYTHON)" "${setup_file#*|}" "${_DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@" || die "Installation failed"
437
-
438
-			_distutils_restore_current_working_directory "${setup_file}"
439
-		done
440
-	fi
441
-
442
-	while read -d $'\0' -r nspkg_pth_file; do
443
-		nspkg_pth_files+=("${nspkg_pth_file}")
444
-	done < <(find "${ED}" -name "*-nspkg.pth" -type f -print0)
445
-
446
-	if [[ "${#nspkg_pth_files[@]}" -gt 0 ]]; then
447
-		einfo
448
-		einfo "Python namespaces:"
449
-		for nspkg_pth_file in "${nspkg_pth_files[@]}"; do
450
-			einfo "    '${nspkg_pth_file#${ED%/}}':"
451
-			while read -r line; do
452
-				einfo "        $(echo "${line}" | sed -e "s/.*types\.ModuleType('\([^']\+\)').*/\1/")"
453
-			done < "${nspkg_pth_file}"
454
-			#if ! has "${EAPI:-0}" 0 1 2 3; then
455
-			#	rm -f "${nspkg_pth_file}" || die "Deletion of '${nspkg_pth_file}' failed"
456
-			#fi
457
-		done
458
-		einfo
459
-	fi
460
-
461
-	if [[ -e "${ED}usr/local" ]]; then
462
-		die "Illegal installation into /usr/local"
463
-	fi
464
-
465
-	default_docs="AUTHORS Change* CHANGELOG CONTRIBUTORS KNOWN_BUGS MAINTAINERS NEWS README* TODO"
466
-
467
-	for doc in ${default_docs}; do
468
-		[[ -s "${doc}" ]] && dodoc "${doc}"
469
-	done
470
-
471
-	if has "${EAPI:-0}" 0 1 2 3; then
472
-		if [[ -n "${DOCS}" ]]; then
473
-			dodoc ${DOCS} || die "dodoc failed"
474
-		fi
475
-	else
476
-		if [[ -n "${DOCS}" ]]; then
477
-			dodoc -r ${DOCS} || die "dodoc failed"
478
-		fi
479
-	fi
480
-
481
-	DISTUTILS_SRC_INSTALL_EXECUTED="1"
482
-}
483
-
484
-# @FUNCTION: distutils_pkg_postinst
485
-# @DESCRIPTION:
486
-# The distutils pkg_postinst function. This function is exported.
487
-# When PYTHON_MODNAME variable is set, then this function calls python_mod_optimize() with modules
488
-# specified in PYTHON_MODNAME variable. Otherwise it calls python_mod_optimize() with module, whose
489
-# name is equal to name of current package, if this module exists.
490
-distutils_pkg_postinst() {
491
-	if [[ "${EBUILD_PHASE}" != "postinst" ]]; then
492
-		die "${FUNCNAME}() can be used only in pkg_postinst() phase"
493
-	fi
494
-
495
-	_python_check_python_pkg_setup_execution
496
-	_python_initialize_prefix_variables
497
-
498
-	if [[ -z "${DISTUTILS_SRC_INSTALL_EXECUTED}" ]]; then
499
-		die "${FUNCNAME}() called illegally"
500
-	fi
501
-
502
-	local pylibdir pymod
503
-
504
-	if [[ "$#" -ne 0 ]]; then
505
-		die "${FUNCNAME}() does not accept arguments"
506
-	fi
507
-
508
-	if [[ -z "$(declare -p PYTHON_MODNAME 2> /dev/null)" ]]; then
509
-		for pylibdir in "${EROOT}"usr/$(get_libdir)/python* "${EROOT}"usr/share/jython-*/Lib; do
510
-			if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then
511
-				PYTHON_MODNAME="${PN}"
512
-			fi
513
-		done
514
-	fi
515
-
516
-	if [[ -n "${PYTHON_MODNAME}" ]]; then
517
-		if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis; then
518
-			python_mod_optimize ${PYTHON_MODNAME}
519
-		else
520
-			for pymod in ${PYTHON_MODNAME}; do
521
-				python_mod_optimize "$(python_get_sitedir)/${pymod}"
522
-			done
523
-		fi
524
-	fi
525
-}
526
-
527
-# @FUNCTION: distutils_pkg_postrm
528
-# @DESCRIPTION:
529
-# The distutils pkg_postrm function. This function is exported.
530
-# When PYTHON_MODNAME variable is set, then this function calls python_mod_cleanup() with modules
531
-# specified in PYTHON_MODNAME variable. Otherwise it calls python_mod_cleanup() with module, whose
532
-# name is equal to name of current package, if this module exists.
533
-distutils_pkg_postrm() {
534
-	if [[ "${EBUILD_PHASE}" != "postrm" ]]; then
535
-		die "${FUNCNAME}() can be used only in pkg_postrm() phase"
536
-	fi
537
-
538
-	_python_check_python_pkg_setup_execution
539
-	_python_initialize_prefix_variables
540
-
541
-	if [[ -z "${DISTUTILS_SRC_INSTALL_EXECUTED}" ]]; then
542
-		die "${FUNCNAME}() called illegally"
543
-	fi
544
-
545
-	local pylibdir pymod
546
-
547
-	if [[ "$#" -ne 0 ]]; then
548
-		die "${FUNCNAME}() does not accept arguments"
549
-	fi
550
-
551
-	if [[ -z "$(declare -p PYTHON_MODNAME 2> /dev/null)" ]]; then
552
-		for pylibdir in "${EROOT}"usr/$(get_libdir)/python* "${EROOT}"usr/share/jython-*/Lib; do
553
-			if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then
554
-				PYTHON_MODNAME="${PN}"
555
-			fi
556
-		done
557
-	fi
558
-
559
-	if [[ -n "${PYTHON_MODNAME}" ]]; then
560
-		if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis; then
561
-			python_mod_cleanup ${PYTHON_MODNAME}
562
-		else
563
-			for pymod in ${PYTHON_MODNAME}; do
564
-				for pylibdir in "${EROOT}"usr/$(get_libdir)/python*; do
565
-					if [[ -d "${pylibdir}/site-packages/${pymod}" ]]; then
566
-						python_mod_cleanup "${pylibdir#${EROOT%/}}/site-packages/${pymod}"
567
-					fi
568
-				done
569
-			done
570
-		fi
571
-	fi
572
-}
573
-
574
-# @FUNCTION: distutils_get_intermediate_installation_image
575
-# @DESCRIPTION:
576
-# Print path to intermediate installation image.
577
-#
578
-# This function can be used only in distutils_src_install_pre_hook() and distutils_src_install_post_hook().
579
-distutils_get_intermediate_installation_image() {
580
-	if [[ "${EBUILD_PHASE}" != "install" ]]; then
581
-		die "${FUNCNAME}() can be used only in src_install() phase"
582
-	fi
583
-
584
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
585
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
586
-	fi
587
-
588
-	_python_check_python_pkg_setup_execution
589
-
590
-	if [[ ! "${FUNCNAME[1]}" =~ ^distutils_src_install_(pre|post)_hook$ ]]; then
591
-		die "${FUNCNAME}() can be used only in distutils_src_install_pre_hook() and distutils_src_install_post_hook()"
592
-	fi
593
-
594
-	if [[ "$#" -ne 0 ]]; then
595
-		die "${FUNCNAME}() does not accept arguments"
596
-	fi
597
-
598
-	echo "${T}/images/${PYTHON_ABI}"
599
-}
... ...
@@ -1,3167 +0,0 @@
1
-# Copyright 1999-2017 Gentoo Foundation
2
-# Distributed under the terms of the GNU General Public License v2
3
-
4
-# @DEAD
5
-# Removal on 2017-03-21.
6
-
7
-# @ECLASS: python.eclass
8
-# @MAINTAINER:
9
-# Gentoo Python Project <python@gentoo.org>
10
-# @BLURB: Eclass for Python packages
11
-# @DESCRIPTION:
12
-# The python eclass contains miscellaneous, useful functions for Python packages.
13
-#
14
-# This eclass is DEPRECATED. Please use python-r1, python-single-r1
15
-# or python-any-r1 instead.
16
-
17
-if [[ ${EAPI} == 6 ]]; then
18
-	die "${ECLASS}.eclass is banned in EAPI ${EAPI}"
19
-fi
20
-
21
-if [[ ${_PYTHON_UTILS_R1} ]]; then
22
-	die 'python.eclass can not be used with python-r1 suite eclasses.'
23
-fi
24
-
25
-# Must call inherit before EXPORT_FUNCTIONS to avoid QA warning.
26
-if [[ -z "${_PYTHON_ECLASS_INHERITED}" ]]; then
27
-	inherit multilib
28
-fi
29
-
30
-# Export pkg_setup every time to avoid issues with eclass inheritance order.
31
-if ! has "${EAPI:-0}" 0 1 2 3 || { has "${EAPI:-0}" 2 3 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; }; then
32
-	EXPORT_FUNCTIONS pkg_setup
33
-fi
34
-
35
-# Avoid processing this eclass more than once.
36
-if [[ -z "${_PYTHON_ECLASS_INHERITED}" ]]; then
37
-_PYTHON_ECLASS_INHERITED="1"
38
-
39
-if ! has "${EAPI:-0}" 0 1 2 3 4 5; then
40
-	die "API of python.eclass in EAPI=\"${EAPI}\" not established"
41
-fi
42
-
43
-# Please do not add any new versions of Python here! Instead, please
44
-# focus on converting packages to use the new eclasses.
45
-
46
-_CPYTHON2_GLOBALLY_SUPPORTED_ABIS=(2.4 2.5 2.6 2.7)
47
-_CPYTHON3_GLOBALLY_SUPPORTED_ABIS=(3.1 3.2 3.3)
48
-_JYTHON_GLOBALLY_SUPPORTED_ABIS=(2.5-jython 2.7-jython)
49
-_PYPY_GLOBALLY_SUPPORTED_ABIS=(2.7-pypy-1.7 2.7-pypy-1.8 2.7-pypy-1.9 2.7-pypy-2.0)
50
-_PYTHON_GLOBALLY_SUPPORTED_ABIS=(${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]} ${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]} ${_JYTHON_GLOBALLY_SUPPORTED_ABIS[@]} ${_PYPY_GLOBALLY_SUPPORTED_ABIS[@]})
51
-
52
-# ================================================================================================
53
-# ===================================== HANDLING OF METADATA =====================================
54
-# ================================================================================================
55
-
56
-_PYTHON_ABI_PATTERN_REGEX="([[:alnum:]]|\.|-|\*|\[|\])+"
57
-
58
-_python_check_python_abi_matching() {
59
-	local pattern patterns patterns_list="0" PYTHON_ABI
60
-
61
-	while (($#)); do
62
-		case "$1" in
63
-			--patterns-list)
64
-				patterns_list="1"
65
-				;;
66
-			--)
67
-				shift
68
-				break
69
-				;;
70
-			-*)
71
-				die "${FUNCNAME}(): Unrecognized option '$1'"
72
-				;;
73
-			*)
74
-				break
75
-				;;
76
-		esac
77
-		shift
78
-	done
79
-
80
-	if [[ "$#" -ne 2 ]]; then
81
-		die "${FUNCNAME}() requires 2 arguments"
82
-	fi
83
-
84
-	PYTHON_ABI="$1"
85
-
86
-	if [[ "${patterns_list}" == "0" ]]; then
87
-		pattern="$2"
88
-
89
-		if [[ "${pattern}" == *"-cpython" ]]; then
90
-			[[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "${PYTHON_ABI}" == ${pattern%-cpython} ]]
91
-		elif [[ "${pattern}" == *"-jython" ]]; then
92
-			[[ "${PYTHON_ABI}" == ${pattern} ]]
93
-		elif [[ "${pattern}" == *"-pypy-"* ]]; then
94
-			[[ "${PYTHON_ABI}" == ${pattern} ]]
95
-		else
96
-			if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
97
-				[[ "${PYTHON_ABI}" == ${pattern} ]]
98
-			elif [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
99
-				[[ "${PYTHON_ABI%-jython}" == ${pattern} ]]
100
-			elif [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then
101
-				[[ "${PYTHON_ABI%-pypy-*}" == ${pattern} ]]
102
-			else
103
-				die "${FUNCNAME}(): Unrecognized Python ABI '${PYTHON_ABI}'"
104
-			fi
105
-		fi
106
-	else
107
-		patterns="${2// /$'\n'}"
108
-
109
-		while read pattern; do
110
-			if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
111
-				return 0
112
-			fi
113
-		done <<< "${patterns}"
114
-
115
-		return 1
116
-	fi
117
-}
118
-
119
-_python_implementation() {
120
-	if [[ "${CATEGORY}/${PN}" == "dev-lang/python" ]]; then
121
-		return 0
122
-	elif [[ "${CATEGORY}/${PN}" == "dev-java/jython" ]]; then
123
-		return 0
124
-	elif [[ "${CATEGORY}/${PN}" == "virtual/pypy" ]]; then
125
-		return 0
126
-	else
127
-		return 1
128
-	fi
129
-}
130
-
131
-_python_package_supporting_installation_for_multiple_python_abis() {
132
-	[[ -n "${SUPPORT_PYTHON_ABIS}" ]]
133
-}
134
-
135
-# @ECLASS-VARIABLE: PYTHON_DEPEND
136
-# @DESCRIPTION:
137
-# Specification of dependency on dev-lang/python.
138
-# Syntax:
139
-#   PYTHON_DEPEND:             [[!]USE_flag? ]<version_components_group>[ version_components_group]
140
-#   version_components_group:  <major_version[:[minimal_version][:maximal_version]]>
141
-#   major_version:             <2|3|*>
142
-#   minimal_version:           <minimal_major_version.minimal_minor_version>
143
-#   maximal_version:           <maximal_major_version.maximal_minor_version>
144
-
145
-_python_parse_PYTHON_DEPEND() {
146
-	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
147
-
148
-	version_components_group_regex="(2|3|\*)(:([[:digit:]]+\.[[:digit:]]+)?(:([[:digit:]]+\.[[:digit:]]+)?)?)?"
149
-	version_components_groups="${PYTHON_DEPEND}"
150
-
151
-	if [[ "${version_components_groups}" =~ ^((\!)?[[:alnum:]_-]+\?\ )?${version_components_group_regex}(\ ${version_components_group_regex})?$ ]]; then
152
-		if [[ "${version_components_groups}" =~ ^(\!)?[[:alnum:]_-]+\? ]]; then
153
-			USE_flag="${version_components_groups%\? *}"
154
-			version_components_groups="${version_components_groups#* }"
155
-		fi
156
-		if [[ "${version_components_groups}" =~ ("*".*" "|" *"|^2.*\ (2|\*)|^3.*\ (3|\*)) ]]; then
157
-			die "Invalid syntax of PYTHON_DEPEND: Incorrectly specified groups of versions"
158
-		fi
159
-
160
-		version_components_groups="${version_components_groups// /$'\n'}"
161
-		while read version_components_group; do
162
-			major_version="${version_components_group:0:1}"
163
-			minimal_version="${version_components_group:2}"
164
-			minimal_version="${minimal_version%:*}"
165
-			maximal_version="${version_components_group:$((3 + ${#minimal_version}))}"
166
-
167
-			if [[ "${major_version}" =~ ^(2|3)$ ]]; then
168
-				if [[ -n "${minimal_version}" && "${major_version}" != "${minimal_version:0:1}" ]]; then
169
-					die "Invalid syntax of PYTHON_DEPEND: Minimal version '${minimal_version}' not in specified group of versions"
170
-				fi
171
-				if [[ -n "${maximal_version}" && "${major_version}" != "${maximal_version:0:1}" ]]; then
172
-					die "Invalid syntax of PYTHON_DEPEND: Maximal version '${maximal_version}' not in specified group of versions"
173
-				fi
174
-			fi
175
-
176
-			if [[ "${major_version}" == "2" ]]; then
177
-				python2="1"
178
-				python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
179
-				python2_minimal_version="${minimal_version}"
180
-				python2_maximal_version="${maximal_version}"
181
-			elif [[ "${major_version}" == "3" ]]; then
182
-				python3="1"
183
-				python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
184
-				python3_minimal_version="${minimal_version}"
185
-				python3_maximal_version="${maximal_version}"
186
-			else
187
-				python_all="1"
188
-				python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
189
-				python_minimal_version="${minimal_version}"
190
-				python_maximal_version="${maximal_version}"
191
-			fi
192
-
193
-			if [[ -n "${minimal_version}" ]] && ! has "${minimal_version}" "${python_versions[@]}"; then
194
-				die "Invalid syntax of PYTHON_DEPEND: Unrecognized minimal version '${minimal_version}'"
195
-			fi
196
-			if [[ -n "${maximal_version}" ]] && ! has "${maximal_version}" "${python_versions[@]}"; then
197
-				die "Invalid syntax of PYTHON_DEPEND: Unrecognized maximal version '${maximal_version}'"
198
-			fi
199
-
200
-			if [[ -n "${minimal_version}" && -n "${maximal_version}" && "${minimal_version}" > "${maximal_version}" ]]; then
201
-				die "Invalid syntax of PYTHON_DEPEND: Minimal version '${minimal_version}' greater than maximal version '${maximal_version}'"
202
-			fi
203
-		done <<< "${version_components_groups}"
204
-
205
-		_PYTHON_ATOMS=()
206
-
207
-		_append_accepted_versions_range() {
208
-			local accepted_version="0" i
209
-			for ((i = "${#python_versions[@]}"; i >= 0; i--)); do
210
-				if [[ "${python_versions[${i}]}" == "${python_maximal_version}" ]]; then
211
-					accepted_version="1"
212
-				fi
213
-				if [[ "${accepted_version}" == "1" ]]; then
214
-					_PYTHON_ATOMS+=("=dev-lang/python-${python_versions[${i}]}*")
215
-				fi
216
-				if [[ "${python_versions[${i}]}" == "${python_minimal_version}" ]]; then
217
-					accepted_version="0"
218
-				fi
219
-			done
220
-		}
221
-
222
-		if [[ "${python_all}" == "1" ]]; then
223
-			if [[ -z "${python_minimal_version}" && -z "${python_maximal_version}" ]]; then
224
-				_PYTHON_ATOMS+=("dev-lang/python")
225
-			else
226
-				python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
227
-				python_minimal_version="${python_minimal_version:-${python_versions[0]}}"
228
-				python_maximal_version="${python_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
229
-				_append_accepted_versions_range
230
-			fi
231
-		else
232
-			if [[ "${python3}" == "1" ]]; then
233
-				if [[ -z "${python3_minimal_version}" && -z "${python3_maximal_version}" ]]; then
234
-					_PYTHON_ATOMS+=("=dev-lang/python-3*")
235
-				else
236
-					python_versions=("${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}")
237
-					python_minimal_version="${python3_minimal_version:-${python_versions[0]}}"
238
-					python_maximal_version="${python3_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
239
-					_append_accepted_versions_range
240
-				fi
241
-			fi
242
-			if [[ "${python2}" == "1" ]]; then
243
-				if [[ -z "${python2_minimal_version}" && -z "${python2_maximal_version}" ]]; then
244
-					_PYTHON_ATOMS+=("=dev-lang/python-2*")
245
-				else
246
-					python_versions=("${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}")
247
-					python_minimal_version="${python2_minimal_version:-${python_versions[0]}}"
248
-					python_maximal_version="${python2_maximal_version:-${python_versions[${#python_versions[@]}-1]}}"
249
-					_append_accepted_versions_range
250
-				fi
251
-			fi
252
-		fi
253
-
254
-		unset -f _append_accepted_versions_range
255
-
256
-		if [[ "${#_PYTHON_ATOMS[@]}" -gt 1 ]]; then
257
-			DEPEND+="${DEPEND:+ }${USE_flag}${USE_flag:+? ( }|| ( ${_PYTHON_ATOMS[@]} )${USE_flag:+ )}"
258
-			RDEPEND+="${RDEPEND:+ }${USE_flag}${USE_flag:+? ( }|| ( ${_PYTHON_ATOMS[@]} )${USE_flag:+ )}"
259
-		else
260
-			DEPEND+="${DEPEND:+ }${USE_flag}${USE_flag:+? ( }${_PYTHON_ATOMS[@]}${USE_flag:+ )}"
261
-			RDEPEND+="${RDEPEND:+ }${USE_flag}${USE_flag:+? ( }${_PYTHON_ATOMS[@]}${USE_flag:+ )}"
262
-		fi
263
-	else
264
-		die "Invalid syntax of PYTHON_DEPEND"
265
-	fi
266
-}
267
-
268
-if _python_implementation; then
269
-	DEPEND=">=app-eselect/eselect-python-20091230"
270
-	RDEPEND="${DEPEND}"
271
-	PDEPEND="app-admin/python-updater"
272
-fi
273
-
274
-if [[ -n "${PYTHON_DEPEND}" ]]; then
275
-	_python_parse_PYTHON_DEPEND
276
-else
277
-	_PYTHON_ATOMS=("dev-lang/python")
278
-fi
279
-unset -f _python_parse_PYTHON_DEPEND
280
-
281
-if [[ -n "${NEED_PYTHON}" ]]; then
282
-	eerror "Use PYTHON_DEPEND variable instead of NEED_PYTHON variable."
283
-	die "NEED_PYTHON variable is banned"
284
-fi
285
-
286
-# @ECLASS-VARIABLE: PYTHON_USE_WITH
287
-# @DESCRIPTION:
288
-# Set this to a space separated list of USE flags the Python slot in use must be built with.
289
-
290
-# @ECLASS-VARIABLE: PYTHON_USE_WITH_OR
291
-# @DESCRIPTION:
292
-# Set this to a space separated list of USE flags of which one must be turned on for the slot in use.
293
-
294
-# @ECLASS-VARIABLE: PYTHON_USE_WITH_OPT
295
-# @DESCRIPTION:
296
-# Set this to a name of a USE flag if you need to make either PYTHON_USE_WITH or
297
-# PYTHON_USE_WITH_OR atoms conditional under a USE flag.
298
-
299
-if ! has "${EAPI:-0}" 0 1 && [[ -n ${PYTHON_USE_WITH} || -n ${PYTHON_USE_WITH_OR} ]]; then
300
-	_PYTHON_USE_WITH_ATOMS_ARRAY=()
301
-	if [[ -n "${PYTHON_USE_WITH}" ]]; then
302
-		for _PYTHON_ATOM in "${_PYTHON_ATOMS[@]}"; do
303
-			_PYTHON_USE_WITH_ATOMS_ARRAY+=("${_PYTHON_ATOM}[${PYTHON_USE_WITH// /,}]")
304
-		done
305
-	elif [[ -n "${PYTHON_USE_WITH_OR}" ]]; then
306
-		for _USE_flag in ${PYTHON_USE_WITH_OR}; do
307
-			for _PYTHON_ATOM in "${_PYTHON_ATOMS[@]}"; do
308
-				_PYTHON_USE_WITH_ATOMS_ARRAY+=("${_PYTHON_ATOM}[${_USE_flag}]")
309
-			done
310
-		done
311
-		unset _USE_flag
312
-	fi
313
-	if [[ "${#_PYTHON_USE_WITH_ATOMS_ARRAY[@]}" -gt 1 ]]; then
314
-		_PYTHON_USE_WITH_ATOMS="|| ( ${_PYTHON_USE_WITH_ATOMS_ARRAY[@]} )"
315
-	else
316
-		_PYTHON_USE_WITH_ATOMS="${_PYTHON_USE_WITH_ATOMS_ARRAY[@]}"
317
-	fi
318
-	if [[ -n "${PYTHON_USE_WITH_OPT}" ]]; then
319
-		_PYTHON_USE_WITH_ATOMS="${PYTHON_USE_WITH_OPT}? ( ${_PYTHON_USE_WITH_ATOMS} )"
320
-	fi
321
-	DEPEND+="${DEPEND:+ }${_PYTHON_USE_WITH_ATOMS}"
322
-	RDEPEND+="${RDEPEND:+ }${_PYTHON_USE_WITH_ATOMS}"
323
-	unset _PYTHON_ATOM _PYTHON_USE_WITH_ATOMS _PYTHON_USE_WITH_ATOMS_ARRAY
324
-fi
325
-
326
-unset _PYTHON_ATOMS
327
-
328
-# ================================================================================================
329
-# =================================== MISCELLANEOUS FUNCTIONS ====================================
330
-# ================================================================================================
331
-
332
-_python_abi-specific_local_scope() {
333
-	[[ " ${FUNCNAME[@]:2} " =~ " "(_python_final_sanity_checks|python_execute_function|python_mod_optimize|python_mod_cleanup)" " ]]
334
-}
335
-
336
-_python_initialize_prefix_variables() {
337
-	if has "${EAPI:-0}" 0 1 2; then
338
-		if [[ -n "${ROOT}" && -z "${EROOT}" ]]; then
339
-			EROOT="${ROOT%/}${EPREFIX}/"
340
-		fi
341
-		if [[ -n "${D}" && -z "${ED}" ]]; then
342
-			ED="${D%/}${EPREFIX}/"
343
-		fi
344
-	fi
345
-}
346
-
347
-unset PYTHON_SANITY_CHECKS_EXECUTED PYTHON_SKIP_SANITY_CHECKS
348
-
349
-_python_initial_sanity_checks() {
350
-	:
351
-}
352
-
353
-_python_final_sanity_checks() {
354
-	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
355
-		local PYTHON_ABI="${PYTHON_ABI}"
356
-		for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI}}; do
357
-			# Ensure that appropriate version of Python is installed.
358
-			if ! has_version "$(python_get_implementational_package)"; then
359
-				die "$(python_get_implementational_package) is not installed"
360
-			fi
361
-
362
-			# Ensure that EPYTHON variable is respected.
363
-			if [[ "$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")" != "${PYTHON_ABI}" ]]; then
364
-				eerror "Path to 'python':                 '$(type -p python)'"
365
-				eerror "ABI:                              '${ABI}'"
366
-				eerror "DEFAULT_ABI:                      '${DEFAULT_ABI}'"
367
-				eerror "EPYTHON:                          '$(PYTHON)'"
368
-				eerror "PYTHON_ABI:                       '${PYTHON_ABI}'"
369
-				eerror "Locally active version of Python: '$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")'"
370
-				die "'python' does not respect EPYTHON variable"
371
-			fi
372
-		done
373
-	fi
374
-	PYTHON_SANITY_CHECKS_EXECUTED="1"
375
-}
376
-
377
-# @ECLASS-VARIABLE: PYTHON_COLORS
378
-# @DESCRIPTION:
379
-# User-configurable colored output.
380
-PYTHON_COLORS="${PYTHON_COLORS:-0}"
381
-
382
-_python_set_color_variables() {
383
-	if [[ "${PYTHON_COLORS}" != "0" && "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then
384
-		_BOLD=$'\e[1m'
385
-		_RED=$'\e[1;31m'
386
-		_GREEN=$'\e[1;32m'
387
-		_BLUE=$'\e[1;34m'
388
-		_CYAN=$'\e[1;36m'
389
-		_NORMAL=$'\e[0m'
390
-	else
391
-		_BOLD=
392
-		_RED=
393
-		_GREEN=
394
-		_BLUE=
395
-		_CYAN=
396
-		_NORMAL=
397
-	fi
398
-}
399
-
400
-_python_check_python_pkg_setup_execution() {
401
-	[[ " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " ]] && return
402
-
403
-	if ! has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_PKG_SETUP_EXECUTED}" ]]; then
404
-		die "python_pkg_setup() not called"
405
-	fi
406
-}
407
-
408
-# @FUNCTION: python_pkg_setup
409
-# @DESCRIPTION:
410
-# Perform sanity checks and initialize environment.
411
-#
412
-# This function is exported in EAPI 2 and 3 when PYTHON_USE_WITH or PYTHON_USE_WITH_OR variable
413
-# is set and always in EAPI >=4. Calling of this function is mandatory in EAPI >=4.
414
-python_pkg_setup() {
415
-	if [[ "${EBUILD_PHASE}" != "setup" ]]; then
416
-		die "${FUNCNAME}() can be used only in pkg_setup() phase"
417
-	fi
418
-
419
-	if [[ "$#" -ne 0 ]]; then
420
-		die "${FUNCNAME}() does not accept arguments"
421
-	fi
422
-
423
-	export JYTHON_SYSTEM_CACHEDIR="1"
424
-	addwrite "${EPREFIX}/var/cache/jython"
425
-
426
-	if _python_package_supporting_installation_for_multiple_python_abis; then
427
-		_python_calculate_PYTHON_ABIS
428
-		export EPYTHON="$(PYTHON -f)"
429
-	else
430
-		PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
431
-	fi
432
-
433
-	if ! has "${EAPI:-0}" 0 1 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; then
434
-		if [[ "${PYTHON_USE_WITH_OPT}" ]]; then
435
-			if [[ "${PYTHON_USE_WITH_OPT}" == !* ]]; then
436
-				use ${PYTHON_USE_WITH_OPT#!} && return
437
-			else
438
-				use !${PYTHON_USE_WITH_OPT} && return
439
-			fi
440
-		fi
441
-
442
-		python_pkg_setup_check_USE_flags() {
443
-			local python_atom USE_flag
444
-			python_atom="$(python_get_implementational_package)"
445
-
446
-			for USE_flag in ${PYTHON_USE_WITH}; do
447
-				if ! has_version "${python_atom}[${USE_flag}]"; then
448
-					eerror "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"
449
-					die "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"
450
-				fi
451
-			done
452
-
453
-			for USE_flag in ${PYTHON_USE_WITH_OR}; do
454
-				if has_version "${python_atom}[${USE_flag}]"; then
455
-					return
456
-				fi
457
-			done
458
-
459
-			if [[ ${PYTHON_USE_WITH_OR} ]]; then
460
-				eerror "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"
461
-				die "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"
462
-			fi
463
-		}
464
-
465
-		if _python_package_supporting_installation_for_multiple_python_abis; then
466
-			PYTHON_SKIP_SANITY_CHECKS="1" python_execute_function -q python_pkg_setup_check_USE_flags
467
-		else
468
-			python_pkg_setup_check_USE_flags
469
-		fi
470
-
471
-		unset -f python_pkg_setup_check_USE_flags
472
-	fi
473
-
474
-	PYTHON_PKG_SETUP_EXECUTED="1"
475
-}
476
-
477
-_PYTHON_SHEBANG_BASE_PART_REGEX='^#![[:space:]]*([^[:space:]]*/usr/bin/env[[:space:]]+)?([^[:space:]]*/)?(jython|pypy-c|python)'
478
-
479
-# @FUNCTION: python_convert_shebangs
480
-# @USAGE: [-q|--quiet] [-r|--recursive] [-x|--only-executables] [--] <Python_ABI|Python_version> <file|directory> [files|directories]
481
-# @DESCRIPTION:
482
-# Convert shebangs in specified files. Directories can be specified only with --recursive option.
483
-python_convert_shebangs() {
484
-	_python_check_python_pkg_setup_execution
485
-
486
-	local argument file files=() only_executables="0" python_interpreter quiet="0" recursive="0" shebangs_converted="0"
487
-
488
-	while (($#)); do
489
-		case "$1" in
490
-			-r|--recursive)
491
-				recursive="1"
492
-				;;
493
-			-q|--quiet)
494
-				quiet="1"
495
-				;;
496
-			-x|--only-executables)
497
-				only_executables="1"
498
-				;;
499
-			--)
500
-				shift
501
-				break
502
-				;;
503
-			-*)
504
-				die "${FUNCNAME}(): Unrecognized option '$1'"
505
-				;;
506
-			*)
507
-				break
508
-				;;
509
-		esac
510
-		shift
511
-	done
512
-
513
-	if [[ "$#" -eq 0 ]]; then
514
-		die "${FUNCNAME}(): Missing Python version and files or directories"
515
-	elif [[ "$#" -eq 1 ]]; then
516
-		die "${FUNCNAME}(): Missing files or directories"
517
-	fi
518
-
519
-	if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
520
-		python_interpreter="$(PYTHON "$1")"
521
-	else
522
-		python_interpreter="python$1"
523
-	fi
524
-	shift
525
-
526
-	for argument in "$@"; do
527
-		if [[ ! -e "${argument}" ]]; then
528
-			die "${FUNCNAME}(): '${argument}' does not exist"
529
-		elif [[ -f "${argument}" ]]; then
530
-			files+=("${argument}")
531
-		elif [[ -d "${argument}" ]]; then
532
-			if [[ "${recursive}" == "1" ]]; then
533
-				while read -d $'\0' -r file; do
534
-					files+=("${file}")
535
-				done < <(find "${argument}" $([[ "${only_executables}" == "1" ]] && echo -perm /111) -type f -print0)
536
-			else
537
-				die "${FUNCNAME}(): '${argument}' is not a regular file"
538
-			fi
539
-		else
540
-			die "${FUNCNAME}(): '${argument}' is not a regular file or a directory"
541
-		fi
542
-	done
543
-
544
-	for file in "${files[@]}"; do
545
-		file="${file#./}"
546
-		[[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue
547
-
548
-		if [[ "$(head -n1 "${file}")" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX} ]]; then
549
-			[[ "$(sed -ne "2p" "${file}")" =~ ^"# Gentoo '".*"' wrapper script generated by python_generate_wrapper_scripts()"$ ]] && continue
550
-
551
-			shebangs_converted="1"
552
-
553
-			if [[ "${quiet}" == "0" ]]; then
554
-				einfo "Converting shebang in '${file}'"
555
-			fi
556
-
557
-			sed -e "1s:^#![[:space:]]*\([^[:space:]]*/usr/bin/env[[:space:]]\)\?[[:space:]]*\([^[:space:]]*/\)\?\(jython\|pypy-c\|python\)\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?\(\$\|[[:space:]].*\):#!\1\2${python_interpreter}\6:" -i "${file}" || die "Conversion of shebang in '${file}' failed"
558
-		fi
559
-	done
560
-
561
-	if [[ "${shebangs_converted}" == "0" ]]; then
562
-		ewarn "${FUNCNAME}(): Python scripts not found"
563
-	fi
564
-}
565
-
566
-# @FUNCTION: python_clean_py-compile_files
567
-# @USAGE: [-q|--quiet]
568
-# @DESCRIPTION:
569
-# Clean py-compile files to disable byte-compilation.
570
-python_clean_py-compile_files() {
571
-	_python_check_python_pkg_setup_execution
572
-
573
-	local file files=() quiet="0"
574
-
575
-	while (($#)); do
576
-		case "$1" in
577
-			-q|--quiet)
578
-				quiet="1"
579
-				;;
580
-			-*)
581
-				die "${FUNCNAME}(): Unrecognized option '$1'"
582
-				;;
583
-			*)
584
-				die "${FUNCNAME}(): Invalid usage"
585
-				;;
586
-		esac
587
-		shift
588
-	done
589
-
590
-	while read -d $'\0' -r file; do
591
-		files+=("${file#./}")
592
-	done < <(find -name py-compile -type f -print0)
593
-
594
-	for file in "${files[@]}"; do
595
-		if [[ "${quiet}" == "0" ]]; then
596
-			einfo "Cleaning '${file}' file"
597
-		fi
598
-		echo "#!/bin/sh" > "${file}"
599
-	done
600
-}
601
-
602
-# @FUNCTION: python_clean_installation_image
603
-# @USAGE: [-q|--quiet]
604
-# @DESCRIPTION:
605
-# Delete needless files in installation image.
606
-#
607
-# This function can be used only in src_install() phase.
608
-python_clean_installation_image() {
609
-	if [[ "${EBUILD_PHASE}" != "install" ]]; then
610
-		die "${FUNCNAME}() can be used only in src_install() phase"
611
-	fi
612
-
613
-	_python_check_python_pkg_setup_execution
614
-	_python_initialize_prefix_variables
615
-
616
-	local file files=() quiet="0"
617
-
618
-	while (($#)); do
619
-		case "$1" in
620
-			-q|--quiet)
621
-				quiet="1"
622
-				;;
623
-			-*)
624
-				die "${FUNCNAME}(): Unrecognized option '$1'"
625
-				;;
626
-			*)
627
-				die "${FUNCNAME}(): Invalid usage"
628
-				;;
629
-		esac
630
-		shift
631
-	done
632
-
633
-	while read -d $'\0' -r file; do
634
-		files+=("${file}")
635
-	done < <(find "${ED}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -type f -print0)
636
-
637
-	if [[ "${#files[@]}" -gt 0 ]]; then
638
-		if [[ "${quiet}" == "0" ]]; then
639
-			ewarn "Deleting byte-compiled Python modules needlessly generated by build system:"
640
-		fi
641
-		for file in "${files[@]}"; do
642
-			if [[ "${quiet}" == "0" ]]; then
643
-				ewarn " ${file}"
644
-			fi
645
-			rm -f "${file}"
646
-
647
-			# Delete empty __pycache__ directories.
648
-			if [[ "${file%/*}" == *"/__pycache__" ]]; then
649
-				rmdir "${file%/*}" 2> /dev/null
650
-			fi
651
-		done
652
-	fi
653
-
654
-	python_clean_sitedirs() {
655
-		if [[ -d "${ED}$(python_get_sitedir)" ]]; then
656
-			find "${ED}$(python_get_sitedir)" "(" -name "*.c" -o -name "*.h" -o -name "*.la" ")" -type f -print0 | xargs -0 rm -f
657
-		fi
658
-	}
659
-	if _python_package_supporting_installation_for_multiple_python_abis; then
660
-		python_execute_function -q python_clean_sitedirs
661
-	else
662
-		python_clean_sitedirs
663
-	fi
664
-
665
-	unset -f python_clean_sitedirs
666
-}
667
-
668
-# ================================================================================================
669
-# =========== FUNCTIONS FOR PACKAGES SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ============
670
-# ================================================================================================
671
-
672
-# @ECLASS-VARIABLE: SUPPORT_PYTHON_ABIS
673
-# @DESCRIPTION:
674
-# Set this in EAPI <= 4 to indicate that current package supports installation for
675
-# multiple Python ABIs.
676
-
677
-# @ECLASS-VARIABLE: PYTHON_TESTS_RESTRICTED_ABIS
678
-# @DESCRIPTION:
679
-# Space-separated list of Python ABI patterns. Testing in Python ABIs matching any Python ABI
680
-# patterns specified in this list is skipped.
681
-
682
-# @ECLASS-VARIABLE: PYTHON_EXPORT_PHASE_FUNCTIONS
683
-# @DESCRIPTION:
684
-# Set this to export phase functions for the following ebuild phases:
685
-# src_prepare(), src_configure(), src_compile(), src_test(), src_install().
686
-if ! has "${EAPI:-0}" 0 1; then
687
-	python_src_prepare() {
688
-		if [[ "${EBUILD_PHASE}" != "prepare" ]]; then
689
-			die "${FUNCNAME}() can be used only in src_prepare() phase"
690
-		fi
691
-
692
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
693
-			die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
694
-		fi
695
-
696
-		_python_check_python_pkg_setup_execution
697
-
698
-		if [[ "$#" -ne 0 ]]; then
699
-			die "${FUNCNAME}() does not accept arguments"
700
-		fi
701
-
702
-		python_copy_sources
703
-	}
704
-
705
-	for python_default_function in src_configure src_compile src_test; do
706
-		eval "python_${python_default_function}() {
707
-			if [[ \"\${EBUILD_PHASE}\" != \"${python_default_function#src_}\" ]]; then
708
-				die \"\${FUNCNAME}() can be used only in ${python_default_function}() phase\"
709
-			fi
710
-
711
-			if ! _python_package_supporting_installation_for_multiple_python_abis; then
712
-				die \"\${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs\"
713
-			fi
714
-
715
-			_python_check_python_pkg_setup_execution
716
-
717
-			python_execute_function -d -s -- \"\$@\"
718
-		}"
719
-	done
720
-	unset python_default_function
721
-
722
-	python_src_install() {
723
-		if [[ "${EBUILD_PHASE}" != "install" ]]; then
724
-			die "${FUNCNAME}() can be used only in src_install() phase"
725
-		fi
726
-
727
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
728
-			die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
729
-		fi
730
-
731
-		_python_check_python_pkg_setup_execution
732
-
733
-		if has "${EAPI:-0}" 0 1 2 3; then
734
-			python_execute_function -d -s -- "$@"
735
-		else
736
-			python_installation() {
737
-				emake DESTDIR="${T}/images/${PYTHON_ABI}" install "$@"
738
-			}
739
-			python_execute_function -s python_installation "$@"
740
-			unset python_installation
741
-
742
-			python_merge_intermediate_installation_images "${T}/images"
743
-		fi
744
-	}
745
-
746
-	if [[ -n "${PYTHON_EXPORT_PHASE_FUNCTIONS}" ]]; then
747
-		EXPORT_FUNCTIONS src_prepare src_configure src_compile src_test src_install
748
-	fi
749
-fi
750
-
751
-unset PYTHON_ABIS
752
-
753
-_python_calculate_PYTHON_ABIS() {
754
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
755
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
756
-	fi
757
-
758
-	_python_initial_sanity_checks
759
-
760
-	if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]]; then
761
-		local PYTHON_ABI
762
-
763
-		if [[ "$(declare -p USE_PYTHON 2> /dev/null)" == "declare -x USE_PYTHON="* ]]; then
764
-			local cpython_enabled="0"
765
-
766
-			if [[ -z "${USE_PYTHON}" ]]; then
767
-				die "USE_PYTHON variable is empty"
768
-			fi
769
-
770
-			for PYTHON_ABI in ${USE_PYTHON}; do
771
-				if ! has "${PYTHON_ABI}" "${_PYTHON_GLOBALLY_SUPPORTED_ABIS[@]}"; then
772
-					die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'"
773
-				fi
774
-
775
-				if has "${PYTHON_ABI}" "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; then
776
-					cpython_enabled="1"
777
-				fi
778
-
779
-				if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
780
-					export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}"
781
-				fi
782
-			done
783
-
784
-			if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then
785
-				die "USE_PYTHON variable does not enable any Python ABI supported by ${CATEGORY}/${PF}"
786
-			fi
787
-
788
-			if [[ "${cpython_enabled}" == "0" ]]; then
789
-				die "USE_PYTHON variable does not enable any CPython ABI"
790
-			fi
791
-		else
792
-			local python_version python2_version python3_version support_python_major_version
793
-
794
-			if ! has_version "dev-lang/python"; then
795
-				die "${FUNCNAME}(): 'dev-lang/python' is not installed"
796
-			fi
797
-
798
-			python_version="$("${EPREFIX}/usr/bin/python" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
799
-
800
-			if has_version "=dev-lang/python-2*"; then
801
-				python2_version="$("${EPREFIX}/usr/bin/python2" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
802
-
803
-				support_python_major_version="0"
804
-				for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
805
-					if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
806
-						support_python_major_version="1"
807
-						break
808
-					fi
809
-				done
810
-				if [[ "${support_python_major_version}" == "1" ]]; then
811
-					if _python_check_python_abi_matching --patterns-list "${python2_version}" "${RESTRICT_PYTHON_ABIS}"; then
812
-						die "Active version of CPython 2 is not supported by ${CATEGORY}/${PF}"
813
-					fi
814
-				else
815
-					python2_version=""
816
-				fi
817
-			fi
818
-
819
-			if has_version "=dev-lang/python-3*"; then
820
-				python3_version="$("${EPREFIX}/usr/bin/python3" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"
821
-
822
-				support_python_major_version="0"
823
-				for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
824
-					if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
825
-						support_python_major_version="1"
826
-						break
827
-					fi
828
-				done
829
-				if [[ "${support_python_major_version}" == "1" ]]; then
830
-					if _python_check_python_abi_matching --patterns-list "${python3_version}" "${RESTRICT_PYTHON_ABIS}"; then
831
-						die "Active version of CPython 3 is not supported by ${CATEGORY}/${PF}"
832
-					fi
833
-				else
834
-					python3_version=""
835
-				fi
836
-			fi
837
-
838
-			if [[ -z "${python2_version}" && -z "${python3_version}" ]]; then
839
-				eerror "${CATEGORY}/${PF} requires at least one of the following packages:"
840
-				for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
841
-					if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then
842
-						eerror "    dev-lang/python:${PYTHON_ABI}"
843
-					fi
844
-				done
845
-				die "No supported version of CPython installed"
846
-			fi
847
-
848
-			if [[ -n "${python2_version}" && "${python_version}" == "2."* && "${python_version}" != "${python2_version}" ]]; then
849
-				eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python2' symlink"
850
-				eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
851
-				die "Incorrect configuration of Python"
852
-			fi
853
-			if [[ -n "${python3_version}" && "${python_version}" == "3."* && "${python_version}" != "${python3_version}" ]]; then
854
-				eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python3' symlink"
855
-				eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
856
-				die "Incorrect configuration of Python"
857
-			fi
858
-
859
-			PYTHON_ABIS="${python2_version} ${python3_version}"
860
-			PYTHON_ABIS="${PYTHON_ABIS# }"
861
-			export PYTHON_ABIS="${PYTHON_ABIS% }"
862
-		fi
863
-	fi
864
-
865
-	_python_final_sanity_checks
866
-}
867
-
868
-_python_prepare_flags() {
869
-	local array=() deleted_flag element flags new_value old_flag old_value operator pattern prefix variable
870
-
871
-	for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do
872
-		eval "_PYTHON_SAVED_${variable}=\"\${!variable}\""
873
-		for prefix in PYTHON_USER_ PYTHON_; do
874
-			if [[ "$(declare -p ${prefix}${variable} 2> /dev/null)" == "declare -a ${prefix}${variable}="* ]]; then
875
-				eval "array=(\"\${${prefix}${variable}[@]}\")"
876
-				for element in "${array[@]}"; do
877
-					if [[ "${element}" =~ ^${_PYTHON_ABI_PATTERN_REGEX}\ (\+|-)\ .+ ]]; then
878
-						pattern="${element%% *}"
879
-						element="${element#* }"
880
-						operator="${element%% *}"
881
-						flags="${element#* }"
882
-						if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then
883
-							if [[ "${operator}" == "+" ]]; then
884
-								eval "export ${variable}+=\"\${variable:+ }${flags}\""
885
-							elif [[ "${operator}" == "-" ]]; then
886
-								flags="${flags// /$'\n'}"
887
-								old_value="${!variable// /$'\n'}"
888
-								new_value=""
889
-								while read old_flag; do
890
-									while read deleted_flag; do
891
-										if [[ "${old_flag}" == ${deleted_flag} ]]; then
892
-											continue 2
893
-										fi
894
-									done <<< "${flags}"
895
-									new_value+="${new_value:+ }${old_flag}"
896
-								done <<< "${old_value}"
897
-								eval "export ${variable}=\"\${new_value}\""
898
-							fi
899
-						fi
900
-					else
901
-						die "Element '${element}' of ${prefix}${variable} array has invalid syntax"
902
-					fi
903
-				done
904
-			elif [[ -n "$(declare -p ${prefix}${variable} 2> /dev/null)" ]]; then
905
-				die "${prefix}${variable} should be indexed array"
906
-			fi
907
-		done
908
-	done
909
-}
910
-
911
-_python_restore_flags() {
912
-	local variable
913
-
914
-	for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do
915
-		eval "${variable}=\"\${_PYTHON_SAVED_${variable}}\""
916
-		unset _PYTHON_SAVED_${variable}
917
-	done
918
-}
919
-
920
-# @FUNCTION: python_execute_function
921
-# @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]
922
-# @DESCRIPTION:
923
-# Execute specified function for each value of PYTHON_ABIS, optionally passing additional
924
-# arguments. The specified function can use PYTHON_ABI and BUILDDIR variables.
925
-python_execute_function() {
926
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
927
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
928
-	fi
929
-
930
-	_python_check_python_pkg_setup_execution
931
-	_python_set_color_variables
932
-
933
-	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
934
-
935
-	while (($#)); do
936
-		case "$1" in
937
-			--action-message)
938
-				action_message_template="$2"
939
-				shift
940
-				;;
941
-			-d|--default-function)
942
-				default_function="1"
943
-				;;
944
-			--failure-message)
945
-				failure_message_template="$2"
946
-				shift
947
-				;;
948
-			-f|--final-ABI)
949
-				final_ABI="1"
950
-				;;
951
-			--nonfatal)
952
-				nonfatal="1"
953
-				;;
954
-			-q|--quiet)
955
-				quiet="1"
956
-				;;
957
-			-s|--separate-build-dirs)
958
-				separate_build_dirs="1"
959
-				;;
960
-			--source-dir)
961
-				source_dir="$2"
962
-				shift
963
-				;;
964
-			--)
965
-				shift
966
-				break
967
-				;;
968
-			-*)
969
-				die "${FUNCNAME}(): Unrecognized option '$1'"
970
-				;;
971
-			*)
972
-				break
973
-				;;
974
-		esac
975
-		shift
976
-	done
977
-
978
-	if [[ -n "${source_dir}" && "${separate_build_dirs}" == 0 ]]; then
979
-		die "${FUNCNAME}(): '--source-dir' option can be specified only with '--separate-build-dirs' option"
980
-	fi
981
-
982
-	if [[ "${default_function}" == "0" ]]; then
983
-		if [[ "$#" -eq 0 ]]; then
984
-			die "${FUNCNAME}(): Missing function name"
985
-		fi
986
-		function="$1"
987
-		shift
988
-
989
-		if [[ -z "$(type -t "${function}")" ]]; then
990
-			die "${FUNCNAME}(): '${function}' function is not defined"
991
-		fi
992
-	else
993
-		if has "${EAPI:-0}" 0 1; then
994
-			die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI"
995
-		fi
996
-
997
-		if [[ "${EBUILD_PHASE}" == "configure" ]]; then
998
-			if has "${EAPI}" 2 3; then
999
-				python_default_function() {
1000
-					econf "$@"
1001
-				}
1002
-			else
1003
-				python_default_function() {
1004
-					nonfatal econf "$@"
1005
-				}
1006
-			fi
1007
-		elif [[ "${EBUILD_PHASE}" == "compile" ]]; then
1008
-			python_default_function() {
1009
-				emake "$@"
1010
-			}
1011
-		elif [[ "${EBUILD_PHASE}" == "test" ]]; then
1012
-			python_default_function() {
1013
-				# Stolen from portage's _eapi0_src_test()
1014
-				local emake_cmd="${MAKE:-make} ${MAKEOPTS} ${EXTRA_EMAKE}"
1015
-				if ${emake_cmd} -j1 -n check &> /dev/null; then
1016
-					${emake_cmd} -j1 check "$@"
1017
-				elif ${emake_cmd} -j1 -n test &> /dev/null; then
1018
-					${emake_cmd} -j1 test "$@"
1019
-				fi
1020
-			}
1021
-		elif [[ "${EBUILD_PHASE}" == "install" ]]; then
1022
-			python_default_function() {
1023
-				emake DESTDIR="${D}" install "$@"
1024
-			}
1025
-		else
1026
-			die "${FUNCNAME}(): '--default-function' option cannot be used in this ebuild phase"
1027
-		fi
1028
-		function="python_default_function"
1029
-	fi
1030
-
1031
-	# Ensure that python_execute_function() cannot be directly or indirectly called by python_execute_function().
1032
-	if _python_abi-specific_local_scope; then
1033
-		die "${FUNCNAME}(): Invalid call stack"
1034
-	fi
1035
-
1036
-	if [[ "${quiet}" == "0" ]]; then
1037
-		[[ "${EBUILD_PHASE}" == "setup" ]] && action="Setting up"
1038
-		[[ "${EBUILD_PHASE}" == "unpack" ]] && action="Unpacking"
1039
-		[[ "${EBUILD_PHASE}" == "prepare" ]] && action="Preparation"
1040
-		[[ "${EBUILD_PHASE}" == "configure" ]] && action="Configuration"
1041
-		[[ "${EBUILD_PHASE}" == "compile" ]] && action="Building"
1042
-		[[ "${EBUILD_PHASE}" == "test" ]] && action="Testing"
1043
-		[[ "${EBUILD_PHASE}" == "install" ]] && action="Installation"
1044
-		[[ "${EBUILD_PHASE}" == "preinst" ]] && action="Preinstallation"
1045
-		[[ "${EBUILD_PHASE}" == "postinst" ]] && action="Postinstallation"
1046
-		[[ "${EBUILD_PHASE}" == "prerm" ]] && action="Preuninstallation"
1047
-		[[ "${EBUILD_PHASE}" == "postrm" ]] && action="Postuninstallation"
1048
-	fi
1049
-
1050
-	_python_calculate_PYTHON_ABIS
1051
-	if [[ "${final_ABI}" == "1" ]]; then
1052
-		iterated_PYTHON_ABIS="$(PYTHON -f --ABI)"
1053
-	else
1054
-		iterated_PYTHON_ABIS="${PYTHON_ABIS}"
1055
-	fi
1056
-	for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
1057
-		if [[ "${EBUILD_PHASE}" == "test" ]] && _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${PYTHON_TESTS_RESTRICTED_ABIS}"; then
1058
-			if [[ "${quiet}" == "0" ]]; then
1059
-				echo " ${_GREEN}*${_NORMAL} ${_BLUE}Testing of ${CATEGORY}/${PF} with $(python_get_implementation_and_version) skipped${_NORMAL}"
1060
-			fi
1061
-			continue
1062
-		fi
1063
-
1064
-		_python_prepare_flags
1065
-
1066
-		if [[ "${quiet}" == "0" ]]; then
1067
-			if [[ -n "${action_message_template}" ]]; then
1068
-				eval "action_message=\"${action_message_template}\""
1069
-			else
1070
-				action_message="${action} of ${CATEGORY}/${PF} with $(python_get_implementation_and_version)..."
1071
-			fi
1072
-			echo " ${_GREEN}*${_NORMAL} ${_BLUE}${action_message}${_NORMAL}"
1073
-		fi
1074
-
1075
-		if [[ "${separate_build_dirs}" == "1" ]]; then
1076
-			if [[ -n "${source_dir}" ]]; then
1077
-				export BUILDDIR="${S}/${source_dir}-${PYTHON_ABI}"
1078
-			else
1079
-				export BUILDDIR="${S}-${PYTHON_ABI}"
1080
-			fi
1081
-			pushd "${BUILDDIR}" > /dev/null || die "pushd failed"
1082
-		else
1083
-			export BUILDDIR="${S}"
1084
-		fi
1085
-
1086
-		previous_directory="$(pwd)"
1087
-		previous_directory_stack="$(dirs -p)"
1088
-		previous_directory_stack_length="$(dirs -p | wc -l)"
1089
-
1090
-		if ! has "${EAPI}" 0 1 2 3 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
1091
-			EPYTHON="$(PYTHON)" nonfatal "${function}" "$@"
1092
-		else
1093
-			EPYTHON="$(PYTHON)" "${function}" "$@"
1094
-		fi
1095
-
1096
-		return_code="$?"
1097
-
1098
-		_python_restore_flags
1099
-
1100
-		if [[ "${return_code}" -ne 0 ]]; then
1101
-			if [[ -n "${failure_message_template}" ]]; then
1102
-				eval "failure_message=\"${failure_message_template}\""
1103
-			else
1104
-				failure_message="${action} failed with $(python_get_implementation_and_version) in ${function}() function"
1105
-			fi
1106
-
1107
-			if [[ "${nonfatal}" == "1" ]]; then
1108
-				if [[ "${quiet}" == "0" ]]; then
1109
-					ewarn "${failure_message}"
1110
-				fi
1111
-			elif [[ "${final_ABI}" == "0" ]] && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
1112
-				if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then
1113
-					local enabled_PYTHON_ABIS= other_PYTHON_ABI
1114
-					for other_PYTHON_ABI in ${PYTHON_ABIS}; do
1115
-						[[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+="${enabled_PYTHON_ABIS:+ }${other_PYTHON_ABI}"
1116
-					done
1117
-					export PYTHON_ABIS="${enabled_PYTHON_ABIS}"
1118
-				fi
1119
-				if [[ "${quiet}" == "0" ]]; then
1120
-					ewarn "${failure_message}"
1121
-				fi
1122
-				if [[ -z "${PYTHON_ABIS}" ]]; then
1123
-					die "${function}() function failed with all enabled Python ABIs"
1124
-				fi
1125
-			else
1126
-				die "${failure_message}"
1127
-			fi
1128
-		fi
1129
-
1130
-		# Ensure that directory stack has not been decreased.
1131
-		if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then
1132
-			die "Directory stack decreased illegally"
1133
-		fi
1134
-
1135
-		# Avoid side effects of earlier returning from the specified function.
1136
-		while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do
1137
-			popd > /dev/null || die "popd failed"
1138
-		done
1139
-
1140
-		# Ensure that the bottom part of directory stack has not been changed. Restore
1141
-		# previous directory (from before running of the specified function) before
1142
-		# comparison of directory stacks to avoid mismatch of directory stacks after
1143
-		# potential using of 'cd' to change current directory. Restoration of previous
1144
-		# directory allows to safely use 'cd' to change current directory in the
1145
-		# specified function without changing it back to original directory.
1146
-		cd "${previous_directory}"
1147
-		if [[ "$(dirs -p)" != "${previous_directory_stack}" ]]; then
1148
-			die "Directory stack changed illegally"
1149
-		fi
1150
-
1151
-		if [[ "${separate_build_dirs}" == "1" ]]; then
1152
-			popd > /dev/null || die "popd failed"
1153
-		fi
1154
-		unset BUILDDIR
1155
-	done
1156
-
1157
-	if [[ "${default_function}" == "1" ]]; then
1158
-		unset -f python_default_function
1159
-	fi
1160
-}
1161
-
1162
-# @FUNCTION: python_copy_sources
1163
-# @USAGE: <directory="${S}"> [directory]
1164
-# @DESCRIPTION:
1165
-# Copy unpacked sources of current package to separate build directory for each Python ABI.
1166
-python_copy_sources() {
1167
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
1168
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1169
-	fi
1170
-
1171
-	_python_check_python_pkg_setup_execution
1172
-
1173
-	local dir dirs=() PYTHON_ABI
1174
-
1175
-	if [[ "$#" -eq 0 ]]; then
1176
-		if [[ "${WORKDIR}" == "${S}" ]]; then
1177
-			die "${FUNCNAME}() cannot be used with current value of S variable"
1178
-		fi
1179
-		dirs=("${S%/}")
1180
-	else
1181
-		dirs=("$@")
1182
-	fi
1183
-
1184
-	_python_calculate_PYTHON_ABIS
1185
-	for PYTHON_ABI in ${PYTHON_ABIS}; do
1186
-		for dir in "${dirs[@]}"; do
1187
-			cp -pr "${dir}" "${dir}-${PYTHON_ABI}" > /dev/null || die "Copying of sources failed"
1188
-		done
1189
-	done
1190
-}
1191
-
1192
-# @FUNCTION: python_generate_wrapper_scripts
1193
-# @USAGE: [-E|--respect-EPYTHON] [-f|--force] [-q|--quiet] [--] <file> [files]
1194
-# @DESCRIPTION:
1195
-# Generate wrapper scripts. Existing files are overwritten only with --force option.
1196
-# If --respect-EPYTHON option is specified, then generated wrapper scripts will
1197
-# respect EPYTHON variable at run time.
1198
-#
1199
-# This function can be used only in src_install() phase.
1200
-python_generate_wrapper_scripts() {
1201
-	if [[ "${EBUILD_PHASE}" != "install" ]]; then
1202
-		die "${FUNCNAME}() can be used only in src_install() phase"
1203
-	fi
1204
-
1205
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
1206
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1207
-	fi
1208
-
1209
-	_python_check_python_pkg_setup_execution
1210
-	_python_initialize_prefix_variables
1211
-
1212
-	local eselect_python_option file force="0" quiet="0" PYTHON_ABI PYTHON_ABIS_list python2_enabled="0" python3_enabled="0" respect_EPYTHON="0"
1213
-
1214
-	while (($#)); do
1215
-		case "$1" in
1216
-			-E|--respect-EPYTHON)
1217
-				respect_EPYTHON="1"
1218
-				;;
1219
-			-f|--force)
1220
-				force="1"
1221
-				;;
1222
-			-q|--quiet)
1223
-				quiet="1"
1224
-				;;
1225
-			--)
1226
-				shift
1227
-				break
1228
-				;;
1229
-			-*)
1230
-				die "${FUNCNAME}(): Unrecognized option '$1'"
1231
-				;;
1232
-			*)
1233
-				break
1234
-				;;
1235
-		esac
1236
-		shift
1237
-	done
1238
-
1239
-	if [[ "$#" -eq 0 ]]; then
1240
-		die "${FUNCNAME}(): Missing arguments"
1241
-	fi
1242
-
1243
-	_python_calculate_PYTHON_ABIS
1244
-	for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1245
-		if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1246
-			python2_enabled="1"
1247
-		fi
1248
-	done
1249
-	for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do
1250
-		if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
1251
-			python3_enabled="1"
1252
-		fi
1253
-	done
1254
-
1255
-	if [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "1" ]]; then
1256
-		eselect_python_option=
1257
-	elif [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "0" ]]; then
1258
-		eselect_python_option="--python2"
1259
-	elif [[ "${python2_enabled}" == "0" && "${python3_enabled}" == "1" ]]; then
1260
-		eselect_python_option="--python3"
1261
-	else
1262
-		die "${FUNCNAME}(): Unsupported environment"
1263
-	fi
1264
-
1265
-	PYTHON_ABIS_list="$("$(PYTHON -f)" -c "print(', '.join('\"%s\"' % x for x in reversed('${PYTHON_ABIS}'.split())))")"
1266
-
1267
-	for file in "$@"; do
1268
-		if [[ -f "${file}" && "${force}" == "0" ]]; then
1269
-			die "${FUNCNAME}(): '${file}' already exists"
1270
-		fi
1271
-
1272
-		if [[ "${quiet}" == "0" ]]; then
1273
-			einfo "Generating '${file#${ED%/}}' wrapper script"
1274
-		fi
1275
-
1276
-		cat << EOF > "${file}"
1277
-#!/usr/bin/env python
1278
-# Gentoo '${file##*/}' wrapper script generated by python_generate_wrapper_scripts()
1279
-
1280
-import os
1281
-import re
1282
-import subprocess
1283
-import sys
1284
-
1285
-cpython_ABI_re = re.compile(r"^(\d+\.\d+)$")
1286
-jython_ABI_re = re.compile(r"^(\d+\.\d+)-jython$")
1287
-pypy_ABI_re = re.compile(r"^\d+\.\d+-pypy-(\d+\.\d+)$")
1288
-cpython_interpreter_re = re.compile(r"^python(\d+\.\d+)$")
1289
-jython_interpreter_re = re.compile(r"^jython(\d+\.\d+)$")
1290
-pypy_interpreter_re = re.compile(r"^pypy-c(\d+\.\d+)$")
1291
-cpython_shebang_re = re.compile(r"^#![ \t]*(?:${EPREFIX}/usr/bin/python|(?:${EPREFIX})?/usr/bin/env[ \t]+(?:${EPREFIX}/usr/bin/)?python)")
1292
-python_shebang_options_re = re.compile(r"^#![ \t]*${EPREFIX}/usr/bin/(?:jython|pypy-c|python)(?:\d+(?:\.\d+)?)?[ \t]+(-\S)")
1293
-python_verification_output_re = re.compile("^GENTOO_PYTHON_TARGET_SCRIPT_PATH supported\n$")
1294
-
1295
-#pypy_versions_mapping = {
1296
-#	"1.5": "2.7",
1297
-#	"1.6": "2.7",
1298
-#	"1.7": "2.7",
1299
-#	"1.8": "2.7",
1300
-#	"1.9": "2.7",
1301
-#	"2.0": "2.7",
1302
-#}
1303
-
1304
-def get_PYTHON_ABI(python_interpreter):
1305
-	cpython_matched = cpython_interpreter_re.match(python_interpreter)
1306
-	jython_matched = jython_interpreter_re.match(python_interpreter)
1307
-	pypy_matched = pypy_interpreter_re.match(python_interpreter)
1308
-	if cpython_matched is not None:
1309
-		PYTHON_ABI = cpython_matched.group(1)
1310
-	elif jython_matched is not None:
1311
-		PYTHON_ABI = jython_matched.group(1) + "-jython"
1312
-	elif pypy_matched is not None:
1313
-		#PYTHON_ABI = pypy_versions_mapping[pypy_matched.group(1)] + "-pypy-" + pypy_matched.group(1)
1314
-		PYTHON_ABI = "2.7-pypy-" + pypy_matched.group(1)
1315
-	else:
1316
-		PYTHON_ABI = None
1317
-	return PYTHON_ABI
1318
-
1319
-def get_python_interpreter(PYTHON_ABI):
1320
-	cpython_matched = cpython_ABI_re.match(PYTHON_ABI)
1321
-	jython_matched = jython_ABI_re.match(PYTHON_ABI)
1322
-	pypy_matched = pypy_ABI_re.match(PYTHON_ABI)
1323
-	if cpython_matched is not None:
1324
-		python_interpreter = "python" + cpython_matched.group(1)
1325
-	elif jython_matched is not None:
1326
-		python_interpreter = "jython" + jython_matched.group(1)
1327
-	elif pypy_matched is not None:
1328
-		python_interpreter = "pypy-c" + pypy_matched.group(1)
1329
-	else:
1330
-		python_interpreter = None
1331
-	return python_interpreter
1332
-
1333
-EOF
1334
-		if [[ "$?" != "0" ]]; then
1335
-			die "${FUNCNAME}(): Generation of '$1' failed"
1336
-		fi
1337
-		if [[ "${respect_EPYTHON}" == "1" ]]; then
1338
-			cat << EOF >> "${file}"
1339
-python_interpreter = os.environ.get("EPYTHON")
1340
-if python_interpreter:
1341
-	PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1342
-	if PYTHON_ABI is None:
1343
-		sys.stderr.write("%s: EPYTHON variable has unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1344
-		sys.exit(1)
1345
-else:
1346
-	try:
1347
-		environment = os.environ.copy()
1348
-		environment["ROOT"] = "/"
1349
-		eselect_process = subprocess.Popen(["${EPREFIX}/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], env=environment, stdout=subprocess.PIPE)
1350
-		if eselect_process.wait() != 0:
1351
-			raise ValueError
1352
-	except (OSError, ValueError):
1353
-		sys.stderr.write("%s: Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n" % sys.argv[0])
1354
-		sys.exit(1)
1355
-
1356
-	python_interpreter = eselect_process.stdout.read()
1357
-	if not isinstance(python_interpreter, str):
1358
-		# Python 3
1359
-		python_interpreter = python_interpreter.decode()
1360
-	python_interpreter = python_interpreter.rstrip("\n")
1361
-
1362
-	PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1363
-	if PYTHON_ABI is None:
1364
-		sys.stderr.write("%s: 'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1365
-		sys.exit(1)
1366
-
1367
-wrapper_script_path = os.path.realpath(sys.argv[0])
1368
-target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1369
-if not os.path.exists(target_executable_path):
1370
-	sys.stderr.write("%s: '%s' does not exist\n" % (sys.argv[0], target_executable_path))
1371
-	sys.exit(1)
1372
-EOF
1373
-			if [[ "$?" != "0" ]]; then
1374
-				die "${FUNCNAME}(): Generation of '$1' failed"
1375
-			fi
1376
-		else
1377
-			cat << EOF >> "${file}"
1378
-try:
1379
-	environment = os.environ.copy()
1380
-	environment["ROOT"] = "/"
1381
-	eselect_process = subprocess.Popen(["${EPREFIX}/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], env=environment, stdout=subprocess.PIPE)
1382
-	if eselect_process.wait() != 0:
1383
-		raise ValueError
1384
-except (OSError, ValueError):
1385
-	sys.stderr.write("%s: Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n" % sys.argv[0])
1386
-	sys.exit(1)
1387
-
1388
-python_interpreter = eselect_process.stdout.read()
1389
-if not isinstance(python_interpreter, str):
1390
-	# Python 3
1391
-	python_interpreter = python_interpreter.decode()
1392
-python_interpreter = python_interpreter.rstrip("\n")
1393
-
1394
-PYTHON_ABI = get_PYTHON_ABI(python_interpreter)
1395
-if PYTHON_ABI is None:
1396
-	sys.stderr.write("%s: 'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s'\n" % (sys.argv[0], python_interpreter))
1397
-	sys.exit(1)
1398
-
1399
-wrapper_script_path = os.path.realpath(sys.argv[0])
1400
-for PYTHON_ABI in [PYTHON_ABI, ${PYTHON_ABIS_list}]:
1401
-	target_executable_path = "%s-%s" % (wrapper_script_path, PYTHON_ABI)
1402
-	if os.path.exists(target_executable_path):
1403
-		break
1404
-else:
1405
-	sys.stderr.write("%s: No target script exists for '%s'\n" % (sys.argv[0], wrapper_script_path))
1406
-	sys.exit(1)
1407
-
1408
-python_interpreter = get_python_interpreter(PYTHON_ABI)
1409
-if python_interpreter is None:
1410
-	sys.stderr.write("%s: Unrecognized Python ABI '%s'\n" % (sys.argv[0], PYTHON_ABI))
1411
-	sys.exit(1)
1412
-EOF
1413
-			if [[ "$?" != "0" ]]; then
1414
-				die "${FUNCNAME}(): Generation of '$1' failed"
1415
-			fi
1416
-		fi
1417
-		cat << EOF >> "${file}"
1418
-
1419
-target_executable = open(target_executable_path, "rb")
1420
-target_executable_first_line = target_executable.readline()
1421
-target_executable.close()
1422
-if not isinstance(target_executable_first_line, str):
1423
-	# Python 3
1424
-	target_executable_first_line = target_executable_first_line.decode("utf_8", "replace")
1425
-
1426
-options = []
1427
-python_shebang_options_matched = python_shebang_options_re.match(target_executable_first_line)
1428
-if python_shebang_options_matched is not None:
1429
-	options = [python_shebang_options_matched.group(1)]
1430
-
1431
-cpython_shebang_matched = cpython_shebang_re.match(target_executable_first_line)
1432
-
1433
-if cpython_shebang_matched is not None:
1434
-	try:
1435
-		python_interpreter_path = "${EPREFIX}/usr/bin/%s" % python_interpreter
1436
-		os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"] = "1"
1437
-		python_verification_process = subprocess.Popen([python_interpreter_path, "-c", "pass"], stdout=subprocess.PIPE)
1438
-		del os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"]
1439
-		if python_verification_process.wait() != 0:
1440
-			raise ValueError
1441
-
1442
-		python_verification_output = python_verification_process.stdout.read()
1443
-		if not isinstance(python_verification_output, str):
1444
-			# Python 3
1445
-			python_verification_output = python_verification_output.decode()
1446
-
1447
-		if not python_verification_output_re.match(python_verification_output):
1448
-			raise ValueError
1449
-
1450
-		if cpython_interpreter_re.match(python_interpreter) is not None:
1451
-			os.environ["GENTOO_PYTHON_PROCESS_NAME"] = os.path.basename(sys.argv[0])
1452
-			os.environ["GENTOO_PYTHON_WRAPPER_SCRIPT_PATH"] = sys.argv[0]
1453
-			os.environ["GENTOO_PYTHON_TARGET_SCRIPT_PATH"] = target_executable_path
1454
-
1455
-		if hasattr(os, "execv"):
1456
-			os.execv(python_interpreter_path, [python_interpreter_path] + options + sys.argv)
1457
-		else:
1458
-			sys.exit(subprocess.Popen([python_interpreter_path] + options + sys.argv).wait())
1459
-	except (KeyboardInterrupt, SystemExit):
1460
-		raise
1461
-	except:
1462
-		pass
1463
-	for variable in ("GENTOO_PYTHON_PROCESS_NAME", "GENTOO_PYTHON_WRAPPER_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH", "GENTOO_PYTHON_TARGET_SCRIPT_PATH_VERIFICATION"):
1464
-		if variable in os.environ:
1465
-			del os.environ[variable]
1466
-
1467
-if hasattr(os, "execv"):
1468
-	os.execv(target_executable_path, sys.argv)
1469
-else:
1470
-	sys.exit(subprocess.Popen([target_executable_path] + sys.argv[1:]).wait())
1471
-EOF
1472
-		if [[ "$?" != "0" ]]; then
1473
-			die "${FUNCNAME}(): Generation of '$1' failed"
1474
-		fi
1475
-		fperms +x "${file#${ED%/}}" || die "fperms '${file}' failed"
1476
-	done
1477
-}
1478
-
1479
-# @ECLASS-VARIABLE: PYTHON_VERSIONED_SCRIPTS
1480
-# @DESCRIPTION:
1481
-# Array of regular expressions of paths to versioned Python scripts.
1482
-# Python scripts in /usr/bin and /usr/sbin are versioned by default.
1483
-
1484
-# @ECLASS-VARIABLE: PYTHON_VERSIONED_EXECUTABLES
1485
-# @DESCRIPTION:
1486
-# Array of regular expressions of paths to versioned executables (including Python scripts).
1487
-
1488
-# @ECLASS-VARIABLE: PYTHON_NONVERSIONED_EXECUTABLES
1489
-# @DESCRIPTION:
1490
-# Array of regular expressions of paths to nonversioned executables (including Python scripts).
1491
-
1492
-# @FUNCTION: python_merge_intermediate_installation_images
1493
-# @USAGE: [-q|--quiet] [--] <intermediate_installation_images_directory>
1494
-# @DESCRIPTION:
1495
-# Merge intermediate installation images into installation image.
1496
-#
1497
-# This function can be used only in src_install() phase.
1498
-python_merge_intermediate_installation_images() {
1499
-	if [[ "${EBUILD_PHASE}" != "install" ]]; then
1500
-		die "${FUNCNAME}() can be used only in src_install() phase"
1501
-	fi
1502
-
1503
-	if ! _python_package_supporting_installation_for_multiple_python_abis; then
1504
-		die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1505
-	fi
1506
-
1507
-	_python_check_python_pkg_setup_execution
1508
-	_python_initialize_prefix_variables
1509
-
1510
-	local absolute_file b file files=() intermediate_installation_images_directory PYTHON_ABI quiet="0" regex shebang version_executable wrapper_scripts=() wrapper_scripts_set=()
1511
-
1512
-	while (($#)); do
1513
-		case "$1" in
1514
-			-q|--quiet)
1515
-				quiet="1"
1516
-				;;
1517
-			--)
1518
-				shift
1519
-				break
1520
-				;;
1521
-			-*)
1522
-				die "${FUNCNAME}(): Unrecognized option '$1'"
1523
-				;;
1524
-			*)
1525
-				break
1526
-				;;
1527
-		esac
1528
-		shift
1529
-	done
1530
-
1531
-	if [[ "$#" -ne 1 ]]; then
1532
-		die "${FUNCNAME}() requires 1 argument"
1533
-	fi
1534
-
1535
-	intermediate_installation_images_directory="$1"
1536
-
1537
-	if [[ ! -d "${intermediate_installation_images_directory}" ]]; then
1538
-		die "${FUNCNAME}(): Intermediate installation images directory '${intermediate_installation_images_directory}' does not exist"
1539
-	fi
1540
-
1541
-	_python_calculate_PYTHON_ABIS
1542
-	if [[ "$(PYTHON -f --ABI)" == 3.* ]]; then
1543
-		b="b"
1544
-	fi
1545
-
1546
-	while read -d $'\0' -r file; do
1547
-		files+=("${file}")
1548
-	done < <("$(PYTHON -f)" -c \
1549
-"import os
1550
-import sys
1551
-
1552
-if hasattr(sys.stdout, 'buffer'):
1553
-	# Python 3
1554
-	stdout = sys.stdout.buffer
1555
-else:
1556
-	# Python 2
1557
-	stdout = sys.stdout
1558
-
1559
-files_set = set()
1560
-
1561
-os.chdir(${b}'${intermediate_installation_images_directory}')
1562
-
1563
-for PYTHON_ABI in ${b}'${PYTHON_ABIS}'.split():
1564
-	for root, dirs, files in os.walk(PYTHON_ABI + ${b}'${EPREFIX}'):
1565
-		root = root[len(PYTHON_ABI + ${b}'${EPREFIX}')+1:]
1566
-		files_set.update(root + ${b}'/' + file for file in files)
1567
-
1568
-for file in sorted(files_set):
1569
-	stdout.write(file)
1570
-	stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of files in intermediate installation images")
1571
-
1572
-	for PYTHON_ABI in ${PYTHON_ABIS}; do
1573
-		if [[ ! -d "${intermediate_installation_images_directory}/${PYTHON_ABI}" ]]; then
1574
-			die "${FUNCNAME}(): Intermediate installation image for Python ABI '${PYTHON_ABI}' does not exist"
1575
-		fi
1576
-
1577
-		pushd "${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}" > /dev/null || die "pushd failed"
1578
-
1579
-		for file in "${files[@]}"; do
1580
-			version_executable="0"
1581
-			for regex in "/usr/bin/.*" "/usr/sbin/.*" "${PYTHON_VERSIONED_SCRIPTS[@]}"; do
1582
-				if [[ "/${file}" =~ ^${regex}$ ]]; then
1583
-					version_executable="1"
1584
-					break
1585
-				fi
1586
-			done
1587
-			for regex in "${PYTHON_VERSIONED_EXECUTABLES[@]}"; do
1588
-				if [[ "/${file}" =~ ^${regex}$ ]]; then
1589
-					version_executable="2"
1590
-					break
1591
-				fi
1592
-			done
1593
-			if [[ "${version_executable}" != "0" ]]; then
1594
-				for regex in "${PYTHON_NONVERSIONED_EXECUTABLES[@]}"; do
1595
-					if [[ "/${file}" =~ ^${regex}$ ]]; then
1596
-						version_executable="0"
1597
-						break
1598
-					fi
1599
-				done
1600
-			fi
1601
-
1602
-			[[ "${version_executable}" == "0" ]] && continue
1603
-
1604
-			if [[ -L "${file}" ]]; then
1605
-				absolute_file="$(readlink "${file}")"
1606
-				if [[ "${absolute_file}" == /* ]]; then
1607
-					absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file##/}"
1608
-				else
1609
-					if [[ "${file}" == */* ]]; then
1610
-						absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file%/*}/${absolute_file}"
1611
-					else
1612
-						absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file}"
1613
-					fi
1614
-				fi
1615
-			else
1616
-				absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file}"
1617
-			fi
1618
-
1619
-			[[ ! -x "${absolute_file}" ]] && continue
1620
-
1621
-			shebang="$(head -n1 "${absolute_file}")" || die "Extraction of shebang from '${absolute_file}' failed"
1622
-
1623
-			if [[ "${version_executable}" == "2" ]]; then
1624
-				wrapper_scripts+=("${ED}${file}")
1625
-			elif [[ "${version_executable}" == "1" ]]; then
1626
-				if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}([[:digit:]]+(\.[[:digit:]]+)?)?($|[[:space:]]+) ]]; then
1627
-					wrapper_scripts+=("${ED}${file}")
1628
-				else
1629
-					version_executable="0"
1630
-				fi
1631
-			fi
1632
-
1633
-			[[ "${version_executable}" == "0" ]] && continue
1634
-
1635
-			if [[ -e "${file}-${PYTHON_ABI}" ]]; then
1636
-				die "${FUNCNAME}(): '${EPREFIX}/${file}-${PYTHON_ABI}' already exists"
1637
-			fi
1638
-
1639
-			mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed"
1640
-
1641
-			if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}[[:digit:]]*($|[[:space:]]+) ]]; then
1642
-				if [[ -L "${file}-${PYTHON_ABI}" ]]; then
1643
-					python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${absolute_file}"
1644
-				else
1645
-					python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${file}-${PYTHON_ABI}"
1646
-				fi
1647
-			fi
1648
-		done
1649
-
1650
-		popd > /dev/null || die "popd failed"
1651
-
1652
-		# This is per bug #390691, without the duplication refactor, and with
1653
-		# the 3-way structure per comment #6. This enable users with old
1654
-		# coreutils to upgrade a lot easier (you need to upgrade python+portage
1655
-		# before coreutils can be upgraded).
1656
-		if ROOT="/" has_version '>=sys-apps/coreutils-6.9.90'; then
1657
-			cp -fr --preserve=all --no-preserve=context "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1658
-		elif ROOT="/" has_version sys-apps/coreutils; then
1659
-			cp -fr --preserve=all "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1660
-		else
1661
-			cp -fpr "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"
1662
-		fi
1663
-	done
1664
-
1665
-	rm -fr "${intermediate_installation_images_directory}"
1666
-
1667
-	if [[ "${#wrapper_scripts[@]}" -ge 1 ]]; then
1668
-		rm -f "${T}/python_wrapper_scripts"
1669
-
1670
-		for file in "${wrapper_scripts[@]}"; do
1671
-			echo -n "${file}" >> "${T}/python_wrapper_scripts"
1672
-			echo -en "\x00" >> "${T}/python_wrapper_scripts"
1673
-		done
1674
-
1675
-		while read -d $'\0' -r file; do
1676
-			wrapper_scripts_set+=("${file}")
1677
-		done < <("$(PYTHON -f)" -c \
1678
-"import sys
1679
-
1680
-if hasattr(sys.stdout, 'buffer'):
1681
-	# Python 3
1682
-	stdout = sys.stdout.buffer
1683
-else:
1684
-	# Python 2
1685
-	stdout = sys.stdout
1686
-
1687
-python_wrapper_scripts_file = open('${T}/python_wrapper_scripts', 'rb')
1688
-files = set(python_wrapper_scripts_file.read().rstrip(${b}'\x00').split(${b}'\x00'))
1689
-python_wrapper_scripts_file.close()
1690
-
1691
-for file in sorted(files):
1692
-	stdout.write(file)
1693
-	stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of set of wrapper scripts")
1694
-
1695
-		python_generate_wrapper_scripts $([[ "${quiet}" == "1" ]] && echo --quiet) "${wrapper_scripts_set[@]}"
1696
-	fi
1697
-}
1698
-
1699
-# ================================================================================================
1700
-# ========= FUNCTIONS FOR PACKAGES NOT SUPPORTING INSTALLATION FOR MULTIPLE PYTHON ABIS ==========
1701
-# ================================================================================================
1702
-
1703
-unset EPYTHON PYTHON_ABI
1704
-
1705
-# @FUNCTION: python_set_active_version
1706
-# @USAGE: <Python_ABI|2|3>
1707
-# @DESCRIPTION:
1708
-# Set locally active version of Python.
1709
-# If Python_ABI argument is specified, then version of Python corresponding to Python_ABI is used.
1710
-# If 2 argument is specified, then active version of CPython 2 is used.
1711
-# If 3 argument is specified, then active version of CPython 3 is used.
1712
-#
1713
-# This function can be used only in pkg_setup() phase.
1714
-python_set_active_version() {
1715
-	if [[ "${EBUILD_PHASE}" != "setup" ]]; then
1716
-		die "${FUNCNAME}() can be used only in pkg_setup() phase"
1717
-	fi
1718
-
1719
-	if _python_package_supporting_installation_for_multiple_python_abis; then
1720
-		die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
1721
-	fi
1722
-
1723
-	if [[ "$#" -ne 1 ]]; then
1724
-		die "${FUNCNAME}() requires 1 argument"
1725
-	fi
1726
-
1727
-	_python_initial_sanity_checks
1728
-
1729
-	if [[ -z "${PYTHON_ABI}" ]]; then
1730
-		if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then
1731
-			# PYTHON_ABI variable is intended to be used only in ebuilds/eclasses,
1732
-			# so it does not need to be exported to subprocesses.
1733
-			PYTHON_ABI="$1"
1734
-			if ! _python_implementation && ! has_version "$(python_get_implementational_package)"; then
1735
-				die "${FUNCNAME}(): '$(python_get_implementational_package)' is not installed"
1736
-			fi
1737
-			export EPYTHON="$(PYTHON "$1")"
1738
-		elif [[ "$1" == "2" ]]; then
1739
-			if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then
1740
-				die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed"
1741
-			fi
1742
-			export EPYTHON="$(PYTHON -2)"
1743
-			PYTHON_ABI="${EPYTHON#python}"
1744
-			PYTHON_ABI="${PYTHON_ABI%%-*}"
1745
-		elif [[ "$1" == "3" ]]; then
1746
-			if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then
1747
-				die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed"
1748
-			fi
1749
-			export EPYTHON="$(PYTHON -3)"
1750
-			PYTHON_ABI="${EPYTHON#python}"
1751
-			PYTHON_ABI="${PYTHON_ABI%%-*}"
1752
-		else
1753
-			die "${FUNCNAME}(): Unrecognized argument '$1'"
1754
-		fi
1755
-	fi
1756
-
1757
-	_python_final_sanity_checks
1758
-
1759
-	# python-updater checks PYTHON_REQUESTED_ACTIVE_VERSION variable.
1760
-	PYTHON_REQUESTED_ACTIVE_VERSION="$1"
1761
-}
1762
-
1763
-# @FUNCTION: python_need_rebuild
1764
-# @DESCRIPTION:
1765
-# Mark current package for rebuilding by python-updater after
1766
-# switching of active version of Python.
1767
-python_need_rebuild() {
1768
-	if _python_package_supporting_installation_for_multiple_python_abis; then
1769
-		die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
1770
-	fi
1771
-
1772
-	_python_check_python_pkg_setup_execution
1773
-
1774
-	if [[ "$#" -ne 0 ]]; then
1775
-		die "${FUNCNAME}() does not accept arguments"
1776
-	fi
1777
-
1778
-	export PYTHON_NEED_REBUILD="$(PYTHON --ABI)"
1779
-}
1780
-
1781
-# ================================================================================================
1782
-# ======================================= GETTER FUNCTIONS =======================================
1783
-# ================================================================================================
1784
-
1785
-_PYTHON_ABI_EXTRACTION_COMMAND=\
1786
-'import platform
1787
-import sys
1788
-sys.stdout.write(".".join(str(x) for x in sys.version_info[:2]))
1789
-if platform.system()[:4] == "Java":
1790
-	sys.stdout.write("-jython")
1791
-elif hasattr(platform, "python_implementation") and platform.python_implementation() == "PyPy":
1792
-	sys.stdout.write("-pypy-" + ".".join(str(x) for x in sys.pypy_version_info[:2]))'
1793
-
1794
-_python_get_implementation() {
1795
-	local ignore_invalid="0"
1796
-
1797
-	while (($#)); do
1798
-		case "$1" in
1799
-			--ignore-invalid)
1800
-				ignore_invalid="1"
1801
-				;;
1802
-			--)
1803
-				shift
1804
-				break
1805
-				;;
1806
-			-*)
1807
-				die "${FUNCNAME}(): Unrecognized option '$1'"
1808
-				;;
1809
-			*)
1810
-				break
1811
-				;;
1812
-		esac
1813
-		shift
1814
-	done
1815
-
1816
-	if [[ "$#" -ne 1 ]]; then
1817
-		die "${FUNCNAME}() requires 1 argument"
1818
-	fi
1819
-
1820
-	if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
1821
-		echo "CPython"
1822
-	elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then
1823
-		echo "Jython"
1824
-	elif [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then
1825
-		echo "PyPy"
1826
-	else
1827
-		if [[ "${ignore_invalid}" == "0" ]]; then
1828
-			die "${FUNCNAME}(): Unrecognized Python ABI '$1'"
1829
-		fi
1830
-	fi
1831
-}
1832
-
1833
-# @FUNCTION: PYTHON
1834
-# @USAGE: [-2] [-3] [--ABI] [-a|--absolute-path] [-f|--final-ABI] [--] <Python_ABI="${PYTHON_ABI}">
1835
-# @DESCRIPTION:
1836
-# Print filename of Python interpreter for specified Python ABI. If Python_ABI argument
1837
-# is ommitted, then PYTHON_ABI environment variable must be set and is used.
1838
-# If -2 option is specified, then active version of CPython 2 is used.
1839
-# If -3 option is specified, then active version of CPython 3 is used.
1840
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1841
-# -2, -3 and --final-ABI options and Python_ABI argument cannot be specified simultaneously.
1842
-# If --ABI option is specified, then only specified Python ABI is printed instead of
1843
-# filename of Python interpreter.
1844
-# If --absolute-path option is specified, then absolute path to Python interpreter is printed.
1845
-# --ABI and --absolute-path options cannot be specified simultaneously.
1846
-PYTHON() {
1847
-	_python_check_python_pkg_setup_execution
1848
-
1849
-	local ABI_output="0" absolute_path_output="0" final_ABI="0" PYTHON_ABI="${PYTHON_ABI}" python_interpreter python2="0" python3="0"
1850
-
1851
-	while (($#)); do
1852
-		case "$1" in
1853
-			-2)
1854
-				python2="1"
1855
-				;;
1856
-			-3)
1857
-				python3="1"
1858
-				;;
1859
-			--ABI)
1860
-				ABI_output="1"
1861
-				;;
1862
-			-a|--absolute-path)
1863
-				absolute_path_output="1"
1864
-				;;
1865
-			-f|--final-ABI)
1866
-				final_ABI="1"
1867
-				;;
1868
-			--)
1869
-				shift
1870
-				break
1871
-				;;
1872
-			-*)
1873
-				die "${FUNCNAME}(): Unrecognized option '$1'"
1874
-				;;
1875
-			*)
1876
-				break
1877
-				;;
1878
-		esac
1879
-		shift
1880
-	done
1881
-
1882
-	if [[ "${ABI_output}" == "1" && "${absolute_path_output}" == "1" ]]; then
1883
-		die "${FUNCNAME}(): '--ABI' and '--absolute-path' options cannot be specified simultaneously"
1884
-	fi
1885
-
1886
-	if [[ "$((${python2} + ${python3} + ${final_ABI}))" -gt 1 ]]; then
1887
-		die "${FUNCNAME}(): '-2', '-3' or '--final-ABI' options cannot be specified simultaneously"
1888
-	fi
1889
-
1890
-	if [[ "$#" -eq 0 ]]; then
1891
-		if [[ "${final_ABI}" == "1" ]]; then
1892
-			if ! _python_package_supporting_installation_for_multiple_python_abis; then
1893
-				die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1894
-			fi
1895
-			_python_calculate_PYTHON_ABIS
1896
-			PYTHON_ABI="${PYTHON_ABIS##* }"
1897
-		elif [[ "${python2}" == "1" ]]; then
1898
-			PYTHON_ABI="$(ROOT="/" eselect python show --python2 --ABI)"
1899
-			if [[ -z "${PYTHON_ABI}" ]]; then
1900
-				die "${FUNCNAME}(): Active version of CPython 2 not set"
1901
-			elif [[ "${PYTHON_ABI}" != "2."* ]]; then
1902
-				die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`"
1903
-			fi
1904
-		elif [[ "${python3}" == "1" ]]; then
1905
-			PYTHON_ABI="$(ROOT="/" eselect python show --python3 --ABI)"
1906
-			if [[ -z "${PYTHON_ABI}" ]]; then
1907
-				die "${FUNCNAME}(): Active version of CPython 3 not set"
1908
-			elif [[ "${PYTHON_ABI}" != "3."* ]]; then
1909
-				die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`"
1910
-			fi
1911
-		elif _python_package_supporting_installation_for_multiple_python_abis; then
1912
-			if ! _python_abi-specific_local_scope; then
1913
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
1914
-			fi
1915
-		else
1916
-			PYTHON_ABI="$("${EPREFIX}/usr/bin/python" -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")"
1917
-			if [[ -z "${PYTHON_ABI}" ]]; then
1918
-				die "${FUNCNAME}(): Failure of extraction of locally active version of Python"
1919
-			fi
1920
-		fi
1921
-	elif [[ "$#" -eq 1 ]]; then
1922
-		if [[ "${final_ABI}" == "1" ]]; then
1923
-			die "${FUNCNAME}(): '--final-ABI' option and Python ABI cannot be specified simultaneously"
1924
-		fi
1925
-		if [[ "${python2}" == "1" ]]; then
1926
-			die "${FUNCNAME}(): '-2' option and Python ABI cannot be specified simultaneously"
1927
-		fi
1928
-		if [[ "${python3}" == "1" ]]; then
1929
-			die "${FUNCNAME}(): '-3' option and Python ABI cannot be specified simultaneously"
1930
-		fi
1931
-		PYTHON_ABI="$1"
1932
-	else
1933
-		die "${FUNCNAME}(): Invalid usage"
1934
-	fi
1935
-
1936
-	if [[ "${ABI_output}" == "1" ]]; then
1937
-		echo -n "${PYTHON_ABI}"
1938
-		return
1939
-	else
1940
-		if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
1941
-			python_interpreter="python${PYTHON_ABI}"
1942
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
1943
-			python_interpreter="jython${PYTHON_ABI%-jython}"
1944
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
1945
-			python_interpreter="pypy-c${PYTHON_ABI#*-pypy-}"
1946
-		fi
1947
-
1948
-		if [[ "${absolute_path_output}" == "1" ]]; then
1949
-			echo -n "${EPREFIX}/usr/bin/${python_interpreter}"
1950
-		else
1951
-			echo -n "${python_interpreter}"
1952
-		fi
1953
-	fi
1954
-
1955
-	if [[ -n "${ABI}" && "${ABI}" != "${DEFAULT_ABI}" && "${DEFAULT_ABI}" != "default" ]]; then
1956
-		echo -n "-${ABI}"
1957
-	fi
1958
-}
1959
-
1960
-# @FUNCTION: python_get_implementation
1961
-# @USAGE: [-f|--final-ABI]
1962
-# @DESCRIPTION:
1963
-# Print name of Python implementation.
1964
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
1965
-python_get_implementation() {
1966
-	_python_check_python_pkg_setup_execution
1967
-
1968
-	local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
1969
-
1970
-	while (($#)); do
1971
-		case "$1" in
1972
-			-f|--final-ABI)
1973
-				final_ABI="1"
1974
-				;;
1975
-			-*)
1976
-				die "${FUNCNAME}(): Unrecognized option '$1'"
1977
-				;;
1978
-			*)
1979
-				die "${FUNCNAME}(): Invalid usage"
1980
-				;;
1981
-		esac
1982
-		shift
1983
-	done
1984
-
1985
-	if [[ "${final_ABI}" == "1" ]]; then
1986
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
1987
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
1988
-		fi
1989
-		PYTHON_ABI="$(PYTHON -f --ABI)"
1990
-	else
1991
-		if _python_package_supporting_installation_for_multiple_python_abis; then
1992
-			if ! _python_abi-specific_local_scope; then
1993
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
1994
-			fi
1995
-		else
1996
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
1997
-		fi
1998
-	fi
1999
-
2000
-	echo "$(_python_get_implementation "${PYTHON_ABI}")"
2001
-}
2002
-
2003
-# @FUNCTION: python_get_implementational_package
2004
-# @USAGE: [-f|--final-ABI]
2005
-# @DESCRIPTION:
2006
-# Print category, name and slot of package providing Python implementation.
2007
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2008
-python_get_implementational_package() {
2009
-	_python_check_python_pkg_setup_execution
2010
-
2011
-	local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
2012
-
2013
-	while (($#)); do
2014
-		case "$1" in
2015
-			-f|--final-ABI)
2016
-				final_ABI="1"
2017
-				;;
2018
-			-*)
2019
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2020
-				;;
2021
-			*)
2022
-				die "${FUNCNAME}(): Invalid usage"
2023
-				;;
2024
-		esac
2025
-		shift
2026
-	done
2027
-
2028
-	if [[ "${final_ABI}" == "1" ]]; then
2029
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2030
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2031
-		fi
2032
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2033
-	else
2034
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2035
-			if ! _python_abi-specific_local_scope; then
2036
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2037
-			fi
2038
-		else
2039
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2040
-		fi
2041
-	fi
2042
-
2043
-	if [[ "${EAPI:-0}" == "0" ]]; then
2044
-		if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2045
-			echo "=dev-lang/python-${PYTHON_ABI}*"
2046
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2047
-			echo "=dev-java/jython-${PYTHON_ABI%-jython}*"
2048
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2049
-			echo "=virtual/pypy-${PYTHON_ABI#*-pypy-}*"
2050
-		fi
2051
-	else
2052
-		if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2053
-			echo "dev-lang/python:${PYTHON_ABI}"
2054
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2055
-			echo "dev-java/jython:${PYTHON_ABI%-jython}"
2056
-		elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2057
-			echo "virtual/pypy:${PYTHON_ABI#*-pypy-}"
2058
-		fi
2059
-	fi
2060
-}
2061
-
2062
-# @FUNCTION: python_get_includedir
2063
-# @USAGE: [-b|--base-path] [-f|--final-ABI]
2064
-# @DESCRIPTION:
2065
-# Print path to Python include directory.
2066
-# If --base-path option is specified, then path not prefixed with "/" is printed.
2067
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2068
-python_get_includedir() {
2069
-	_python_check_python_pkg_setup_execution
2070
-
2071
-	local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2072
-
2073
-	while (($#)); do
2074
-		case "$1" in
2075
-			-b|--base-path)
2076
-				base_path="1"
2077
-				;;
2078
-			-f|--final-ABI)
2079
-				final_ABI="1"
2080
-				;;
2081
-			-*)
2082
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2083
-				;;
2084
-			*)
2085
-				die "${FUNCNAME}(): Invalid usage"
2086
-				;;
2087
-		esac
2088
-		shift
2089
-	done
2090
-
2091
-	if [[ "${base_path}" == "0" ]]; then
2092
-		prefix="/"
2093
-	fi
2094
-
2095
-	if [[ "${final_ABI}" == "1" ]]; then
2096
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2097
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2098
-		fi
2099
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2100
-	else
2101
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2102
-			if ! _python_abi-specific_local_scope; then
2103
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2104
-			fi
2105
-		else
2106
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2107
-		fi
2108
-	fi
2109
-
2110
-	if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2111
-		echo "${prefix}usr/include/python${PYTHON_ABI}"
2112
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2113
-		echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Include"
2114
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2115
-		echo "${prefix}usr/$(get_libdir)/pypy${PYTHON_ABI#*-pypy-}/include"
2116
-	fi
2117
-}
2118
-
2119
-# @FUNCTION: python_get_libdir
2120
-# @USAGE: [-b|--base-path] [-f|--final-ABI]
2121
-# @DESCRIPTION:
2122
-# Print path to Python standard library directory.
2123
-# If --base-path option is specified, then path not prefixed with "/" is printed.
2124
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2125
-python_get_libdir() {
2126
-	_python_check_python_pkg_setup_execution
2127
-
2128
-	local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2129
-
2130
-	while (($#)); do
2131
-		case "$1" in
2132
-			-b|--base-path)
2133
-				base_path="1"
2134
-				;;
2135
-			-f|--final-ABI)
2136
-				final_ABI="1"
2137
-				;;
2138
-			-*)
2139
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2140
-				;;
2141
-			*)
2142
-				die "${FUNCNAME}(): Invalid usage"
2143
-				;;
2144
-		esac
2145
-		shift
2146
-	done
2147
-
2148
-	if [[ "${base_path}" == "0" ]]; then
2149
-		prefix="/"
2150
-	fi
2151
-
2152
-	if [[ "${final_ABI}" == "1" ]]; then
2153
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2154
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2155
-		fi
2156
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2157
-	else
2158
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2159
-			if ! _python_abi-specific_local_scope; then
2160
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2161
-			fi
2162
-		else
2163
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2164
-		fi
2165
-	fi
2166
-
2167
-	if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2168
-		echo "${prefix}usr/$(get_libdir)/python${PYTHON_ABI}"
2169
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2170
-		echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Lib"
2171
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2172
-		die "${FUNCNAME}(): PyPy has multiple standard library directories"
2173
-	fi
2174
-}
2175
-
2176
-# @FUNCTION: python_get_sitedir
2177
-# @USAGE: [-b|--base-path] [-f|--final-ABI]
2178
-# @DESCRIPTION:
2179
-# Print path to Python site-packages directory.
2180
-# If --base-path option is specified, then path not prefixed with "/" is printed.
2181
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2182
-python_get_sitedir() {
2183
-	_python_check_python_pkg_setup_execution
2184
-
2185
-	local base_path="0" final_ABI="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2186
-
2187
-	while (($#)); do
2188
-		case "$1" in
2189
-			-b|--base-path)
2190
-				base_path="1"
2191
-				;;
2192
-			-f|--final-ABI)
2193
-				final_ABI="1"
2194
-				;;
2195
-			-*)
2196
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2197
-				;;
2198
-			*)
2199
-				die "${FUNCNAME}(): Invalid usage"
2200
-				;;
2201
-		esac
2202
-		shift
2203
-	done
2204
-
2205
-	if [[ "${base_path}" == "0" ]]; then
2206
-		prefix="/"
2207
-	fi
2208
-
2209
-	if [[ "${final_ABI}" == "1" ]]; then
2210
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2211
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2212
-		fi
2213
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2214
-	else
2215
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2216
-			if ! _python_abi-specific_local_scope; then
2217
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2218
-			fi
2219
-		else
2220
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2221
-		fi
2222
-	fi
2223
-
2224
-	if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2225
-		echo "${prefix}usr/$(get_libdir)/python${PYTHON_ABI}/site-packages"
2226
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2227
-		echo "${prefix}usr/share/jython-${PYTHON_ABI%-jython}/Lib/site-packages"
2228
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2229
-		echo "${prefix}usr/$(get_libdir)/pypy${PYTHON_ABI#*-pypy-}/site-packages"
2230
-	fi
2231
-}
2232
-
2233
-# @FUNCTION: python_get_library
2234
-# @USAGE: [-b|--base-path] [-f|--final-ABI] [-l|--linker-option]
2235
-# @DESCRIPTION:
2236
-# Print path to Python library.
2237
-# If --base-path option is specified, then path not prefixed with "/" is printed.
2238
-# If --linker-option is specified, then "-l${library}" linker option is printed.
2239
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2240
-python_get_library() {
2241
-	_python_check_python_pkg_setup_execution
2242
-
2243
-	local base_path="0" final_ABI="0" linker_option="0" prefix PYTHON_ABI="${PYTHON_ABI}"
2244
-
2245
-	while (($#)); do
2246
-		case "$1" in
2247
-			-b|--base-path)
2248
-				base_path="1"
2249
-				;;
2250
-			-f|--final-ABI)
2251
-				final_ABI="1"
2252
-				;;
2253
-			-l|--linker-option)
2254
-				linker_option="1"
2255
-				;;
2256
-			-*)
2257
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2258
-				;;
2259
-			*)
2260
-				die "${FUNCNAME}(): Invalid usage"
2261
-				;;
2262
-		esac
2263
-		shift
2264
-	done
2265
-
2266
-	if [[ "${base_path}" == "0" ]]; then
2267
-		prefix="/"
2268
-	fi
2269
-
2270
-	if [[ "${base_path}" == "1" && "${linker_option}" == "1" ]]; then
2271
-		die "${FUNCNAME}(): '--base-path' and '--linker-option' options cannot be specified simultaneously"
2272
-	fi
2273
-
2274
-	if [[ "${final_ABI}" == "1" ]]; then
2275
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2276
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2277
-		fi
2278
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2279
-	else
2280
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2281
-			if ! _python_abi-specific_local_scope; then
2282
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2283
-			fi
2284
-		else
2285
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2286
-		fi
2287
-	fi
2288
-
2289
-	if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2290
-		if [[ "${linker_option}" == "1" ]]; then
2291
-			echo "-lpython${PYTHON_ABI}"
2292
-		else
2293
-			echo "${prefix}usr/$(get_libdir)/libpython${PYTHON_ABI}$(get_libname)"
2294
-		fi
2295
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2296
-		die "${FUNCNAME}(): Jython does not have shared library"
2297
-	elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2298
-		die "${FUNCNAME}(): PyPy does not have shared library"
2299
-	fi
2300
-}
2301
-
2302
-# @FUNCTION: python_get_version
2303
-# @USAGE: [-f|--final-ABI] [-l|--language] [--full] [--major] [--minor] [--micro]
2304
-# @DESCRIPTION:
2305
-# Print version of Python implementation.
2306
-# --full, --major, --minor and --micro options cannot be specified simultaneously.
2307
-# If --full, --major, --minor and --micro options are not specified, then "${major_version}.${minor_version}" is printed.
2308
-# If --language option is specified, then version of Python language is printed.
2309
-# --language and --full options cannot be specified simultaneously.
2310
-# --language and --micro options cannot be specified simultaneously.
2311
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2312
-python_get_version() {
2313
-	_python_check_python_pkg_setup_execution
2314
-
2315
-	local final_ABI="0" language="0" language_version full="0" major="0" minor="0" micro="0" PYTHON_ABI="${PYTHON_ABI}" python_command
2316
-
2317
-	while (($#)); do
2318
-		case "$1" in
2319
-			-f|--final-ABI)
2320
-				final_ABI="1"
2321
-				;;
2322
-			-l|--language)
2323
-				language="1"
2324
-				;;
2325
-			--full)
2326
-				full="1"
2327
-				;;
2328
-			--major)
2329
-				major="1"
2330
-				;;
2331
-			--minor)
2332
-				minor="1"
2333
-				;;
2334
-			--micro)
2335
-				micro="1"
2336
-				;;
2337
-			-*)
2338
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2339
-				;;
2340
-			*)
2341
-				die "${FUNCNAME}(): Invalid usage"
2342
-				;;
2343
-		esac
2344
-		shift
2345
-	done
2346
-
2347
-	if [[ "${final_ABI}" == "1" ]]; then
2348
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2349
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2350
-		fi
2351
-	else
2352
-		if _python_package_supporting_installation_for_multiple_python_abis && ! _python_abi-specific_local_scope; then
2353
-			die "${FUNCNAME}() should be used in ABI-specific local scope"
2354
-		fi
2355
-	fi
2356
-
2357
-	if [[ "$((${full} + ${major} + ${minor} + ${micro}))" -gt 1 ]]; then
2358
-		die "${FUNCNAME}(): '--full', '--major', '--minor' or '--micro' options cannot be specified simultaneously"
2359
-	fi
2360
-
2361
-	if [[ "${language}" == "1" ]]; then
2362
-		if [[ "${final_ABI}" == "1" ]]; then
2363
-			PYTHON_ABI="$(PYTHON -f --ABI)"
2364
-		elif [[ -z "${PYTHON_ABI}" ]]; then
2365
-			PYTHON_ABI="$(PYTHON --ABI)"
2366
-		fi
2367
-		language_version="${PYTHON_ABI%%-*}"
2368
-		if [[ "${full}" == "1" ]]; then
2369
-			die "${FUNCNAME}(): '--language' and '--full' options cannot be specified simultaneously"
2370
-		elif [[ "${major}" == "1" ]]; then
2371
-			echo "${language_version%.*}"
2372
-		elif [[ "${minor}" == "1" ]]; then
2373
-			echo "${language_version#*.}"
2374
-		elif [[ "${micro}" == "1" ]]; then
2375
-			die "${FUNCNAME}(): '--language' and '--micro' options cannot be specified simultaneously"
2376
-		else
2377
-			echo "${language_version}"
2378
-		fi
2379
-	else
2380
-		if [[ "${full}" == "1" ]]; then
2381
-			python_command="import sys; print('.'.join(str(x) for x in getattr(sys, 'pypy_version_info', sys.version_info)[:3]))"
2382
-		elif [[ "${major}" == "1" ]]; then
2383
-			python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[0])"
2384
-		elif [[ "${minor}" == "1" ]]; then
2385
-			python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[1])"
2386
-		elif [[ "${micro}" == "1" ]]; then
2387
-			python_command="import sys; print(getattr(sys, 'pypy_version_info', sys.version_info)[2])"
2388
-		else
2389
-			if [[ -n "${PYTHON_ABI}" && "${final_ABI}" == "0" ]]; then
2390
-				if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then
2391
-					echo "${PYTHON_ABI}"
2392
-				elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then
2393
-					echo "${PYTHON_ABI%-jython}"
2394
-				elif [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then
2395
-					echo "${PYTHON_ABI#*-pypy-}"
2396
-				fi
2397
-				return
2398
-			fi
2399
-			python_command="from sys import version_info; print('.'.join(str(x) for x in version_info[:2]))"
2400
-		fi
2401
-
2402
-		if [[ "${final_ABI}" == "1" ]]; then
2403
-			"$(PYTHON -f)" -c "${python_command}"
2404
-		else
2405
-			"$(PYTHON ${PYTHON_ABI})" -c "${python_command}"
2406
-		fi
2407
-	fi
2408
-}
2409
-
2410
-# @FUNCTION: python_get_implementation_and_version
2411
-# @USAGE: [-f|--final-ABI]
2412
-# @DESCRIPTION:
2413
-# Print name and version of Python implementation.
2414
-# If version of Python implementation is not bound to version of Python language, then
2415
-# version of Python language is additionally printed.
2416
-# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
2417
-python_get_implementation_and_version() {
2418
-	_python_check_python_pkg_setup_execution
2419
-
2420
-	local final_ABI="0" PYTHON_ABI="${PYTHON_ABI}"
2421
-
2422
-	while (($#)); do
2423
-		case "$1" in
2424
-			-f|--final-ABI)
2425
-				final_ABI="1"
2426
-				;;
2427
-			-*)
2428
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2429
-				;;
2430
-			*)
2431
-				die "${FUNCNAME}(): Invalid usage"
2432
-				;;
2433
-		esac
2434
-		shift
2435
-	done
2436
-
2437
-	if [[ "${final_ABI}" == "1" ]]; then
2438
-		if ! _python_package_supporting_installation_for_multiple_python_abis; then
2439
-			die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2440
-		fi
2441
-		PYTHON_ABI="$(PYTHON -f --ABI)"
2442
-	else
2443
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2444
-			if ! _python_abi-specific_local_scope; then
2445
-				die "${FUNCNAME}() should be used in ABI-specific local scope"
2446
-			fi
2447
-		else
2448
-			PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
2449
-		fi
2450
-	fi
2451
-
2452
-	if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-[[:alnum:]]+-[[:digit:]]+\.[[:digit:]]+$ ]]; then
2453
-		echo "$(_python_get_implementation "${PYTHON_ABI}") ${PYTHON_ABI##*-} (Python ${PYTHON_ABI%%-*})"
2454
-	else
2455
-		echo "$(_python_get_implementation "${PYTHON_ABI}") ${PYTHON_ABI%%-*}"
2456
-	fi
2457
-}
2458
-
2459
-# ================================================================================================
2460
-# ================================ FUNCTIONS FOR RUNNING OF TESTS ================================
2461
-# ================================================================================================
2462
-
2463
-# @ECLASS-VARIABLE: PYTHON_TEST_VERBOSITY
2464
-# @DESCRIPTION:
2465
-# User-configurable verbosity of tests of Python modules.
2466
-# Supported values: 0, 1, 2, 3, 4.
2467
-PYTHON_TEST_VERBOSITY="${PYTHON_TEST_VERBOSITY:-1}"
2468
-
2469
-_python_test_hook() {
2470
-	if [[ "$#" -ne 1 ]]; then
2471
-		die "${FUNCNAME}() requires 1 argument"
2472
-	fi
2473
-
2474
-	if _python_package_supporting_installation_for_multiple_python_abis && [[ "$(type -t "${_PYTHON_TEST_FUNCTION}_$1_hook")" == "function" ]]; then
2475
-		"${_PYTHON_TEST_FUNCTION}_$1_hook"
2476
-	fi
2477
-}
2478
-
2479
-# @FUNCTION: python_execute_nosetests
2480
-# @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2481
-# @DESCRIPTION:
2482
-# Execute nosetests for all enabled Python ABIs.
2483
-# In ebuilds of packages supporting installation for multiple Python ABIs, this function calls
2484
-# python_execute_nosetests_pre_hook() and python_execute_nosetests_post_hook(), if they are defined.
2485
-python_execute_nosetests() {
2486
-	_python_check_python_pkg_setup_execution
2487
-	_python_set_color_variables
2488
-
2489
-	local PYTHONPATH_template separate_build_dirs
2490
-
2491
-	while (($#)); do
2492
-		case "$1" in
2493
-			-P|--PYTHONPATH)
2494
-				PYTHONPATH_template="$2"
2495
-				shift
2496
-				;;
2497
-			-s|--separate-build-dirs)
2498
-				separate_build_dirs="1"
2499
-				;;
2500
-			--)
2501
-				shift
2502
-				break
2503
-				;;
2504
-			-*)
2505
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2506
-				;;
2507
-			*)
2508
-				break
2509
-				;;
2510
-		esac
2511
-		shift
2512
-	done
2513
-
2514
-	python_test_function() {
2515
-		local evaluated_PYTHONPATH
2516
-
2517
-		eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2518
-
2519
-		_PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook pre
2520
-
2521
-		if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2522
-			echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}
2523
-			PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"
2524
-		else
2525
-			echo ${_BOLD}nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}
2526
-			nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"
2527
-		fi
2528
-
2529
-		_PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook post
2530
-	}
2531
-	if _python_package_supporting_installation_for_multiple_python_abis; then
2532
-		python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2533
-	else
2534
-		if [[ -n "${separate_build_dirs}" ]]; then
2535
-			die "${FUNCNAME}(): Invalid usage"
2536
-		fi
2537
-		python_test_function "$@" || die "Testing failed"
2538
-	fi
2539
-
2540
-	unset -f python_test_function
2541
-}
2542
-
2543
-# @FUNCTION: python_execute_py.test
2544
-# @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2545
-# @DESCRIPTION:
2546
-# Execute py.test for all enabled Python ABIs.
2547
-# In ebuilds of packages supporting installation for multiple Python ABIs, this function calls
2548
-# python_execute_py.test_pre_hook() and python_execute_py.test_post_hook(), if they are defined.
2549
-python_execute_py.test() {
2550
-	_python_check_python_pkg_setup_execution
2551
-	_python_set_color_variables
2552
-
2553
-	local PYTHONPATH_template separate_build_dirs
2554
-
2555
-	while (($#)); do
2556
-		case "$1" in
2557
-			-P|--PYTHONPATH)
2558
-				PYTHONPATH_template="$2"
2559
-				shift
2560
-				;;
2561
-			-s|--separate-build-dirs)
2562
-				separate_build_dirs="1"
2563
-				;;
2564
-			--)
2565
-				shift
2566
-				break
2567
-				;;
2568
-			-*)
2569
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2570
-				;;
2571
-			*)
2572
-				break
2573
-				;;
2574
-		esac
2575
-		shift
2576
-	done
2577
-
2578
-	python_test_function() {
2579
-		local evaluated_PYTHONPATH
2580
-
2581
-		eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2582
-
2583
-		_PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook pre
2584
-
2585
-		if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2586
-			echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@"${_NORMAL}
2587
-			PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@" || return "$?"
2588
-		else
2589
-			echo ${_BOLD}py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@"${_NORMAL}
2590
-			py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@" || return "$?"
2591
-		fi
2592
-
2593
-		_PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook post
2594
-	}
2595
-	if _python_package_supporting_installation_for_multiple_python_abis; then
2596
-		python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2597
-	else
2598
-		if [[ -n "${separate_build_dirs}" ]]; then
2599
-			die "${FUNCNAME}(): Invalid usage"
2600
-		fi
2601
-		python_test_function "$@" || die "Testing failed"
2602
-	fi
2603
-
2604
-	unset -f python_test_function
2605
-}
2606
-
2607
-# @FUNCTION: python_execute_trial
2608
-# @USAGE: [-P|--PYTHONPATH PYTHONPATH] [-s|--separate-build-dirs] [--] [arguments]
2609
-# @DESCRIPTION:
2610
-# Execute trial for all enabled Python ABIs.
2611
-# In ebuilds of packages supporting installation for multiple Python ABIs, this function
2612
-# calls python_execute_trial_pre_hook() and python_execute_trial_post_hook(), if they are defined.
2613
-python_execute_trial() {
2614
-	_python_check_python_pkg_setup_execution
2615
-	_python_set_color_variables
2616
-
2617
-	local PYTHONPATH_template separate_build_dirs
2618
-
2619
-	while (($#)); do
2620
-		case "$1" in
2621
-			-P|--PYTHONPATH)
2622
-				PYTHONPATH_template="$2"
2623
-				shift
2624
-				;;
2625
-			-s|--separate-build-dirs)
2626
-				separate_build_dirs="1"
2627
-				;;
2628
-			--)
2629
-				shift
2630
-				break
2631
-				;;
2632
-			-*)
2633
-				die "${FUNCNAME}(): Unrecognized option '$1'"
2634
-				;;
2635
-			*)
2636
-				break
2637
-				;;
2638
-		esac
2639
-		shift
2640
-	done
2641
-
2642
-	python_test_function() {
2643
-		local evaluated_PYTHONPATH
2644
-
2645
-		eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""
2646
-
2647
-		_PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook pre
2648
-
2649
-		if [[ -n "${evaluated_PYTHONPATH}" ]]; then
2650
-			echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}
2651
-			PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"
2652
-		else
2653
-			echo ${_BOLD}trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}
2654
-			trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"
2655
-		fi
2656
-
2657
-		_PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook post
2658
-	}
2659
-	if _python_package_supporting_installation_for_multiple_python_abis; then
2660
-		python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"
2661
-	else
2662
-		if [[ -n "${separate_build_dirs}" ]]; then
2663
-			die "${FUNCNAME}(): Invalid usage"
2664
-		fi
2665
-		python_test_function "$@" || die "Testing failed"
2666
-	fi
2667
-
2668
-	unset -f python_test_function
2669
-}
2670
-
2671
-# ================================================================================================
2672
-# ======================= FUNCTIONS FOR HANDLING OF BYTE-COMPILED MODULES ========================
2673
-# ================================================================================================
2674
-
2675
-# @FUNCTION: python_enable_pyc
2676
-# @DESCRIPTION:
2677
-# Tell Python to automatically recompile modules to .pyc/.pyo if the
2678
-# timestamps/version stamps have changed.
2679
-python_enable_pyc() {
2680
-	_python_check_python_pkg_setup_execution
2681
-
2682
-	if [[ "$#" -ne 0 ]]; then
2683
-		die "${FUNCNAME}() does not accept arguments"
2684
-	fi
2685
-
2686
-	unset PYTHONDONTWRITEBYTECODE
2687
-}
2688
-
2689
-# @FUNCTION: python_disable_pyc
2690
-# @DESCRIPTION:
2691
-# Tell Python not to automatically recompile modules to .pyc/.pyo
2692
-# even if the timestamps/version stamps do not match. This is done
2693
-# to protect sandbox.
2694
-python_disable_pyc() {
2695
-	_python_check_python_pkg_setup_execution
2696
-
2697
-	if [[ "$#" -ne 0 ]]; then
2698
-		die "${FUNCNAME}() does not accept arguments"
2699
-	fi
2700
-
2701
-	export PYTHONDONTWRITEBYTECODE="1"
2702
-}
2703
-
2704
-_python_vecho() {
2705
-	[[ -z ${PORTAGE_VERBOSE} ]] || echo "$@"
2706
-}
2707
-
2708
-_python_clean_compiled_modules() {
2709
-	_python_initialize_prefix_variables
2710
-	_python_set_color_variables
2711
-
2712
-	[[ "${FUNCNAME[1]}" =~ ^(python_mod_optimize|python_mod_cleanup)$ ]] || die "${FUNCNAME}(): Invalid usage"
2713
-
2714
-	local base_module_name compiled_file compiled_files=() dir path py_file root
2715
-
2716
-	# Strip trailing slash from EROOT.
2717
-	root="${EROOT%/}"
2718
-
2719
-	for path in "$@"; do
2720
-		compiled_files=()
2721
-		if [[ -d "${path}" ]]; then
2722
-			while read -d $'\0' -r compiled_file; do
2723
-				compiled_files+=("${compiled_file}")
2724
-			done < <(find "${path}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -print0)
2725
-
2726
-			if [[ "${EBUILD_PHASE}" == "postrm" ]]; then
2727
-				# Delete empty child directories.
2728
-				find "${path}" -type d | sort -r | while read -r dir; do
2729
-					if rmdir "${dir}" 2> /dev/null; then
2730
-						_python_vecho "<<< ${dir}"
2731
-					fi
2732
-				done
2733
-			fi
2734
-		elif [[ "${path}" == *.py ]]; then
2735
-			base_module_name="${path##*/}"
2736
-			base_module_name="${base_module_name%.py}"
2737
-			if [[ -d "${path%/*}/__pycache__" ]]; then
2738
-				while read -d $'\0' -r compiled_file; do
2739
-					compiled_files+=("${compiled_file}")
2740
-				done < <(find "${path%/*}/__pycache__" "(" -name "${base_module_name}.*.py[co]" -o -name "${base_module_name}\$py.class" ")" -print0)
2741
-			fi
2742
-			compiled_files+=("${path}c" "${path}o" "${path%.py}\$py.class")
2743
-		fi
2744
-
2745
-		for compiled_file in "${compiled_files[@]}"; do
2746
-			[[ ! -f "${compiled_file}" ]] && continue
2747
-			dir="${compiled_file%/*}"
2748
-			dir="${dir##*/}"
2749
-			if [[ "${compiled_file}" == *.py[co] ]]; then
2750
-				if [[ "${dir}" == "__pycache__" ]]; then
2751
-					base_module_name="${compiled_file##*/}"
2752
-					base_module_name="${base_module_name%.*py[co]}"
2753
-					base_module_name="${base_module_name%.*}"
2754
-					py_file="${compiled_file%__pycache__/*}${base_module_name}.py"
2755
-				else
2756
-					py_file="${compiled_file%[co]}"
2757
-				fi
2758
-				if [[ "${EBUILD_PHASE}" == "postinst" ]]; then
2759
-					[[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue
2760
-				else
2761
-					[[ -f "${py_file}" ]] && continue
2762
-				fi
2763
-				_python_vecho "<<< ${compiled_file%[co]}[co]"
2764
-				rm -f "${compiled_file%[co]}"[co]
2765
-			elif [[ "${compiled_file}" == *\$py.class ]]; then
2766
-				if [[ "${dir}" == "__pycache__" ]]; then
2767
-					base_module_name="${compiled_file##*/}"
2768
-					base_module_name="${base_module_name%\$py.class}"
2769
-					py_file="${compiled_file%__pycache__/*}${base_module_name}.py"
2770
-				else
2771
-					py_file="${compiled_file%\$py.class}.py"
2772
-				fi
2773
-				if [[ "${EBUILD_PHASE}" == "postinst" ]]; then
2774
-					[[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue
2775
-				else
2776
-					[[ -f "${py_file}" ]] && continue
2777
-				fi
2778
-				_python_vecho "<<< ${compiled_file}"
2779
-				rm -f "${compiled_file}"
2780
-			else
2781
-				die "${FUNCNAME}(): Unrecognized file type: '${compiled_file}'"
2782
-			fi
2783
-
2784
-			# Delete empty parent directories.
2785
-			dir="${compiled_file%/*}"
2786
-			while [[ "${dir}" != "${root}" ]]; do
2787
-				if rmdir "${dir}" 2> /dev/null; then
2788
-					_python_vecho "<<< ${dir}"
2789
-				else
2790
-					break
2791
-				fi
2792
-				dir="${dir%/*}"
2793
-			done
2794
-		done
2795
-	done
2796
-}
2797
-
2798
-# @FUNCTION: python_mod_optimize
2799
-# @USAGE: [--allow-evaluated-non-sitedir-paths] [-d directory] [-f] [-l] [-q] [-x regular_expression] [--] <file|directory> [files|directories]
2800
-# @DESCRIPTION:
2801
-# Byte-compile specified Python modules.
2802
-# -d, -f, -l, -q and -x options passed to this function are passed to compileall.py.
2803
-#
2804
-# This function can be used only in pkg_postinst() phase.
2805
-python_mod_optimize() {
2806
-	if [[ "${EBUILD_PHASE}" != "postinst" ]]; then
2807
-		die "${FUNCNAME}() can be used only in pkg_postinst() phase"
2808
-	fi
2809
-
2810
-	_python_check_python_pkg_setup_execution
2811
-	_python_initialize_prefix_variables
2812
-
2813
-	if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then
2814
-		# PYTHON_ABI variable cannot be local in packages not supporting installation for multiple Python ABIs.
2815
-		local allow_evaluated_non_sitedir_paths="0" dir dirs=() evaluated_dirs=() evaluated_files=() file files=() iterated_PYTHON_ABIS options=() other_dirs=() other_files=() previous_PYTHON_ABI="${PYTHON_ABI}" return_code root site_packages_dirs=() site_packages_files=() stderr stderr_line
2816
-
2817
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2818
-			if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then
2819
-				die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"
2820
-			fi
2821
-			iterated_PYTHON_ABIS="${PYTHON_ABIS}"
2822
-		else
2823
-			if has "${EAPI:-0}" 0 1 2 3; then
2824
-				iterated_PYTHON_ABIS="${PYTHON_ABI:=$(PYTHON --ABI)}"
2825
-			else
2826
-				iterated_PYTHON_ABIS="${PYTHON_ABI}"
2827
-			fi
2828
-		fi
2829
-
2830
-		# Strip trailing slash from EROOT.
2831
-		root="${EROOT%/}"
2832
-
2833
-		while (($#)); do
2834
-			case "$1" in
2835
-				--allow-evaluated-non-sitedir-paths)
2836
-					allow_evaluated_non_sitedir_paths="1"
2837
-					;;
2838
-				-l|-f|-q)
2839
-					options+=("$1")
2840
-					;;
2841
-				-d|-x)
2842
-					options+=("$1" "$2")
2843
-					shift
2844
-					;;
2845
-				--)
2846
-					shift
2847
-					break
2848
-					;;
2849
-				-*)
2850
-					die "${FUNCNAME}(): Unrecognized option '$1'"
2851
-					;;
2852
-				*)
2853
-					break
2854
-					;;
2855
-			esac
2856
-			shift
2857
-		done
2858
-
2859
-		if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then
2860
-			die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
2861
-		fi
2862
-
2863
-		if [[ "$#" -eq 0 ]]; then
2864
-			die "${FUNCNAME}(): Missing files or directories"
2865
-		fi
2866
-
2867
-		while (($#)); do
2868
-			if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
2869
-				die "${FUNCNAME}(): Invalid argument '$1'"
2870
-			elif ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
2871
-				die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"
2872
-			elif [[ "$1" =~ ^/ ]]; then
2873
-				if _python_package_supporting_installation_for_multiple_python_abis; then
2874
-					if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then
2875
-						die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
2876
-					fi
2877
-					if [[ "$1" != *\$* ]]; then
2878
-						die "${FUNCNAME}(): '$1' has invalid syntax"
2879
-					fi
2880
-					if [[ "$1" == *.py ]]; then
2881
-						evaluated_files+=("$1")
2882
-					else
2883
-						evaluated_dirs+=("$1")
2884
-					fi
2885
-				else
2886
-					if [[ -d "${root}$1" ]]; then
2887
-						other_dirs+=("${root}$1")
2888
-					elif [[ -f "${root}$1" ]]; then
2889
-						other_files+=("${root}$1")
2890
-					elif [[ -e "${root}$1" ]]; then
2891
-						eerror "${FUNCNAME}(): '${root}$1' is not a regular file or a directory"
2892
-					else
2893
-						eerror "${FUNCNAME}(): '${root}$1' does not exist"
2894
-					fi
2895
-				fi
2896
-			else
2897
-				for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
2898
-					if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then
2899
-						site_packages_dirs+=("$1")
2900
-						break
2901
-					elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then
2902
-						site_packages_files+=("$1")
2903
-						break
2904
-					elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then
2905
-						eerror "${FUNCNAME}(): '$1' is not a regular file or a directory"
2906
-					else
2907
-						eerror "${FUNCNAME}(): '$1' does not exist"
2908
-					fi
2909
-				done
2910
-			fi
2911
-			shift
2912
-		done
2913
-
2914
-		# Set additional options.
2915
-		options+=("-q")
2916
-
2917
-		for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
2918
-			if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})) || ((${#evaluated_dirs[@]})) || ((${#evaluated_files[@]})); then
2919
-				return_code="0"
2920
-				stderr=""
2921
-				ebegin "Compilation and optimization of Python modules for $(python_get_implementation_and_version)"
2922
-				if ((${#site_packages_dirs[@]})) || ((${#evaluated_dirs[@]})); then
2923
-					for dir in "${site_packages_dirs[@]}"; do
2924
-						dirs+=("${root}$(python_get_sitedir)/${dir}")
2925
-					done
2926
-					for dir in "${evaluated_dirs[@]}"; do
2927
-						eval "dirs+=(\"\${root}${dir}\")"
2928
-					done
2929
-					stderr+="${stderr:+$'\n'}$("$(PYTHON)" -m compileall "${options[@]}" "${dirs[@]}" 2>&1)" || return_code="1"
2930
-					if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2931
-						"$(PYTHON)" -O -m compileall "${options[@]}" "${dirs[@]}" &> /dev/null || return_code="1"
2932
-					fi
2933
-					_python_clean_compiled_modules "${dirs[@]}"
2934
-				fi
2935
-				if ((${#site_packages_files[@]})) || ((${#evaluated_files[@]})); then
2936
-					for file in "${site_packages_files[@]}"; do
2937
-						files+=("${root}$(python_get_sitedir)/${file}")
2938
-					done
2939
-					for file in "${evaluated_files[@]}"; do
2940
-						eval "files+=(\"\${root}${file}\")"
2941
-					done
2942
-					stderr+="${stderr:+$'\n'}$("$(PYTHON)" -m py_compile "${files[@]}" 2>&1)" || return_code="1"
2943
-					if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2944
-						"$(PYTHON)" -O -m py_compile "${files[@]}" &> /dev/null || return_code="1"
2945
-					fi
2946
-					_python_clean_compiled_modules "${files[@]}"
2947
-				fi
2948
-				eend "${return_code}"
2949
-				if [[ -n "${stderr}" ]]; then
2950
-					eerror "Syntax errors / warnings in Python modules for $(python_get_implementation_and_version):" &> /dev/null
2951
-					while read stderr_line; do
2952
-						eerror "    ${stderr_line}"
2953
-					done <<< "${stderr}"
2954
-				fi
2955
-			fi
2956
-			unset dirs files
2957
-		done
2958
-
2959
-		if _python_package_supporting_installation_for_multiple_python_abis; then
2960
-			# Restore previous value of PYTHON_ABI.
2961
-			if [[ -n "${previous_PYTHON_ABI}" ]]; then
2962
-				PYTHON_ABI="${previous_PYTHON_ABI}"
2963
-			else
2964
-				unset PYTHON_ABI
2965
-			fi
2966
-		fi
2967
-
2968
-		if ((${#other_dirs[@]})) || ((${#other_files[@]})); then
2969
-			return_code="0"
2970
-			stderr=""
2971
-			ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for $(python_get_implementation_and_version)"
2972
-			if ((${#other_dirs[@]})); then
2973
-				stderr+="${stderr:+$'\n'}$("$(PYTHON ${PYTHON_ABI})" -m compileall "${options[@]}" "${other_dirs[@]}" 2>&1)" || return_code="1"
2974
-				if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2975
-					"$(PYTHON ${PYTHON_ABI})" -O -m compileall "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1"
2976
-				fi
2977
-				_python_clean_compiled_modules "${other_dirs[@]}"
2978
-			fi
2979
-			if ((${#other_files[@]})); then
2980
-				stderr+="${stderr:+$'\n'}$("$(PYTHON ${PYTHON_ABI})" -m py_compile "${other_files[@]}" 2>&1)" || return_code="1"
2981
-				if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then
2982
-					"$(PYTHON ${PYTHON_ABI})" -O -m py_compile "${other_files[@]}" &> /dev/null || return_code="1"
2983
-				fi
2984
-				_python_clean_compiled_modules "${other_files[@]}"
2985
-			fi
2986
-			eend "${return_code}"
2987
-			if [[ -n "${stderr}" ]]; then
2988
-				eerror "Syntax errors / warnings in Python modules placed outside of site-packages directories for $(python_get_implementation_and_version):" &> /dev/null
2989
-				while read stderr_line; do
2990
-					eerror "    ${stderr_line}"
2991
-				done <<< "${stderr}"
2992
-			fi
2993
-		fi
2994
-	else
2995
-		# Deprecated part of python_mod_optimize()
2996
-
2997
-		local myroot mydirs=() myfiles=() myopts=() return_code="0"
2998
-
2999
-		# strip trailing slash
3000
-		myroot="${EROOT%/}"
3001
-
3002
-		# respect EROOT and options passed to compileall.py
3003
-		while (($#)); do
3004
-			case "$1" in
3005
-				-l|-f|-q)
3006
-					myopts+=("$1")
3007
-					;;
3008
-				-d|-x)
3009
-					myopts+=("$1" "$2")
3010
-					shift
3011
-					;;
3012
-				--)
3013
-					shift
3014
-					break
3015
-					;;
3016
-				-*)
3017
-					die "${FUNCNAME}(): Unrecognized option '$1'"
3018
-					;;
3019
-				*)
3020
-					break
3021
-					;;
3022
-			esac
3023
-			shift
3024
-		done
3025
-
3026
-		if [[ "$#" -eq 0 ]]; then
3027
-			die "${FUNCNAME}(): Missing files or directories"
3028
-		fi
3029
-
3030
-		while (($#)); do
3031
-			if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
3032
-				die "${FUNCNAME}(): Invalid argument '$1'"
3033
-			elif [[ -d "${myroot}/${1#/}" ]]; then
3034
-				mydirs+=("${myroot}/${1#/}")
3035
-			elif [[ -f "${myroot}/${1#/}" ]]; then
3036
-				myfiles+=("${myroot}/${1#/}")
3037
-			elif [[ -e "${myroot}/${1#/}" ]]; then
3038
-				eerror "${FUNCNAME}(): ${myroot}/${1#/} is not a regular file or directory"
3039
-			else
3040
-				eerror "${FUNCNAME}(): ${myroot}/${1#/} does not exist"
3041
-			fi
3042
-			shift
3043
-		done
3044
-
3045
-		# set additional opts
3046
-		myopts+=(-q)
3047
-
3048
-		PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"
3049
-
3050
-		ebegin "Compilation and optimization of Python modules for $(python_get_implementation) $(python_get_version)"
3051
-		if ((${#mydirs[@]})); then
3052
-			"$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" || return_code="1"
3053
-			"$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" &> /dev/null || return_code="1"
3054
-			_python_clean_compiled_modules "${mydirs[@]}"
3055
-		fi
3056
-
3057
-		if ((${#myfiles[@]})); then
3058
-			"$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" || return_code="1"
3059
-			"$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" &> /dev/null || return_code="1"
3060
-			_python_clean_compiled_modules "${myfiles[@]}"
3061
-		fi
3062
-
3063
-		eend "${return_code}"
3064
-	fi
3065
-}
3066
-
3067
-# @FUNCTION: python_mod_cleanup
3068
-# @USAGE: [--allow-evaluated-non-sitedir-paths] [--] <file|directory> [files|directories]
3069
-# @DESCRIPTION:
3070
-# Delete orphaned byte-compiled Python modules corresponding to specified Python modules.
3071
-#
3072
-# This function can be used only in pkg_postrm() phase.
3073
-python_mod_cleanup() {
3074
-	if [[ "${EBUILD_PHASE}" != "postrm" ]]; then
3075
-		die "${FUNCNAME}() can be used only in pkg_postrm() phase"
3076
-	fi
3077
-
3078
-	_python_check_python_pkg_setup_execution
3079
-	_python_initialize_prefix_variables
3080
-
3081
-	local allow_evaluated_non_sitedir_paths="0" dir iterated_PYTHON_ABIS PYTHON_ABI="${PYTHON_ABI}" root search_paths=() sitedir
3082
-
3083
-	if _python_package_supporting_installation_for_multiple_python_abis; then
3084
-		if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then
3085
-			die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"
3086
-		fi
3087
-		iterated_PYTHON_ABIS="${PYTHON_ABIS}"
3088
-	else
3089
-		if has "${EAPI:-0}" 0 1 2 3; then
3090
-			iterated_PYTHON_ABIS="${PYTHON_ABI:-$(PYTHON --ABI)}"
3091
-		else
3092
-			iterated_PYTHON_ABIS="${PYTHON_ABI}"
3093
-		fi
3094
-	fi
3095
-
3096
-	# Strip trailing slash from EROOT.
3097
-	root="${EROOT%/}"
3098
-
3099
-	while (($#)); do
3100
-		case "$1" in
3101
-			--allow-evaluated-non-sitedir-paths)
3102
-				allow_evaluated_non_sitedir_paths="1"
3103
-				;;
3104
-			--)
3105
-				shift
3106
-				break
3107
-				;;
3108
-			-*)
3109
-				die "${FUNCNAME}(): Unrecognized option '$1'"
3110
-				;;
3111
-			*)
3112
-				break
3113
-				;;
3114
-		esac
3115
-		shift
3116
-	done
3117
-
3118
-	if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then
3119
-		die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"
3120
-	fi
3121
-
3122
-	if [[ "$#" -eq 0 ]]; then
3123
-		die "${FUNCNAME}(): Missing files or directories"
3124
-	fi
3125
-
3126
-	if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then
3127
-		while (($#)); do
3128
-			if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then
3129
-				die "${FUNCNAME}(): Invalid argument '$1'"
3130
-			elif ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
3131
-				die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"
3132
-			elif [[ "$1" =~ ^/ ]]; then
3133
-				if _python_package_supporting_installation_for_multiple_python_abis; then
3134
-					if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then
3135
-						die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"
3136
-					fi
3137
-					if [[ "$1" != *\$* ]]; then
3138
-						die "${FUNCNAME}(): '$1' has invalid syntax"
3139
-					fi
3140
-					for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
3141
-						eval "search_paths+=(\"\${root}$1\")"
3142
-					done
3143
-				else
3144
-					search_paths+=("${root}$1")
3145
-				fi
3146
-			else
3147
-				for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do
3148
-					search_paths+=("${root}$(python_get_sitedir)/$1")
3149
-				done
3150
-			fi
3151
-			shift
3152
-		done
3153
-	else
3154
-		# Deprecated part of python_mod_cleanup()
3155
-
3156
-		search_paths=("${@#/}")
3157
-		search_paths=("${search_paths[@]/#/${root}/}")
3158
-	fi
3159
-
3160
-	_python_clean_compiled_modules "${search_paths[@]}"
3161
-}
3162
-
3163
-# ================================================================================================
3164
-# ===================================== DEPRECATED FUNCTIONS =====================================
3165
-# ================================================================================================
3166
-
3167
-fi # _PYTHON_ECLASS_INHERITED
... ...
@@ -1,17 +0,0 @@
1
-AUX crontab 488 BLAKE2B 51a7ac9bbca8e6e68d0338320535ef6e5a4cb311d6f28a7077f04f3d9f937cdc67e991a97d0ff77b482f81752f1a76b2e7f3013f409fed1191309e8403c19ec9 SHA512 adf8335c4742aea39f825e21475959e638b0926cf557f20aefa93efa1291145ef4e44ec9e4fa0f0d6358c65d2c2b6b411deb4d4ac1dcc811085851910fb8c071
2
-AUX crontab-3.0.1-r4 489 BLAKE2B 09c173a967b845b833b1f0b31705240ceb6453d53f8fd9a9a32115a08aa65df8a24ed75be26905f189b40f953d3fb82d1f51e120d9d857ffbcdd586650d7ce8d SHA512 6387680385c0f75a77a939592a9eb0f6ed30de20f262597875c64847d480a54854c4810001b7872fa769a7f9c45fa3045b2179744efad78fd80a4e8a3f4f326d
3
-AUX crontab.5.diff 772 BLAKE2B f9281e71ac8271e088bc76dbf93085a21ca1dffa04dc02bd18845af5d78838fea032a46f72e33fe440b228536f824a281f82e698d2b1618c952b4929b6e9c1b1 SHA512 2efecff5b35f06ccd65961143c55d8c4be92714c67de6c064b1d3b6975ef9d825c3f4b1b4c32c64efede2a8aa727bb4b22330ac45118f0e2b0feb6b169dfb17d
4
-AUX pamd.compatible 123 BLAKE2B 81739a6ded32d58251cfdcb6d6981aabef949b7d41be100212315f7311ca812e9790ae4b1c5a349ce23e2324cffbb8fe777260a71a55c84b10b0069436c5ce39 SHA512 ea770adf46e00c0d517333f9c072946300db88e53fa7379616f499b6e771a24b0514bd85e24272b16a9dd4599b04514c557519ecb6d51f2ad752b7326376c62b
5
-AUX vixie-cron-4.1-basename.diff 479 BLAKE2B 2b2753ee6c73a66081dce7b9d34b8b075d3a9ca85df9a4f1de9efd5242195aef1b38822b2f45602c402c552b7e0325d2087b74e831b2be01e48d08ce4a42c3ac SHA512 979942efca89b724ca4bdc865d6d5ee3a298c9a1d2af69edbc3d65b3831ff99225eb7b2b4974722d38272b8fb4651806d51f2d1bf2e15e2a65deb1c64f7a8349
6
-AUX vixie-cron-4.1-commandline.patch 387 BLAKE2B 73f6b02459037592b88483f69a28e5ecc55adc0754208eef0148970d752781670e40b7839e4397d123fc00cf4d8f69dab305964e63452e3a70e44a4c0b8ae9d7 SHA512 cfd85bb7999160559d462c246e6b87b0dd472dd859065adc0b3c98332b6da484a2be70a8ad55001f0d701e91f6f7f35972c1c0135cf79f1f7399a5371558c05b
7
-AUX vixie-cron-4.1-cron.deny 148 BLAKE2B 3da92c65667ccacd74e32443e1cd5623d8040a75d783bac5055ed2c6773b1967c516cba82fcfe8ab6a25b65af6d009ae7c4178b332681970c9b2d339bc6473bd SHA512 e2e3a72a527d7d905b8e36f3a988eb71baebab5eb83d4a744d7c4ff4e9d6030d17bd9d8dbea30397027f4f0bbcd8df82ca0c2dd89777aade530af832fa26b5c6
8
-AUX vixie-cron-4.1-crontabrace.patch 658 BLAKE2B 4958e13b14519b484b677a7fd7593f2b17adbbb7cac46d18e0cd68714841e50614d472cdb880ce7f45e456ba30b9119671c44c217edfa81679d5a231bab8be30 SHA512 7aac74563a26bc86bb99488ab0a556a389b5a3d36bed7c80c355a3504d9175d1ac8d437ebdba60831de42a1cc7188b464956f8e94876f8eaf465c9f7005b8242
9
-AUX vixie-cron-4.1-hardlink.patch 369 BLAKE2B a1e3f1106ca15411b59ebb0a162181675189ae9c459169b01893ffc33cd6ca2b256eaee043c48d841cb8ee8789414ebaf7d153f5a600190d6c8b096c2d06fbd9 SHA512 32a804929f1a005edbe58c17e5a4e57141e1b379724e1d760729ba2e5f578b9e509e5e04893e648f463dc250804a9b6303b3dfb7d91c485e57ac02e1c866600a
10
-AUX vixie-cron-4.1-pam.patch 1714 BLAKE2B 04d3b0f76b794e357b8d93f2a95a45f64f9f6baddd92901626f8cad96d9a6033802727d5d54bc3983acf3073b0e860228567f1a6894021c260222de22d99c880 SHA512 596e3888c9ba484b5e4f2b0db14aac0449760d9e4ca91105cac19555c4e45ae96c9e5e302335c5559697881286eae98d7149742e4f01102cc5042edf795d46fc
11
-AUX vixie-cron-4.1-selinux-2.patch 6566 BLAKE2B 21aec85c6ca39e6479252f34d7f8e557fbbc191d8336d056c37a41f487f8c417dea827e3f608f9c605960431583db0453db024f4bbe329a89b81661c5eba641f SHA512 b272b8a9dda7b80f6213ce7b0b38dc3beb16bf38ae202410c9062ae0c14653174dc309fe6dffa469058acf58fae903e0eb670b721213bbdcba3bf21eccfbdfd3
12
-AUX vixie-cron-4.1-setuid_check.patch 767 BLAKE2B b14d22d7a457fd984a65b32bacd30f6f4a01b6670f486d3529a28afd2f880791e0995043066035870e0221b9ae66af68f7134081ec25d18f4757249bd7119784 SHA512 4c49ac5465a142a49799ce1ab816aacd458b44287a3200d9dc35afe1b717d095b2db93eee70913c3c6ee4171afe1293d6838af3f0e6156a96e1e6431ded2af70
13
-AUX vixie-cron.rc7 239 BLAKE2B 64248f4d67ba35ae9c4cbcc9f800782a4da9c0b8780b326cf97d8800cd606cb449ab1725b68d98879d1e33db7552b090ca458fe2ba10f86d360130e65563945f SHA512 d491ae5db8e6ad00bf59380a3358577dfe45a0d137fa5100c22252b8d6d84149d379aae860a30b39c4bdbfc0274ed6cf8fe8d2dfedbea29f4260d5aaab975766
14
-AUX vixie-cron.service 178 BLAKE2B 2ef614075505ef9a48b89ae46d21c5c3544db711b430eabc04870b436437d9b194963b6da572c3bf2c758c4fc7aa37ee90500a1e72fc135ecb8a59f7582ebbba SHA512 09af14c9010c55c204db8755872df531d0e28b473d56f0b5f99c037e2183e2f9e2be9cc66895f4da2036b74efa7bc472e932331fac13722a505ae2be400a068d
15
-DIST vixie-cron-4.1-gentoo-r4.patch.bz2 4204 BLAKE2B 1e276ade20e61ae17e45c10145532e3f32dfa74e32b6cbecde22863de82afb280e97d3b380626451524cfc7fc0663934657509b228a51b3b5ad42e26e5cceb3d SHA512 eec8f89a97927a3557bd1350ed7e9baa0ec133e2c49f8f0fbf51adf62c377451dc48867ca6affcc7576833a5b6b749613c9b99641b1b658853f91d8071c3411b
16
-DIST vixie-cron-4.1.tar.bz2 54246 BLAKE2B 920bf5d95b24cd41677f4a748da02231ed75713ff280acafdf476ad0a71e73068bbad9070fc57d3b0cb39a9539da24182aa2dbc9eb9dfe241adaf9a46f9c5db2 SHA512 1db9a246243dbd4934438ce70bf022215ccffed4b899a77b076d5a7679a7b98a23ef67344e329fc7a836df90685581e10b1c95709db40601c33d2052ce561e04
17
-EBUILD vixie-cron-4.1-r15.ebuild 3467 BLAKE2B b482daee160f119cfe0095654742d3c783cb583c66ffff46999cb0fc7d98793c7584aa8973f2699fba45b7bb4fa8e4ad270d26392f8e2bb9de4d5102f758fdbe SHA512 6cf3d9773e915787233e49c7ce81cfcb1afecf68f76b3579b8a1a2ba68f56637d4a99cc7a7095674d1c0c82855d9a3ddf3cd8e8c53c67044fd9cddb2c3312192
... ...
@@ -1,15 +0,0 @@
1
-# for vixie cron
2
-#
3
-
4
-# Global variables
5
-SHELL=/bin/bash
6
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
7
-MAILTO=root
8
-HOME=/
9
-
10
-# check scripts in cron.hourly, cron.daily, cron.weekly and cron.monthly
11
-*/15 * * * *	root	test -x /usr/sbin/run-crons && /usr/sbin/run-crons
12
-0  *  * * *	root	rm -f /var/spool/cron/lastrun/cron.hourly
13
-0  3  * * *	root	rm -f /var/spool/cron/lastrun/cron.daily
14
-15 4  * * 6	root	rm -f /var/spool/cron/lastrun/cron.weekly
15
-30 5  1 * *	root	rm -f /var/spool/cron/lastrun/cron.monthly
... ...
@@ -1,14 +0,0 @@
1
-# for vixie cron
2
-
3
-# Global variables
4
-SHELL=/bin/bash
5
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
6
-MAILTO=root
7
-HOME=/
8
-
9
-# check scripts in cron.hourly, cron.daily, cron.weekly and cron.monthly
10
-59  *  * * *	root	rm -f /var/spool/cron/lastrun/cron.hourly
11
-9  3  * * *	root	rm -f /var/spool/cron/lastrun/cron.daily
12
-19 4  * * 6	root	rm -f /var/spool/cron/lastrun/cron.weekly
13
-29 5  1 * *	root	rm -f /var/spool/cron/lastrun/cron.monthly
14
-*/10  *  * * *	root	test -x /usr/sbin/run-crons && /usr/sbin/run-crons
... ...
@@ -1,35 +0,0 @@
1
---- crontab.5.orig	2004-02-19 20:40:04.954132624 +0000
2
-+++ crontab.5	2004-02-19 20:45:27.033169168 +0000
3
-@@ -153,6 +153,32 @@
4
- ``30 4 1,15 * 5''
5
- would cause a command to be run at 4:30 am on the 1st and 15th of each
6
- month, plus every Friday.
7
-+.PP
8
-+Instead of the first five fields, one of eight special strings may
9
-+appear:
10
-+.IP
11
-+.ta 1.5i
12
-+string	   meaning
13
-+.br
14
-+------	   -------
15
-+.br
16
-+@reboot	   Run once, at startup.
17
-+.br
18
-+@yearly	   Run once a year, "0 0 1 1 *".
19
-+.br
20
-+@annually	   (same as @yearly)
21
-+.br
22
-+@monthly	   Run once a month, "0 0 1 * *".
23
-+.br
24
-+@weekly	   Run once a week, "0 0 * * 0".
25
-+.br
26
-+@daily	   Run once a day, "0 0 * * *".
27
-+.br
28
-+@midnight	   (same as @daily)
29
-+.br
30
-+@hourly	   Run once an hour, "0 * * * *".
31
-+.br
32
-+.fi
33
- .SH EXAMPLE CRON FILE
34
- .nf
35
- 
... ...
@@ -1,7 +0,0 @@
1
-#%PAM-1.0
2
-
3
-account required        pam_unix.so
4
-
5
-auth    required        pam_unix.so
6
-
7
-session optional        pam_limits.so
... ...
@@ -1,20 +0,0 @@
1
-diff --exclude='*~' -urN vixie-cron-4.1.orig/cron.c vixie-cron-4.1/cron.c
2
---- vixie-cron-4.1.orig/cron.c	2005-02-23 02:05:30.730975808 -0500
3
-+++ vixie-cron-4.1/cron.c	2005-02-23 02:07:13.233393072 -0500
4
-@@ -25,6 +25,7 @@
5
- 
6
- #define	MAIN_PROGRAM
7
- 
8
-+#include <libgen.h>
9
- #include "cron.h"
10
- 
11
- enum timejump { negative, small, medium, large };
12
-@@ -61,7 +62,7 @@
13
- 	cron_db	database;
14
- 	int fd;
15
- 
16
--	ProgramName = argv[0];
17
-+	ProgramName = basename(argv[0]);
18
- 
19
- 	setlocale(LC_ALL, "");
20
- 
... ...
@@ -1,13 +0,0 @@
1
---- entry.c.orig     2004-08-27 20:09:34.000000000 +0200
2
-+++ entry.c	2004-12-01 22:16:10.992268200 +0100
3
-@@ -336,7 +336,9 @@
4
- 
5
- 	/* If the first character of the command is '-' it is a cron option.
6
- 	 */
7
--	while ((ch = get_char(file)) == '-') {
8
-+	ch = get_char(file);
9
-+	Skip_Blanks(ch, file)
10
-+	while (ch == '-') {
11
- 		switch (ch = get_char(file)) {
12
- 		case 'q':
13
- 			e->flags |= DONT_LOG;
... ...
@@ -1,4 +0,0 @@
1
-# If for any reason you have users in the 'cron' group who should not
2
-# be allowed to run crontab, add them to this file (one username per
3
-# line)
4
-
... ...
@@ -1,29 +0,0 @@
1
---- vixie-cron-4.1/crontab.c
2
-+++ vixie-cron-4.1/crontab.c
3
-@@ -314,8 +314,6 @@
4
- 		perror("fstat");
5
- 		goto fatal;
6
- 	}
7
--	utimebuf.actime = statbuf.st_atime;
8
--	utimebuf.modtime = statbuf.st_mtime;
9
- 
10
- 	/* Turn off signals. */
11
- 	(void)signal(SIGHUP, SIG_IGN);
12
-@@ -374,6 +372,17 @@
13
- 		perror(Filename);
14
- 		exit(ERROR_EXIT);
15
- 	}
16
-+	if (swap_uids() < OK) {
17
-+		perror("swapping uids");
18
-+		exit(ERROR_EXIT);
19
-+	}
20
-+	utimebuf.actime = statbuf.st_atime;
21
-+	utimebuf.modtime = statbuf.st_mtime;
22
-+	utime(Filename, &utimebuf);
23
-+	if (swap_uids_back() < OK) {
24
-+		perror("swapping uids back");
25
-+		exit(ERROR_EXIT);
26
-+	}
27
- 	utime(Filename, &utimebuf);
28
-  again:
29
- 	rewind(NewCrontab);
... ...
@@ -1,11 +0,0 @@
1
---- database.c.orig	2007-04-08 21:06:16.913019387 +0200
2
-+++ database.c	2007-04-08 21:06:29.489736093 +0200
3
-@@ -251,7 +251,7 @@
4
- 		log_it(fname, getpid(), "WRONG FILE OWNER", tabname);
5
- 		goto next_crontab;
6
- 	}
7
--	if (statbuf->st_nlink != 1) {
8
-+	if (statbuf->st_nlink != 1 && pw != NULL) {
9
- 		log_it(fname, getpid(), "BAD LINK COUNT", tabname);
10
- 		goto next_crontab;
11
- 	}
... ...
@@ -1,67 +0,0 @@
1
---- vixie-cron-3.0.1.orig/Makefile	Thu May 30 19:47:00 2002
2
-+++ vixie-cron-3.0.1/Makefile	Thu May 30 20:54:46 2002
3
-@@ -55,7 +55,7 @@
4
- INCLUDE		=	-I.
5
- #INCLUDE	=
6
- #<<need getopt()>>
7
--LIBS		=
8
-+LIBS		=	-lpam
9
- #<<optimize or debug?>>
10
- OPTIM		=	$(RPM_OPT_FLAGS)
11
- #OPTIM		=	-g
12
---- vixie-cron-3.0.1.orig/do_command.c	Thu May 30 19:47:00 2002
13
-+++ vixie-cron-3.0.1/do_command.c	Thu May 30 20:55:50 2002
14
-@@ -25,6 +25,18 @@
15
- 
16
- #include "cron.h"
17
- 
18
-+#include <security/pam_appl.h>
19
-+static pam_handle_t *pamh = NULL;
20
-+static const struct pam_conv conv = {
21
-+	NULL
22
-+};
23
-+#define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
24
-+	fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
25
-+	syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
26
-+	pam_end(pamh, retcode); exit(1); \
27
-+	}
28
-+
29
-+
30
- static void		child_process(entry *, user *);
31
- static int		safe_p(const char *, const char *);
32
-
33
-@@ -65,6 +77,7 @@
34
- 	int stdin_pipe[2], stdout_pipe[2];
35
- 	char *input_data, *usernm, *mailto;
36
- 	int children = 0;
37
-+	int retcode = 0;
38
- 
39
- 	Debug(DPROC, ("[%ld] child_process('%s')\n", (long)getpid(), e->cmd))
40
- 
41
-@@ -134,6 +147,16 @@
42
- 		*p = '\0';
43
- 	}
44
- 
45
-+ 
46
-+	retcode = pam_start("cron", usernm, &conv, &pamh);
47
-+	PAM_FAIL_CHECK;
48
-+	retcode = pam_acct_mgmt(pamh, PAM_SILENT);
49
-+	PAM_FAIL_CHECK;
50
-+	retcode = pam_open_session(pamh, PAM_SILENT);
51
-+	PAM_FAIL_CHECK;
52
-+	retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
53
-+	PAM_FAIL_CHECK;
54
-+
55
- 	/* fork again, this time so we can exec the user's command.
56
- 	 */
57
- 	switch (vfork()) {
58
-@@ -507,6 +530,9 @@
59
- 			Debug(DPROC, (", dumped core"))
60
- 		Debug(DPROC, ("\n"))
61
- 	}
62
-+	pam_setcred(pamh, PAM_DELETE_CRED | PAM_SILENT);
63
-+	retcode = pam_close_session(pamh, PAM_SILENT);
64
-+	pam_end(pamh, retcode);
65
- }
66
- 
67
- static int
... ...
@@ -1,225 +0,0 @@
1
-diff -ur vixie-cron-4.1/Makefile vixie-cron-4.1-selinux/Makefile
2
---- vixie-cron-4.1/Makefile	2004-08-28 02:09:33.000000000 +0800
3
-+++ vixie-cron-4.1-selinux/Makefile	2017-04-26 22:16:53.321394815 +0800
4
-@@ -68,7 +68,8 @@
5
- #<<want to use a nonstandard CC?>>
6
- CC		=	gcc -Wall -Wno-unused -Wno-comment
7
- #<<manifest defines>>
8
--DEFS		=
9
-+DEFS		= -s -DWITH_SELINUX
10
-+LIBS		+= 	-lselinux
11
- #(SGI IRIX systems need this)
12
- #DEFS		=	-D_BSD_SIGNALS -Dconst=
13
- #<<the name of the BSD-like install program>>
14
-diff -ur vixie-cron-4.1/database.c vixie-cron-4.1-selinux/database.c
15
---- vixie-cron-4.1/database.c	2004-08-28 02:09:34.000000000 +0800
16
-+++ vixie-cron-4.1-selinux/database.c	2017-04-27 01:31:34.757942605 +0800
17
-@@ -28,6 +28,15 @@
18
- 
19
- #include "cron.h"
20
- 
21
-+#ifdef WITH_SELINUX
22
-+#include <selinux/selinux.h>
23
-+#include <selinux/context.h>
24
-+#include <selinux/get_context_list.h>
25
-+#define SYSUSERNAME "system_u"
26
-+#else
27
-+#define SYSUSERNAME "*system*"
28
-+#endif
29
-+
30
- #define TMAX(a,b) ((a)>(b)?(a):(b))
31
- 
32
- static	void		process_crontab(const char *, const char *,
33
-@@ -183,7 +192,7 @@
34
- 	if (fname == NULL) {
35
- 		/* must be set to something for logging purposes.
36
- 		 */
37
--		fname = "*system*";
38
-+		fname = SYSUSERNAME;
39
- 	} else if ((pw = getpwnam(uname)) == NULL) {
40
- 		/* file doesn't have a user in passwd file.
41
- 		 */
42
-@@ -245,6 +254,117 @@
43
- 		free_user(u);
44
- 		log_it(fname, getpid(), "RELOAD", tabname);
45
- 	}
46
-+#ifdef WITH_SELINUX
47
-+	if (is_selinux_enabled()) {
48
-+		security_context_t file_context=NULL;
49
-+		security_context_t user_context=NULL;
50
-+		context_t current_context = NULL;
51
-+		char *current_context_str = NULL;
52
-+		struct av_decision avd;
53
-+		int retval=0;
54
-+		char *seuser=NULL;
55
-+		char *level=NULL;
56
-+		int sys_user = 0;
57
-+
58
-+		sys_user = strcmp(SYSUSERNAME, fname);
59
-+
60
-+		if (fgetfilecon(crontab_fd, &file_context) < OK) {
61
-+			log_it(fname, getpid(), "getfilecon FAILED", tabname);
62
-+			goto next_crontab;
63
-+		}
64
-+
65
-+		if (sys_user != 0) {
66
-+			if (getseuserbyname(fname, &seuser, &level) < 0) {
67
-+				log_it(fname, getpid(), "NO SEUSER", tabname);
68
-+				goto next_crontab;
69
-+			}
70
-+		} else {
71
-+			if (getcon(&current_context_str) < 0) {
72
-+				log_it(fname, getpid(), "getcon FAILED", tabname);
73
-+				goto next_crontab;
74
-+			}
75
-+
76
-+			current_context = context_new(current_context_str);
77
-+			if (current_context == 0) {
78
-+				log_it(fname, getpid(), "context new FAILED", tabname);
79
-+				freecon(current_context_str);
80
-+				goto next_crontab;
81
-+			}
82
-+
83
-+			seuser = context_user_get(current_context);
84
-+			level = context_range_get(current_context);
85
-+		}
86
-+
87
-+		if (get_default_context_with_level(seuser, level, NULL, &user_context) < 0) {
88
-+			log_it(fname, getpid(), "NO CONTEXT", tabname);
89
-+			freecon(file_context);
90
-+			if (sys_user != 0) {
91
-+				free(seuser);
92
-+				free(level);
93
-+			}
94
-+			freecon(current_context_str);
95
-+			context_free(current_context);
96
-+			goto next_crontab;
97
-+		}
98
-+
99
-+		/*
100
-+		 * Since crontab files are not directly executed,
101
-+		 * crond must ensure that the crontab file has
102
-+		 * a context that is appropriate for the context of
103
-+		 * the user cron job.  It performs an entrypoint
104
-+		 * permission check for this purpose.
105
-+		 */
106
-+		security_class_t file_class;
107
-+		access_vector_t entrypoint_bit;
108
-+		file_class = string_to_security_class("file");
109
-+		if (file_class == 0) {
110
-+			log_it(fname, getpid(), "file CLASS NOT DEFINED", tabname);
111
-+			freecon(current_context_str);
112
-+			context_free(current_context);
113
-+			freecon(user_context);
114
-+			freecon(file_context);
115
-+			if (sys_user != 0) {
116
-+				free(seuser);
117
-+				free(level);
118
-+			}
119
-+			goto next_crontab;
120
-+		}
121
-+
122
-+		entrypoint_bit = string_to_av_perm(file_class, "entrypoint");
123
-+		if (entrypoint_bit == 0) {
124
-+			log_it(fname, getpid(), "file:entrypoint AV NOT DEFINED", tabname);
125
-+			freecon(current_context_str);
126
-+			context_free(current_context);
127
-+			freecon(user_context);
128
-+			freecon(file_context);
129
-+			if (sys_user != 0) {
130
-+				free(seuser);
131
-+				free(level);
132
-+			}
133
-+			goto next_crontab;
134
-+		}
135
-+
136
-+		retval = security_compute_av_raw(user_context,
137
-+			file_context,
138
-+			file_class,
139
-+			entrypoint_bit,
140
-+			&avd);
141
-+
142
-+		freecon(user_context);
143
-+		freecon(file_context);
144
-+		if (sys_user != 0) {
145
-+			free(seuser);
146
-+			free(level);
147
-+		}
148
-+		context_free(current_context);
149
-+		freecon(current_context_str);
150
-+
151
-+		if (retval || ((entrypoint_bit & avd.allowed) != entrypoint_bit)) {
152
-+			log_it(fname, getpid(), "ENTRYPOINT FAILED", tabname);
153
-+			goto next_crontab;
154
-+		}
155
-+	}
156
-+#endif
157
- 	u = load_user(crontab_fd, pw, fname);
158
- 	if (u != NULL) {
159
- 		u->mtime = statbuf->st_mtime;
160
-diff -ur vixie-cron-4.1/do_command.c vixie-cron-4.1-selinux/do_command.c
161
---- vixie-cron-4.1/do_command.c	2004-08-28 02:09:34.000000000 +0800
162
-+++ vixie-cron-4.1-selinux/do_command.c	2017-04-27 01:30:49.045144698 +0800
163
-@@ -25,6 +25,12 @@
164
- 
165
- #include "cron.h"
166
- 
167
-+#ifdef WITH_SELINUX
168
-+#include <selinux/selinux.h>
169
-+#include <selinux/context.h>
170
-+#include <selinux/get_context_list.h>
171
-+#endif
172
-+
173
- static void		child_process(entry *, user *);
174
- static int		safe_p(const char *, const char *);
175
- 
176
-@@ -265,6 +271,49 @@
177
- 				_exit(OK_EXIT);
178
- 			}
179
- # endif /*DEBUGGING*/
180
-+#ifdef WITH_SELINUX
181
-+			if (is_selinux_enabled()) {
182
-+				char *seuser = NULL;
183
-+				char *level = NULL;
184
-+				char *current_context_str = NULL;
185
-+				security_context_t scontext;
186
-+				context_t current_context = NULL;
187
-+
188
-+				if (strcmp("system_u", u->name) != 0) {
189
-+					if (getseuserbyname(u->name, &seuser, &level) < 0) {
190
-+						fprintf(stderr, "getseuserbyname: Could not determine seuser for user %s\n", u->name);
191
-+						_exit(ERROR_EXIT);
192
-+					}
193
-+				} else {
194
-+					if (getcon(&current_context_str) < 0) {
195
-+						fprintf(stderr, "getcon FAILED\n");
196
-+						_exit(ERROR_EXIT);
197
-+					}
198
-+
199
-+					current_context = context_new(current_context_str);
200
-+					if (current_context == NULL) {
201
-+						fprintf(stderr, "failed to create new context: %s\n", current_context_str);
202
-+						freecon(current_context_str);
203
-+						_exit(ERROR_EXIT);
204
-+					}
205
-+
206
-+					seuser = context_user_get(current_context);
207
-+				}
208
-+
209
-+				if (get_default_context_with_level(seuser, level, NULL, &scontext) < 0) {
210
-+					fprintf(stderr, "get_default_context_with_level: could not get security context for user %s, seuser %s\n", u->name, seuser);
211
-+					_exit(ERROR_EXIT);
212
-+				}
213
-+
214
-+				if (setexeccon(scontext) < 0) {
215
-+					fprintf(stderr, "setexeccon: Could not set exec context to %s for user %s\n", scontext, u->name);
216
-+					_exit(ERROR_EXIT);
217
-+				}
218
-+				free(seuser);
219
-+				free(level);
220
-+				freecon(scontext);
221
-+			}
222
-+#endif
223
- 			execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);
224
- 			fprintf(stderr, "execl: couldn't exec `%s'\n", shell);
225
- 			perror("execl");
... ...
@@ -1,29 +0,0 @@
1
---- vixie-cron-4.1/do_command.c	2006-05-25 16:44:26.000000000 +0400
2
-+++ vixie-cron-4.1.lk/do_command.c	2006-05-25 16:42:25.000000000 +0400
3
-@@ -240,12 +240,23 @@
4
- 			}
5
- 		}
6
- #else
7
--		setgid(e->pwd->pw_gid);
8
-+		
9
- 		initgroups(usernm, e->pwd->pw_gid);
10
- #if (defined(BSD)) && (BSD >= 199103)
11
- 		setlogin(usernm);
12
- #endif /* BSD */
13
--		setuid(e->pwd->pw_uid);	/* we aren't root after this... */
14
-+		// setuid(e->pwd->pw_uid);	/* we aren't root after this... */
15
-+		
16
-+	if ( setgid(e->pwd->pw_gid) == -1 ) {
17
-+		fprintf(stderr,"can't set gid for %s\n", e->pwd->pw_name);
18
-+		_exit(1);
19
-+	}
20
-+		
21
-+	if ( setuid(e->pwd->pw_uid) == -1 ) {
22
-+		fprintf(stderr,"can't set uid for %s\n", e->pwd->pw_name);
23
-+		_exit(1);
24
-+	}
25
-+		
26
- 
27
- #endif /* LOGIN_CAP */
28
- 		chdir(env_get("HOME", e->envp));
29
-
... ...
@@ -1,12 +0,0 @@
1
-#!/sbin/openrc-run
2
-# Copyright 1999-2011 Gentoo Foundation
3
-# Distributed under the terms of the GNU General Public License v2
4
-
5
-command=/usr/sbin/cron
6
-pidfile=/var/run/cron.pid
7
-
8
-depend() {
9
-	use clock logger
10
-	need localmount
11
-	provide cron
12
-}
... ...
@@ -1,11 +0,0 @@
1
-[Unit]
2
-Description=Vixie Cron Daemon
3
-
4
-[Service]
5
-Type=forking
6
-ExecStart=/usr/sbin/cron
7
-ExecStop=/bin/kill -TERM $MAINPID
8
-IgnoreSIGPIPE=false
9
-
10
-[Install]
11
-WantedBy=multi-user.target
... ...
@@ -1,126 +0,0 @@
1
-# Copyright 1999-2019 Gentoo Authors
2
-# Distributed under the terms of the GNU General Public License v2
3
-
4
-EAPI=0
5
-
6
-inherit cron toolchain-funcs pam eutils flag-o-matic user systemd
7
-
8
-# no useful homepage, bug #65898
9
-HOMEPAGE="ftp://ftp.isc.org/isc/cron/"
10
-DESCRIPTION="Paul Vixie's cron daemon, a fully featured crond implementation"
11
-
12
-SELINUX_PATCH="${P}-selinux-2.patch"
13
-GENTOO_PATCH_REV="r4"
14
-
15
-SRC_URI="mirror://gentoo/${P}.tar.bz2
16
-	mirror://gentoo/${P}-gentoo-${GENTOO_PATCH_REV}.patch.bz2"
17
-
18
-LICENSE="ISC BSD-2 BSD"
19
-KEYWORDS="alpha amd64 arm arm64 hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86"
20
-IUSE="selinux pam debug"
21
-
22
-DEPEND="selinux? ( sys-libs/libselinux )
23
-	pam? ( sys-libs/pam )"
24
-
25
-RDEPEND="selinux? ( sys-libs/libselinux )
26
-	 pam? ( sys-libs/pam )"
27
-
28
-#vixie-cron supports /etc/crontab
29
-CRON_SYSTEM_CRONTAB="yes"
30
-
31
-pkg_setup() {
32
-	enewgroup crontab
33
-}
34
-
35
-src_unpack() {
36
-	unpack ${A}
37
-	cd "${S}"
38
-
39
-	epatch "${WORKDIR}"/${P}-gentoo-${GENTOO_PATCH_REV}.patch
40
-	epatch "${FILESDIR}"/crontab.5.diff
41
-	epatch "${FILESDIR}"/${P}-commandline.patch
42
-	epatch "${FILESDIR}"/${P}-basename.diff
43
-	epatch "${FILESDIR}"/${P}-setuid_check.patch
44
-	epatch "${FILESDIR}"/${P}-hardlink.patch
45
-	epatch "${FILESDIR}"/${P}-crontabrace.patch
46
-	use pam && epatch "${FILESDIR}"/${P}-pam.patch
47
-	use selinux && epatch "${FILESDIR}"/${SELINUX_PATCH}
48
-}
49
-
50
-src_compile() {
51
-	use debug && append-flags -DDEBUGGING
52
-
53
-	sed -i -e "s:gcc \(-Wall.*\):$(tc-getCC) \1 ${CFLAGS}:" \
54
-		-e "s:^\(LDFLAGS[ \t]\+=\).*:\1 ${LDFLAGS}:" Makefile \
55
-		|| die "sed Makefile failed"
56
-
57
-	emake || die "emake failed"
58
-}
59
-
60
-src_install() {
61
-	docrondir -m 1730 -o root -g crontab
62
-	docron
63
-	docrontab -m 2755 -o root -g crontab
64
-
65
-	# /etc stuff
66
-	insinto /etc
67
-	newins  "${FILESDIR}"/crontab-3.0.1-r4 crontab
68
-	newins "${FILESDIR}"/${P}-cron.deny cron.deny
69
-
70
-	keepdir /etc/cron.d
71
-	newpamd "${FILESDIR}"/pamd.compatible cron
72
-	newinitd "${FILESDIR}"/vixie-cron.rc7 vixie-cron
73
-
74
-	# doc stuff
75
-	doman crontab.1 crontab.5 cron.8
76
-	dodoc "${FILESDIR}"/crontab
77
-	dodoc CHANGES CONVERSION FEATURES MAIL README THANKS
78
-
79
-	systemd_dounit "${FILESDIR}/${PN}.service"
80
-}
81
-
82
-pkg_preinst() {
83
-	has_version "<${CATEGORY}/${PN}-4.1-r10"
84
-	fix_spool_dir_perms=$?
85
-}
86
-
87
-pkg_postinst() {
88
-	if [[ -f ${ROOT}/etc/init.d/vcron ]]
89
-	then
90
-		ewarn "Please run:"
91
-		ewarn "rc-update del vcron"
92
-		ewarn "rc-update add vixie-cron default"
93
-	fi
94
-
95
-	# bug 71326
96
-	if [[ -u ${ROOT}/etc/pam.d/cron ]] ; then
97
-		echo
98
-		ewarn "Warning: previous ebuilds didn't reset permissions prior"
99
-		ewarn "to installing crontab, resulting in /etc/pam.d/cron being"
100
-		ewarn "installed with the SUID and executable bits set."
101
-		ewarn
102
-		ewarn "Run the following as root to set the proper permissions:"
103
-		ewarn "   chmod 0644 /etc/pam.d/cron"
104
-		echo
105
-	fi
106
-
107
-	# bug 164466
108
-	if [[ $fix_spool_dir_perms = 0 ]] ; then
109
-		echo
110
-		ewarn "Previous ebuilds didn't correctly set permissions on"
111
-		ewarn "the crontabs spool directory. Proper permissions are"
112
-		ewarn "now being set on ${ROOT}var/spool/cron/crontabs/"
113
-		ewarn "Look at this directory if you have a specific configuration"
114
-		ewarn "that needs special ownerships or permissions."
115
-		echo
116
-		chmod 1730 "${ROOT}/var/spool/cron/crontabs" || die "chmod failed"
117
-		chgrp -R crontab "${ROOT}/var/spool/cron/crontabs" || die "chgrp failed"
118
-		cd "${ROOT}/var/spool/cron/crontabs/"
119
-		for cronfile in * ; do
120
-			[[ ! -f $cronfile ]] || chown "$cronfile:crontab" "$cronfile" \
121
-		    || ewarn "chown failed on $cronfile, you probably have an orphan file."
122
-		done
123
-	fi
124
-
125
-	cron_pkg_postinst
126
-}
127 0