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

Diff of /eclass/eutils.eclass

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

Revision 1.358 Revision 1.373
1# Copyright 1999-2011 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.358 2011/07/08 11:35:01 ssuominen 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"
21 24
22if has "${EAPI:-0}" 0 1 2; then 25if has "${EAPI:-0}" 0 1 2; then
23 26
64fi 67fi
65 68
66# @FUNCTION: eqawarn 69# @FUNCTION: eqawarn
67# @USAGE: [message] 70# @USAGE: [message]
68# @DESCRIPTION: 71# @DESCRIPTION:
69# Proxy to einfo for package managers that don't provide eqawarn and use the PM 72# Proxy to ewarn for package managers that don't provide eqawarn and use the PM
70# implementation if available. 73# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
74# profile.
71if ! declare -F eqawarn >/dev/null ; then 75if ! declare -F eqawarn >/dev/null ; then
72 eqawarn() { 76 eqawarn() {
73 einfo "$@" 77 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
78 :
74 } 79 }
75fi 80fi
76 81
77# @FUNCTION: ecvs_clean 82# @FUNCTION: ecvs_clean
78# @USAGE: [list of dirs] 83# @USAGE: [list of dirs]
91# Remove .svn directories recursiveley. Useful when a source tarball contains 96# Remove .svn directories recursiveley. Useful when a source tarball contains
92# internal Subversion directories. Defaults to $PWD. 97# internal Subversion directories. Defaults to $PWD.
93esvn_clean() { 98esvn_clean() {
94 [[ -z $* ]] && set -- . 99 [[ -z $* ]] && set -- .
95 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 100 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
101}
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}]
96} 149}
97 150
98# @FUNCTION: eshopts_push 151# @FUNCTION: eshopts_push
99# @USAGE: [options to `set` or `shopt`] 152# @USAGE: [options to `set` or `shopt`]
100# @DESCRIPTION: 153# @DESCRIPTION:
119# eshopts_pop 172# eshopts_pop
120# @CODE 173# @CODE
121eshopts_push() { 174eshopts_push() {
122 # have to assume __ESHOPTS_SAVE__ isn't screwed with 175 # have to assume __ESHOPTS_SAVE__ isn't screwed with
123 # as a `declare -a` here will reset its value 176 # as a `declare -a` here will reset its value
124 local i=${#__ESHOPTS_SAVE__[@]}
125 if [[ $1 == -[su] ]] ; then 177 if [[ $1 == -[su] ]] ; then
126 __ESHOPTS_SAVE__[$i]=$(shopt -p) 178 estack_push eshopts "$(shopt -p)"
127 [[ $# -eq 0 ]] && return 0 179 [[ $# -eq 0 ]] && return 0
128 shopt "$@" || die "eshopts_push: bad options to shopt: $*" 180 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
129 else 181 else
130 __ESHOPTS_SAVE__[$i]=$- 182 estack_push eshopts $-
131 [[ $# -eq 0 ]] && return 0 183 [[ $# -eq 0 ]] && return 0
132 set "$@" || die "eshopts_push: bad options to set: $*" 184 set "$@" || die "${FUNCNAME}: bad options to set: $*"
133 fi 185 fi
134} 186}
135 187
136# @FUNCTION: eshopts_pop 188# @FUNCTION: eshopts_pop
137# @USAGE: 189# @USAGE:
138# @DESCRIPTION: 190# @DESCRIPTION:
139# Restore the shell options to the state saved with the corresponding 191# Restore the shell options to the state saved with the corresponding
140# eshopts_push call. See that function for more details. 192# eshopts_push call. See that function for more details.
141eshopts_pop() { 193eshopts_pop() {
142 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 194 local s
143 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 195 estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
144 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
145 local s=${__ESHOPTS_SAVE__[$i]}
146 unset __ESHOPTS_SAVE__[$i]
147 if [[ ${s} == "shopt -"* ]] ; then 196 if [[ ${s} == "shopt -"* ]] ; then
148 eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}" 197 eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"
149 else 198 else
150 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 199 set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"
151 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}"
152 fi 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}"
153} 222}
154 223
155# @VARIABLE: EPATCH_SOURCE 224# @VARIABLE: EPATCH_SOURCE
156# @DESCRIPTION: 225# @DESCRIPTION:
157# Default directory to search for patches. 226# Default directory to search for patches.
250 319
251 elif [[ -d $1 ]] ; then 320 elif [[ -d $1 ]] ; then
252 # 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)
253 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"} 322 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
254 323
324 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
325 # Re-use EPATCH_SOURCE as a search dir
326 epatch "${EPATCH_SOURCE}/$1"
327 return $?
328
255 else 329 else
256 # 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 ?
257 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1 331 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
258 echo 332 echo
259 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 333 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
329 local STDERR_TARGET="${T}/${patchname}.out" 403 local STDERR_TARGET="${T}/${patchname}.out"
330 if [[ -e ${STDERR_TARGET} ]] ; then 404 if [[ -e ${STDERR_TARGET} ]] ; then
331 STDERR_TARGET="${T}/${patchname}-$$.out" 405 STDERR_TARGET="${T}/${patchname}-$$.out"
332 fi 406 fi
333 407
334 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}" 408 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
335 409
336 # Decompress the patch if need be 410 # Decompress the patch if need be
337 local count=0 411 local count=0
338 local PATCH_TARGET 412 local PATCH_TARGET
339 if [[ -n ${PIPE_CMD} ]] ; then 413 if [[ -n ${PIPE_CMD} ]] ; then
375 _epatch_draw_line "***** ${patchname} *****" 449 _epatch_draw_line "***** ${patchname} *****"
376 echo 450 echo
377 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 451 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
378 echo 452 echo
379 _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}
380 ) >> "${STDERR_TARGET}" 459 ) >> "${STDERR_TARGET}"
381 460
382 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then 461 if [ $? -eq 0 ] ; then
383 ( 462 (
384 _epatch_draw_line "***** ${patchname} *****" 463 _epatch_draw_line "***** ${patchname} *****"
385 echo 464 echo
386 echo "ACTUALLY APPLYING ${patchname} ..." 465 echo "ACTUALLY APPLYING ${patchname} ..."
387 echo 466 echo
388 _epatch_draw_line "***** ${patchname} *****" 467 _epatch_draw_line "***** ${patchname} *****"
389 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}
390 ) >> "${STDERR_TARGET}" 473 ) >> "${STDERR_TARGET}"
391 474
392 if [ $? -ne 0 ] ; then 475 if [ $? -ne 0 ] ; then
393 echo 476 echo
394 eerror "A dry-run of patch command succeeded, but actually" 477 eerror "A dry-run of patch command succeeded, but actually"
425 done 508 done
426 509
427 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 510 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
428 : # everything worked 511 : # everything worked
429} 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.
430epatch_user() { 540epatch_user() {
431 [[ $# -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
432 546
433 # don't clobber any EPATCH vars that the parent might want 547 # don't clobber any EPATCH vars that the parent might want
434 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 548 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
435 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 549 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
436 EPATCH_SOURCE=${base}/${CTARGET}/${check} 550 EPATCH_SOURCE=${base}/${CTARGET}/${check}
440 EPATCH_SOURCE=${EPATCH_SOURCE} \ 554 EPATCH_SOURCE=${EPATCH_SOURCE} \
441 EPATCH_SUFFIX="patch" \ 555 EPATCH_SUFFIX="patch" \
442 EPATCH_FORCE="yes" \ 556 EPATCH_FORCE="yes" \
443 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ 557 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
444 epatch 558 epatch
559 echo "${EPATCH_SOURCE}" > "${applied}"
445 return 0 560 return 0
446 fi 561 fi
447 done 562 done
563 echo "none" > "${applied}"
448 return 1 564 return 1
449} 565}
450 566
451# @FUNCTION: emktemp 567# @FUNCTION: emktemp
452# @USAGE: [temp dir] 568# @USAGE: [temp dir]
481 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 597 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
482 fi 598 fi
483 fi 599 fi
484} 600}
485 601
486# @FUNCTION: egetent
487# @USAGE: <database> <key>
488# @MAINTAINER:
489# base-system@gentoo.org (Linux)
490# Joe Jezak <josejx@gmail.com> (OS X)
491# usata@gentoo.org (OS X)
492# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
493# @DESCRIPTION:
494# Small wrapper for getent (Linux),
495# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
496# and pw (FreeBSD) used in enewuser()/enewgroup()
497egetent() {
498 case ${CHOST} in
499 *-darwin[678])
500 case "$2" in
501 *[!0-9]*) # Non numeric
502 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
503 ;;
504 *) # Numeric
505 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
506 ;;
507 esac
508 ;;
509 *-darwin*)
510 local mytype=$1
511 [[ "passwd" == $mytype ]] && mytype="Users"
512 [[ "group" == $mytype ]] && mytype="Groups"
513 case "$2" in
514 *[!0-9]*) # Non numeric
515 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
516 ;;
517 *) # Numeric
518 local mykey="UniqueID"
519 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
520 dscl . -search /$mytype $mykey $2 2>/dev/null
521 ;;
522 esac
523 ;;
524 *-freebsd*|*-dragonfly*)
525 local opts action="user"
526 [[ $1 == "passwd" ]] || action="group"
527
528 # lookup by uid/gid
529 if [[ $2 == [[:digit:]]* ]] ; then
530 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
531 fi
532
533 pw show ${action} ${opts} "$2" -q
534 ;;
535 *-netbsd*|*-openbsd*)
536 grep "$2:\*:" /etc/$1
537 ;;
538 *)
539 type -p nscd >& /dev/null && nscd -i "$1"
540 getent "$1" "$2"
541 ;;
542 esac
543}
544
545# @FUNCTION: enewuser
546# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
547# @DESCRIPTION:
548# Same as enewgroup, you are not required to understand how to properly add
549# a user to the system. The only required parameter is the username.
550# Default uid is (pass -1 for this) next available, default shell is
551# /bin/false, default homedir is /dev/null, there are no default groups,
552# and default params sets the comment as 'added by portage for ${PN}'.
553enewuser() {
554 case ${EBUILD_PHASE} in
555 unpack|compile|test|install)
556 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
557 eerror "Package fails at QA and at life. Please file a bug."
558 die "Bad package! enewuser is only for use in pkg_* functions!"
559 esac
560
561 # get the username
562 local euser=$1; shift
563 if [[ -z ${euser} ]] ; then
564 eerror "No username specified !"
565 die "Cannot call enewuser without a username"
566 fi
567
568 # lets see if the username already exists
569 if [[ -n $(egetent passwd "${euser}") ]] ; then
570 return 0
571 fi
572 einfo "Adding user '${euser}' to your system ..."
573
574 # options to pass to useradd
575 local opts=
576
577 # handle uid
578 local euid=$1; shift
579 if [[ -n ${euid} && ${euid} != -1 ]] ; then
580 if [[ ${euid} -gt 0 ]] ; then
581 if [[ -n $(egetent passwd ${euid}) ]] ; then
582 euid="next"
583 fi
584 else
585 eerror "Userid given but is not greater than 0 !"
586 die "${euid} is not a valid UID"
587 fi
588 else
589 euid="next"
590 fi
591 if [[ ${euid} == "next" ]] ; then
592 for ((euid = 101; euid <= 999; euid++)); do
593 [[ -z $(egetent passwd ${euid}) ]] && break
594 done
595 fi
596 opts="${opts} -u ${euid}"
597 einfo " - Userid: ${euid}"
598
599 # handle shell
600 local eshell=$1; shift
601 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
602 if [[ ! -e ${ROOT}${eshell} ]] ; then
603 eerror "A shell was specified but it does not exist !"
604 die "${eshell} does not exist in ${ROOT}"
605 fi
606 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
607 eerror "Do not specify ${eshell} yourself, use -1"
608 die "Pass '-1' as the shell parameter"
609 fi
610 else
611 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
612 [[ -x ${ROOT}${shell} ]] && break
613 done
614
615 if [[ ${shell} == "/dev/null" ]] ; then
616 eerror "Unable to identify the shell to use, proceeding with userland default."
617 case ${USERLAND} in
618 GNU) shell="/bin/false" ;;
619 BSD) shell="/sbin/nologin" ;;
620 Darwin) shell="/usr/sbin/nologin" ;;
621 *) die "Unable to identify the default shell for userland ${USERLAND}"
622 esac
623 fi
624
625 eshell=${shell}
626 fi
627 einfo " - Shell: ${eshell}"
628 opts="${opts} -s ${eshell}"
629
630 # handle homedir
631 local ehome=$1; shift
632 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
633 ehome="/dev/null"
634 fi
635 einfo " - Home: ${ehome}"
636 opts="${opts} -d ${ehome}"
637
638 # handle groups
639 local egroups=$1; shift
640 if [[ ! -z ${egroups} ]] ; then
641 local oldifs=${IFS}
642 local defgroup="" exgroups=""
643
644 export IFS=","
645 for g in ${egroups} ; do
646 export IFS=${oldifs}
647 if [[ -z $(egetent group "${g}") ]] ; then
648 eerror "You must add group ${g} to the system first"
649 die "${g} is not a valid GID"
650 fi
651 if [[ -z ${defgroup} ]] ; then
652 defgroup=${g}
653 else
654 exgroups="${exgroups},${g}"
655 fi
656 export IFS=","
657 done
658 export IFS=${oldifs}
659
660 opts="${opts} -g ${defgroup}"
661 if [[ ! -z ${exgroups} ]] ; then
662 opts="${opts} -G ${exgroups:1}"
663 fi
664 else
665 egroups="(none)"
666 fi
667 einfo " - Groups: ${egroups}"
668
669 # handle extra and add the user
670 local oldsandbox=${SANDBOX_ON}
671 export SANDBOX_ON="0"
672 case ${CHOST} in
673 *-darwin*)
674 ### Make the user
675 if [[ -z $@ ]] ; then
676 dscl . create /users/${euser} uid ${euid}
677 dscl . create /users/${euser} shell ${eshell}
678 dscl . create /users/${euser} home ${ehome}
679 dscl . create /users/${euser} realname "added by portage for ${PN}"
680 ### Add the user to the groups specified
681 local oldifs=${IFS}
682 export IFS=","
683 for g in ${egroups} ; do
684 dscl . merge /groups/${g} users ${euser}
685 done
686 export IFS=${oldifs}
687 else
688 einfo "Extra options are not supported on Darwin yet"
689 einfo "Please report the ebuild along with the info below"
690 einfo "eextra: $@"
691 die "Required function missing"
692 fi
693 ;;
694 *-freebsd*|*-dragonfly*)
695 if [[ -z $@ ]] ; then
696 pw useradd ${euser} ${opts} \
697 -c "added by portage for ${PN}" \
698 die "enewuser failed"
699 else
700 einfo " - Extra: $@"
701 pw useradd ${euser} ${opts} \
702 "$@" || die "enewuser failed"
703 fi
704 ;;
705
706 *-netbsd*)
707 if [[ -z $@ ]] ; then
708 useradd ${opts} ${euser} || die "enewuser failed"
709 else
710 einfo " - Extra: $@"
711 useradd ${opts} ${euser} "$@" || die "enewuser failed"
712 fi
713 ;;
714
715 *-openbsd*)
716 if [[ -z $@ ]] ; then
717 useradd -u ${euid} -s ${eshell} \
718 -d ${ehome} -c "Added by portage for ${PN}" \
719 -g ${egroups} ${euser} || die "enewuser failed"
720 else
721 einfo " - Extra: $@"
722 useradd -u ${euid} -s ${eshell} \
723 -d ${ehome} -c "Added by portage for ${PN}" \
724 -g ${egroups} ${euser} "$@" || die "enewuser failed"
725 fi
726 ;;
727
728 *)
729 if [[ -z $@ ]] ; then
730 useradd -r ${opts} \
731 -c "added by portage for ${PN}" \
732 ${euser} \
733 || die "enewuser failed"
734 else
735 einfo " - Extra: $@"
736 useradd -r ${opts} "$@" \
737 ${euser} \
738 || die "enewuser failed"
739 fi
740 ;;
741 esac
742
743 if [[ ! -e ${ROOT}/${ehome} ]] ; then
744 einfo " - Creating ${ehome} in ${ROOT}"
745 mkdir -p "${ROOT}/${ehome}"
746 chown ${euser} "${ROOT}/${ehome}"
747 chmod 755 "${ROOT}/${ehome}"
748 fi
749
750 export SANDBOX_ON=${oldsandbox}
751}
752
753# @FUNCTION: enewgroup
754# @USAGE: <group> [gid]
755# @DESCRIPTION:
756# This function does not require you to understand how to properly add a
757# group to the system. Just give it a group name to add and enewgroup will
758# do the rest. You may specify the gid for the group or allow the group to
759# allocate the next available one.
760enewgroup() {
761 case ${EBUILD_PHASE} in
762 unpack|compile|test|install)
763 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
764 eerror "Package fails at QA and at life. Please file a bug."
765 die "Bad package! enewgroup is only for use in pkg_* functions!"
766 esac
767
768 # get the group
769 local egroup="$1"; shift
770 if [ -z "${egroup}" ]
771 then
772 eerror "No group specified !"
773 die "Cannot call enewgroup without a group"
774 fi
775
776 # see if group already exists
777 if [[ -n $(egetent group "${egroup}") ]]; then
778 return 0
779 fi
780 einfo "Adding group '${egroup}' to your system ..."
781
782 # options to pass to useradd
783 local opts=
784
785 # handle gid
786 local egid="$1"; shift
787 if [ ! -z "${egid}" ]
788 then
789 if [ "${egid}" -gt 0 ]
790 then
791 if [ -z "`egetent group ${egid}`" ]
792 then
793 if [[ "${CHOST}" == *-darwin* ]]; then
794 opts="${opts} ${egid}"
795 else
796 opts="${opts} -g ${egid}"
797 fi
798 else
799 egid="next available; requested gid taken"
800 fi
801 else
802 eerror "Groupid given but is not greater than 0 !"
803 die "${egid} is not a valid GID"
804 fi
805 else
806 egid="next available"
807 fi
808 einfo " - Groupid: ${egid}"
809
810 # handle extra
811 local eextra="$@"
812 opts="${opts} ${eextra}"
813
814 # add the group
815 local oldsandbox="${SANDBOX_ON}"
816 export SANDBOX_ON="0"
817 case ${CHOST} in
818 *-darwin*)
819 if [ ! -z "${eextra}" ];
820 then
821 einfo "Extra options are not supported on Darwin/OS X yet"
822 einfo "Please report the ebuild along with the info below"
823 einfo "eextra: ${eextra}"
824 die "Required function missing"
825 fi
826
827 # If we need the next available
828 case ${egid} in
829 *[!0-9]*) # Non numeric
830 for ((egid = 101; egid <= 999; egid++)); do
831 [[ -z $(egetent group ${egid}) ]] && break
832 done
833 esac
834 dscl . create /groups/${egroup} gid ${egid}
835 dscl . create /groups/${egroup} passwd '*'
836 ;;
837
838 *-freebsd*|*-dragonfly*)
839 case ${egid} in
840 *[!0-9]*) # Non numeric
841 for ((egid = 101; egid <= 999; egid++)); do
842 [[ -z $(egetent group ${egid}) ]] && break
843 done
844 esac
845 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
846 ;;
847
848 *-netbsd*)
849 case ${egid} in
850 *[!0-9]*) # Non numeric
851 for ((egid = 101; egid <= 999; egid++)); do
852 [[ -z $(egetent group ${egid}) ]] && break
853 done
854 esac
855 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
856 ;;
857
858 *)
859 # We specify -r so that we get a GID in the system range from login.defs
860 groupadd -r ${opts} ${egroup} || die "enewgroup failed"
861 ;;
862 esac
863 export SANDBOX_ON="${oldsandbox}"
864}
865
866# @FUNCTION: edos2unix 602# @FUNCTION: edos2unix
867# @USAGE: <file> [more files ...] 603# @USAGE: <file> [more files ...]
868# @DESCRIPTION: 604# @DESCRIPTION:
869# A handy replacement for dos2unix, recode, fixdos, etc... This allows you 605# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
870# 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
871# 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
872# 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.
873edos2unix() { 609edos2unix() {
874 echo "$@" | xargs sed -i 's/\r$//' 610 [[ $# -eq 0 ]] && return 0
611 sed -i 's/\r$//' -- "$@" || die
875} 612}
876 613
877# Make a desktop file ! 614# Make a desktop file !
878# Great for making those icons in kde/gnome startmenu ! 615# Great for making those icons in kde/gnome startmenu !
879# Amaze your friends ! Get the women ! Join today ! 616# Amaze your friends ! Get the women ! Join today !
1413 eerror "Unknown filetype \"${filetype}\" ?" 1150 eerror "Unknown filetype \"${filetype}\" ?"
1414 false 1151 false
1415 ;; 1152 ;;
1416 esac 1153 esac
1417 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1154 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1418}
1419
1420# @FUNCTION: check_license
1421# @USAGE: [license]
1422# @DESCRIPTION:
1423# Display a license for user to accept. If no license is
1424# specified, then ${LICENSE} is used.
1425check_license() {
1426 local lic=$1
1427 if [ -z "${lic}" ] ; then
1428 lic="${PORTDIR}/licenses/${LICENSE}"
1429 else
1430 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1431 lic="${PORTDIR}/licenses/${lic}"
1432 elif [ -e "${PWD}/${lic}" ] ; then
1433 lic="${PWD}/${lic}"
1434 elif [ -e "${lic}" ] ; then
1435 lic="${lic}"
1436 fi
1437 fi
1438 local l="`basename ${lic}`"
1439
1440 # here is where we check for the licenses the user already
1441 # accepted ... if we don't find a match, we make the user accept
1442 local alic
1443 eshopts_push -o noglob # so that bash doesn't expand "*"
1444 for alic in ${ACCEPT_LICENSE} ; do
1445 if [[ ${alic} == ${l} ]]; then
1446 eshopts_pop
1447 return 0
1448 fi
1449 done
1450 eshopts_pop
1451 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1452
1453 local licmsg=$(emktemp)
1454 cat <<-EOF > ${licmsg}
1455 **********************************************************
1456 The following license outlines the terms of use of this
1457 package. You MUST accept this license for installation to
1458 continue. When you are done viewing, hit 'q'. If you
1459 CTRL+C out of this, the install will not run!
1460 **********************************************************
1461
1462 EOF
1463 cat ${lic} >> ${licmsg}
1464 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1465 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1466 read alic
1467 case ${alic} in
1468 yes|Yes|y|Y)
1469 return 0
1470 ;;
1471 *)
1472 echo;echo;echo
1473 eerror "You MUST accept the license to continue! Exiting!"
1474 die "Failed to accept license"
1475 ;;
1476 esac
1477} 1155}
1478 1156
1479# @FUNCTION: cdrom_get_cds 1157# @FUNCTION: cdrom_get_cds
1480# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...] 1158# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1481# @DESCRIPTION: 1159# @DESCRIPTION:
1978 case ${opt} in 1656 case ${opt} in
1979 -a) return $(( r != 0 )) ;; 1657 -a) return $(( r != 0 )) ;;
1980 -o) return $(( r == $# )) ;; 1658 -o) return $(( r == $# )) ;;
1981 esac 1659 esac
1982} 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.358  
changed lines
  Added in v.1.373

  ViewVC Help
Powered by ViewVC 1.1.20