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

Diff of /eclass/python.eclass

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

Revision 1.78 Revision 1.84
1# Copyright 1999-2009 Gentoo Foundation 1# Copyright 1999-2010 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.78 2009/11/15 14:25:55 arfrever Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/python.eclass,v 1.84 2010/01/11 16:07:23 arfrever Exp $
4 4
5# @ECLASS: python.eclass 5# @ECLASS: python.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# python@gentoo.org 7# python@gentoo.org
8# @BLURB: A utility eclass that should be inherited by anything that deals with Python or Python modules. 8# @BLURB: A utility eclass that should be inherited by anything that deals with Python or Python modules.
9# @DESCRIPTION: 9# @DESCRIPTION:
10# Some useful functions for dealing with Python. 10# Some useful functions for dealing with Python.
11 11
12inherit multilib 12inherit multilib
13
14if ! has "${EAPI:-0}" 0 1 2; then
15 die "API of python.eclass in EAPI=\"${EAPI}\" not established"
16fi
13 17
14if [[ -n "${NEED_PYTHON}" ]]; then 18if [[ -n "${NEED_PYTHON}" ]]; then
15 PYTHON_ATOM=">=dev-lang/python-${NEED_PYTHON}" 19 PYTHON_ATOM=">=dev-lang/python-${NEED_PYTHON}"
16 DEPEND="${PYTHON_ATOM}" 20 DEPEND="${PYTHON_ATOM}"
17 RDEPEND="${DEPEND}" 21 RDEPEND="${DEPEND}"
18else 22else
19 PYTHON_ATOM="dev-lang/python" 23 PYTHON_ATOM="dev-lang/python"
20fi 24fi
21 25
22DEPEND+=" >=app-admin/eselect-python-20090804 26DEPEND+=" >=app-admin/eselect-python-20090804"
23 >=app-shells/bash-3.2"
24 27
25__python_eclass_test() { 28__python_eclass_test() {
26 __python_version_extract 2.3 29 __python_version_extract 2.3
27 echo -n "2.3 -> PYVER: $PYVER PYVER_MAJOR: $PYVER_MAJOR" 30 echo -n "2.3 -> PYVER: $PYVER PYVER_MAJOR: $PYVER_MAJOR"
28 echo " PYVER_MINOR: $PYVER_MINOR PYVER_MICRO: $PYVER_MICRO" 31 echo " PYVER_MINOR: $PYVER_MINOR PYVER_MICRO: $PYVER_MICRO"
56 59
57python_version() { 60python_version() {
58 [[ -n "${PYVER}" ]] && return 0 61 [[ -n "${PYVER}" ]] && return 0
59 local tmpstr 62 local tmpstr
60 python=${python:-/usr/bin/python} 63 python=${python:-/usr/bin/python}
61 tmpstr="$(${python} -V 2>&1 )" 64 tmpstr="$(EPYTHON= ${python} -V 2>&1 )"
62 export PYVER_ALL="${tmpstr#Python }" 65 export PYVER_ALL="${tmpstr#Python }"
63 __python_version_extract $PYVER_ALL 66 __python_version_extract $PYVER_ALL
64} 67}
65 68
66# @FUNCTION: PYTHON 69# @FUNCTION: PYTHON
67# @USAGE: [-a|--absolute-path] [--] <Python_ABI="${PYTHON_ABI}"> 70# @USAGE: [-2] [-3] [--ABI] [-A|--active] [-a|--absolute-path] [-f|--final-ABI] [--] <Python_ABI="${PYTHON_ABI}">
68# @DESCRIPTION: 71# @DESCRIPTION:
69# Get Python interpreter filename for specified Python ABI. If Python_ABI argument 72# Get Python interpreter filename for specified Python ABI. If Python_ABI argument
70# is ommitted, then PYTHON_ABI environment variable must be set and is used. 73# is ommitted, then PYTHON_ABI environment variable must be set and is used.
74# If -2 option is specified, then active version of Python 2 is used.
75# If -3 option is specified, then active version of Python 3 is used.
76# If --active option is specified, then active version of Python is used.
77# Active version of Python can be set by python_set_active_version().
78# If --final-ABI option is specified, then final ABI from the list of enabled ABIs is used.
79# -2, -3, --active and --final-ABI options and Python_ABI argument cannot be specified simultaneously.
80# If --ABI option is specified, then only specified Python ABI is printed instead of
81# Python interpreter filename.
82# --ABI and --absolute-path options cannot be specified simultaneously.
71PYTHON() { 83PYTHON() {
72 local absolute_path="0" slot= 84 local ABI_output="0" absolute_path_output="0" active="0" final_ABI="0" python2="0" python3="0" slot=
73 85
74 while (($#)); do 86 while (($#)); do
75 case "$1" in 87 case "$1" in
88 -2)
89 python2="1"
90 ;;
91 -3)
92 python3="1"
93 ;;
94 --ABI)
95 ABI_output="1"
96 ;;
97 -A|--active)
98 active="1"
99 ;;
76 -a|--absolute-path) 100 -a|--absolute-path)
77 absolute_path="1" 101 absolute_path_output="1"
102 ;;
103 -f|--final-ABI)
104 final_ABI="1"
78 ;; 105 ;;
79 --) 106 --)
80 break 107 break
81 ;; 108 ;;
82 -*) 109 -*)
83 die "${FUNCNAME}(): Unrecognized option $1" 110 die "${FUNCNAME}(): Unrecognized option '$1'"
84 ;; 111 ;;
85 *) 112 *)
86 break 113 break
87 ;; 114 ;;
88 esac 115 esac
89 shift 116 shift
90 done 117 done
91 118
119 if [[ "${ABI_output}" == "1" && "${absolute_path_output}" == "1" ]]; then
120 die "${FUNCNAME}(): '--ABI and '--absolute-path' options cannot be specified simultaneously"
121 fi
122
123 if [[ "$((${python2} + ${python3} + ${active} + ${final_ABI}))" -gt 1 ]]; then
124 die "${FUNCNAME}(): '-2', '-3', '--active' or '--final-ABI' options cannot be specified simultaneously"
125 fi
126
92 if [[ "$#" -eq "0" ]]; then 127 if [[ "$#" -eq 0 ]]; then
128 if [[ "${active}" == "1" ]]; then
129 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
130 die "${FUNCNAME}(): '--active' option cannot be used in ebuilds of packages supporting installation for multiple versions of Python"
131 fi
132 slot="$(/usr/bin/python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')"
133 elif [[ "${final_ABI}" == "1" ]]; then
134 validate_PYTHON_ABIS
135 slot="${PYTHON_ABIS##* }"
136 elif [[ "${python2}" == "1" ]]; then
137 slot="$(eselect python show --python2)"
138 if [[ -z "${slot}" ]]; then
139 die "${FUNCNAME}(): Active Python 2 interpreter not set"
140 elif [[ "${slot}" != "python2."* ]]; then
141 die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`"
142 fi
143 slot="${slot#python}"
144 elif [[ "${python3}" == "1" ]]; then
145 slot="$(eselect python show --python3)"
146 if [[ -z "${slot}" ]]; then
147 die "${FUNCNAME}(): Active Python 3 interpreter not set"
148 elif [[ "${slot}" != "python3."* ]]; then
149 die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`"
150 fi
151 slot="${slot#python}"
93 if [[ -n "${PYTHON_ABI}" ]]; then 152 elif [[ -n "${PYTHON_ABI}" ]]; then
94 slot="${PYTHON_ABI}" 153 slot="${PYTHON_ABI}"
95 else 154 else
96 die "${FUNCNAME}(): Invalid usage" 155 die "${FUNCNAME}(): Invalid usage"
97 fi 156 fi
98 elif [[ "$#" -eq "1" ]]; then 157 elif [[ "$#" -eq 1 ]]; then
158 if [[ "${active}" == "1" ]]; then
159 die "${FUNCNAME}(): '--active' option and Python ABI cannot be specified simultaneously"
160 fi
161 if [[ "${final_ABI}" == "1" ]]; then
162 die "${FUNCNAME}(): '--final-ABI' option and Python ABI cannot be specified simultaneously"
163 fi
164 if [[ "${python2}" == "1" ]]; then
165 die "${FUNCNAME}(): '-2' option and Python ABI cannot be specified simultaneously"
166 fi
167 if [[ "${python3}" == "1" ]]; then
168 die "${FUNCNAME}(): '-3' option and Python ABI cannot be specified simultaneously"
169 fi
99 slot="$1" 170 slot="$1"
100 else 171 else
101 die "${FUNCNAME}(): Invalid usage" 172 die "${FUNCNAME}(): Invalid usage"
102 fi 173 fi
103 174
175 if [[ "${ABI_output}" == "1" ]]; then
176 echo -n "${slot}"
177 return
104 if [[ "${absolute_path}" == "1" ]]; then 178 elif [[ "${absolute_path_output}" == "1" ]]; then
105 echo -n "/usr/bin/python${slot}" 179 echo -n "/usr/bin/python${slot}"
106 else 180 else
107 echo -n "python${slot}" 181 echo -n "python${slot}"
108 fi 182 fi
109 183
110 if [[ "${ABI}" != "${DEFAULT_ABI}" ]]; then 184 if [[ -n "${ABI}" && "${ABI}" != "${DEFAULT_ABI}" && "${DEFAULT_ABI}" != "default" ]]; then
111 echo -n "-${ABI}" 185 echo -n "-${ABI}"
112 fi 186 fi
187}
188
189_python_implementation() {
190 if [[ "${CATEGORY}/${PN}" == "dev-lang/python" ]]; then
191 return 0
192 else
193 return 1
194 fi
195}
196
197# @FUNCTION: python_set_active_version
198# @USAGE: <Python_ABI|2|3>
199# @DESCRIPTION:
200# Set active version of Python.
201python_set_active_version() {
202 if [[ "$#" -ne "1" ]]; then
203 die "${FUNCNAME}() requires 1 argument"
204 fi
205
206 if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then
207 if ! _python_implementation && ! has_version "dev-lang/python:$1"; then
208 die "${FUNCNAME}(): 'dev-lang/python:$1' is not installed"
209 fi
210 export EPYTHON="$(PYTHON "$1")"
211 elif [[ "$1" == "2" ]]; then
212 if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then
213 die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed"
214 fi
215 export EPYTHON="$(PYTHON -2)"
216 elif [[ "$1" == "3" ]]; then
217 if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then
218 die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed"
219 fi
220 export EPYTHON="$(PYTHON -3)"
221 else
222 die "${FUNCNAME}(): Unrecognized argument '$1'"
223 fi
224
225 # PYTHON_ABI variable is intended to be used only in ebuilds/eclasses,
226 # so it does not need to be exported to subprocesses.
227 PYTHON_ABI="${EPYTHON#python}"
228 PYTHON_ABI="${PYTHON_ABI%%-*}"
113} 229}
114 230
115unset PYTHON_ABIS 231unset PYTHON_ABIS
116unset PYTHON_ABIS_SANITY_CHECKS 232unset PYTHON_ABIS_SANITY_CHECKS
117 233
124 die "${FUNCNAME}() cannot be used in this EAPI without setting SUPPORT_PYTHON_ABIS variable" 240 die "${FUNCNAME}() cannot be used in this EAPI without setting SUPPORT_PYTHON_ABIS variable"
125 fi 241 fi
126 242
127 # Ensure that /usr/bin/python and /usr/bin/python-config are valid. 243 # Ensure that /usr/bin/python and /usr/bin/python-config are valid.
128 if [[ "$(readlink /usr/bin/python)" != "python-wrapper" ]]; then 244 if [[ "$(readlink /usr/bin/python)" != "python-wrapper" ]]; then
245 eerror "'/usr/bin/python' is not valid symlink."
246 eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."
129 die "'/usr/bin/python' isn't valid symlink" 247 die "'/usr/bin/python' is not valid symlink"
130 fi 248 fi
131 if [[ "$(</usr/bin/python-config)" != *"Gentoo python-config wrapper script"* ]]; then 249 if [[ "$(</usr/bin/python-config)" != *"Gentoo python-config wrapper script"* ]]; then
250 eerror "'/usr/bin/python-config' is not valid script"
251 eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."
132 die "'/usr/bin/python-config' isn't valid script" 252 die "'/usr/bin/python-config' is not valid script"
133 fi 253 fi
134 254
135 # USE_${ABI_TYPE^^} and RESTRICT_${ABI_TYPE^^}_ABIS variables hopefully will be included in EAPI >= 4. 255 # USE_${ABI_TYPE^^} and RESTRICT_${ABI_TYPE^^}_ABIS variables hopefully will be included in EAPI >= 5.
136 if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]] && has "${EAPI:-0}" 0 1 2 3; then 256 if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]] && has "${EAPI:-0}" 0 1 2 3 4; then
137 local PYTHON_ABI python2_supported_versions python3_supported_versions restricted_ABI support_ABI supported_PYTHON_ABIS= 257 local PYTHON_ABI python2_supported_versions python3_supported_versions restricted_ABI support_ABI supported_PYTHON_ABIS=
138 PYTHON_ABI_SUPPORTED_VALUES="2.4 2.5 2.6 2.7 3.0 3.1 3.2" 258 PYTHON_ABI_SUPPORTED_VALUES="2.4 2.5 2.6 2.7 3.0 3.1 3.2"
139 python2_supported_versions="2.4 2.5 2.6 2.7" 259 python2_supported_versions="2.4 2.5 2.6 2.7"
140 python3_supported_versions="3.0 3.1 3.2" 260 python3_supported_versions="3.0 3.1 3.2"
141 261
163 if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then 283 if [[ "${PYTHON_ABI}" == ${restricted_ABI} ]]; then
164 support_ABI="0" 284 support_ABI="0"
165 break 285 break
166 fi 286 fi
167 done 287 done
168 [[ "${support_ABI}" == "1" ]] && supported_PYTHON_ABIS+=" ${PYTHON_ABI}" 288 [[ "${support_ABI}" == "1" ]] && export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}"
169 done 289 done
170 export PYTHON_ABIS="${supported_PYTHON_ABIS# }"
171 290
172 if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then 291 if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then
173 die "USE_PYTHON variable doesn't enable any version of Python supported by ${CATEGORY}/${PF}" 292 die "USE_PYTHON variable does not enable any version of Python supported by ${CATEGORY}/${PF}"
174 fi 293 fi
175 294
176 if [[ "${python2_enabled}" == "0" ]]; then 295 if [[ "${python2_enabled}" == "0" ]]; then
177 ewarn "USE_PYTHON variable doesn't enable any version of Python 2. This configuration is unsupported." 296 ewarn "USE_PYTHON variable does not enable any version of Python 2. This configuration is unsupported."
178 fi 297 fi
179 if [[ "${python3_enabled}" == "0" ]]; then 298 if [[ "${python3_enabled}" == "0" ]]; then
180 ewarn "USE_PYTHON variable doesn't enable any version of Python 3. This configuration is unsupported." 299 ewarn "USE_PYTHON variable does not enable any version of Python 3. This configuration is unsupported."
181 fi 300 fi
182 else 301 else
183 local python_version python2_version= python3_version= support_python_major_version 302 local python_version python2_version= python3_version= support_python_major_version
184 303
185 python_version="$(/usr/bin/python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" 304 python_version="$(/usr/bin/python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')"
186 305
187 if has_version "=dev-lang/python-2*"; then 306 if has_version "=dev-lang/python-2*"; then
188 if [[ "$(readlink /usr/bin/python2)" != "python2."* ]]; then 307 if [[ "$(readlink /usr/bin/python2)" != "python2."* ]]; then
189 die "'/usr/bin/python2' isn't valid symlink" 308 die "'/usr/bin/python2' is not valid symlink"
190 fi 309 fi
191 310
192 python2_version="$(/usr/bin/python2 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" 311 python2_version="$(/usr/bin/python2 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')"
193 312
194 for PYTHON_ABI in ${python2_supported_versions}; do 313 for PYTHON_ABI in ${python2_supported_versions}; do
201 [[ "${support_python_major_version}" == "1" ]] && break 320 [[ "${support_python_major_version}" == "1" ]] && break
202 done 321 done
203 if [[ "${support_python_major_version}" == "1" ]]; then 322 if [[ "${support_python_major_version}" == "1" ]]; then
204 for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do 323 for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do
205 if [[ "${python2_version}" == ${restricted_ABI} ]]; then 324 if [[ "${python2_version}" == ${restricted_ABI} ]]; then
206 die "Active version of Python 2 isn't supported by ${CATEGORY}/${PF}" 325 die "Active version of Python 2 is not supported by ${CATEGORY}/${PF}"
207 fi 326 fi
208 done 327 done
209 else 328 else
210 python2_version="" 329 python2_version=""
211 fi 330 fi
212 fi 331 fi
213 332
214 if has_version "=dev-lang/python-3*"; then 333 if has_version "=dev-lang/python-3*"; then
215 if [[ "$(readlink /usr/bin/python3)" != "python3."* ]]; then 334 if [[ "$(readlink /usr/bin/python3)" != "python3."* ]]; then
216 die "'/usr/bin/python3' isn't valid symlink" 335 die "'/usr/bin/python3' is not valid symlink"
217 fi 336 fi
218 337
219 python3_version="$(/usr/bin/python3 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" 338 python3_version="$(/usr/bin/python3 -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')"
220 339
221 for PYTHON_ABI in ${python3_supported_versions}; do 340 for PYTHON_ABI in ${python3_supported_versions}; do
228 [[ "${support_python_major_version}" == "1" ]] && break 347 [[ "${support_python_major_version}" == "1" ]] && break
229 done 348 done
230 if [[ "${support_python_major_version}" == "1" ]]; then 349 if [[ "${support_python_major_version}" == "1" ]]; then
231 for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do 350 for restricted_ABI in ${RESTRICT_PYTHON_ABIS}; do
232 if [[ "${python3_version}" == ${restricted_ABI} ]]; then 351 if [[ "${python3_version}" == ${restricted_ABI} ]]; then
233 die "Active version of Python 3 isn't supported by ${CATEGORY}/${PF}" 352 die "Active version of Python 3 is not supported by ${CATEGORY}/${PF}"
234 fi 353 fi
235 done 354 done
236 else 355 else
237 python3_version="" 356 python3_version=""
238 fi 357 fi
239 fi 358 fi
240 359
241 if ! has "${python_version}" "${python2_version}" "${python3_version}"; then 360 if [[ -n "${python2_version}" && "${python_version}" == "2."* && "${python_version}" != "${python2_version}" ]]; then
242 eerror "Python wrapper is configured incorrectly or /usr/bin/python2 or /usr/bin/python3 symlink" 361 eerror "Python wrapper is configured incorrectly or /usr/bin/python2 symlink"
362 eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
363 die "Incorrect configuration of Python"
364 fi
365 if [[ -n "${python3_version}" && "${python_version}" == "3."* && "${python_version}" != "${python3_version}" ]]; then
366 eerror "Python wrapper is configured incorrectly or /usr/bin/python3 symlink"
243 eerror "is set incorrectly. Use \`eselect python\` to fix configuration." 367 eerror "is set incorrectly. Use \`eselect python\` to fix configuration."
244 die "Incorrect configuration of Python" 368 die "Incorrect configuration of Python"
245 fi 369 fi
246 370
247 PYTHON_ABIS="${python2_version} ${python3_version}" 371 PYTHON_ABIS="${python2_version} ${python3_version}"
248 PYTHON_ABIS="${PYTHON_ABIS# }" 372 PYTHON_ABIS="${PYTHON_ABIS# }"
249 export PYTHON_ABIS="${PYTHON_ABIS% }" 373 export PYTHON_ABIS="${PYTHON_ABIS% }"
250 fi 374 fi
251 fi 375 fi
252 376
253 if [[ "$(declare -p PYTHON_ABIS_SANITY_CHECKS 2> /dev/null)" != "declare -- PYTHON_ABIS_SANITY_CHECKS="* ]]; then 377 if ! _python_implementation && [[ "$(declare -p PYTHON_ABIS_SANITY_CHECKS 2> /dev/null)" != "declare -- PYTHON_ABIS_SANITY_CHECKS="* ]]; then
254 local PYTHON_ABI 378 local PYTHON_ABI
255 for PYTHON_ABI in ${PYTHON_ABIS}; do 379 for PYTHON_ABI in ${PYTHON_ABIS}; do
256 # Ensure that appropriate Python version is installed. 380 # Ensure that appropriate version of Python is installed.
257 if ! has_version "dev-lang/python:${PYTHON_ABI}"; then 381 if ! has_version "dev-lang/python:${PYTHON_ABI}"; then
258 die "dev-lang/python:${PYTHON_ABI} isn't installed" 382 die "dev-lang/python:${PYTHON_ABI} is not installed"
259 fi 383 fi
260 384
261 # Ensure that EPYTHON variable is respected. 385 # Ensure that EPYTHON variable is respected.
262 if [[ "$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" != "${PYTHON_ABI}" ]]; then 386 if [[ "$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')" != "${PYTHON_ABI}" ]]; then
387 eerror "python: '$(type -p python)'"
388 eerror "ABI: '${ABI}'"
389 eerror "DEFAULT_ABI: '${DEFAULT_ABI}'"
390 eerror "EPYTHON: '$(PYTHON)'"
391 eerror "PYTHON_ABI: '${PYTHON_ABI}'"
392 eerror "Version of enabled Python: '$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')'"
263 die "'python' doesn't respect EPYTHON variable" 393 die "'python' does not respect EPYTHON variable"
264 fi 394 fi
265 done 395 done
266 PYTHON_ABIS_SANITY_CHECKS="1" 396 PYTHON_ABIS_SANITY_CHECKS="1"
267 fi 397 fi
268} 398}
290 ;; 420 ;;
291 esac 421 esac
292 shift 422 shift
293 done 423 done
294 424
295 if [[ "$#" -eq "0" ]]; then 425 if [[ "$#" -eq 0 ]]; then
296 if [[ "${WORKDIR}" == "${S}" ]]; then 426 if [[ "${WORKDIR}" == "${S}" ]]; then
297 die "${FUNCNAME}() cannot be used" 427 die "${FUNCNAME}() cannot be used"
298 fi 428 fi
299 dirs="${S}" 429 dirs="${S}"
300 else 430 else
321 local dir="$1" 451 local dir="$1"
322 452
323 [[ -z "${PYTHON_ABI}" ]] && die "PYTHON_ABI variable not set" 453 [[ -z "${PYTHON_ABI}" ]] && die "PYTHON_ABI variable not set"
324 [[ -z "${dir}" ]] && dir="build" 454 [[ -z "${dir}" ]] && dir="build"
325 455
326 # Don't delete preexistent directories. 456 # Do not delete preexistent directories.
327 rm -f "${dir}" || die "Deletion of '${dir}' failed" 457 rm -f "${dir}" || die "Deletion of '${dir}' failed"
328 ln -s "${dir}-${PYTHON_ABI}" "${dir}" || die "Creation of '${dir}' directory symlink failed" 458 ln -s "${dir}-${PYTHON_ABI}" "${dir}" || die "Creation of '${dir}' directory symlink failed"
329} 459}
330 460
331# @FUNCTION: python_execute_function 461# @FUNCTION: python_execute_function
332# @USAGE: [--action-message message] [-d|--default-function] [--failure-message message] [--nonfatal] [-q|--quiet] [-s|--separate-build-dirs] [--] <function> [arguments] 462# @USAGE: [--action-message message] [-d|--default-function] [--failure-message message] [--nonfatal] [-q|--quiet] [-s|--separate-build-dirs] [--source-dir source_directory] [--] <function> [arguments]
333# @DESCRIPTION: 463# @DESCRIPTION:
334# Execute specified function for each value of PYTHON_ABIS, optionally passing additional 464# Execute specified function for each value of PYTHON_ABIS, optionally passing additional
335# arguments. The specified function can use PYTHON_ABI and BUILDDIR variables. 465# arguments. The specified function can use PYTHON_ABI and BUILDDIR variables.
336python_execute_function() { 466python_execute_function() {
337 local action action_message action_message_template= default_function="0" failure_message failure_message_template= function nonfatal="0" previous_directory previous_directory_stack previous_directory_stack_length PYTHON_ABI quiet="0" separate_build_dirs="0" 467 local action action_message action_message_template= default_function="0" failure_message failure_message_template= function nonfatal="0" previous_directory previous_directory_stack previous_directory_stack_length PYTHON_ABI quiet="0" separate_build_dirs="0" source_dir=
338 468
339 while (($#)); do 469 while (($#)); do
340 case "$1" in 470 case "$1" in
341 --action-message) 471 --action-message)
342 action_message_template="$2" 472 action_message_template="$2"
356 quiet="1" 486 quiet="1"
357 ;; 487 ;;
358 -s|--separate-build-dirs) 488 -s|--separate-build-dirs)
359 separate_build_dirs="1" 489 separate_build_dirs="1"
360 ;; 490 ;;
491 --source-dir)
492 source_dir="$2"
493 shift
494 ;;
361 --) 495 --)
362 break 496 break
363 ;; 497 ;;
364 -*) 498 -*)
365 die "${FUNCNAME}(): Unrecognized option '$1'" 499 die "${FUNCNAME}(): Unrecognized option '$1'"
369 ;; 503 ;;
370 esac 504 esac
371 shift 505 shift
372 done 506 done
373 507
508 if [[ -n "${source_dir}" && "${separate_build_dirs}" == 0 ]]; then
509 die "${FUNCNAME}(): '--source-dir' option can be specified only with '--separate-build-dirs' option"
510 fi
511
374 if [[ "${default_function}" == "0" ]]; then 512 if [[ "${default_function}" == "0" ]]; then
375 if [[ "$#" -eq "0" ]]; then 513 if [[ "$#" -eq 0 ]]; then
376 die "${FUNCNAME}(): Missing function name" 514 die "${FUNCNAME}(): Missing function name"
377 fi 515 fi
378 function="$1" 516 function="$1"
379 shift 517 shift
380 518
381 if [[ -z "$(type -t "${function}")" ]]; then 519 if [[ -z "$(type -t "${function}")" ]]; then
382 die "${FUNCNAME}(): '${function}' function isn't defined" 520 die "${FUNCNAME}(): '${function}' function is not defined"
383 fi 521 fi
384 else 522 else
385 if [[ "$#" -ne "0" ]]; then 523 if [[ "$#" -ne "0" ]]; then
386 die "${FUNCNAME}(): '--default-function' option and function name cannot be specified simultaneously" 524 die "${FUNCNAME}(): '--default-function' option and function name cannot be specified simultaneously"
387 fi 525 fi
388 if has "${EAPI:-0}" 0 1; then 526 if has "${EAPI:-0}" 0 1; then
389 die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI" 527 die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI"
390 fi 528 fi
391 529
392 if [[ "${EBUILD_PHASE}" == "configure" ]]; then 530 if [[ "${EBUILD_PHASE}" == "configure" ]]; then
393 if has "${EAPI}" 2; then 531 if has "${EAPI}" 2 3; then
394 python_default_function() { 532 python_default_function() {
395 econf 533 econf
396 } 534 }
397 else 535 else
398 python_default_function() { 536 python_default_function() {
414 elif [[ "${EBUILD_PHASE}" == "install" ]]; then 552 elif [[ "${EBUILD_PHASE}" == "install" ]]; then
415 python_default_function() { 553 python_default_function() {
416 emake DESTDIR="${D}" install 554 emake DESTDIR="${D}" install
417 } 555 }
418 else 556 else
419 die "${FUNCNAME}(): --default-function option cannot be used in this ebuild phase" 557 die "${FUNCNAME}(): '--default-function' option cannot be used in this ebuild phase"
420 fi 558 fi
421 function="python_default_function" 559 function="python_default_function"
422 fi 560 fi
423 561
424 if [[ "${quiet}" == "0" ]]; then 562 if [[ "${quiet}" == "0" ]]; then
458 fi 596 fi
459 echo " ${GREEN}*${NORMAL} ${BLUE}${action_message}${NORMAL}" 597 echo " ${GREEN}*${NORMAL} ${BLUE}${action_message}${NORMAL}"
460 fi 598 fi
461 599
462 if [[ "${separate_build_dirs}" == "1" ]]; then 600 if [[ "${separate_build_dirs}" == "1" ]]; then
601 if [[ -n "${source_dir}" ]]; then
602 export BUILDDIR="${S}/${source_dir}-${PYTHON_ABI}"
603 else
463 export BUILDDIR="${S}-${PYTHON_ABI}" 604 export BUILDDIR="${S}-${PYTHON_ABI}"
605 fi
464 pushd "${BUILDDIR}" > /dev/null || die "pushd failed" 606 pushd "${BUILDDIR}" > /dev/null || die "pushd failed"
465 else 607 else
466 export BUILDDIR="${S}" 608 export BUILDDIR="${S}"
467 fi 609 fi
468 610
469 previous_directory="$(pwd)" 611 previous_directory="$(pwd)"
470 previous_directory_stack="$(dirs -p)" 612 previous_directory_stack="$(dirs -p)"
471 previous_directory_stack_length="$(dirs -p | wc -l)" 613 previous_directory_stack_length="$(dirs -p | wc -l)"
472 614
473 if ! has "${EAPI}" 0 1 2 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then 615 if ! has "${EAPI}" 0 1 2 3 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
474 EPYTHON="$(PYTHON)" nonfatal "${function}" "$@" 616 EPYTHON="$(PYTHON)" nonfatal "${function}" "$@"
475 else 617 else
476 EPYTHON="$(PYTHON)" "${function}" "$@" 618 EPYTHON="$(PYTHON)" "${function}" "$@"
477 fi 619 fi
478 620
489 fi 631 fi
490 elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then 632 elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
491 if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then 633 if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then
492 local enabled_PYTHON_ABIS= other_PYTHON_ABI 634 local enabled_PYTHON_ABIS= other_PYTHON_ABI
493 for other_PYTHON_ABI in ${PYTHON_ABIS}; do 635 for other_PYTHON_ABI in ${PYTHON_ABIS}; do
494 [[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+=" ${other_PYTHON_ABI}" 636 [[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+="${enabled_PYTHON_ABIS:+ }${other_PYTHON_ABI}"
495 done 637 done
496 export PYTHON_ABIS="${enabled_PYTHON_ABIS# }" 638 export PYTHON_ABIS="${enabled_PYTHON_ABIS}"
497 fi 639 fi
498 if [[ "${quiet}" == "0" ]]; then 640 if [[ "${quiet}" == "0" ]]; then
499 ewarn "${RED}${failure_message}${NORMAL}" 641 ewarn "${RED}${failure_message}${NORMAL}"
500 fi 642 fi
501 if [[ -z "${PYTHON_ABIS}" ]]; then 643 if [[ -z "${PYTHON_ABIS}" ]]; then
504 else 646 else
505 die "${failure_message}" 647 die "${failure_message}"
506 fi 648 fi
507 fi 649 fi
508 650
509 # Ensure that directory stack hasn't been decreased. 651 # Ensure that directory stack has not been decreased.
510 if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then 652 if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then
511 die "Directory stack decreased illegally" 653 die "Directory stack decreased illegally"
512 fi 654 fi
513 655
514 # Avoid side effects of earlier returning from the specified function. 656 # Avoid side effects of earlier returning from the specified function.
515 while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do 657 while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do
516 popd > /dev/null || die "popd failed" 658 popd > /dev/null || die "popd failed"
517 done 659 done
518 660
519 # Ensure that the bottom part of directory stack hasn't been changed. Restore 661 # Ensure that the bottom part of directory stack has not been changed. Restore
520 # previous directory (from before running of the specified function) before 662 # previous directory (from before running of the specified function) before
521 # comparison of directory stacks to avoid mismatch of directory stacks after 663 # comparison of directory stacks to avoid mismatch of directory stacks after
522 # potential using of 'cd' to change current directory. Restoration of previous 664 # potential using of 'cd' to change current directory. Restoration of previous
523 # directory allows to safely use 'cd' to change current directory in the 665 # directory allows to safely use 'cd' to change current directory in the
524 # specified function without changing it back to original directory. 666 # specified function without changing it back to original directory.
578 python_version="$1" 720 python_version="$1"
579 shift 721 shift
580 722
581 for argument in "$@"; do 723 for argument in "$@"; do
582 if [[ ! -e "${argument}" ]]; then 724 if [[ ! -e "${argument}" ]]; then
583 die "${FUNCNAME}(): '${argument}' doesn't exist" 725 die "${FUNCNAME}(): '${argument}' does not exist"
584 elif [[ -f "${argument}" ]]; then 726 elif [[ -f "${argument}" ]]; then
585 files+=("${argument}") 727 files+=("${argument}")
586 elif [[ -d "${argument}" ]]; then 728 elif [[ -d "${argument}" ]]; then
587 if [[ "${recursive}" == "1" ]]; then 729 if [[ "${recursive}" == "1" ]]; then
588 if [[ "${only_executables}" == "1" ]]; then 730 if [[ "${only_executables}" == "1" ]]; then
589 files+=($(find "${argument}" -perm /111 -type f)) 731 files+=($(find "${argument}" -perm /111 -type f))
590 else 732 else
591 files+=($(find "${argument}" -type f)) 733 files+=($(find "${argument}" -type f))
592 fi 734 fi
593 else 735 else
594 die "${FUNCNAME}(): '${argument}' isn't a regular file" 736 die "${FUNCNAME}(): '${argument}' is not a regular file"
595 fi 737 fi
596 else 738 else
597 die "${FUNCNAME}(): '${argument}' isn't a regular file or a directory" 739 die "${FUNCNAME}(): '${argument}' is not a regular file or a directory"
598 fi 740 fi
599 done 741 done
600 742
601 for file in "${files[@]}"; do 743 for file in "${files[@]}"; do
602 file="${file#./}" 744 file="${file#./}"
603 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue 745 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue
604 746
605 if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then 747 if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then
748 if [[ "${quiet}" == "0" ]]; then
606 [[ "${quiet}" == "0" ]] && einfo "Converting shebang in '${file}'" 749 einfo "Converting shebang in '${file}'"
750 fi
607 sed -e "1s/python\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?/python${python_version}/" -i "${file}" || die "Conversion of shebang in '${file}' failed" 751 sed -e "1s/python\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?/python${python_version}/" -i "${file}" || die "Conversion of shebang in '${file}' failed"
608 752
609 # Delete potential whitespace after "#!". 753 # Delete potential whitespace after "#!".
610 sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed" 754 sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed"
611 fi 755 fi
756 done
757}
758
759# @FUNCTION: python_generate_wrapper_scripts
760# @USAGE: [-E|--respect-EPYTHON] [-f|--force] [-q|--quiet] [--] <file> [files]
761# @DESCRIPTION:
762# Generate wrapper scripts. Existing files are overwritten only with --force option.
763# If --respect-EPYTHON option is specified, then generated wrapper scripts will
764# respect EPYTHON variable at run time.
765python_generate_wrapper_scripts() {
766 local eselect_python_option file force="0" quiet="0" PYTHON_ABI python2_enabled="0" python2_supported_versions python3_enabled="0" python3_supported_versions respect_EPYTHON="0"
767 python2_supported_versions="2.4 2.5 2.6 2.7"
768 python3_supported_versions="3.0 3.1 3.2"
769
770 while (($#)); do
771 case "$1" in
772 -E|--respect-EPYTHON)
773 respect_EPYTHON="1"
774 ;;
775 -f|--force)
776 force="1"
777 ;;
778 -q|--quiet)
779 quiet="1"
780 ;;
781 --)
782 break
783 ;;
784 -*)
785 die "${FUNCNAME}(): Unrecognized option '$1'"
786 ;;
787 *)
788 break
789 ;;
790 esac
791 shift
792 done
793
794 if [[ "$#" -eq 0 ]]; then
795 die "${FUNCNAME}(): Missing arguments"
796 fi
797
798 validate_PYTHON_ABIS
799 for PYTHON_ABI in ${python2_supported_versions}; do
800 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
801 python2_enabled="1"
802 fi
803 done
804 for PYTHON_ABI in ${python3_supported_versions}; do
805 if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then
806 python3_enabled="1"
807 fi
808 done
809
810 if [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "1" ]]; then
811 eselect_python_option=
812 elif [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "0" ]]; then
813 eselect_python_option="--python2"
814 elif [[ "${python2_enabled}" == "0" && "${python3_enabled}" == "1" ]]; then
815 eselect_python_option="--python3"
816 else
817 die "${FUNCNAME}(): Unsupported environment"
818 fi
819
820 for file in "$@"; do
821 if [[ -f "${file}" && "${force}" == "0" ]]; then
822 die "${FUNCNAME}(): '$1' already exists"
823 fi
824
825 if [[ "${quiet}" == "0" ]]; then
826 einfo "Generating '${file#${D%/}}' wrapper script"
827 fi
828
829 cat << EOF > "${file}"
830#!/usr/bin/env python
831# Gentoo '${file##*/}' wrapper script
832
833import os
834import re
835import subprocess
836import sys
837
838EPYTHON_re = re.compile(r"^python(\d+\.\d+)$")
839
840EOF
841 if [[ "$?" != "0" ]]; then
842 die "${FUNCNAME}(): Generation of '$1' failed"
843 fi
844 if [[ "${respect_EPYTHON}" == "1" ]]; then
845 cat << EOF >> "${file}"
846EPYTHON = os.environ.get("EPYTHON")
847if EPYTHON:
848 EPYTHON_matched = EPYTHON_re.match(EPYTHON)
849 if EPYTHON_matched:
850 PYTHON_ABI = EPYTHON_matched.group(1)
851 else:
852 sys.stderr.write("EPYTHON variable has unrecognized value '%s'\n" % EPYTHON)
853 sys.exit(1)
854else:
855 try:
856 eselect_process = subprocess.Popen(["/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], stdout=subprocess.PIPE)
857 if eselect_process.wait() != 0:
858 raise ValueError
859 except (OSError, ValueError):
860 sys.stderr.write("Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n")
861 sys.exit(1)
862
863 eselect_output = eselect_process.stdout.read()
864 if not isinstance(eselect_output, str):
865 # Python 3
866 eselect_output = eselect_output.decode()
867
868 EPYTHON_matched = EPYTHON_re.match(eselect_output)
869 if EPYTHON_matched:
870 PYTHON_ABI = EPYTHON_matched.group(1)
871 else:
872 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s" % eselect_output)
873 sys.exit(1)
874EOF
875 if [[ "$?" != "0" ]]; then
876 die "${FUNCNAME}(): Generation of '$1' failed"
877 fi
878 else
879 cat << EOF >> "${file}"
880try:
881 eselect_process = subprocess.Popen(["/usr/bin/eselect", "python", "show"${eselect_python_option:+, $(echo "\"")}${eselect_python_option}${eselect_python_option:+$(echo "\"")}], stdout=subprocess.PIPE)
882 if eselect_process.wait() != 0:
883 raise ValueError
884except (OSError, ValueError):
885 sys.stderr.write("Execution of 'eselect python show${eselect_python_option:+ }${eselect_python_option}' failed\n")
886 sys.exit(1)
887
888eselect_output = eselect_process.stdout.read()
889if not isinstance(eselect_output, str):
890 # Python 3
891 eselect_output = eselect_output.decode()
892
893EPYTHON_matched = EPYTHON_re.match(eselect_output)
894if EPYTHON_matched:
895 PYTHON_ABI = EPYTHON_matched.group(1)
896else:
897 sys.stderr.write("'eselect python show${eselect_python_option:+ }${eselect_python_option}' printed unrecognized value '%s" % eselect_output)
898 sys.exit(1)
899EOF
900 if [[ "$?" != "0" ]]; then
901 die "${FUNCNAME}(): Generation of '$1' failed"
902 fi
903 fi
904 cat << EOF >> "${file}"
905
906os.environ["PYTHON_PROCESS_NAME"] = sys.argv[0]
907target_executable = "%s-%s" % (os.path.realpath(sys.argv[0]), PYTHON_ABI)
908if not os.path.exists(target_executable):
909 sys.stderr.write("'%s' does not exist\n" % target_executable)
910 sys.exit(1)
911
912os.execv(target_executable, sys.argv)
913EOF
914 if [[ "$?" != "0" ]]; then
915 die "${FUNCNAME}(): Generation of '$1' failed"
916 fi
917 fperms +x "${file#${D%/}}" || die "fperms '${file}' failed"
612 done 918 done
613} 919}
614 920
615# @ECLASS-VARIABLE: PYTHON_USE_WITH 921# @ECLASS-VARIABLE: PYTHON_USE_WITH
616# @DESCRIPTION: 922# @DESCRIPTION:
644 python_pkg_setup_check_USE_flags() { 950 python_pkg_setup_check_USE_flags() {
645 local pyatom use 951 local pyatom use
646 if [[ -n "${PYTHON_ABI}" ]]; then 952 if [[ -n "${PYTHON_ABI}" ]]; then
647 pyatom="dev-lang/python:${PYTHON_ABI}" 953 pyatom="dev-lang/python:${PYTHON_ABI}"
648 else 954 else
649 python_version
650 pyatom="dev-lang/python:${PYVER}" 955 pyatom="dev-lang/python:$(PYTHON -A --ABI)"
651 fi 956 fi
652 957
653 for use in ${PYTHON_USE_WITH}; do 958 for use in ${PYTHON_USE_WITH}; do
654 if ! has_version "${pyatom}[${use}]"; then 959 if ! has_version "${pyatom}[${use}]"; then
655 python_pkg_setup_fail "Please rebuild ${pyatom} with the following USE flags enabled: ${PYTHON_USE_WITH}" 960 python_pkg_setup_fail "Please rebuild ${pyatom} with the following USE flags enabled: ${PYTHON_USE_WITH}"
711fi 1016fi
712 1017
713# @FUNCTION: python_disable_pyc 1018# @FUNCTION: python_disable_pyc
714# @DESCRIPTION: 1019# @DESCRIPTION:
715# Tell Python not to automatically recompile modules to .pyc/.pyo 1020# Tell Python not to automatically recompile modules to .pyc/.pyo
716# even if the timestamps/version stamps don't match. This is done 1021# even if the timestamps/version stamps do not match. This is done
717# to protect sandbox. 1022# to protect sandbox.
718python_disable_pyc() { 1023python_disable_pyc() {
719 export PYTHONDONTWRITEBYTECODE="1" 1024 export PYTHONDONTWRITEBYTECODE="1"
720} 1025}
721 1026
728} 1033}
729 1034
730# @FUNCTION: python_need_rebuild 1035# @FUNCTION: python_need_rebuild
731# @DESCRIPTION: Run without arguments, specifies that the package should be 1036# @DESCRIPTION: Run without arguments, specifies that the package should be
732# rebuilt after a python upgrade. 1037# rebuilt after a python upgrade.
1038# Do not use this function in ebuilds of packages supporting installation
1039# for multiple versions of Python.
733python_need_rebuild() { 1040python_need_rebuild() {
734 python_version 1041 export PYTHON_NEED_REBUILD="$(PYTHON -A --ABI)"
735 export PYTHON_NEED_REBUILD=${PYVER}
736} 1042}
737 1043
738# @FUNCTION: python_get_includedir 1044# @FUNCTION: python_get_includedir
739# @DESCRIPTION: 1045# @DESCRIPTION:
740# Run without arguments, returns the Python include directory. 1046# Run without arguments, returns the Python include directory.
741python_get_includedir() { 1047python_get_includedir() {
742 if [[ -n "${PYTHON_ABI}" ]]; then 1048 if [[ -n "${PYTHON_ABI}" ]]; then
743 echo "/usr/include/python${PYTHON_ABI}" 1049 echo "/usr/include/python${PYTHON_ABI}"
744 else 1050 else
745 python_version
746 echo "/usr/include/python${PYVER}" 1051 echo "/usr/include/python$(PYTHON -A --ABI)"
747 fi 1052 fi
748} 1053}
749 1054
750# @FUNCTION: python_get_libdir 1055# @FUNCTION: python_get_libdir
751# @DESCRIPTION: 1056# @DESCRIPTION:
752# Run without arguments, returns the Python library directory. 1057# Run without arguments, returns the Python library directory.
753python_get_libdir() { 1058python_get_libdir() {
754 if [[ -n "${PYTHON_ABI}" ]]; then 1059 if [[ -n "${PYTHON_ABI}" ]]; then
755 echo "/usr/$(get_libdir)/python${PYTHON_ABI}" 1060 echo "/usr/$(get_libdir)/python${PYTHON_ABI}"
756 else 1061 else
757 python_version
758 echo "/usr/$(get_libdir)/python${PYVER}" 1062 echo "/usr/$(get_libdir)/python$(PYTHON -A --ABI)"
759 fi 1063 fi
760} 1064}
761 1065
762# @FUNCTION: python_get_sitedir 1066# @FUNCTION: python_get_sitedir
763# @DESCRIPTION: 1067# @DESCRIPTION:
815 1119
816 # Check if phase is pkg_postinst() 1120 # Check if phase is pkg_postinst()
817 [[ ${EBUILD_PHASE} != postinst ]] &&\ 1121 [[ ${EBUILD_PHASE} != postinst ]] &&\
818 die "${FUNCNAME} should only be run in pkg_postinst()" 1122 die "${FUNCNAME} should only be run in pkg_postinst()"
819 1123
820 # allow compiling for older python versions
821 if [[ "${PYTHON_OVERRIDE_PYVER}" ]]; then
822 PYVER=${PYTHON_OVERRIDE_PYVER}
823 else
824 python_version
825 fi
826
827 # strip trailing slash 1124 # strip trailing slash
828 myroot="${ROOT%/}" 1125 myroot="${ROOT%/}"
829 1126
830 # respect ROOT 1127 # respect ROOT
831 for f in "$@"; do 1128 for f in "$@"; do
832 [[ -f "${myroot}/${f}" ]] && myfiles+=("${myroot}/${f}") 1129 [[ -f "${myroot}/${f}" ]] && myfiles+=("${myroot}/${f}")
833 done 1130 done
834 1131
835 if ((${#myfiles[@]})); then 1132 if ((${#myfiles[@]})); then
836 python${PYVER} ${myroot}/usr/$(get_libdir)/python${PYVER}/py_compile.py "${myfiles[@]}" 1133 "$(PYTHON -A)" "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}"
837 python${PYVER} -O ${myroot}/usr/$(get_libdir)/python${PYVER}/py_compile.py "${myfiles[@]}" &> /dev/null 1134 "$(PYTHON -A)" -O "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" &> /dev/null
838 else 1135 else
839 ewarn "No files to compile!" 1136 ewarn "No files to compile!"
840 fi 1137 fi
841} 1138}
842 1139
876 ;; 1173 ;;
877 -*) 1174 -*)
878 ewarn "${FUNCNAME}: Ignoring compile option $1" 1175 ewarn "${FUNCNAME}: Ignoring compile option $1"
879 ;; 1176 ;;
880 *) 1177 *)
881 if [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then 1178 if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
882 die "${FUNCNAME} doesn't support absolute paths of directories/files in site-packages directories" 1179 die "${FUNCNAME} does not support absolute paths of directories/files in site-packages directories"
883 elif [[ "$1" =~ ^/ ]]; then 1180 elif [[ "$1" =~ ^/ ]]; then
884 if [[ -d "${root}/$1" ]]; then 1181 if [[ -d "${root}/$1" ]]; then
885 other_dirs+=("${root}/$1") 1182 other_dirs+=("${root}/$1")
886 elif [[ -f "${root}/$1" ]]; then 1183 elif [[ -f "${root}/$1" ]]; then
887 other_files+=("${root}/$1") 1184 other_files+=("${root}/$1")
888 elif [[ -e "${root}/$1" ]]; then 1185 elif [[ -e "${root}/$1" ]]; then
889 ewarn "'${root}/$1' is not a file or a directory!" 1186 ewarn "'${root}/$1' is not a file or a directory!"
890 else 1187 else
891 ewarn "'${root}/$1' doesn't exist!" 1188 ewarn "'${root}/$1' does not exist!"
892 fi 1189 fi
893 else 1190 else
894 for PYTHON_ABI in ${PYTHON_ABIS}; do 1191 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
895 if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then 1192 if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then
896 site_packages_dirs+=("$1") 1193 site_packages_dirs+=("$1")
897 break 1194 break
898 elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then 1195 elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then
899 site_packages_files+=("$1") 1196 site_packages_files+=("$1")
900 break 1197 break
901 elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then 1198 elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then
902 ewarn "'$1' is not a file or a directory!" 1199 ewarn "'$1' is not a file or a directory!"
903 else 1200 else
904 ewarn "'$1' doesn't exist!" 1201 ewarn "'$1' does not exist!"
905 fi 1202 fi
906 done 1203 done
907 fi 1204 fi
908 ;; 1205 ;;
909 esac 1206 esac
911 done 1208 done
912 1209
913 # Set additional options. 1210 # Set additional options.
914 options+=("-q") 1211 options+=("-q")
915 1212
916 for PYTHON_ABI in ${PYTHON_ABIS}; do 1213 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
917 if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})); then 1214 if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})); then
918 return_code="0" 1215 return_code="0"
919 ebegin "Compilation and optimization of Python modules for Python ${PYTHON_ABI}" 1216 ebegin "Compilation and optimization of Python modules for Python ${PYTHON_ABI}"
920 if ((${#site_packages_dirs[@]})); then 1217 if ((${#site_packages_dirs[@]})); then
921 for dir in "${site_packages_dirs[@]}"; do 1218 for dir in "${site_packages_dirs[@]}"; do
934 eend "${return_code}" 1231 eend "${return_code}"
935 fi 1232 fi
936 unset site_packages_absolute_dirs site_packages_absolute_files 1233 unset site_packages_absolute_dirs site_packages_absolute_files
937 done 1234 done
938 1235
939 # Don't use PYTHON_ABI in next calls to python_get_libdir(). 1236 # Do not use PYTHON_ABI in next calls to python_get_libdir().
940 unset PYTHON_ABI 1237 unset PYTHON_ABI
941 1238
942 if ((${#other_dirs[@]})) || ((${#other_files[@]})); then 1239 if ((${#other_dirs[@]})) || ((${#other_files[@]})); then
943 return_code="0" 1240 return_code="0"
944 ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for Python ${PYVER}" 1241 ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for Python $(PYTHON -A --ABI)"
945 if ((${#other_dirs[@]})); then 1242 if ((${#other_dirs[@]})); then
946 python${PYVER} "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" || return_code="1" 1243 "$(PYTHON -A)" "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" || return_code="1"
947 python${PYVER} -O "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1" 1244 "$(PYTHON -A)" -O "${root}$(python_get_libdir)/compileall.py" "${options[@]}" "${other_dirs[@]}" &> /dev/null || return_code="1"
948 fi 1245 fi
949 if ((${#other_files[@]})); then 1246 if ((${#other_files[@]})); then
950 python${PYVER} "${root}$(python_get_libdir)/py_compile.py" "${other_files[@]}" || return_code="1" 1247 "$(PYTHON -A)" "${root}$(python_get_libdir)/py_compile.py" "${other_files[@]}" || return_code="1"
951 python${PYVER} -O "${root}$(python_get_libdir)/py_compile.py" "${other_files[@]}" &> /dev/null || return_code="1" 1248 "$(PYTHON -A)" -O "${root}$(python_get_libdir)/py_compile.py" "${other_files[@]}" &> /dev/null || return_code="1"
952 fi 1249 fi
953 eend "${return_code}" 1250 eend "${return_code}"
954 fi 1251 fi
955 else 1252 else
956 local myroot mydirs=() myfiles=() myopts=() return_code="0" 1253 local myroot mydirs=() myfiles=() myopts=() return_code="0"
978 # Files are passed to python_mod_compile which is ROOT-aware 1275 # Files are passed to python_mod_compile which is ROOT-aware
979 myfiles+=("$1") 1276 myfiles+=("$1")
980 elif [[ -e "${myroot}/$1" ]]; then 1277 elif [[ -e "${myroot}/$1" ]]; then
981 ewarn "${myroot}/$1 is not a file or directory!" 1278 ewarn "${myroot}/$1 is not a file or directory!"
982 else 1279 else
983 ewarn "${myroot}/$1 doesn't exist!" 1280 ewarn "${myroot}/$1 does not exist!"
984 fi 1281 fi
985 ;; 1282 ;;
986 esac 1283 esac
987 shift 1284 shift
988 done 1285 done
989 1286
990 # allow compiling for older python versions
991 if [ -n "${PYTHON_OVERRIDE_PYVER}" ]; then
992 PYVER=${PYTHON_OVERRIDE_PYVER}
993 else
994 python_version
995 fi
996
997 # set additional opts 1287 # set additional opts
998 myopts+=(-q) 1288 myopts+=(-q)
999 1289
1000 ebegin "Compilation and optimization of Python modules for Python ${PYVER}" 1290 ebegin "Compilation and optimization of Python modules for Python $(PYTHON -A --ABI)"
1001 if ((${#mydirs[@]})); then 1291 if ((${#mydirs[@]})); then
1002 python${PYVER} \ 1292 "$(PYTHON -A)" "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" || return_code="1"
1003 "${myroot}"/usr/$(get_libdir)/python${PYVER}/compileall.py \ 1293 "$(PYTHON -A)" -O "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" &> /dev/null || return_code="1"
1004 "${myopts[@]}" "${mydirs[@]}" || return_code="1"
1005 python${PYVER} -O \
1006 "${myroot}"/usr/$(get_libdir)/python${PYVER}/compileall.py \
1007 "${myopts[@]}" "${mydirs[@]}" &> /dev/null || return_code="1"
1008 fi 1294 fi
1009 1295
1010 if ((${#myfiles[@]})); then 1296 if ((${#myfiles[@]})); then
1011 python_mod_compile "${myfiles[@]}" 1297 python_mod_compile "${myfiles[@]}"
1012 fi 1298 fi
1014 eend "${return_code}" 1300 eend "${return_code}"
1015 fi 1301 fi
1016} 1302}
1017 1303
1018# @FUNCTION: python_mod_cleanup 1304# @FUNCTION: python_mod_cleanup
1019# @USAGE: [directory] 1305# @USAGE: [directory|file]
1020# @DESCRIPTION: 1306# @DESCRIPTION:
1021# Run with optional arguments, where arguments are directories of 1307# Run with optional arguments, where arguments are Python modules. If none given,
1022# python modules. If none given, it will look in /usr/lib/python[0-9].[0-9]. 1308# it will look in /usr/lib/python[0-9].[0-9].
1023# 1309#
1024# It will recursively scan all compiled Python modules in the directories and 1310# It will recursively scan all compiled Python modules in the directories and
1025# determine if they are orphaned (i.e. their corresponding .py files are missing.) 1311# determine if they are orphaned (i.e. their corresponding .py files are missing.)
1026# If they are, then it will remove their corresponding .pyc and .pyo files. 1312# If they are, then it will remove their corresponding .pyc and .pyo files.
1027# 1313#
1036 root="${ROOT%/}" 1322 root="${ROOT%/}"
1037 1323
1038 if (($#)); then 1324 if (($#)); then
1039 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then 1325 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
1040 while (($#)); do 1326 while (($#)); do
1041 if [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then 1327 if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
1042 die "${FUNCNAME} doesn't support absolute paths of directories/files in site-packages directories" 1328 die "${FUNCNAME} does not support absolute paths of directories/files in site-packages directories"
1043 elif [[ "$1" =~ ^/ ]]; then 1329 elif [[ "$1" =~ ^/ ]]; then
1044 SEARCH_PATH+=("${root}/${1#/}") 1330 SEARCH_PATH+=("${root}/${1#/}")
1045 else 1331 else
1046 for PYTHON_ABI in ${PYTHON_ABIS}; do 1332 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
1047 SEARCH_PATH+=("${root}$(python_get_sitedir)/$1") 1333 SEARCH_PATH+=("${root}$(python_get_sitedir)/$1")
1048 done 1334 done
1049 fi 1335 fi
1050 shift 1336 shift
1051 done 1337 done
1066 done 1352 done
1067 fi 1353 fi
1068 1354
1069 local BLUE CYAN NORMAL 1355 local BLUE CYAN NORMAL
1070 if [[ "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then 1356 if [[ "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then
1071 BLUE=$'\e[34m' 1357 BLUE=$'\e[1;34m'
1072 CYAN=$'\e[36m' 1358 CYAN=$'\e[1;36m'
1073 NORMAL=$'\e[0m' 1359 NORMAL=$'\e[0m'
1074 else 1360 else
1075 BLUE= 1361 BLUE=
1076 CYAN= 1362 CYAN=
1077 NORMAL= 1363 NORMAL=

Legend:
Removed from v.1.78  
changed lines
  Added in v.1.84

  ViewVC Help
Powered by ViewVC 1.1.20