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

Diff of /eclass/eutils.eclass

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

Revision 1.294 Revision 1.312
1# Copyright 1999-2007 Gentoo Foundation 1# Copyright 1999-2007 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/eutils.eclass,v 1.294 2008/01/14 04:52:35 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.312 2009/02/18 18:40:07 mr_bones_ Exp $
4 4
5# @ECLASS: eutils.eclass 5# @ECLASS: eutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# base-system@gentoo.org 7# base-system@gentoo.org
8# @BLURB: many extra (but common) functions that are used in ebuilds 8# @BLURB: many extra (but common) functions that are used in ebuilds
47 sleep 1 47 sleep 1
48 done 48 done
49 fi 49 fi
50} 50}
51 51
52# @FUNCTION: ecvs_clean
53# @USAGE: [list of dirs]
54# @DESCRIPTION:
55# Remove CVS directories recursiveley. Useful when a source tarball contains
56# internal CVS directories. Defaults to $PWD.
57ecvs_clean() {
58 [[ -z $* ]] && set -- .
59 find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf
60 find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf
61}
62
63# @FUNCTION: esvn_clean
64# @USAGE: [list of dirs]
65# @DESCRIPTION:
66# Remove .svn directories recursiveley. Useful when a source tarball contains
67# internal Subversion directories. Defaults to $PWD.
68esvn_clean() {
69 [[ -z $* ]] && set -- .
70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71}
72
52# Default directory where patches are located 73# Default directory where patches are located
53EPATCH_SOURCE="${WORKDIR}/patch" 74EPATCH_SOURCE="${WORKDIR}/patch"
54# Default extension for patches 75# Default extension for patches
55EPATCH_SUFFIX="patch.bz2" 76EPATCH_SUFFIX="patch.bz2"
56# Default options for patch 77# Default options for patch
57# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 78# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
58# Set --no-backup-if-mismatch so we don't leave '.orig' files behind. 79# Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
59# Set -E to automatically remove empty files. 80# Set -E to automatically remove empty files.
60EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 81EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
61# List of patches not to apply. Not this is only file names, 82# List of patches not to apply. Note this is only file names,
62# and not the full path .. 83# and not the full path ..
63EPATCH_EXCLUDE="" 84EPATCH_EXCLUDE=""
64# Change the printed message for a single patch. 85# Change the printed message for a single patch.
65EPATCH_SINGLE_MSG="" 86EPATCH_SINGLE_MSG=""
66# Change the printed message for multiple patches. 87# Change the printed message for multiple patches.
84# bug they should be left as is to ensure an ebuild can rely on 105# bug they should be left as is to ensure an ebuild can rely on
85# them for. 106# them for.
86# 107#
87# Patches are applied in current directory. 108# Patches are applied in current directory.
88# 109#
89# Bulk Patches should preferibly have the form of: 110# Bulk Patches should preferably have the form of:
90# 111#
91# ??_${ARCH}_foo.${EPATCH_SUFFIX} 112# ??_${ARCH}_foo.${EPATCH_SUFFIX}
92# 113#
93# For example: 114# For example:
94# 115#
162 183
163 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
164 fi 185 fi
165 186
166 case ${EPATCH_SUFFIX##*\.} in 187 case ${EPATCH_SUFFIX##*\.} in
188 lzma)
189 PIPE_CMD="lzma -dc"
190 PATCH_SUFFIX="lzma"
191 ;;
167 bz2) 192 bz2)
168 PIPE_CMD="bzip2 -dc" 193 PIPE_CMD="bzip2 -dc"
169 PATCH_SUFFIX="bz2" 194 PATCH_SUFFIX="bz2"
170 ;; 195 ;;
171 gz|Z|z) 196 gz|Z|z)
221 fi 246 fi
222 247
223 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 248 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
224 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 249 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
225 250
251 # Decompress the patch if need be
252 if [[ ${PATCH_SUFFIX} != "patch" ]] ; then
253 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
254 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
255
256 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 ; then
257 echo
258 eerror "Could not extract patch!"
259 #die "Could not extract patch!"
260 count=5
261 break
262 fi
263 else
264 PATCH_TARGET="${x}"
265 fi
266
267 # Check for absolute paths in patches. If sandbox is disabled,
268 # people could (accidently) patch files in the root filesystem.
269 # Or trigger other unpleasantries #237667. So disallow -p0 on
270 # such patches.
271 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
272 if [[ -n ${abs_paths} ]] ; then
273 count=1
274 echo "NOTE: skipping -p0 due to absolute paths in patch:" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
275 echo "${abs_paths}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
276 fi
277
226 # Allow for prefix to differ ... im lazy, so shoot me :/ 278 # Allow for prefix to differ ... im lazy, so shoot me :/
227 while [ "${count}" -lt 5 ] 279 while [ "${count}" -lt 5 ]
228 do 280 do
229 # Generate some useful debug info ... 281 # Generate some useful debug info ...
230 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 282 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
231 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 283 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
232 284
233 if [ "${PATCH_SUFFIX}" != "patch" ]
234 then
235 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
236 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
237 else
238 PATCH_TARGET="${x}"
239 fi
240
241 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 285 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
242 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 286 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
243 287
244 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 288 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
245 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 289 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
246
247 if [ "${PATCH_SUFFIX}" != "patch" ]
248 then
249 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
250 then
251 echo
252 eerror "Could not extract patch!"
253 #die "Could not extract patch!"
254 count=5
255 break
256 fi
257 fi
258 290
259 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 291 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
260 then 292 then
261 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 293 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
262 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 294 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
355# base-system@gentoo.org (Linux) 387# base-system@gentoo.org (Linux)
356# Joe Jezak <josejx@gmail.com> (OS X) 388# Joe Jezak <josejx@gmail.com> (OS X)
357# usata@gentoo.org (OS X) 389# usata@gentoo.org (OS X)
358# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD) 390# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
359# @DESCRIPTION: 391# @DESCRIPTION:
360# Small wrapper for getent (Linux), nidump (Mac OS X), 392# Small wrapper for getent (Linux),
393# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
361# and pw (FreeBSD) used in enewuser()/enewgroup() 394# and pw (FreeBSD) used in enewuser()/enewgroup()
362egetent() { 395egetent() {
363 case ${CHOST} in 396 case ${CHOST} in
397 *-darwin9)
398 local mytype=$1
399 [[ "passwd" == $mytype ]] && mytype="Users"
400 [[ "group" == $mytype ]] && mytype="Groups"
401 case "$2" in
402 *[!0-9]*) # Non numeric
403 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
404 ;;
405 *) # Numeric
406 local mykey="UniqueID"
407 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
408 dscl . -search /$mytype $mykey $2 2>/dev/null
409 ;;
410 esac
411 ;;
364 *-darwin*) 412 *-darwin*)
365 case "$2" in 413 case "$2" in
366 *[!0-9]*) # Non numeric 414 *[!0-9]*) # Non numeric
367 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 415 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
368 ;; 416 ;;
1454# displayed and we'll hang out here until: 1502# displayed and we'll hang out here until:
1455# (1) the file is found on a mounted cdrom 1503# (1) the file is found on a mounted cdrom
1456# (2) the user hits CTRL+C 1504# (2) the user hits CTRL+C
1457_cdrom_locate_file_on_cd() { 1505_cdrom_locate_file_on_cd() {
1458 local mline="" 1506 local mline=""
1459 local showedmsg=0 1507 local showedmsg=0 showjolietmsg=0
1460 1508
1461 while [[ -z ${CDROM_ROOT} ]] ; do 1509 while [[ -z ${CDROM_ROOT} ]] ; do
1462 local i=0 1510 local i=0
1463 local -a cdset=(${*//:/ }) 1511 local -a cdset=(${*//:/ })
1464 if [[ -n ${CDROM_SET} ]] ; then 1512 if [[ -n ${CDROM_SET} ]] ; then
1505 showedmsg=1 1553 showedmsg=1
1506 fi 1554 fi
1507 einfo "Press return to scan for the cd again" 1555 einfo "Press return to scan for the cd again"
1508 einfo "or hit CTRL+C to abort the emerge." 1556 einfo "or hit CTRL+C to abort the emerge."
1509 echo 1557 echo
1558 if [[ ${showjolietmsg} -eq 0 ]] ; then
1559 showjolietmsg=1
1560 else
1510 einfo "If you are having trouble with the detection" 1561 ewarn "If you are having trouble with the detection"
1511 einfo "of your CD, it is possible that you do not have" 1562 ewarn "of your CD, it is possible that you do not have"
1512 einfo "Joliet support enabled in your kernel. Please" 1563 ewarn "Joliet support enabled in your kernel. Please"
1513 einfo "check that CONFIG_JOLIET is enabled in your kernel." 1564 ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1565 ebeep 5
1566 fi
1514 read || die "something is screwed with your system" 1567 read || die "something is screwed with your system"
1515 done 1568 done
1516} 1569}
1517 1570
1518# @FUNCTION: strip-linguas 1571# @FUNCTION: strip-linguas
1578 eerror "preserve_old_lib() must be called from pkg_preinst() only" 1631 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1579 die "Invalid preserve_old_lib() usage" 1632 die "Invalid preserve_old_lib() usage"
1580 fi 1633 fi
1581 [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]" 1634 [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1582 1635
1636 # let portage worry about it
1637 has preserve-libs ${FEATURES} && return 0
1638
1583 local lib dir 1639 local lib dir
1584 for lib in "$@" ; do 1640 for lib in "$@" ; do
1585 [[ -e ${ROOT}/${lib} ]] || continue 1641 [[ -e ${ROOT}/${lib} ]] || continue
1586 dir=${lib%/*} 1642 dir=${lib%/*}
1587 dodir ${dir} || die "dodir ${dir} failed" 1643 dodir ${dir} || die "dodir ${dir} failed"
1597preserve_old_lib_notify() { 1653preserve_old_lib_notify() {
1598 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then 1654 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1599 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only" 1655 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1600 die "Invalid preserve_old_lib_notify() usage" 1656 die "Invalid preserve_old_lib_notify() usage"
1601 fi 1657 fi
1658
1659 # let portage worry about it
1660 has preserve-libs ${FEATURES} && return 0
1602 1661
1603 local lib notice=0 1662 local lib notice=0
1604 for lib in "$@" ; do 1663 for lib in "$@" ; do
1605 [[ -e ${ROOT}/${lib} ]] || continue 1664 [[ -e ${ROOT}/${lib} ]] || continue
1606 if [[ ${notice} -eq 0 ]] ; then 1665 if [[ ${notice} -eq 0 ]] ; then
1615 ewarn " # revdep-rebuild --library ${lib##*/}" 1674 ewarn " # revdep-rebuild --library ${lib##*/}"
1616 done 1675 done
1617 if [[ ${notice} -eq 1 ]] ; then 1676 if [[ ${notice} -eq 1 ]] ; then
1618 ewarn 1677 ewarn
1619 ewarn "Once you've finished running revdep-rebuild, it should be safe to" 1678 ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1620 ewarn "delete the old libraries." 1679 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1680 for lib in "$@" ; do
1681 ewarn " # rm '${lib}'"
1682 done
1621 fi 1683 fi
1622} 1684}
1623 1685
1624# @FUNCTION: built_with_use 1686# @FUNCTION: built_with_use
1625# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1687# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1630# --missing option controls the behavior if called on a package that does 1692# --missing option controls the behavior if called on a package that does
1631# not actually support the defined USE flags (aka listed in IUSE). 1693# not actually support the defined USE flags (aka listed in IUSE).
1632# The default is to abort (call die). The -a and -o flags control 1694# The default is to abort (call die). The -a and -o flags control
1633# the requirements of the USE flags. They correspond to "and" and "or" 1695# the requirements of the USE flags. They correspond to "and" and "or"
1634# logic. So the -a flag means all listed USE flags must be enabled 1696# logic. So the -a flag means all listed USE flags must be enabled
1635# while the -o flag means at least one of the listed fIUSE flags must be 1697# while the -o flag means at least one of the listed IUSE flags must be
1636# enabled. The --hidden option is really for internal use only as it 1698# enabled. The --hidden option is really for internal use only as it
1637# means the USE flag we're checking is hidden expanded, so it won't be found 1699# means the USE flag we're checking is hidden expanded, so it won't be found
1638# in IUSE like normal USE flags. 1700# in IUSE like normal USE flags.
1639# 1701#
1640# Remember that this function isn't terribly intelligent so order of optional 1702# Remember that this function isn't terribly intelligent so order of optional
1675 die) die "Unable to determine what USE flags $PKG was built with";; 1737 die) die "Unable to determine what USE flags $PKG was built with";;
1676 esac 1738 esac
1677 fi 1739 fi
1678 1740
1679 if [[ ${hidden} == "no" ]] ; then 1741 if [[ ${hidden} == "no" ]] ; then
1680 local IUSE_BUILT=$(<${IUSEFILE}) 1742 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1681 # Don't check USE_EXPAND #147237 1743 # Don't check USE_EXPAND #147237
1682 local expand 1744 local expand
1683 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do 1745 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1684 if [[ $1 == ${expand}_* ]] ; then 1746 if [[ $1 == ${expand}_* ]] ; then
1685 expand="" 1747 expand=""
1686 break 1748 break
1687 fi 1749 fi
1688 done 1750 done
1689 if [[ -n ${expand} ]] ; then 1751 if [[ -n ${expand} ]] ; then
1690 if ! has $1 ${IUSE_BUILT} ; then 1752 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1691 case ${missing_action} in 1753 case ${missing_action} in
1692 true) return 0;; 1754 true) return 0;;
1693 false) return 1;; 1755 false) return 1;;
1694 die) die "$PKG does not actually support the $1 USE flag!";; 1756 die) die "$PKG does not actually support the $1 USE flag!";;
1695 esac 1757 esac
1726 done 1788 done
1727 eend 0 1789 eend 0
1728} 1790}
1729 1791
1730# @FUNCTION: make_wrapper 1792# @FUNCTION: make_wrapper
1731# @USAGE: <wrapper> <target> <chdir> [libpaths] [installpath] 1793# @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1732# @DESCRIPTION: 1794# @DESCRIPTION:
1733# Create a shell wrapper script named wrapper in installpath 1795# Create a shell wrapper script named wrapper in installpath
1734# (defaults to the bindir) to execute target (default of wrapper) by 1796# (defaults to the bindir) to execute target (default of wrapper) by
1735# first optionally setting LD_LIBRARY_PATH to the colon-delimited 1797# first optionally setting LD_LIBRARY_PATH to the colon-delimited
1736# libpaths followed by optionally changing directory to chdir. 1798# libpaths followed by optionally changing directory to chdir.
1759 ) || die 1821 ) || die
1760 else 1822 else
1761 newbin "${tmpwrapper}" "${wrapper}" || die 1823 newbin "${tmpwrapper}" "${wrapper}" || die
1762 fi 1824 fi
1763} 1825}
1826
1827# @FUNCTION: prepalldocs
1828# @USAGE:
1829# @DESCRIPTION:
1830# Compress files in /usr/share/doc which are not already
1831# compressed, excluding /usr/share/doc/${PF}/html.
1832# Uses the ecompressdir to do the compression.
1833prepalldocs() {
1834 if [[ -n $1 ]] ; then
1835 ewarn "prepalldocs: invalid usage; takes no arguments"
1836 fi
1837
1838 cd "${D}"
1839 [[ -d usr/share/doc ]] || return 0
1840
1841 ecompressdir --ignore /usr/share/doc/${PF}/html
1842 ecompressdir --queue /usr/share/doc
1843}

Legend:
Removed from v.1.294  
changed lines
  Added in v.1.312

  ViewVC Help
Powered by ViewVC 1.1.20