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

Diff of /eclass/python.eclass

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

Revision 1.79 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.79 2009/11/15 22:00:47 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 [[ -n "${ABI}" && "${ABI}" != "${DEFAULT_ABI}" && "${DEFAULT_ABI}" != "default" ]]; 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
263 eerror "python: '$(type -p python)'" 387 eerror "python: '$(type -p python)'"
264 eerror "ABI: '${ABI}'" 388 eerror "ABI: '${ABI}'"
265 eerror "DEFAULT_ABI: '${DEFAULT_ABI}'" 389 eerror "DEFAULT_ABI: '${DEFAULT_ABI}'"
266 eerror "EPYTHON: '$(PYTHON)'" 390 eerror "EPYTHON: '$(PYTHON)'"
267 eerror "PYTHON_ABI: '${PYTHON_ABI}'" 391 eerror "PYTHON_ABI: '${PYTHON_ABI}'"
268 eerror "Version of enabled Python: '$(EPYTHON="$(PYTHON)" python -c 'from sys import version_info; print(".".join([str(x) for x in version_info[:2]]))')'" 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]]))')'"
269 die "'python' doesn't respect EPYTHON variable" 393 die "'python' does not respect EPYTHON variable"
270 fi 394 fi
271 done 395 done
272 PYTHON_ABIS_SANITY_CHECKS="1" 396 PYTHON_ABIS_SANITY_CHECKS="1"
273 fi 397 fi
274} 398}
296 ;; 420 ;;
297 esac 421 esac
298 shift 422 shift
299 done 423 done
300 424
301 if [[ "$#" -eq "0" ]]; then 425 if [[ "$#" -eq 0 ]]; then
302 if [[ "${WORKDIR}" == "${S}" ]]; then 426 if [[ "${WORKDIR}" == "${S}" ]]; then
303 die "${FUNCNAME}() cannot be used" 427 die "${FUNCNAME}() cannot be used"
304 fi 428 fi
305 dirs="${S}" 429 dirs="${S}"
306 else 430 else
327 local dir="$1" 451 local dir="$1"
328 452
329 [[ -z "${PYTHON_ABI}" ]] && die "PYTHON_ABI variable not set" 453 [[ -z "${PYTHON_ABI}" ]] && die "PYTHON_ABI variable not set"
330 [[ -z "${dir}" ]] && dir="build" 454 [[ -z "${dir}" ]] && dir="build"
331 455
332 # Don't delete preexistent directories. 456 # Do not delete preexistent directories.
333 rm -f "${dir}" || die "Deletion of '${dir}' failed" 457 rm -f "${dir}" || die "Deletion of '${dir}' failed"
334 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"
335} 459}
336 460
337# @FUNCTION: python_execute_function 461# @FUNCTION: python_execute_function
338# @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]
339# @DESCRIPTION: 463# @DESCRIPTION:
340# 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
341# arguments. The specified function can use PYTHON_ABI and BUILDDIR variables. 465# arguments. The specified function can use PYTHON_ABI and BUILDDIR variables.
342python_execute_function() { 466python_execute_function() {
343 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=
344 468
345 while (($#)); do 469 while (($#)); do
346 case "$1" in 470 case "$1" in
347 --action-message) 471 --action-message)
348 action_message_template="$2" 472 action_message_template="$2"
362 quiet="1" 486 quiet="1"
363 ;; 487 ;;
364 -s|--separate-build-dirs) 488 -s|--separate-build-dirs)
365 separate_build_dirs="1" 489 separate_build_dirs="1"
366 ;; 490 ;;
491 --source-dir)
492 source_dir="$2"
493 shift
494 ;;
367 --) 495 --)
368 break 496 break
369 ;; 497 ;;
370 -*) 498 -*)
371 die "${FUNCNAME}(): Unrecognized option '$1'" 499 die "${FUNCNAME}(): Unrecognized option '$1'"
375 ;; 503 ;;
376 esac 504 esac
377 shift 505 shift
378 done 506 done
379 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
380 if [[ "${default_function}" == "0" ]]; then 512 if [[ "${default_function}" == "0" ]]; then
381 if [[ "$#" -eq "0" ]]; then 513 if [[ "$#" -eq 0 ]]; then
382 die "${FUNCNAME}(): Missing function name" 514 die "${FUNCNAME}(): Missing function name"
383 fi 515 fi
384 function="$1" 516 function="$1"
385 shift 517 shift
386 518
387 if [[ -z "$(type -t "${function}")" ]]; then 519 if [[ -z "$(type -t "${function}")" ]]; then
388 die "${FUNCNAME}(): '${function}' function isn't defined" 520 die "${FUNCNAME}(): '${function}' function is not defined"
389 fi 521 fi
390 else 522 else
391 if [[ "$#" -ne "0" ]]; then 523 if [[ "$#" -ne "0" ]]; then
392 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"
393 fi 525 fi
394 if has "${EAPI:-0}" 0 1; then 526 if has "${EAPI:-0}" 0 1; then
395 die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI" 527 die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI"
396 fi 528 fi
397 529
398 if [[ "${EBUILD_PHASE}" == "configure" ]]; then 530 if [[ "${EBUILD_PHASE}" == "configure" ]]; then
399 if has "${EAPI}" 2; then 531 if has "${EAPI}" 2 3; then
400 python_default_function() { 532 python_default_function() {
401 econf 533 econf
402 } 534 }
403 else 535 else
404 python_default_function() { 536 python_default_function() {
420 elif [[ "${EBUILD_PHASE}" == "install" ]]; then 552 elif [[ "${EBUILD_PHASE}" == "install" ]]; then
421 python_default_function() { 553 python_default_function() {
422 emake DESTDIR="${D}" install 554 emake DESTDIR="${D}" install
423 } 555 }
424 else 556 else
425 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"
426 fi 558 fi
427 function="python_default_function" 559 function="python_default_function"
428 fi 560 fi
429 561
430 if [[ "${quiet}" == "0" ]]; then 562 if [[ "${quiet}" == "0" ]]; then
464 fi 596 fi
465 echo " ${GREEN}*${NORMAL} ${BLUE}${action_message}${NORMAL}" 597 echo " ${GREEN}*${NORMAL} ${BLUE}${action_message}${NORMAL}"
466 fi 598 fi
467 599
468 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
469 export BUILDDIR="${S}-${PYTHON_ABI}" 604 export BUILDDIR="${S}-${PYTHON_ABI}"
605 fi
470 pushd "${BUILDDIR}" > /dev/null || die "pushd failed" 606 pushd "${BUILDDIR}" > /dev/null || die "pushd failed"
471 else 607 else
472 export BUILDDIR="${S}" 608 export BUILDDIR="${S}"
473 fi 609 fi
474 610
475 previous_directory="$(pwd)" 611 previous_directory="$(pwd)"
476 previous_directory_stack="$(dirs -p)" 612 previous_directory_stack="$(dirs -p)"
477 previous_directory_stack_length="$(dirs -p | wc -l)" 613 previous_directory_stack_length="$(dirs -p | wc -l)"
478 614
479 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
480 EPYTHON="$(PYTHON)" nonfatal "${function}" "$@" 616 EPYTHON="$(PYTHON)" nonfatal "${function}" "$@"
481 else 617 else
482 EPYTHON="$(PYTHON)" "${function}" "$@" 618 EPYTHON="$(PYTHON)" "${function}" "$@"
483 fi 619 fi
484 620
495 fi 631 fi
496 elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then 632 elif has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then
497 if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then 633 if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then
498 local enabled_PYTHON_ABIS= other_PYTHON_ABI 634 local enabled_PYTHON_ABIS= other_PYTHON_ABI
499 for other_PYTHON_ABI in ${PYTHON_ABIS}; do 635 for other_PYTHON_ABI in ${PYTHON_ABIS}; do
500 [[ "${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}"
501 done 637 done
502 export PYTHON_ABIS="${enabled_PYTHON_ABIS# }" 638 export PYTHON_ABIS="${enabled_PYTHON_ABIS}"
503 fi 639 fi
504 if [[ "${quiet}" == "0" ]]; then 640 if [[ "${quiet}" == "0" ]]; then
505 ewarn "${RED}${failure_message}${NORMAL}" 641 ewarn "${RED}${failure_message}${NORMAL}"
506 fi 642 fi
507 if [[ -z "${PYTHON_ABIS}" ]]; then 643 if [[ -z "${PYTHON_ABIS}" ]]; then
510 else 646 else
511 die "${failure_message}" 647 die "${failure_message}"
512 fi 648 fi
513 fi 649 fi
514 650
515 # Ensure that directory stack hasn't been decreased. 651 # Ensure that directory stack has not been decreased.
516 if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then 652 if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then
517 die "Directory stack decreased illegally" 653 die "Directory stack decreased illegally"
518 fi 654 fi
519 655
520 # Avoid side effects of earlier returning from the specified function. 656 # Avoid side effects of earlier returning from the specified function.
521 while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do 657 while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do
522 popd > /dev/null || die "popd failed" 658 popd > /dev/null || die "popd failed"
523 done 659 done
524 660
525 # 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
526 # previous directory (from before running of the specified function) before 662 # previous directory (from before running of the specified function) before
527 # comparison of directory stacks to avoid mismatch of directory stacks after 663 # comparison of directory stacks to avoid mismatch of directory stacks after
528 # potential using of 'cd' to change current directory. Restoration of previous 664 # potential using of 'cd' to change current directory. Restoration of previous
529 # 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
530 # specified function without changing it back to original directory. 666 # specified function without changing it back to original directory.
584 python_version="$1" 720 python_version="$1"
585 shift 721 shift
586 722
587 for argument in "$@"; do 723 for argument in "$@"; do
588 if [[ ! -e "${argument}" ]]; then 724 if [[ ! -e "${argument}" ]]; then
589 die "${FUNCNAME}(): '${argument}' doesn't exist" 725 die "${FUNCNAME}(): '${argument}' does not exist"
590 elif [[ -f "${argument}" ]]; then 726 elif [[ -f "${argument}" ]]; then
591 files+=("${argument}") 727 files+=("${argument}")
592 elif [[ -d "${argument}" ]]; then 728 elif [[ -d "${argument}" ]]; then
593 if [[ "${recursive}" == "1" ]]; then 729 if [[ "${recursive}" == "1" ]]; then
594 if [[ "${only_executables}" == "1" ]]; then 730 if [[ "${only_executables}" == "1" ]]; then
595 files+=($(find "${argument}" -perm /111 -type f)) 731 files+=($(find "${argument}" -perm /111 -type f))
596 else 732 else
597 files+=($(find "${argument}" -type f)) 733 files+=($(find "${argument}" -type f))
598 fi 734 fi
599 else 735 else
600 die "${FUNCNAME}(): '${argument}' isn't a regular file" 736 die "${FUNCNAME}(): '${argument}' is not a regular file"
601 fi 737 fi
602 else 738 else
603 die "${FUNCNAME}(): '${argument}' isn't a regular file or a directory" 739 die "${FUNCNAME}(): '${argument}' is not a regular file or a directory"
604 fi 740 fi
605 done 741 done
606 742
607 for file in "${files[@]}"; do 743 for file in "${files[@]}"; do
608 file="${file#./}" 744 file="${file#./}"
609 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue 745 [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue
610 746
611 if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then 747 if [[ "$(head -n1 "${file}")" =~ ^'#!'.*python ]]; then
748 if [[ "${quiet}" == "0" ]]; then
612 [[ "${quiet}" == "0" ]] && einfo "Converting shebang in '${file}'" 749 einfo "Converting shebang in '${file}'"
750 fi
613 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"
614 752
615 # Delete potential whitespace after "#!". 753 # Delete potential whitespace after "#!".
616 sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed" 754 sed -e '1s/\(^#!\)[[:space:]]*/\1/' -i "${file}" || die "sed '${file}' failed"
617 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"
618 done 918 done
619} 919}
620 920
621# @ECLASS-VARIABLE: PYTHON_USE_WITH 921# @ECLASS-VARIABLE: PYTHON_USE_WITH
622# @DESCRIPTION: 922# @DESCRIPTION:
650 python_pkg_setup_check_USE_flags() { 950 python_pkg_setup_check_USE_flags() {
651 local pyatom use 951 local pyatom use
652 if [[ -n "${PYTHON_ABI}" ]]; then 952 if [[ -n "${PYTHON_ABI}" ]]; then
653 pyatom="dev-lang/python:${PYTHON_ABI}" 953 pyatom="dev-lang/python:${PYTHON_ABI}"
654 else 954 else
655 python_version
656 pyatom="dev-lang/python:${PYVER}" 955 pyatom="dev-lang/python:$(PYTHON -A --ABI)"
657 fi 956 fi
658 957
659 for use in ${PYTHON_USE_WITH}; do 958 for use in ${PYTHON_USE_WITH}; do
660 if ! has_version "${pyatom}[${use}]"; then 959 if ! has_version "${pyatom}[${use}]"; then
661 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}"
717fi 1016fi
718 1017
719# @FUNCTION: python_disable_pyc 1018# @FUNCTION: python_disable_pyc
720# @DESCRIPTION: 1019# @DESCRIPTION:
721# Tell Python not to automatically recompile modules to .pyc/.pyo 1020# Tell Python not to automatically recompile modules to .pyc/.pyo
722# 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
723# to protect sandbox. 1022# to protect sandbox.
724python_disable_pyc() { 1023python_disable_pyc() {
725 export PYTHONDONTWRITEBYTECODE="1" 1024 export PYTHONDONTWRITEBYTECODE="1"
726} 1025}
727 1026
734} 1033}
735 1034
736# @FUNCTION: python_need_rebuild 1035# @FUNCTION: python_need_rebuild
737# @DESCRIPTION: Run without arguments, specifies that the package should be 1036# @DESCRIPTION: Run without arguments, specifies that the package should be
738# 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.
739python_need_rebuild() { 1040python_need_rebuild() {
740 python_version 1041 export PYTHON_NEED_REBUILD="$(PYTHON -A --ABI)"
741 export PYTHON_NEED_REBUILD=${PYVER}
742} 1042}
743 1043
744# @FUNCTION: python_get_includedir 1044# @FUNCTION: python_get_includedir
745# @DESCRIPTION: 1045# @DESCRIPTION:
746# Run without arguments, returns the Python include directory. 1046# Run without arguments, returns the Python include directory.
747python_get_includedir() { 1047python_get_includedir() {
748 if [[ -n "${PYTHON_ABI}" ]]; then 1048 if [[ -n "${PYTHON_ABI}" ]]; then
749 echo "/usr/include/python${PYTHON_ABI}" 1049 echo "/usr/include/python${PYTHON_ABI}"
750 else 1050 else
751 python_version
752 echo "/usr/include/python${PYVER}" 1051 echo "/usr/include/python$(PYTHON -A --ABI)"
753 fi 1052 fi
754} 1053}
755 1054
756# @FUNCTION: python_get_libdir 1055# @FUNCTION: python_get_libdir
757# @DESCRIPTION: 1056# @DESCRIPTION:
758# Run without arguments, returns the Python library directory. 1057# Run without arguments, returns the Python library directory.
759python_get_libdir() { 1058python_get_libdir() {
760 if [[ -n "${PYTHON_ABI}" ]]; then 1059 if [[ -n "${PYTHON_ABI}" ]]; then
761 echo "/usr/$(get_libdir)/python${PYTHON_ABI}" 1060 echo "/usr/$(get_libdir)/python${PYTHON_ABI}"
762 else 1061 else
763 python_version
764 echo "/usr/$(get_libdir)/python${PYVER}" 1062 echo "/usr/$(get_libdir)/python$(PYTHON -A --ABI)"
765 fi 1063 fi
766} 1064}
767 1065
768# @FUNCTION: python_get_sitedir 1066# @FUNCTION: python_get_sitedir
769# @DESCRIPTION: 1067# @DESCRIPTION:
821 1119
822 # Check if phase is pkg_postinst() 1120 # Check if phase is pkg_postinst()
823 [[ ${EBUILD_PHASE} != postinst ]] &&\ 1121 [[ ${EBUILD_PHASE} != postinst ]] &&\
824 die "${FUNCNAME} should only be run in pkg_postinst()" 1122 die "${FUNCNAME} should only be run in pkg_postinst()"
825 1123
826 # allow compiling for older python versions
827 if [[ "${PYTHON_OVERRIDE_PYVER}" ]]; then
828 PYVER=${PYTHON_OVERRIDE_PYVER}
829 else
830 python_version
831 fi
832
833 # strip trailing slash 1124 # strip trailing slash
834 myroot="${ROOT%/}" 1125 myroot="${ROOT%/}"
835 1126
836 # respect ROOT 1127 # respect ROOT
837 for f in "$@"; do 1128 for f in "$@"; do
838 [[ -f "${myroot}/${f}" ]] && myfiles+=("${myroot}/${f}") 1129 [[ -f "${myroot}/${f}" ]] && myfiles+=("${myroot}/${f}")
839 done 1130 done
840 1131
841 if ((${#myfiles[@]})); then 1132 if ((${#myfiles[@]})); then
842 python${PYVER} ${myroot}/usr/$(get_libdir)/python${PYVER}/py_compile.py "${myfiles[@]}" 1133 "$(PYTHON -A)" "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}"
843 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
844 else 1135 else
845 ewarn "No files to compile!" 1136 ewarn "No files to compile!"
846 fi 1137 fi
847} 1138}
848 1139
882 ;; 1173 ;;
883 -*) 1174 -*)
884 ewarn "${FUNCNAME}: Ignoring compile option $1" 1175 ewarn "${FUNCNAME}: Ignoring compile option $1"
885 ;; 1176 ;;
886 *) 1177 *)
887 if [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then 1178 if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
888 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"
889 elif [[ "$1" =~ ^/ ]]; then 1180 elif [[ "$1" =~ ^/ ]]; then
890 if [[ -d "${root}/$1" ]]; then 1181 if [[ -d "${root}/$1" ]]; then
891 other_dirs+=("${root}/$1") 1182 other_dirs+=("${root}/$1")
892 elif [[ -f "${root}/$1" ]]; then 1183 elif [[ -f "${root}/$1" ]]; then
893 other_files+=("${root}/$1") 1184 other_files+=("${root}/$1")
894 elif [[ -e "${root}/$1" ]]; then 1185 elif [[ -e "${root}/$1" ]]; then
895 ewarn "'${root}/$1' is not a file or a directory!" 1186 ewarn "'${root}/$1' is not a file or a directory!"
896 else 1187 else
897 ewarn "'${root}/$1' doesn't exist!" 1188 ewarn "'${root}/$1' does not exist!"
898 fi 1189 fi
899 else 1190 else
900 for PYTHON_ABI in ${PYTHON_ABIS}; do 1191 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
901 if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then 1192 if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then
902 site_packages_dirs+=("$1") 1193 site_packages_dirs+=("$1")
903 break 1194 break
904 elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then 1195 elif [[ -f "${root}$(python_get_sitedir)/$1" ]]; then
905 site_packages_files+=("$1") 1196 site_packages_files+=("$1")
906 break 1197 break
907 elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then 1198 elif [[ -e "${root}$(python_get_sitedir)/$1" ]]; then
908 ewarn "'$1' is not a file or a directory!" 1199 ewarn "'$1' is not a file or a directory!"
909 else 1200 else
910 ewarn "'$1' doesn't exist!" 1201 ewarn "'$1' does not exist!"
911 fi 1202 fi
912 done 1203 done
913 fi 1204 fi
914 ;; 1205 ;;
915 esac 1206 esac
917 done 1208 done
918 1209
919 # Set additional options. 1210 # Set additional options.
920 options+=("-q") 1211 options+=("-q")
921 1212
922 for PYTHON_ABI in ${PYTHON_ABIS}; do 1213 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
923 if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})); then 1214 if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})); then
924 return_code="0" 1215 return_code="0"
925 ebegin "Compilation and optimization of Python modules for Python ${PYTHON_ABI}" 1216 ebegin "Compilation and optimization of Python modules for Python ${PYTHON_ABI}"
926 if ((${#site_packages_dirs[@]})); then 1217 if ((${#site_packages_dirs[@]})); then
927 for dir in "${site_packages_dirs[@]}"; do 1218 for dir in "${site_packages_dirs[@]}"; do
940 eend "${return_code}" 1231 eend "${return_code}"
941 fi 1232 fi
942 unset site_packages_absolute_dirs site_packages_absolute_files 1233 unset site_packages_absolute_dirs site_packages_absolute_files
943 done 1234 done
944 1235
945 # 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().
946 unset PYTHON_ABI 1237 unset PYTHON_ABI
947 1238
948 if ((${#other_dirs[@]})) || ((${#other_files[@]})); then 1239 if ((${#other_dirs[@]})) || ((${#other_files[@]})); then
949 return_code="0" 1240 return_code="0"
950 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)"
951 if ((${#other_dirs[@]})); then 1242 if ((${#other_dirs[@]})); then
952 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"
953 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"
954 fi 1245 fi
955 if ((${#other_files[@]})); then 1246 if ((${#other_files[@]})); then
956 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"
957 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"
958 fi 1249 fi
959 eend "${return_code}" 1250 eend "${return_code}"
960 fi 1251 fi
961 else 1252 else
962 local myroot mydirs=() myfiles=() myopts=() return_code="0" 1253 local myroot mydirs=() myfiles=() myopts=() return_code="0"
984 # Files are passed to python_mod_compile which is ROOT-aware 1275 # Files are passed to python_mod_compile which is ROOT-aware
985 myfiles+=("$1") 1276 myfiles+=("$1")
986 elif [[ -e "${myroot}/$1" ]]; then 1277 elif [[ -e "${myroot}/$1" ]]; then
987 ewarn "${myroot}/$1 is not a file or directory!" 1278 ewarn "${myroot}/$1 is not a file or directory!"
988 else 1279 else
989 ewarn "${myroot}/$1 doesn't exist!" 1280 ewarn "${myroot}/$1 does not exist!"
990 fi 1281 fi
991 ;; 1282 ;;
992 esac 1283 esac
993 shift 1284 shift
994 done 1285 done
995 1286
996 # allow compiling for older python versions
997 if [ -n "${PYTHON_OVERRIDE_PYVER}" ]; then
998 PYVER=${PYTHON_OVERRIDE_PYVER}
999 else
1000 python_version
1001 fi
1002
1003 # set additional opts 1287 # set additional opts
1004 myopts+=(-q) 1288 myopts+=(-q)
1005 1289
1006 ebegin "Compilation and optimization of Python modules for Python ${PYVER}" 1290 ebegin "Compilation and optimization of Python modules for Python $(PYTHON -A --ABI)"
1007 if ((${#mydirs[@]})); then 1291 if ((${#mydirs[@]})); then
1008 python${PYVER} \ 1292 "$(PYTHON -A)" "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" || return_code="1"
1009 "${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"
1010 "${myopts[@]}" "${mydirs[@]}" || return_code="1"
1011 python${PYVER} -O \
1012 "${myroot}"/usr/$(get_libdir)/python${PYVER}/compileall.py \
1013 "${myopts[@]}" "${mydirs[@]}" &> /dev/null || return_code="1"
1014 fi 1294 fi
1015 1295
1016 if ((${#myfiles[@]})); then 1296 if ((${#myfiles[@]})); then
1017 python_mod_compile "${myfiles[@]}" 1297 python_mod_compile "${myfiles[@]}"
1018 fi 1298 fi
1042 root="${ROOT%/}" 1322 root="${ROOT%/}"
1043 1323
1044 if (($#)); then 1324 if (($#)); then
1045 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
1046 while (($#)); do 1326 while (($#)); do
1047 if [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then 1327 if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then
1048 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"
1049 elif [[ "$1" =~ ^/ ]]; then 1329 elif [[ "$1" =~ ^/ ]]; then
1050 SEARCH_PATH+=("${root}/${1#/}") 1330 SEARCH_PATH+=("${root}/${1#/}")
1051 else 1331 else
1052 for PYTHON_ABI in ${PYTHON_ABIS}; do 1332 for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI-$(PYTHON -A --ABI)}}; do
1053 SEARCH_PATH+=("${root}$(python_get_sitedir)/$1") 1333 SEARCH_PATH+=("${root}$(python_get_sitedir)/$1")
1054 done 1334 done
1055 fi 1335 fi
1056 shift 1336 shift
1057 done 1337 done
1072 done 1352 done
1073 fi 1353 fi
1074 1354
1075 local BLUE CYAN NORMAL 1355 local BLUE CYAN NORMAL
1076 if [[ "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then 1356 if [[ "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then
1077 BLUE=$'\e[34m' 1357 BLUE=$'\e[1;34m'
1078 CYAN=$'\e[36m' 1358 CYAN=$'\e[1;36m'
1079 NORMAL=$'\e[0m' 1359 NORMAL=$'\e[0m'
1080 else 1360 else
1081 BLUE= 1361 BLUE=
1082 CYAN= 1362 CYAN=
1083 NORMAL= 1363 NORMAL=

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

  ViewVC Help
Powered by ViewVC 1.1.20