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

Diff of /eclass/eutils.eclass

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

Revision 1.328 Revision 1.373
1# Copyright 1999-2009 Gentoo Foundation 1# Copyright 1999-2011 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.328 2010/01/10 15:58:58 scarabeus Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.373 2011/12/16 23:38:41 vapier 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
13# home rather than having multiple ebuilds implementing the same thing. 13# home rather than having multiple ebuilds implementing the same thing.
14# 14#
15# Due to the nature of this eclass, some functions may have maintainers 15# Due to the nature of this eclass, some functions may have maintainers
16# different from the overall eclass! 16# different from the overall eclass!
17 17
18if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then
19___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
20
18inherit multilib portability 21inherit multilib portability user
19 22
20DESCRIPTION="Based on the ${ECLASS} eclass" 23DESCRIPTION="Based on the ${ECLASS} eclass"
24
25if has "${EAPI:-0}" 0 1 2; then
21 26
22# @FUNCTION: epause 27# @FUNCTION: epause
23# @USAGE: [seconds] 28# @USAGE: [seconds]
24# @DESCRIPTION: 29# @DESCRIPTION:
25# Sleep for the specified number of seconds (default of 5 seconds). Useful when 30# Sleep for the specified number of seconds (default of 5 seconds). Useful when
26# printing a message the user should probably be reading and often used in 31# printing a message the user should probably be reading and often used in
27# conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set, 32# conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
28# don't wait at all. 33# don't wait at all. Defined in EAPIs 0 1 and 2.
29epause() { 34epause() {
30 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5} 35 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
31} 36}
32 37
33# @FUNCTION: ebeep 38# @FUNCTION: ebeep
34# @USAGE: [number of beeps] 39# @USAGE: [number of beeps]
35# @DESCRIPTION: 40# @DESCRIPTION:
36# Issue the specified number of beeps (default of 5 beeps). Useful when 41# Issue the specified number of beeps (default of 5 beeps). Useful when
37# printing a message the user should probably be reading and often used in 42# printing a message the user should probably be reading and often used in
38# conjunction with the epause function. If the EBEEP_IGNORE env var is set, 43# conjunction with the epause function. If the EBEEP_IGNORE env var is set,
39# don't beep at all. 44# don't beep at all. Defined in EAPIs 0 1 and 2.
40ebeep() { 45ebeep() {
41 local n 46 local n
42 if [[ -z ${EBEEP_IGNORE} ]] ; then 47 if [[ -z ${EBEEP_IGNORE} ]] ; then
43 for ((n=1 ; n <= ${1:-5} ; n++)) ; do 48 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
44 echo -ne "\a" 49 echo -ne "\a"
47 sleep 1 52 sleep 1
48 done 53 done
49 fi 54 fi
50} 55}
51 56
57else
58
59ebeep() {
60 ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
61}
62
63epause() {
64 ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
65}
66
67fi
68
69# @FUNCTION: eqawarn
70# @USAGE: [message]
71# @DESCRIPTION:
72# Proxy to ewarn for package managers that don't provide eqawarn and use the PM
73# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
74# profile.
75if ! declare -F eqawarn >/dev/null ; then
76 eqawarn() {
77 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
78 :
79 }
80fi
81
52# @FUNCTION: ecvs_clean 82# @FUNCTION: ecvs_clean
53# @USAGE: [list of dirs] 83# @USAGE: [list of dirs]
54# @DESCRIPTION: 84# @DESCRIPTION:
55# Remove CVS directories recursiveley. Useful when a source tarball contains 85# Remove CVS directories recursiveley. Useful when a source tarball contains
56# internal CVS directories. Defaults to $PWD. 86# internal CVS directories. Defaults to $PWD.
68esvn_clean() { 98esvn_clean() {
69 [[ -z $* ]] && set -- . 99 [[ -z $* ]] && set -- .
70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 100 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71} 101}
72 102
103# @FUNCTION: estack_push
104# @USAGE: <stack> [items to push]
105# @DESCRIPTION:
106# Push any number of items onto the specified stack. Pick a name that
107# is a valid variable (i.e. stick to alphanumerics), and push as many
108# items as you like onto the stack at once.
109#
110# The following code snippet will echo 5, then 4, then 3, then ...
111# @CODE
112# estack_push mystack 1 2 3 4 5
113# while estack_pop mystack i ; do
114# echo "${i}"
115# done
116# @CODE
117estack_push() {
118 [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"
119 local stack_name="__ESTACK_$1__" ; shift
120 eval ${stack_name}+=\( \"\$@\" \)
121}
122
123# @FUNCTION: estack_pop
124# @USAGE: <stack> [variable]
125# @DESCRIPTION:
126# Pop a single item off the specified stack. If a variable is specified,
127# the popped item is stored there. If no more items are available, return
128# 1, else return 0. See estack_push for more info.
129estack_pop() {
130 [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments"
131
132 # We use the fugly __estack_xxx var names to avoid collision with
133 # passing back the return value. If we used "local i" and the
134 # caller ran `estack_pop ... i`, we'd end up setting the local
135 # copy of "i" rather than the caller's copy. The __estack_xxx
136 # garbage is preferable to using $1/$2 everywhere as that is a
137 # bit harder to read.
138 local __estack_name="__ESTACK_$1__" ; shift
139 local __estack_retvar=$1 ; shift
140 eval local __estack_i=\${#${__estack_name}[@]}
141 # Don't warn -- let the caller interpret this as a failure
142 # or as normal behavior (akin to `shift`)
143 [[ $(( --__estack_i )) -eq -1 ]] && return 1
144
145 if [[ -n ${__estack_retvar} ]] ; then
146 eval ${__estack_retvar}=\"\${${__estack_name}[${__estack_i}]}\"
147 fi
148 eval unset ${__estack_name}[${__estack_i}]
149}
150
73# @FUNCTION: eshopts_push 151# @FUNCTION: eshopts_push
74# @USAGE: [options to `set`] 152# @USAGE: [options to `set` or `shopt`]
75# @DESCRIPTION: 153# @DESCRIPTION:
76# Often times code will want to enable a shell option to change code behavior. 154# Often times code will want to enable a shell option to change code behavior.
77# Since changing shell options can easily break other pieces of code (which 155# Since changing shell options can easily break other pieces of code (which
78# assume the default state), eshopts_push is used to (1) push the current shell 156# assume the default state), eshopts_push is used to (1) push the current shell
79# options onto a stack and (2) pass the specified arguments to set. 157# options onto a stack and (2) pass the specified arguments to set.
158#
159# If the first argument is '-s' or '-u', we assume you want to call `shopt`
160# rather than `set` as there are some options only available via that.
80# 161#
81# A common example is to disable shell globbing so that special meaning/care 162# A common example is to disable shell globbing so that special meaning/care
82# may be used with variables/arguments to custom functions. That would be: 163# may be used with variables/arguments to custom functions. That would be:
83# @CODE 164# @CODE
84# eshopts_push -o noglob 165# eshopts_push -o noglob
91# eshopts_pop 172# eshopts_pop
92# @CODE 173# @CODE
93eshopts_push() { 174eshopts_push() {
94 # have to assume __ESHOPTS_SAVE__ isn't screwed with 175 # have to assume __ESHOPTS_SAVE__ isn't screwed with
95 # as a `declare -a` here will reset its value 176 # as a `declare -a` here will reset its value
96 local i=${#__ESHOPTS_SAVE__[@]} 177 if [[ $1 == -[su] ]] ; then
97 __ESHOPTS_SAVE__[$i]=$- 178 estack_push eshopts "$(shopt -p)"
98 [[ $# -eq 0 ]] && return 0 179 [[ $# -eq 0 ]] && return 0
180 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
181 else
182 estack_push eshopts $-
183 [[ $# -eq 0 ]] && return 0
99 set "$@" || die "eshopts_push: bad options to set: $*" 184 set "$@" || die "${FUNCNAME}: bad options to set: $*"
185 fi
100} 186}
101 187
102# @FUNCTION: eshopts_pop 188# @FUNCTION: eshopts_pop
103# @USAGE: 189# @USAGE:
104# @DESCRIPTION: 190# @DESCRIPTION:
105# Restore the shell options to the state saved with the corresponding 191# Restore the shell options to the state saved with the corresponding
106# eshopts_push call. See that function for more details. 192# eshopts_push call. See that function for more details.
107eshopts_pop() { 193eshopts_pop() {
108 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 194 local s
109 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 195 estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
110 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair" 196 if [[ ${s} == "shopt -"* ]] ; then
111 local s=${__ESHOPTS_SAVE__[$i]} 197 eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"
112 unset __ESHOPTS_SAVE__[$i] 198 else
113 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 199 set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"
114 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}" 200 set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}"
201 fi
202}
203
204# @FUNCTION: eumask_push
205# @USAGE: <new umask>
206# @DESCRIPTION:
207# Set the umask to the new value specified while saving the previous
208# value onto a stack. Useful for temporarily changing the umask.
209eumask_push() {
210 estack_push eumask "$(umask)"
211 umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
212}
213
214# @FUNCTION: eumask_pop
215# @USAGE:
216# @DESCRIPTION:
217# Restore the previous umask state.
218eumask_pop() {
219 local s
220 estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
221 umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
115} 222}
116 223
117# @VARIABLE: EPATCH_SOURCE 224# @VARIABLE: EPATCH_SOURCE
118# @DESCRIPTION: 225# @DESCRIPTION:
119# Default directory to search for patches. 226# Default directory to search for patches.
162# If you do not specify any options, then epatch will default to the directory 269# If you do not specify any options, then epatch will default to the directory
163# specified by EPATCH_SOURCE. 270# specified by EPATCH_SOURCE.
164# 271#
165# When processing directories, epatch will apply all patches that match: 272# When processing directories, epatch will apply all patches that match:
166# @CODE 273# @CODE
167# ${EPATCH_FORCE} == "yes" 274# if ${EPATCH_FORCE} != "yes"
168# ??_${ARCH}_foo.${EPATCH_SUFFIX} 275# ??_${ARCH}_foo.${EPATCH_SUFFIX}
169# else 276# else
170# *.${EPATCH_SUFFIX} 277# *.${EPATCH_SUFFIX}
171# @CODE 278# @CODE
172# The leading ?? are typically numbers used to force consistent patch ordering. 279# The leading ?? are typically numbers used to force consistent patch ordering.
211 local EPATCH_SUFFIX=$1 318 local EPATCH_SUFFIX=$1
212 319
213 elif [[ -d $1 ]] ; then 320 elif [[ -d $1 ]] ; then
214 # Some people like to make dirs of patches w/out suffixes (vim) 321 # Some people like to make dirs of patches w/out suffixes (vim)
215 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"} 322 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
323
324 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
325 # Re-use EPATCH_SOURCE as a search dir
326 epatch "${EPATCH_SOURCE}/$1"
327 return $?
216 328
217 else 329 else
218 # sanity check ... if it isn't a dir or file, wtf man ? 330 # sanity check ... if it isn't a dir or file, wtf man ?
219 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1 331 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
220 echo 332 echo
251 # ???_arch_foo.patch 363 # ???_arch_foo.patch
252 # Else, skip this input altogether 364 # Else, skip this input altogether
253 local a=${patchname#*_} # strip the ???_ 365 local a=${patchname#*_} # strip the ???_
254 a=${a%%_*} # strip the _foo.patch 366 a=${a%%_*} # strip the _foo.patch
255 if ! [[ ${SINGLE_PATCH} == "yes" || \ 367 if ! [[ ${SINGLE_PATCH} == "yes" || \
256 ${EPATCH_FORCE} == "yes" || \ 368 ${EPATCH_FORCE} == "yes" || \
257 ${a} == all || \ 369 ${a} == all || \
258 ${a} == ${ARCH} ]] 370 ${a} == ${ARCH} ]]
259 then 371 then
260 continue 372 continue
261 fi 373 fi
262 374
263 # Let people filter things dynamically 375 # Let people filter things dynamically
291 local STDERR_TARGET="${T}/${patchname}.out" 403 local STDERR_TARGET="${T}/${patchname}.out"
292 if [[ -e ${STDERR_TARGET} ]] ; then 404 if [[ -e ${STDERR_TARGET} ]] ; then
293 STDERR_TARGET="${T}/${patchname}-$$.out" 405 STDERR_TARGET="${T}/${patchname}-$$.out"
294 fi 406 fi
295 407
296 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}" 408 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
297 409
298 # Decompress the patch if need be 410 # Decompress the patch if need be
299 local count=0 411 local count=0
300 local PATCH_TARGET 412 local PATCH_TARGET
301 if [[ -n ${PIPE_CMD} ]] ; then 413 if [[ -n ${PIPE_CMD} ]] ; then
320 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }') 432 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
321 if [[ -n ${abs_paths} ]] ; then 433 if [[ -n ${abs_paths} ]] ; then
322 count=1 434 count=1
323 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}" 435 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
324 fi 436 fi
437 # Similar reason, but with relative paths.
438 local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}")
439 if [[ -n ${rel_paths} ]] ; then
440 eqawarn "QA Notice: Your patch uses relative paths '../'."
441 eqawarn " In the future this will cause a failure."
442 eqawarn "${rel_paths}"
443 fi
325 444
326 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/ 445 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
327 while [[ ${count} -lt 5 ]] ; do 446 while [[ ${count} -lt 5 ]] ; do
328 # Generate some useful debug info ... 447 # Generate some useful debug info ...
329 ( 448 (
330 _epatch_draw_line "***** ${patchname} *****" 449 _epatch_draw_line "***** ${patchname} *****"
331 echo 450 echo
332 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 451 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
333 echo 452 echo
334 _epatch_draw_line "***** ${patchname} *****" 453 _epatch_draw_line "***** ${patchname} *****"
454 patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}" 2>&1
455 ret=$?
456 echo
457 echo "patch program exited with status ${ret}"
458 exit ${ret}
335 ) >> "${STDERR_TARGET}" 459 ) >> "${STDERR_TARGET}"
336 460
337 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then 461 if [ $? -eq 0 ] ; then
338 ( 462 (
339 _epatch_draw_line "***** ${patchname} *****" 463 _epatch_draw_line "***** ${patchname} *****"
340 echo 464 echo
341 echo "ACTUALLY APPLYING ${patchname} ..." 465 echo "ACTUALLY APPLYING ${patchname} ..."
342 echo 466 echo
343 _epatch_draw_line "***** ${patchname} *****" 467 _epatch_draw_line "***** ${patchname} *****"
344 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1 468 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
469 ret=$?
470 echo
471 echo "patch program exited with status ${ret}"
472 exit ${ret}
345 ) >> "${STDERR_TARGET}" 473 ) >> "${STDERR_TARGET}"
346 474
347 if [ $? -ne 0 ] ; then 475 if [ $? -ne 0 ] ; then
348 echo 476 echo
349 eerror "A dry-run of patch command succeeded, but actually" 477 eerror "A dry-run of patch command succeeded, but actually"
380 done 508 done
381 509
382 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 510 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
383 : # everything worked 511 : # everything worked
384} 512}
513
514# @FUNCTION: epatch_user
515# @USAGE:
516# @DESCRIPTION:
517# Applies user-provided patches to the source tree. The patches are
518# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first
519# of these three directories to exist will be the one to use, ignoring
520# any more general directories which might exist as well.
521#
522# User patches are intended for quick testing of patches without ebuild
523# modifications, as well as for permanent customizations a user might
524# desire. Obviously, there can be no official support for arbitrarily
525# patched ebuilds. So whenever a build log in a bug report mentions that
526# user patches were applied, the user should be asked to reproduce the
527# problem without these.
528#
529# Not all ebuilds do call this function, so placing patches in the
530# stated directory might or might not work, depending on the package and
531# the eclasses it inherits and uses. It is safe to call the function
532# repeatedly, so it is always possible to add a call at the ebuild
533# level. The first call is the time when the patches will be
534# applied.
535#
536# Ideally, this function should be called after gentoo-specific patches
537# have been applied, so that their code can be modified as well, but
538# before calls to e.g. eautoreconf, as the user patches might affect
539# autotool input files as well.
385epatch_user() { 540epatch_user() {
386 [[ $# -ne 0 ]] && die "epatch_user takes no options" 541 [[ $# -ne 0 ]] && die "epatch_user takes no options"
542
543 # Allow multiple calls to this function; ignore all but the first
544 local applied="${T}/epatch_user.applied"
545 [[ -e ${applied} ]] && return 2
387 546
388 # don't clobber any EPATCH vars that the parent might want 547 # don't clobber any EPATCH vars that the parent might want
389 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 548 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
390 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 549 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
391 EPATCH_SOURCE=${base}/${CTARGET}/${check} 550 EPATCH_SOURCE=${base}/${CTARGET}/${check}
395 EPATCH_SOURCE=${EPATCH_SOURCE} \ 554 EPATCH_SOURCE=${EPATCH_SOURCE} \
396 EPATCH_SUFFIX="patch" \ 555 EPATCH_SUFFIX="patch" \
397 EPATCH_FORCE="yes" \ 556 EPATCH_FORCE="yes" \
398 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ 557 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
399 epatch 558 epatch
400 break 559 echo "${EPATCH_SOURCE}" > "${applied}"
560 return 0
401 fi 561 fi
402 done 562 done
563 echo "none" > "${applied}"
564 return 1
403} 565}
404 566
405# @FUNCTION: emktemp 567# @FUNCTION: emktemp
406# @USAGE: [temp dir] 568# @USAGE: [temp dir]
407# @DESCRIPTION: 569# @DESCRIPTION:
435 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 597 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
436 fi 598 fi
437 fi 599 fi
438} 600}
439 601
440# @FUNCTION: egetent
441# @USAGE: <database> <key>
442# @MAINTAINER:
443# base-system@gentoo.org (Linux)
444# Joe Jezak <josejx@gmail.com> (OS X)
445# usata@gentoo.org (OS X)
446# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
447# @DESCRIPTION:
448# Small wrapper for getent (Linux),
449# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
450# and pw (FreeBSD) used in enewuser()/enewgroup()
451egetent() {
452 case ${CHOST} in
453 *-darwin[678])
454 case "$2" in
455 *[!0-9]*) # Non numeric
456 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
457 ;;
458 *) # Numeric
459 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
460 ;;
461 esac
462 ;;
463 *-darwin*)
464 local mytype=$1
465 [[ "passwd" == $mytype ]] && mytype="Users"
466 [[ "group" == $mytype ]] && mytype="Groups"
467 case "$2" in
468 *[!0-9]*) # Non numeric
469 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
470 ;;
471 *) # Numeric
472 local mykey="UniqueID"
473 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
474 dscl . -search /$mytype $mykey $2 2>/dev/null
475 ;;
476 esac
477 ;;
478 *-freebsd*|*-dragonfly*)
479 local opts action="user"
480 [[ $1 == "passwd" ]] || action="group"
481
482 # lookup by uid/gid
483 if [[ $2 == [[:digit:]]* ]] ; then
484 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
485 fi
486
487 pw show ${action} ${opts} "$2" -q
488 ;;
489 *-netbsd*|*-openbsd*)
490 grep "$2:\*:" /etc/$1
491 ;;
492 *)
493 type -p nscd >& /dev/null && nscd -i "$1"
494 getent "$1" "$2"
495 ;;
496 esac
497}
498
499# @FUNCTION: enewuser
500# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
501# @DESCRIPTION:
502# Same as enewgroup, you are not required to understand how to properly add
503# a user to the system. The only required parameter is the username.
504# Default uid is (pass -1 for this) next available, default shell is
505# /bin/false, default homedir is /dev/null, there are no default groups,
506# and default params sets the comment as 'added by portage for ${PN}'.
507enewuser() {
508 case ${EBUILD_PHASE} in
509 unpack|compile|test|install)
510 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
511 eerror "Package fails at QA and at life. Please file a bug."
512 die "Bad package! enewuser is only for use in pkg_* functions!"
513 esac
514
515 # get the username
516 local euser=$1; shift
517 if [[ -z ${euser} ]] ; then
518 eerror "No username specified !"
519 die "Cannot call enewuser without a username"
520 fi
521
522 # lets see if the username already exists
523 if [[ -n $(egetent passwd "${euser}") ]] ; then
524 return 0
525 fi
526 einfo "Adding user '${euser}' to your system ..."
527
528 # options to pass to useradd
529 local opts=
530
531 # handle uid
532 local euid=$1; shift
533 if [[ -n ${euid} && ${euid} != -1 ]] ; then
534 if [[ ${euid} -gt 0 ]] ; then
535 if [[ -n $(egetent passwd ${euid}) ]] ; then
536 euid="next"
537 fi
538 else
539 eerror "Userid given but is not greater than 0 !"
540 die "${euid} is not a valid UID"
541 fi
542 else
543 euid="next"
544 fi
545 if [[ ${euid} == "next" ]] ; then
546 for ((euid = 101; euid <= 999; euid++)); do
547 [[ -z $(egetent passwd ${euid}) ]] && break
548 done
549 fi
550 opts="${opts} -u ${euid}"
551 einfo " - Userid: ${euid}"
552
553 # handle shell
554 local eshell=$1; shift
555 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
556 if [[ ! -e ${ROOT}${eshell} ]] ; then
557 eerror "A shell was specified but it does not exist !"
558 die "${eshell} does not exist in ${ROOT}"
559 fi
560 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
561 eerror "Do not specify ${eshell} yourself, use -1"
562 die "Pass '-1' as the shell parameter"
563 fi
564 else
565 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
566 [[ -x ${ROOT}${shell} ]] && break
567 done
568
569 if [[ ${shell} == "/dev/null" ]] ; then
570 eerror "Unable to identify the shell to use, proceeding with userland default."
571 case ${USERLAND} in
572 GNU) shell="/bin/false" ;;
573 BSD) shell="/sbin/nologin" ;;
574 Darwin) shell="/usr/sbin/nologin" ;;
575 *) die "Unable to identify the default shell for userland ${USERLAND}"
576 esac
577 fi
578
579 eshell=${shell}
580 fi
581 einfo " - Shell: ${eshell}"
582 opts="${opts} -s ${eshell}"
583
584 # handle homedir
585 local ehome=$1; shift
586 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
587 ehome="/dev/null"
588 fi
589 einfo " - Home: ${ehome}"
590 opts="${opts} -d ${ehome}"
591
592 # handle groups
593 local egroups=$1; shift
594 if [[ ! -z ${egroups} ]] ; then
595 local oldifs=${IFS}
596 local defgroup="" exgroups=""
597
598 export IFS=","
599 for g in ${egroups} ; do
600 export IFS=${oldifs}
601 if [[ -z $(egetent group "${g}") ]] ; then
602 eerror "You must add group ${g} to the system first"
603 die "${g} is not a valid GID"
604 fi
605 if [[ -z ${defgroup} ]] ; then
606 defgroup=${g}
607 else
608 exgroups="${exgroups},${g}"
609 fi
610 export IFS=","
611 done
612 export IFS=${oldifs}
613
614 opts="${opts} -g ${defgroup}"
615 if [[ ! -z ${exgroups} ]] ; then
616 opts="${opts} -G ${exgroups:1}"
617 fi
618 else
619 egroups="(none)"
620 fi
621 einfo " - Groups: ${egroups}"
622
623 # handle extra and add the user
624 local oldsandbox=${SANDBOX_ON}
625 export SANDBOX_ON="0"
626 case ${CHOST} in
627 *-darwin*)
628 ### Make the user
629 if [[ -z $@ ]] ; then
630 dscl . create /users/${euser} uid ${euid}
631 dscl . create /users/${euser} shell ${eshell}
632 dscl . create /users/${euser} home ${ehome}
633 dscl . create /users/${euser} realname "added by portage for ${PN}"
634 ### Add the user to the groups specified
635 local oldifs=${IFS}
636 export IFS=","
637 for g in ${egroups} ; do
638 dscl . merge /groups/${g} users ${euser}
639 done
640 export IFS=${oldifs}
641 else
642 einfo "Extra options are not supported on Darwin yet"
643 einfo "Please report the ebuild along with the info below"
644 einfo "eextra: $@"
645 die "Required function missing"
646 fi
647 ;;
648 *-freebsd*|*-dragonfly*)
649 if [[ -z $@ ]] ; then
650 pw useradd ${euser} ${opts} \
651 -c "added by portage for ${PN}" \
652 die "enewuser failed"
653 else
654 einfo " - Extra: $@"
655 pw useradd ${euser} ${opts} \
656 "$@" || die "enewuser failed"
657 fi
658 ;;
659
660 *-netbsd*)
661 if [[ -z $@ ]] ; then
662 useradd ${opts} ${euser} || die "enewuser failed"
663 else
664 einfo " - Extra: $@"
665 useradd ${opts} ${euser} "$@" || die "enewuser failed"
666 fi
667 ;;
668
669 *-openbsd*)
670 if [[ -z $@ ]] ; then
671 useradd -u ${euid} -s ${eshell} \
672 -d ${ehome} -c "Added by portage for ${PN}" \
673 -g ${egroups} ${euser} || die "enewuser failed"
674 else
675 einfo " - Extra: $@"
676 useradd -u ${euid} -s ${eshell} \
677 -d ${ehome} -c "Added by portage for ${PN}" \
678 -g ${egroups} ${euser} "$@" || die "enewuser failed"
679 fi
680 ;;
681
682 *)
683 if [[ -z $@ ]] ; then
684 useradd ${opts} \
685 -c "added by portage for ${PN}" \
686 ${euser} \
687 || die "enewuser failed"
688 else
689 einfo " - Extra: $@"
690 useradd ${opts} "$@" \
691 ${euser} \
692 || die "enewuser failed"
693 fi
694 ;;
695 esac
696
697 if [[ ! -e ${ROOT}/${ehome} ]] ; then
698 einfo " - Creating ${ehome} in ${ROOT}"
699 mkdir -p "${ROOT}/${ehome}"
700 chown ${euser} "${ROOT}/${ehome}"
701 chmod 755 "${ROOT}/${ehome}"
702 fi
703
704 export SANDBOX_ON=${oldsandbox}
705}
706
707# @FUNCTION: enewgroup
708# @USAGE: <group> [gid]
709# @DESCRIPTION:
710# This function does not require you to understand how to properly add a
711# group to the system. Just give it a group name to add and enewgroup will
712# do the rest. You may specify the gid for the group or allow the group to
713# allocate the next available one.
714enewgroup() {
715 case ${EBUILD_PHASE} in
716 unpack|compile|test|install)
717 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
718 eerror "Package fails at QA and at life. Please file a bug."
719 die "Bad package! enewgroup is only for use in pkg_* functions!"
720 esac
721
722 # get the group
723 local egroup="$1"; shift
724 if [ -z "${egroup}" ]
725 then
726 eerror "No group specified !"
727 die "Cannot call enewgroup without a group"
728 fi
729
730 # see if group already exists
731 if [[ -n $(egetent group "${egroup}") ]]; then
732 return 0
733 fi
734 einfo "Adding group '${egroup}' to your system ..."
735
736 # options to pass to useradd
737 local opts=
738
739 # handle gid
740 local egid="$1"; shift
741 if [ ! -z "${egid}" ]
742 then
743 if [ "${egid}" -gt 0 ]
744 then
745 if [ -z "`egetent group ${egid}`" ]
746 then
747 if [[ "${CHOST}" == *-darwin* ]]; then
748 opts="${opts} ${egid}"
749 else
750 opts="${opts} -g ${egid}"
751 fi
752 else
753 egid="next available; requested gid taken"
754 fi
755 else
756 eerror "Groupid given but is not greater than 0 !"
757 die "${egid} is not a valid GID"
758 fi
759 else
760 egid="next available"
761 fi
762 einfo " - Groupid: ${egid}"
763
764 # handle extra
765 local eextra="$@"
766 opts="${opts} ${eextra}"
767
768 # add the group
769 local oldsandbox="${SANDBOX_ON}"
770 export SANDBOX_ON="0"
771 case ${CHOST} in
772 *-darwin*)
773 if [ ! -z "${eextra}" ];
774 then
775 einfo "Extra options are not supported on Darwin/OS X yet"
776 einfo "Please report the ebuild along with the info below"
777 einfo "eextra: ${eextra}"
778 die "Required function missing"
779 fi
780
781 # If we need the next available
782 case ${egid} in
783 *[!0-9]*) # Non numeric
784 for ((egid = 101; egid <= 999; egid++)); do
785 [[ -z $(egetent group ${egid}) ]] && break
786 done
787 esac
788 dscl . create /groups/${egroup} gid ${egid}
789 dscl . create /groups/${egroup} passwd '*'
790 ;;
791
792 *-freebsd*|*-dragonfly*)
793 case ${egid} in
794 *[!0-9]*) # Non numeric
795 for ((egid = 101; egid <= 999; egid++)); do
796 [[ -z $(egetent group ${egid}) ]] && break
797 done
798 esac
799 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
800 ;;
801
802 *-netbsd*)
803 case ${egid} in
804 *[!0-9]*) # Non numeric
805 for ((egid = 101; egid <= 999; egid++)); do
806 [[ -z $(egetent group ${egid}) ]] && break
807 done
808 esac
809 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
810 ;;
811
812 *)
813 groupadd ${opts} ${egroup} || die "enewgroup failed"
814 ;;
815 esac
816 export SANDBOX_ON="${oldsandbox}"
817}
818
819# @FUNCTION: edos2unix 602# @FUNCTION: edos2unix
820# @USAGE: <file> [more files ...] 603# @USAGE: <file> [more files ...]
821# @DESCRIPTION: 604# @DESCRIPTION:
822# A handy replacement for dos2unix, recode, fixdos, etc... This allows you 605# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
823# to remove all of these text utilities from DEPEND variables because this 606# to remove all of these text utilities from DEPEND variables because this
824# is a script based solution. Just give it a list of files to convert and 607# is a script based solution. Just give it a list of files to convert and
825# they will all be changed from the DOS CRLF format to the UNIX LF format. 608# they will all be changed from the DOS CRLF format to the UNIX LF format.
826edos2unix() { 609edos2unix() {
827 echo "$@" | xargs sed -i 's/\r$//' 610 [[ $# -eq 0 ]] && return 0
611 sed -i 's/\r$//' -- "$@" || die
828} 612}
829 613
830# Make a desktop file ! 614# Make a desktop file !
831# Great for making those icons in kde/gnome startmenu ! 615# Great for making those icons in kde/gnome startmenu !
832# Amaze your friends ! Get the women ! Join today ! 616# Amaze your friends ! Get the women ! Join today !
833# 617#
834# make_desktop_entry(<command>, [name], [icon], [type], [path]) 618# make_desktop_entry(<command>, [name], [icon], [type], [fields])
835# 619#
836# binary: what command does the app run with ? 620# binary: what command does the app run with ?
837# name: the name that will show up in the menu 621# name: the name that will show up in the menu
838# icon: give your little like a pretty little icon ... 622# icon: give your little like a pretty little icon ...
839# this can be relative (to /usr/share/pixmaps) or 623# this can be relative (to /usr/share/pixmaps) or
840# a full path to an icon 624# a full path to an icon
841# type: what kind of application is this ? for categories: 625# type: what kind of application is this ? for categories:
842# http://standards.freedesktop.org/menu-spec/latest/apa.html 626# http://standards.freedesktop.org/menu-spec/latest/apa.html
843# path: if your app needs to startup in a specific dir 627# fields: extra fields to append to the desktop file; a printf string
844make_desktop_entry() { 628make_desktop_entry() {
845 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1 629 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
846 630
847 local exec=${1} 631 local exec=${1}
848 local name=${2:-${PN}} 632 local name=${2:-${PN}}
849 local icon=${3:-${PN}} 633 local icon=${3:-${PN}}
850 local type=${4} 634 local type=${4}
851 local path=${5} 635 local fields=${5}
852 636
853 if [[ -z ${type} ]] ; then 637 if [[ -z ${type} ]] ; then
854 local catmaj=${CATEGORY%%-*} 638 local catmaj=${CATEGORY%%-*}
855 local catmin=${CATEGORY##*-} 639 local catmin=${CATEGORY##*-}
856 case ${catmaj} in 640 case ${catmaj} in
857 app) 641 app)
858 case ${catmin} in 642 case ${catmin} in
859 accessibility) type=Accessibility;; 643 accessibility) type=Accessibility;;
860 admin) type=System;; 644 admin) type=System;;
861 antivirus) type=System;; 645 antivirus) type=System;;
862 arch) type=Archiving;; 646 arch) type=Archiving;;
863 backup) type=Archiving;; 647 backup) type=Archiving;;
864 cdr) type=DiscBurning;; 648 cdr) type=DiscBurning;;
865 dicts) type=Dictionary;; 649 dicts) type=Dictionary;;
866 doc) type=Documentation;; 650 doc) type=Documentation;;
867 editors) type=TextEditor;; 651 editors) type=TextEditor;;
868 emacs) type=TextEditor;; 652 emacs) type=TextEditor;;
869 emulation) type=Emulator;; 653 emulation) type=Emulator;;
870 laptop) type=HardwareSettings;; 654 laptop) type=HardwareSettings;;
871 office) type=Office;; 655 office) type=Office;;
872 pda) type=PDA;; 656 pda) type=PDA;;
873 vim) type=TextEditor;; 657 vim) type=TextEditor;;
874 xemacs) type=TextEditor;; 658 xemacs) type=TextEditor;;
875 *) type=;;
876 esac 659 esac
877 ;; 660 ;;
878 661
879 dev) 662 dev)
880 type="Development" 663 type="Development"
881 ;; 664 ;;
882 665
883 games) 666 games)
884 case ${catmin} in 667 case ${catmin} in
885 action|fps) type=ActionGame;; 668 action|fps) type=ActionGame;;
886 arcade) type=ArcadeGame;; 669 arcade) type=ArcadeGame;;
887 board) type=BoardGame;; 670 board) type=BoardGame;;
888 emulation) type=Emulator;; 671 emulation) type=Emulator;;
889 kids) type=KidsGame;; 672 kids) type=KidsGame;;
890 puzzle) type=LogicGame;; 673 puzzle) type=LogicGame;;
891 roguelike) type=RolePlaying;; 674 roguelike) type=RolePlaying;;
892 rpg) type=RolePlaying;; 675 rpg) type=RolePlaying;;
893 simulation) type=Simulation;; 676 simulation) type=Simulation;;
894 sports) type=SportsGame;; 677 sports) type=SportsGame;;
895 strategy) type=StrategyGame;; 678 strategy) type=StrategyGame;;
896 *) type=;;
897 esac 679 esac
898 type="Game;${type}" 680 type="Game;${type}"
899 ;; 681 ;;
900 682
901 gnome) 683 gnome)
910 type="Network;Email" 692 type="Network;Email"
911 ;; 693 ;;
912 694
913 media) 695 media)
914 case ${catmin} in 696 case ${catmin} in
697 gfx)
915 gfx) type=Graphics;; 698 type=Graphics
699 ;;
700 *)
701 case ${catmin} in
916 radio) type=Tuner;; 702 radio) type=Tuner;;
917 sound) type=Audio;; 703 sound) type=Audio;;
918 tv) type=TV;; 704 tv) type=TV;;
919 video) type=Video;; 705 video) type=Video;;
920 *) type=;; 706 esac
707 type="AudioVideo;${type}"
708 ;;
921 esac 709 esac
922 type="AudioVideo;${type}"
923 ;; 710 ;;
924 711
925 net) 712 net)
926 case ${catmin} in 713 case ${catmin} in
927 dialup) type=Dialup;; 714 dialup) type=Dialup;;
928 ftp) type=FileTransfer;; 715 ftp) type=FileTransfer;;
929 im) type=InstantMessaging;; 716 im) type=InstantMessaging;;
930 irc) type=IRCClient;; 717 irc) type=IRCClient;;
931 mail) type=Email;; 718 mail) type=Email;;
932 news) type=News;; 719 news) type=News;;
933 nntp) type=News;; 720 nntp) type=News;;
934 p2p) type=FileTransfer;; 721 p2p) type=FileTransfer;;
935 *) type=;; 722 voip) type=Telephony;;
936 esac 723 esac
937 type="Network;${type}" 724 type="Network;${type}"
938 ;; 725 ;;
939 726
940 sci) 727 sci)
941 case ${catmin} in 728 case ${catmin} in
942 astro*) type=Astronomy;; 729 astro*) type=Astronomy;;
943 bio*) type=Biology;; 730 bio*) type=Biology;;
944 calc*) type=Calculator;; 731 calc*) type=Calculator;;
945 chem*) type=Chemistry;; 732 chem*) type=Chemistry;;
946 elec*) type=Electronics;; 733 elec*) type=Electronics;;
947 geo*) type=Geology;; 734 geo*) type=Geology;;
948 math*) type=Math;; 735 math*) type=Math;;
949 physics) type=Physics;; 736 physics) type=Physics;;
950 visual*) type=DataVisualization;; 737 visual*) type=DataVisualization;;
951 *) type=;;
952 esac 738 esac
953 type="Science;${type}" 739 type="Education;Science;${type}"
954 ;; 740 ;;
955 741
956 sys) 742 sys)
957 type="System" 743 type="System"
958 ;; 744 ;;
959 745
960 www) 746 www)
961 case ${catmin} in 747 case ${catmin} in
962 client) type=WebBrowser;; 748 client) type=WebBrowser;;
963 *) type=;;
964 esac 749 esac
965 type="Network" 750 type="Network;${type}"
966 ;; 751 ;;
967 752
968 *) 753 *)
969 type= 754 type=
970 ;; 755 ;;
975 else 760 else
976 local desktop_name="${PN}-${SLOT}" 761 local desktop_name="${PN}-${SLOT}"
977 fi 762 fi
978 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop" 763 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
979 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 764 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
765
766 # Don't append another ";" when a valid category value is provided.
767 type=${type%;}${type:+;}
768
769 eshopts_push -s extglob
770 if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
771 ewarn "As described in the Icon Theme Specification, icon file extensions are not"
772 ewarn "allowed in .desktop files if the value is not an absolute path."
773 icon=${icon%.@(xpm|png|svg)}
774 fi
775 eshopts_pop
980 776
981 cat <<-EOF > "${desktop}" 777 cat <<-EOF > "${desktop}"
982 [Desktop Entry] 778 [Desktop Entry]
983 Name=${name} 779 Name=${name}
984 Type=Application 780 Type=Application
985 Comment=${DESCRIPTION} 781 Comment=${DESCRIPTION}
986 Exec=${exec} 782 Exec=${exec}
987 TryExec=${exec%% *} 783 TryExec=${exec%% *}
988 Icon=${icon} 784 Icon=${icon}
989 Categories=${type}; 785 Categories=${type}
990 EOF 786 EOF
991 787
992 [[ ${path} ]] && echo "Path=${path}" >> "${desktop}" 788 if [[ ${fields:-=} != *=* ]] ; then
789 # 5th arg used to be value to Path=
790 ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"
791 fields="Path=${fields}"
792 fi
793 [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"
993 794
994 ( 795 (
995 # wrap the env here so that the 'insinto' call 796 # wrap the env here so that the 'insinto' call
996 # doesn't corrupt the env of the caller 797 # doesn't corrupt the env of the caller
997 insinto /usr/share/applications 798 insinto /usr/share/applications
998 doins "${desktop}" 799 doins "${desktop}"
999 ) 800 ) || die "installing desktop file failed"
1000} 801}
1001 802
1002# @FUNCTION: validate_desktop_entries 803# @FUNCTION: validate_desktop_entries
1003# @USAGE: [directories] 804# @USAGE: [directories]
1004# @MAINTAINER: 805# @MAINTAINER:
1283 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'" 1084 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1284 1085
1285 local shrtsrc=$(basename "${src}") 1086 local shrtsrc=$(basename "${src}")
1286 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1087 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1287 if [[ -z ${skip} ]] ; then 1088 if [[ -z ${skip} ]] ; then
1288 local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}') 1089 local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
1289 local skip=0 1090 local skip=0
1290 exe=tail 1091 exe=tail
1291 case ${ver} in 1092 case ${ver} in
1292 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1093 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1293 skip=$(grep -a ^skip= "${src}" | cut -d= -f2) 1094 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1295 2.0|2.0.1) 1096 2.0|2.0.1)
1296 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-) 1097 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1297 ;; 1098 ;;
1298 2.1.1) 1099 2.1.1)
1299 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-) 1100 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1300 let skip="skip + 1" 1101 (( skip++ ))
1301 ;; 1102 ;;
1302 2.1.2) 1103 2.1.2)
1303 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1) 1104 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1304 let skip="skip + 1" 1105 (( skip++ ))
1305 ;; 1106 ;;
1306 2.1.3) 1107 2.1.3)
1307 skip=`grep -a ^offset= "${src}" | awk '{print $3}'` 1108 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1308 let skip="skip + 1" 1109 (( skip++ ))
1309 ;; 1110 ;;
1310 2.1.4|2.1.5) 1111 2.1.4|2.1.5)
1311 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) 1112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1312 skip=$(head -n ${skip} "${src}" | wc -c) 1113 skip=$(head -n ${skip} "${src}" | wc -c)
1313 exe="dd" 1114 exe="dd"
1322 esac 1123 esac
1323 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" 1124 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1324 fi 1125 fi
1325 case ${exe} in 1126 case ${exe} in
1326 tail) exe="tail -n +${skip} '${src}'";; 1127 tail) exe="tail -n +${skip} '${src}'";;
1327 dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";; 1128 dd) exe="dd ibs=${skip} skip=1 if='${src}'";;
1328 *) die "makeself cant handle exe '${exe}'" 1129 *) die "makeself cant handle exe '${exe}'"
1329 esac 1130 esac
1330 1131
1331 # lets grab the first few bytes of the file to figure out what kind of archive it is 1132 # lets grab the first few bytes of the file to figure out what kind of archive it is
1332 local tmpfile=$(emktemp) 1133 local filetype tmpfile=$(emktemp)
1333 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}" 1134 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1334 local filetype=$(file -b "${tmpfile}") 1135 filetype=$(file -b "${tmpfile}") || die
1335 case ${filetype} in 1136 case ${filetype} in
1336 *tar\ archive*) 1137 *tar\ archive*)
1337 eval ${exe} | tar --no-same-owner -xf - 1138 eval ${exe} | tar --no-same-owner -xf -
1338 ;; 1139 ;;
1339 bzip2*) 1140 bzip2*)
1349 eerror "Unknown filetype \"${filetype}\" ?" 1150 eerror "Unknown filetype \"${filetype}\" ?"
1350 false 1151 false
1351 ;; 1152 ;;
1352 esac 1153 esac
1353 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1154 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1354}
1355
1356# @FUNCTION: check_license
1357# @USAGE: [license]
1358# @DESCRIPTION:
1359# Display a license for user to accept. If no license is
1360# specified, then ${LICENSE} is used.
1361check_license() {
1362 local lic=$1
1363 if [ -z "${lic}" ] ; then
1364 lic="${PORTDIR}/licenses/${LICENSE}"
1365 else
1366 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1367 lic="${PORTDIR}/licenses/${lic}"
1368 elif [ -e "${PWD}/${lic}" ] ; then
1369 lic="${PWD}/${lic}"
1370 elif [ -e "${lic}" ] ; then
1371 lic="${lic}"
1372 fi
1373 fi
1374 local l="`basename ${lic}`"
1375
1376 # here is where we check for the licenses the user already
1377 # accepted ... if we don't find a match, we make the user accept
1378 local alic
1379 eshopts_push -o noglob # so that bash doesn't expand "*"
1380 for alic in ${ACCEPT_LICENSE} ; do
1381 if [[ ${alic} == ${l} ]]; then
1382 eshopts_pop
1383 return 0
1384 fi
1385 done
1386 eshopts_pop
1387 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1388
1389 local licmsg=$(emktemp)
1390 cat <<-EOF > ${licmsg}
1391 **********************************************************
1392 The following license outlines the terms of use of this
1393 package. You MUST accept this license for installation to
1394 continue. When you are done viewing, hit 'q'. If you
1395 CTRL+C out of this, the install will not run!
1396 **********************************************************
1397
1398 EOF
1399 cat ${lic} >> ${licmsg}
1400 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1401 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1402 read alic
1403 case ${alic} in
1404 yes|Yes|y|Y)
1405 return 0
1406 ;;
1407 *)
1408 echo;echo;echo
1409 eerror "You MUST accept the license to continue! Exiting!"
1410 die "Failed to accept license"
1411 ;;
1412 esac
1413} 1155}
1414 1156
1415# @FUNCTION: cdrom_get_cds 1157# @FUNCTION: cdrom_get_cds
1416# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...] 1158# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1417# @DESCRIPTION: 1159# @DESCRIPTION:
1465 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}} 1207 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1466 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1208 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1467 export CDROM_SET=-1 1209 export CDROM_SET=-1
1468 for f in ${CDROM_CHECK_1//:/ } ; do 1210 for f in ${CDROM_CHECK_1//:/ } ; do
1469 ((++CDROM_SET)) 1211 ((++CDROM_SET))
1470 [[ -e ${CD_ROOT}/${f} ]] && break 1212 [[ -e ${CDROM_ROOT}/${f} ]] && break
1471 done 1213 done
1472 export CDROM_MATCH=${f} 1214 export CDROM_MATCH=${f}
1473 return 1215 return
1474 fi 1216 fi
1475 1217
1649 else 1391 else
1650 newls="" 1392 newls=""
1651 fi 1393 fi
1652 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do 1394 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1653 if [[ ${op} == "-i" ]] ; then 1395 if [[ ${op} == "-i" ]] ; then
1654 hasq ${f} ${ls} && newls="${newls} ${f}" 1396 has ${f} ${ls} && newls="${newls} ${f}"
1655 else 1397 else
1656 hasq ${f} ${ls} || newls="${newls} ${f}" 1398 has ${f} ${ls} || newls="${newls} ${f}"
1657 fi 1399 fi
1658 done 1400 done
1659 ls=${newls} 1401 ls=${newls}
1660 done 1402 done
1661 else 1403 else
1663 fi 1405 fi
1664 1406
1665 nols="" 1407 nols=""
1666 newls="" 1408 newls=""
1667 for f in ${LINGUAS} ; do 1409 for f in ${LINGUAS} ; do
1668 if hasq ${f} ${ls} ; then 1410 if has ${f} ${ls} ; then
1669 newls="${newls} ${f}" 1411 newls="${newls} ${f}"
1670 else 1412 else
1671 nols="${nols} ${f}" 1413 nols="${nols} ${f}"
1672 fi 1414 fi
1673 done 1415 done
1728 ewarn "the libraries are not being removed. You need to run revdep-rebuild" 1470 ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1729 ewarn "in order to remove these old dependencies. If you do not have this" 1471 ewarn "in order to remove these old dependencies. If you do not have this"
1730 ewarn "helper program, simply emerge the 'gentoolkit' package." 1472 ewarn "helper program, simply emerge the 'gentoolkit' package."
1731 ewarn 1473 ewarn
1732 fi 1474 fi
1475 # temp hack for #348634 #357225
1476 [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1733 ewarn " # revdep-rebuild --library ${lib##*/}" 1477 ewarn " # revdep-rebuild --library '${lib}'"
1734 done 1478 done
1735 if [[ ${notice} -eq 1 ]] ; then 1479 if [[ ${notice} -eq 1 ]] ; then
1736 ewarn 1480 ewarn
1737 ewarn "Once you've finished running revdep-rebuild, it should be safe to" 1481 ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1738 ewarn "delete the old libraries. Here is a copy & paste for the lazy:" 1482 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1743} 1487}
1744 1488
1745# @FUNCTION: built_with_use 1489# @FUNCTION: built_with_use
1746# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1490# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1747# @DESCRIPTION: 1491# @DESCRIPTION:
1492#
1493# Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1494#
1748# A temporary hack until portage properly supports DEPENDing on USE 1495# A temporary hack until portage properly supports DEPENDing on USE
1749# flags being enabled in packages. This will check to see if the specified 1496# flags being enabled in packages. This will check to see if the specified
1750# DEPEND atom was built with the specified list of USE flags. The 1497# DEPEND atom was built with the specified list of USE flags. The
1751# --missing option controls the behavior if called on a package that does 1498# --missing option controls the behavior if called on a package that does
1752# not actually support the defined USE flags (aka listed in IUSE). 1499# not actually support the defined USE flags (aka listed in IUSE).
1881 else 1628 else
1882 newbin "${tmpwrapper}" "${wrapper}" || die 1629 newbin "${tmpwrapper}" "${wrapper}" || die
1883 fi 1630 fi
1884} 1631}
1885 1632
1886# @FUNCTION: prepalldocs 1633# @FUNCTION: path_exists
1887# @USAGE: 1634# @USAGE: [-a|-o] <paths>
1888# @DESCRIPTION: 1635# @DESCRIPTION:
1889# Compress files in /usr/share/doc which are not already 1636# Check if the specified paths exist. Works for all types of paths
1890# compressed, excluding /usr/share/doc/${PF}/html. 1637# (files/dirs/etc...). The -a and -o flags control the requirements
1891# Uses the ecompressdir to do the compression. 1638# of the paths. They correspond to "and" and "or" logic. So the -a
1892# 2009-02-18 by betelgeuse: 1639# flag means all the paths must exist while the -o flag means at least
1893# Commented because ecompressdir is even more internal to 1640# one of the paths must exist. The default behavior is "and". If no
1894# Portage than prepalldocs (it's not even mentioned in man 5 1641# paths are specified, then the return value is "false".
1895# ebuild). Please submit a better version for review to gentoo-dev 1642path_exists() {
1896# if you want prepalldocs here. 1643 local opt=$1
1897#prepalldocs() { 1644 [[ ${opt} == -[ao] ]] && shift || opt="-a"
1898# if [[ -n $1 ]] ; then
1899# ewarn "prepalldocs: invalid usage; takes no arguments"
1900# fi
1901 1645
1902# cd "${D}" 1646 # no paths -> return false
1903# [[ -d usr/share/doc ]] || return 0 1647 # same behavior as: [[ -e "" ]]
1648 [[ $# -eq 0 ]] && return 1
1904 1649
1905# find usr/share/doc -exec gzip {} + 1650 local p r=0
1906# ecompressdir --ignore /usr/share/doc/${PF}/html 1651 for p in "$@" ; do
1907# ecompressdir --queue /usr/share/doc 1652 [[ -e ${p} ]]
1908#} 1653 : $(( r += $? ))
1654 done
1655
1656 case ${opt} in
1657 -a) return $(( r != 0 )) ;;
1658 -o) return $(( r == $# )) ;;
1659 esac
1660}
1661
1662# @FUNCTION: in_iuse
1663# @USAGE: <flag>
1664# @DESCRIPTION:
1665# Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1666# as necessary.
1667#
1668# Note that this function should not be used in the global scope.
1669in_iuse() {
1670 debug-print-function ${FUNCNAME} "${@}"
1671 [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1672
1673 local flag=${1}
1674 local liuse=( ${IUSE} )
1675
1676 has "${flag}" "${liuse[@]#[+-]}"
1677}
1678
1679# @FUNCTION: use_if_iuse
1680# @USAGE: <flag>
1681# @DESCRIPTION:
1682# Return true if the given flag is in USE and IUSE.
1683#
1684# Note that this function should not be used in the global scope.
1685use_if_iuse() {
1686 in_iuse $1 || return 1
1687 use $1
1688}
1689
1690# @FUNCTION: usex
1691# @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1692# @DESCRIPTION:
1693# If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1694# otherwise echo [false output][false suffix] (defaults to "no").
1695usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1696
1697check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1698
1699fi

Legend:
Removed from v.1.328  
changed lines
  Added in v.1.373

  ViewVC Help
Powered by ViewVC 1.1.20