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

Diff of /eclass/eutils.eclass

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

Revision 1.300 Revision 1.321
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.300 2008/03/01 21:59:54 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.321 2009/10/18 07:52:23 grobian 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
77# Default options for patch 77# Default options for patch
78# 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
79# 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.
80# Set -E to automatically remove empty files. 80# Set -E to automatically remove empty files.
81EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 81EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
82# 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,
83# and not the full path .. 83# and not the full path ..
84EPATCH_EXCLUDE="" 84EPATCH_EXCLUDE=""
85# Change the printed message for a single patch. 85# Change the printed message for a single patch.
86EPATCH_SINGLE_MSG="" 86EPATCH_SINGLE_MSG=""
87# Change the printed message for multiple patches. 87# Change the printed message for multiple patches.
105# 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
106# them for. 106# them for.
107# 107#
108# Patches are applied in current directory. 108# Patches are applied in current directory.
109# 109#
110# Bulk Patches should preferibly have the form of: 110# Bulk Patches should preferably have the form of:
111# 111#
112# ??_${ARCH}_foo.${EPATCH_SUFFIX} 112# ??_${ARCH}_foo.${EPATCH_SUFFIX}
113# 113#
114# For example: 114# For example:
115# 115#
183 183
184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
185 fi 185 fi
186 186
187 case ${EPATCH_SUFFIX##*\.} in 187 case ${EPATCH_SUFFIX##*\.} in
188 xz)
189 PIPE_CMD="xz -dc"
190 PATCH_SUFFIX="xz"
191 ;;
192 lzma)
193 PIPE_CMD="lzma -dc"
194 PATCH_SUFFIX="lzma"
195 ;;
188 bz2) 196 bz2)
189 PIPE_CMD="bzip2 -dc" 197 PIPE_CMD="bzip2 -dc"
190 PATCH_SUFFIX="bz2" 198 PATCH_SUFFIX="bz2"
191 ;; 199 ;;
192 gz|Z|z) 200 gz|Z|z)
242 fi 250 fi
243 251
244 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 252 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
245 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 253 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
246 254
255 # Decompress the patch if need be
256 if [[ ${PATCH_SUFFIX} != "patch" ]] ; then
257 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
258 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
259
260 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 ; then
261 echo
262 eerror "Could not extract patch!"
263 #die "Could not extract patch!"
264 count=5
265 break
266 fi
267 else
268 PATCH_TARGET="${x}"
269 fi
270
271 # Check for absolute paths in patches. If sandbox is disabled,
272 # people could (accidently) patch files in the root filesystem.
273 # Or trigger other unpleasantries #237667. So disallow -p0 on
274 # such patches.
275 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
276 if [[ -n ${abs_paths} ]] ; then
277 count=1
278 echo "NOTE: skipping -p0 due to absolute paths in patch:" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
279 echo "${abs_paths}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
280 fi
281
247 # Allow for prefix to differ ... im lazy, so shoot me :/ 282 # Allow for prefix to differ ... im lazy, so shoot me :/
248 while [ "${count}" -lt 5 ] 283 while [ "${count}" -lt 5 ]
249 do 284 do
250 # Generate some useful debug info ... 285 # Generate some useful debug info ...
251 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 286 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
252 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 287 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
253 288
254 if [ "${PATCH_SUFFIX}" != "patch" ]
255 then
256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
258 else
259 PATCH_TARGET="${x}"
260 fi
261
262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 289 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
263 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 290 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
264 291
265 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 292 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
266 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 293 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
267
268 if [ "${PATCH_SUFFIX}" != "patch" ]
269 then
270 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
271 then
272 echo
273 eerror "Could not extract patch!"
274 #die "Could not extract patch!"
275 count=5
276 break
277 fi
278 fi
279 294
280 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 295 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
281 then 296 then
282 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 297 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
283 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 298 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
331 done 346 done
332 if [ "${SINGLE_PATCH}" = "no" ] 347 if [ "${SINGLE_PATCH}" = "no" ]
333 then 348 then
334 einfo "Done with patching" 349 einfo "Done with patching"
335 fi 350 fi
351}
352epatch_user() {
353 [[ $# -ne 0 ]] && die "epatch_user takes no options"
354
355 # don't clobber any EPATCH vars that the parent might want
356 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT}/etc/portage/patches
357 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
358 EPATCH_SOURCE=${base}/${CTARGET}/${check}
359 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
360 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
361 if [[ -d ${EPATCH_SOURCE} ]] ; then
362 EPATCH_SOURCE=${EPATCH_SOURCE} \
363 EPATCH_SUFFIX="patch" \
364 EPATCH_FORCE="yes" \
365 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
366 epatch
367 break
368 fi
369 done
336} 370}
337 371
338# @FUNCTION: emktemp 372# @FUNCTION: emktemp
339# @USAGE: [temp dir] 373# @USAGE: [temp dir]
340# @DESCRIPTION: 374# @DESCRIPTION:
376# base-system@gentoo.org (Linux) 410# base-system@gentoo.org (Linux)
377# Joe Jezak <josejx@gmail.com> (OS X) 411# Joe Jezak <josejx@gmail.com> (OS X)
378# usata@gentoo.org (OS X) 412# usata@gentoo.org (OS X)
379# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD) 413# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
380# @DESCRIPTION: 414# @DESCRIPTION:
381# Small wrapper for getent (Linux), nidump (Mac OS X), 415# Small wrapper for getent (Linux),
416# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
382# and pw (FreeBSD) used in enewuser()/enewgroup() 417# and pw (FreeBSD) used in enewuser()/enewgroup()
383egetent() { 418egetent() {
384 case ${CHOST} in 419 case ${CHOST} in
385 *-darwin*) 420 *-darwin[678])
386 case "$2" in 421 case "$2" in
387 *[!0-9]*) # Non numeric 422 *[!0-9]*) # Non numeric
388 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 423 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
389 ;; 424 ;;
390 *) # Numeric 425 *) # Numeric
391 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 426 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
427 ;;
428 esac
429 ;;
430 *-darwin*)
431 local mytype=$1
432 [[ "passwd" == $mytype ]] && mytype="Users"
433 [[ "group" == $mytype ]] && mytype="Groups"
434 case "$2" in
435 *[!0-9]*) # Non numeric
436 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
437 ;;
438 *) # Numeric
439 local mykey="UniqueID"
440 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
441 dscl . -search /$mytype $mykey $2 2>/dev/null
392 ;; 442 ;;
393 esac 443 esac
394 ;; 444 ;;
395 *-freebsd*|*-dragonfly*) 445 *-freebsd*|*-dragonfly*)
396 local opts action="user" 446 local opts action="user"
596 fi 646 fi
597 ;; 647 ;;
598 648
599 *) 649 *)
600 if [[ -z $@ ]] ; then 650 if [[ -z $@ ]] ; then
601 useradd ${opts} ${euser} \ 651 useradd ${opts} \
602 -c "added by portage for ${PN}" \ 652 -c "added by portage for ${PN}" \
653 ${euser} \
603 || die "enewuser failed" 654 || die "enewuser failed"
604 else 655 else
605 einfo " - Extra: $@" 656 einfo " - Extra: $@"
606 useradd ${opts} ${euser} "$@" \ 657 useradd ${opts} "$@" \
658 ${euser} \
607 || die "enewuser failed" 659 || die "enewuser failed"
608 fi 660 fi
609 ;; 661 ;;
610 esac 662 esac
611 663
893 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop" 945 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
894 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 946 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
895 947
896 cat <<-EOF > "${desktop}" 948 cat <<-EOF > "${desktop}"
897 [Desktop Entry] 949 [Desktop Entry]
898 Version=1.0
899 Name=${name} 950 Name=${name}
900 Type=Application 951 Type=Application
901 Comment=${DESCRIPTION} 952 Comment=${DESCRIPTION}
902 Exec=${exec} 953 Exec=${exec}
903 TryExec=${exec%% *} 954 TryExec=${exec%% *}
942 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo." 993 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
943 fi 994 fi
944} 995}
945 996
946# @FUNCTION: make_session_desktop 997# @FUNCTION: make_session_desktop
947# @USAGE: <title> <command> 998# @USAGE: <title> <command> [command args...]
948# @DESCRIPTION: 999# @DESCRIPTION:
949# Make a GDM/KDM Session file. The title is the file to execute to start the 1000# Make a GDM/KDM Session file. The title is the file to execute to start the
950# Window Manager. The command is the name of the Window Manager. 1001# Window Manager. The command is the name of the Window Manager.
1002#
1003# You can set the name of the file via the ${wm} variable.
951make_session_desktop() { 1004make_session_desktop() {
952 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1 1005 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
953 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1 1006 [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
954 1007
955 local title=$1 1008 local title=$1
956 local command=$2 1009 local command=$2
957 local desktop=${T}/${wm}.desktop 1010 local desktop=${T}/${wm:-${PN}}.desktop
1011 shift 2
958 1012
959 cat <<-EOF > "${desktop}" 1013 cat <<-EOF > "${desktop}"
960 [Desktop Entry] 1014 [Desktop Entry]
961 Name=${title} 1015 Name=${title}
962 Comment=This session logs you into ${title} 1016 Comment=This session logs you into ${title}
963 Exec=${command} 1017 Exec=${command} $*
964 TryExec=${command} 1018 TryExec=${command}
965 Type=Application 1019 Type=XSession
966 EOF 1020 EOF
967 1021
968 ( 1022 (
969 # wrap the env here so that the 'insinto' call 1023 # wrap the env here so that the 'insinto' call
970 # doesn't corrupt the env of the caller 1024 # doesn't corrupt the env of the caller
1553# of the lists. 1607# of the lists.
1554strip-linguas() { 1608strip-linguas() {
1555 local ls newls nols 1609 local ls newls nols
1556 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then 1610 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1557 local op=$1; shift 1611 local op=$1; shift
1558 ls=$(find "$1" -name '*.po' -exec basename {} .po \;); shift 1612 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1559 local d f 1613 local d f
1560 for d in "$@" ; do 1614 for d in "$@" ; do
1561 if [[ ${op} == "-u" ]] ; then 1615 if [[ ${op} == "-u" ]] ; then
1562 newls=${ls} 1616 newls=${ls}
1563 else 1617 else
1564 newls="" 1618 newls=""
1565 fi 1619 fi
1566 for f in $(find "$d" -name '*.po' -exec basename {} .po \;) ; do 1620 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1567 if [[ ${op} == "-i" ]] ; then 1621 if [[ ${op} == "-i" ]] ; then
1568 hasq ${f} ${ls} && newls="${newls} ${f}" 1622 hasq ${f} ${ls} && newls="${newls} ${f}"
1569 else 1623 else
1570 hasq ${f} ${ls} || newls="${newls} ${f}" 1624 hasq ${f} ${ls} || newls="${newls} ${f}"
1571 fi 1625 fi
1584 else 1638 else
1585 nols="${nols} ${f}" 1639 nols="${nols} ${f}"
1586 fi 1640 fi
1587 done 1641 done
1588 [[ -n ${nols} ]] \ 1642 [[ -n ${nols} ]] \
1589 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols} 1643 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1590 export LINGUAS=${newls:1} 1644 export LINGUAS=${newls:1}
1591} 1645}
1592 1646
1593# @FUNCTION: preserve_old_lib 1647# @FUNCTION: preserve_old_lib
1594# @USAGE: <libs to preserve> [more libs] 1648# @USAGE: <libs to preserve> [more libs]
1665# --missing option controls the behavior if called on a package that does 1719# --missing option controls the behavior if called on a package that does
1666# not actually support the defined USE flags (aka listed in IUSE). 1720# not actually support the defined USE flags (aka listed in IUSE).
1667# The default is to abort (call die). The -a and -o flags control 1721# The default is to abort (call die). The -a and -o flags control
1668# the requirements of the USE flags. They correspond to "and" and "or" 1722# the requirements of the USE flags. They correspond to "and" and "or"
1669# logic. So the -a flag means all listed USE flags must be enabled 1723# logic. So the -a flag means all listed USE flags must be enabled
1670# while the -o flag means at least one of the listed fIUSE flags must be 1724# while the -o flag means at least one of the listed IUSE flags must be
1671# enabled. The --hidden option is really for internal use only as it 1725# enabled. The --hidden option is really for internal use only as it
1672# means the USE flag we're checking is hidden expanded, so it won't be found 1726# means the USE flag we're checking is hidden expanded, so it won't be found
1673# in IUSE like normal USE flags. 1727# in IUSE like normal USE flags.
1674# 1728#
1675# Remember that this function isn't terribly intelligent so order of optional 1729# Remember that this function isn't terribly intelligent so order of optional
1710 die) die "Unable to determine what USE flags $PKG was built with";; 1764 die) die "Unable to determine what USE flags $PKG was built with";;
1711 esac 1765 esac
1712 fi 1766 fi
1713 1767
1714 if [[ ${hidden} == "no" ]] ; then 1768 if [[ ${hidden} == "no" ]] ; then
1715 local IUSE_BUILT=$(<${IUSEFILE}) 1769 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1716 # Don't check USE_EXPAND #147237 1770 # Don't check USE_EXPAND #147237
1717 local expand 1771 local expand
1718 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do 1772 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1719 if [[ $1 == ${expand}_* ]] ; then 1773 if [[ $1 == ${expand}_* ]] ; then
1720 expand="" 1774 expand=""
1721 break 1775 break
1722 fi 1776 fi
1723 done 1777 done
1724 if [[ -n ${expand} ]] ; then 1778 if [[ -n ${expand} ]] ; then
1725 if ! has $1 ${IUSE_BUILT} ; then 1779 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1726 case ${missing_action} in 1780 case ${missing_action} in
1727 true) return 0;; 1781 true) return 0;;
1728 false) return 1;; 1782 false) return 1;;
1729 die) die "$PKG does not actually support the $1 USE flag!";; 1783 die) die "$PKG does not actually support the $1 USE flag!";;
1730 esac 1784 esac
1794 ) || die 1848 ) || die
1795 else 1849 else
1796 newbin "${tmpwrapper}" "${wrapper}" || die 1850 newbin "${tmpwrapper}" "${wrapper}" || die
1797 fi 1851 fi
1798} 1852}
1853
1854# @FUNCTION: prepalldocs
1855# @USAGE:
1856# @DESCRIPTION:
1857# Compress files in /usr/share/doc which are not already
1858# compressed, excluding /usr/share/doc/${PF}/html.
1859# Uses the ecompressdir to do the compression.
1860# 2009-02-18 by betelgeuse:
1861# Commented because ecompressdir is even more internal to
1862# Portage than prepalldocs (it's not even mentioned in man 5
1863# ebuild). Please submit a better version for review to gentoo-dev
1864# if you want prepalldocs here.
1865#prepalldocs() {
1866# if [[ -n $1 ]] ; then
1867# ewarn "prepalldocs: invalid usage; takes no arguments"
1868# fi
1869
1870# cd "${D}"
1871# [[ -d usr/share/doc ]] || return 0
1872
1873# find usr/share/doc -exec gzip {} +
1874# ecompressdir --ignore /usr/share/doc/${PF}/html
1875# ecompressdir --queue /usr/share/doc
1876#}

Legend:
Removed from v.1.300  
changed lines
  Added in v.1.321

  ViewVC Help
Powered by ViewVC 1.1.20