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

Diff of /eclass/distutils.eclass

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

Revision 1.71 Revision 1.73
1# Copyright 1999-2010 Gentoo Foundation 1# Copyright 1999-2010 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/distutils.eclass,v 1.71 2010/02/07 21:17:15 pva Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/distutils.eclass,v 1.73 2010/02/28 11:52:22 arfrever Exp $
4 4
5# @ECLASS: distutils.eclass 5# @ECLASS: distutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Gentoo Python Project <python@gentoo.org> 7# Gentoo Python Project <python@gentoo.org>
8# 8#
9# Original author: Jon Nelson <jnelson@gentoo.org> 9# Original author: Jon Nelson <jnelson@gentoo.org>
10# @BLURB: Eclass for packages with build systems using Distutils 10# @BLURB: Eclass for packages with build systems using Distutils
11# @DESCRIPTION: 11# @DESCRIPTION:
12# The distutils eclass defines phase functions for packages with build systems using Distutils 12# The distutils eclass defines phase functions for packages with build systems using Distutils.
13 13
14inherit eutils multilib python 14inherit multilib python
15 15
16case "${EAPI:-0}" in 16case "${EAPI:-0}" in
17 0|1) 17 0|1)
18 EXPORT_FUNCTIONS src_unpack src_compile src_install pkg_postinst pkg_postrm 18 EXPORT_FUNCTIONS src_unpack src_compile src_install pkg_postinst pkg_postrm
19 ;; 19 ;;
20 *) 20 *)
21 EXPORT_FUNCTIONS src_unpack src_prepare src_compile src_install pkg_postinst pkg_postrm 21 EXPORT_FUNCTIONS src_prepare src_compile src_install pkg_postinst pkg_postrm
22 ;; 22 ;;
23esac 23esac
24 24
25if [[ -z "${PYTHON_DEPEND}" ]]; then 25if [[ -z "${PYTHON_DEPEND}" ]]; then
26 DEPEND="virtual/python" 26 DEPEND="dev-lang/python"
27 RDEPEND="${DEPEND}" 27 RDEPEND="${DEPEND}"
28fi 28fi
29 29
30if has "${EAPI:-0}" 0 1 2; then 30if has "${EAPI:-0}" 0 1 2 && [[ -z "${SUPPORT_PYTHON_ABIS}" ]]; then
31 python="python" 31 python="python"
32else 32else
33 # Use "$(PYTHON)" or "$(PYTHON -A)" instead of "${python}". 33 # Use "$(PYTHON)" instead of "${python}".
34 python="die" 34 python="die"
35fi 35fi
36 36
37# @ECLASS-VARIABLE: DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES 37# @ECLASS-VARIABLE: DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES
38# @DESCRIPTION: 38# @DESCRIPTION:
81# @ECLASS-VARIABLE: DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS 81# @ECLASS-VARIABLE: DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS
82# @DESCRIPTION: 82# @DESCRIPTION:
83# Set this to disable renaming of Python scripts containing versioned shebangs 83# Set this to disable renaming of Python scripts containing versioned shebangs
84# and generation of wrapper scripts. 84# and generation of wrapper scripts.
85 85
86# @ECLASS-VARIABLE: DISTUTILS_NONVERSIONED_PYTHON_SCRIPTS
87# @DESCRIPTION:
88# List of paths to Python scripts, relative to ${D}, which are excluded from
89# renaming and generation of wrapper scripts.
90
86# @ECLASS-VARIABLE: DOCS 91# @ECLASS-VARIABLE: DOCS
87# @DESCRIPTION: 92# @DESCRIPTION:
88# Additional documentation files installed by distutils_src_install(). 93# Additional documentation files installed by distutils_src_install().
89 94
90_distutils_get_build_dir() { 95_distutils_get_build_dir() {
114 119
115# @FUNCTION: distutils_src_unpack 120# @FUNCTION: distutils_src_unpack
116# @DESCRIPTION: 121# @DESCRIPTION:
117# The distutils src_unpack function. This function is exported. 122# The distutils src_unpack function. This function is exported.
118distutils_src_unpack() { 123distutils_src_unpack() {
124 if ! has "${EAPI:-0}" 0 1; then
125 die "${FUNCNAME}() cannot be used in this EAPI"
126 fi
127
119 if [[ "${EBUILD_PHASE}" != "unpack" ]]; then 128 if [[ "${EBUILD_PHASE}" != "unpack" ]]; then
120 die "${FUNCNAME}() can be used only in src_unpack() phase" 129 die "${FUNCNAME}() can be used only in src_unpack() phase"
121 fi 130 fi
122 131
123 unpack ${A} 132 unpack ${A}
124 cd "${S}" 133 cd "${S}"
125 134
126 has "${EAPI:-0}" 0 1 && distutils_src_prepare 135 distutils_src_prepare
127} 136}
128 137
129# @FUNCTION: distutils_src_prepare 138# @FUNCTION: distutils_src_prepare
130# @DESCRIPTION: 139# @DESCRIPTION:
131# The distutils src_prepare function. This function is exported. 140# The distutils src_prepare function. This function is exported.
163distutils_src_compile() { 172distutils_src_compile() {
164 if [[ "${EBUILD_PHASE}" != "compile" ]]; then 173 if [[ "${EBUILD_PHASE}" != "compile" ]]; then
165 die "${FUNCNAME}() can be used only in src_compile() phase" 174 die "${FUNCNAME}() can be used only in src_compile() phase"
166 fi 175 fi
167 176
177 _python_set_color_variables
178
168 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then 179 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
169 distutils_building() { 180 distutils_building() {
170 _distutils_hook pre 181 _distutils_hook pre
171 182
172 echo "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@" 183 echo ${_BOLD}"$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@"${_NORMAL}
173 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@" || return "$?" 184 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build -b "$(_distutils_get_build_dir)" "$@" || return "$?"
174 185
175 _distutils_hook post 186 _distutils_hook post
176 } 187 }
177 python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_building "$@" 188 python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_building "$@"
178 else 189 else
179 echo "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@" 190 echo ${_BOLD}"$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@"${_NORMAL}
180 "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@" || die "Building failed" 191 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" build "$@" || die "Building failed"
181 fi 192 fi
182} 193}
183 194
184# @FUNCTION: distutils_src_test 195# @FUNCTION: distutils_src_test
185# @DESCRIPTION: 196# @DESCRIPTION:
186# The distutils src_test function. This function is exported, when DISTUTILS_SRC_TEST variable is set. 197# The distutils src_test function. This function is exported, when DISTUTILS_SRC_TEST variable is set.
187distutils_src_test() { 198distutils_src_test() {
199 _python_set_color_variables
200
188 if [[ "${DISTUTILS_SRC_TEST}" == "setup.py" ]]; then 201 if [[ "${DISTUTILS_SRC_TEST}" == "setup.py" ]]; then
189 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then 202 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
190 distutils_testing() { 203 distutils_testing() {
191 echo PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@" 204 echo ${_BOLD}PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@"${_NORMAL}
192 PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@" 205 PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") test "$@"
193 } 206 }
194 python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_testing "$@" 207 python_execute_function ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} distutils_testing "$@"
195 else 208 else
196 echo PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@" || die "Testing failed" 209 echo ${_BOLD}PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@"${_NORMAL}
197 PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@" || die "Testing failed" 210 PYTHONPATH="$(_distutils_get_PYTHONPATH)" "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" test "$@" || die "Testing failed"
198 fi 211 fi
199 elif [[ "${DISTUTILS_SRC_TEST}" == "nosetests" ]]; then 212 elif [[ "${DISTUTILS_SRC_TEST}" == "nosetests" ]]; then
200 python_execute_nosetests -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@" 213 python_execute_nosetests -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@"
201 elif [[ "${DISTUTILS_SRC_TEST}" == "py.test" ]]; then 214 elif [[ "${DISTUTILS_SRC_TEST}" == "py.test" ]]; then
202 python_execute_py.test -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@" 215 python_execute_py.test -P '$(_distutils_get_PYTHONPATH)' ${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES:+-s} -- "$@"
225distutils_src_install() { 238distutils_src_install() {
226 if [[ "${EBUILD_PHASE}" != "install" ]]; then 239 if [[ "${EBUILD_PHASE}" != "install" ]]; then
227 die "${FUNCNAME}() can be used only in src_install() phase" 240 die "${FUNCNAME}() can be used only in src_install() phase"
228 fi 241 fi
229 242
243 _python_set_color_variables
244
230 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then 245 if [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
231 if [[ -z "${DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS}" && "${BASH_VERSINFO[0]}" -ge 4 ]]; then 246 if [[ -z "${DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS}" && "${BASH_VERSINFO[0]}" -ge 4 ]]; then
232 declare -A wrapper_scripts=() 247 declare -A wrapper_scripts=()
233 248
234 rename_scripts_with_versioned_shebangs() { 249 rename_scripts_with_versioned_shebangs() {
235 if [[ -d "${D}usr/bin" ]]; then 250 if [[ -d "${D}usr/bin" ]]; then
236 cd "${D}usr/bin" 251 cd "${D}usr/bin"
237 252
238 local file 253 local nonversioned_file file
239 for file in *; do 254 for file in *; do
240 if [[ -f "${file}" && ! "${file}" =~ [[:digit:]]+\.[[:digit:]]+$ && "$(head -n1 "${file}")" =~ ^'#!'.*python[[:digit:]]+\.[[:digit:]]+ ]]; then 255 if [[ -f "${file}" && ! "${file}" =~ [[:digit:]]+\.[[:digit:]](-jython)?+$ && "$(head -n1 "${file}")" =~ ^'#!'.*(python|jython-)[[:digit:]]+\.[[:digit:]]+ ]]; then
256 for nonversioned_file in "${DISTUTILS_NONVERSIONED_PYTHON_SCRIPTS[@]}"; do
257 [[ "${nonversioned_file}" == "/usr/bin/${file}" ]] && continue 2
258 done
241 mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed" 259 mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed"
242 wrapper_scripts+=(["${D}usr/bin/${file}"]=) 260 wrapper_scripts+=(["${D}usr/bin/${file}"]=)
243 fi 261 fi
244 done 262 done
245 fi 263 fi
247 fi 265 fi
248 266
249 distutils_installation() { 267 distutils_installation() {
250 _distutils_hook pre 268 _distutils_hook pre
251 269
252 echo "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --root="${D}" --no-compile "$@" 270 echo ${_BOLD}"$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --root="${D}" --no-compile "$@"${_NORMAL}
253 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --root="${D}" --no-compile "$@" || return "$?" 271 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" $([[ -z "${DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES}" ]] && echo build -b "$(_distutils_get_build_dir)") install --root="${D}" --no-compile "$@" || return "$?"
254 272
255 if [[ -z "${DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS}" && "${BASH_VERSINFO[0]}" -ge 4 ]]; then 273 if [[ -z "${DISTUTILS_DISABLE_VERSIONING_OF_PYTHON_SCRIPTS}" && "${BASH_VERSINFO[0]}" -ge 4 ]]; then
256 rename_scripts_with_versioned_shebangs 274 rename_scripts_with_versioned_shebangs
257 fi 275 fi
266 unset wrapper_scripts 284 unset wrapper_scripts
267 else 285 else
268 # Mark the package to be rebuilt after a Python upgrade. 286 # Mark the package to be rebuilt after a Python upgrade.
269 python_need_rebuild 287 python_need_rebuild
270 288
271 echo "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@" 289 echo ${_BOLD}"$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@"${_NORMAL}
272 "$(PYTHON -A)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@" || die "Installation failed" 290 "$(PYTHON)" setup.py "${DISTUTILS_GLOBAL_OPTIONS[@]}" install --root="${D}" --no-compile "$@" || die "Installation failed"
273 fi 291 fi
274 292
275 if [[ -e "${D}usr/local" ]]; then 293 if [[ -e "${D}usr/local" ]]; then
276 die "Illegal installation into /usr/local" 294 die "Illegal installation into /usr/local"
277 fi 295 fi
300 die "${FUNCNAME}() can be used only in pkg_postinst() phase" 318 die "${FUNCNAME}() can be used only in pkg_postinst() phase"
301 fi 319 fi
302 320
303 local pylibdir pymod 321 local pylibdir pymod
304 if [[ -z "${PYTHON_MODNAME}" ]]; then 322 if [[ -z "${PYTHON_MODNAME}" ]]; then
305 for pylibdir in "${ROOT}"/usr/$(get_libdir)/python*; do 323 for pylibdir in "${ROOT}"usr/$(get_libdir)/python* "${ROOT}"/usr/share/jython-*/Lib; do
306 if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then 324 if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then
307 PYTHON_MODNAME="${PN}" 325 PYTHON_MODNAME="${PN}"
308 fi 326 fi
309 done 327 done
310 fi 328 fi
329 die "${FUNCNAME}() can be used only in pkg_postrm() phase" 347 die "${FUNCNAME}() can be used only in pkg_postrm() phase"
330 fi 348 fi
331 349
332 local pylibdir pymod 350 local pylibdir pymod
333 if [[ -z "${PYTHON_MODNAME}" ]]; then 351 if [[ -z "${PYTHON_MODNAME}" ]]; then
334 for pylibdir in "${ROOT}"/usr/$(get_libdir)/python*; do 352 for pylibdir in "${ROOT}"usr/$(get_libdir)/python* "${ROOT}"/usr/share/jython-*/Lib; do
335 if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then 353 if [[ -d "${pylibdir}/site-packages/${PN}" ]]; then
336 PYTHON_MODNAME="${PN}" 354 PYTHON_MODNAME="${PN}"
337 fi 355 fi
338 done 356 done
339 fi 357 fi
341 if [[ -n "${PYTHON_MODNAME}" ]]; then 359 if [[ -n "${PYTHON_MODNAME}" ]]; then
342 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then 360 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
343 python_mod_cleanup ${PYTHON_MODNAME} 361 python_mod_cleanup ${PYTHON_MODNAME}
344 else 362 else
345 for pymod in ${PYTHON_MODNAME}; do 363 for pymod in ${PYTHON_MODNAME}; do
346 for pylibdir in "${ROOT}"/usr/$(get_libdir)/python*; do 364 for pylibdir in "${ROOT}"usr/$(get_libdir)/python*; do
347 if [[ -d "${pylibdir}/site-packages/${pymod}" ]]; then 365 if [[ -d "${pylibdir}/site-packages/${pymod}" ]]; then
348 python_mod_cleanup "${pylibdir#${ROOT}}/site-packages/${pymod}" 366 python_mod_cleanup "${pylibdir#${ROOT%/}}/site-packages/${pymod}"
349 fi 367 fi
350 done 368 done
351 done 369 done
352 fi 370 fi
353 else 371 else
357 375
358# @FUNCTION: distutils_python_version 376# @FUNCTION: distutils_python_version
359# @DESCRIPTION: 377# @DESCRIPTION:
360# Deprecated wrapper function for deprecated python_version(). 378# Deprecated wrapper function for deprecated python_version().
361distutils_python_version() { 379distutils_python_version() {
362 if ! has "${EAPI:-0}" 0 1 2; then 380 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
363 eerror "Use PYTHON() and/or python_get_*() instead of ${FUNCNAME}()." 381 eerror "Use PYTHON() and/or python_get_*() instead of ${FUNCNAME}()."
364 die "${FUNCNAME}() cannot be used in this EAPI" 382 die "${FUNCNAME}() cannot be used in this EAPI"
365 fi 383 fi
366 384
367 python_version 385 python_version
368} 386}
369 387
370# @FUNCTION: distutils_python_tkinter 388# @FUNCTION: distutils_python_tkinter
371# @DESCRIPTION: 389# @DESCRIPTION:
372# Deprecated wrapper function for python_tkinter_exists(). 390# Deprecated wrapper function for deprecated python_tkinter_exists().
373distutils_python_tkinter() { 391distutils_python_tkinter() {
374 if ! has "${EAPI:-0}" 0 1 2; then 392 if ! has "${EAPI:-0}" 0 1 2 || [[ -n "${SUPPORT_PYTHON_ABIS}" ]]; then
375 eerror "Use python_tkinter_exists() instead of ${FUNCNAME}()." 393 eerror "Use PYTHON_USE_WITH=\"xml\" and python_pkg_setup() instead of ${FUNCNAME}()."
376 die "${FUNCNAME}() cannot be used in this EAPI" 394 die "${FUNCNAME}() cannot be used in this EAPI"
377 fi 395 fi
378 396
379 python_tkinter_exists 397 python_tkinter_exists
380} 398}

Legend:
Removed from v.1.71  
changed lines
  Added in v.1.73

  ViewVC Help
Powered by ViewVC 1.1.20