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

Diff of /eclass/eutils.eclass

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

Revision 1.359 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.359 2011/07/20 05:46:46 vapier 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.
334 local STDERR_TARGET="${T}/${patchname}.out" 403 local STDERR_TARGET="${T}/${patchname}.out"
335 if [[ -e ${STDERR_TARGET} ]] ; then 404 if [[ -e ${STDERR_TARGET} ]] ; then
336 STDERR_TARGET="${T}/${patchname}-$$.out" 405 STDERR_TARGET="${T}/${patchname}-$$.out"
337 fi 406 fi
338 407
339 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}" 408 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
340 409
341 # Decompress the patch if need be 410 # Decompress the patch if need be
342 local count=0 411 local count=0
343 local PATCH_TARGET 412 local PATCH_TARGET
344 if [[ -n ${PIPE_CMD} ]] ; then 413 if [[ -n ${PIPE_CMD} ]] ; then
380 _epatch_draw_line "***** ${patchname} *****" 449 _epatch_draw_line "***** ${patchname} *****"
381 echo 450 echo
382 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 451 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
383 echo 452 echo
384 _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}
385 ) >> "${STDERR_TARGET}" 459 ) >> "${STDERR_TARGET}"
386 460
387 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then 461 if [ $? -eq 0 ] ; then
388 ( 462 (
389 _epatch_draw_line "***** ${patchname} *****" 463 _epatch_draw_line "***** ${patchname} *****"
390 echo 464 echo
391 echo "ACTUALLY APPLYING ${patchname} ..." 465 echo "ACTUALLY APPLYING ${patchname} ..."
392 echo 466 echo
393 _epatch_draw_line "***** ${patchname} *****" 467 _epatch_draw_line "***** ${patchname} *****"
394 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}
395 ) >> "${STDERR_TARGET}" 473 ) >> "${STDERR_TARGET}"
396 474
397 if [ $? -ne 0 ] ; then 475 if [ $? -ne 0 ] ; then
398 echo 476 echo
399 eerror "A dry-run of patch command succeeded, but actually" 477 eerror "A dry-run of patch command succeeded, but actually"
430 done 508 done
431 509
432 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 510 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
433 : # everything worked 511 : # everything worked
434} 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.
435epatch_user() { 540epatch_user() {
436 [[ $# -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
437 546
438 # don't clobber any EPATCH vars that the parent might want 547 # don't clobber any EPATCH vars that the parent might want
439 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 548 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
440 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 549 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
441 EPATCH_SOURCE=${base}/${CTARGET}/${check} 550 EPATCH_SOURCE=${base}/${CTARGET}/${check}
445 EPATCH_SOURCE=${EPATCH_SOURCE} \ 554 EPATCH_SOURCE=${EPATCH_SOURCE} \
446 EPATCH_SUFFIX="patch" \ 555 EPATCH_SUFFIX="patch" \
447 EPATCH_FORCE="yes" \ 556 EPATCH_FORCE="yes" \
448 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ 557 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
449 epatch 558 epatch
559 echo "${EPATCH_SOURCE}" > "${applied}"
450 return 0 560 return 0
451 fi 561 fi
452 done 562 done
563 echo "none" > "${applied}"
453 return 1 564 return 1
454} 565}
455 566
456# @FUNCTION: emktemp 567# @FUNCTION: emktemp
457# @USAGE: [temp dir] 568# @USAGE: [temp dir]
486 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 597 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
487 fi 598 fi
488 fi 599 fi
489} 600}
490 601
491# @FUNCTION: egetent
492# @USAGE: <database> <key>
493# @MAINTAINER:
494# base-system@gentoo.org (Linux)
495# Joe Jezak <josejx@gmail.com> (OS X)
496# usata@gentoo.org (OS X)
497# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
498# @DESCRIPTION:
499# Small wrapper for getent (Linux),
500# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
501# and pw (FreeBSD) used in enewuser()/enewgroup()
502egetent() {
503 case ${CHOST} in
504 *-darwin[678])
505 case "$2" in
506 *[!0-9]*) # Non numeric
507 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
508 ;;
509 *) # Numeric
510 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
511 ;;
512 esac
513 ;;
514 *-darwin*)
515 local mytype=$1
516 [[ "passwd" == $mytype ]] && mytype="Users"
517 [[ "group" == $mytype ]] && mytype="Groups"
518 case "$2" in
519 *[!0-9]*) # Non numeric
520 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
521 ;;
522 *) # Numeric
523 local mykey="UniqueID"
524 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
525 dscl . -search /$mytype $mykey $2 2>/dev/null
526 ;;
527 esac
528 ;;
529 *-freebsd*|*-dragonfly*)
530 local opts action="user"
531 [[ $1 == "passwd" ]] || action="group"
532
533 # lookup by uid/gid
534 if [[ $2 == [[:digit:]]* ]] ; then
535 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
536 fi
537
538 pw show ${action} ${opts} "$2" -q
539 ;;
540 *-netbsd*|*-openbsd*)
541 grep "$2:\*:" /etc/$1
542 ;;
543 *)
544 type -p nscd >& /dev/null && nscd -i "$1"
545 getent "$1" "$2"
546 ;;
547 esac
548}
549
550# @FUNCTION: enewuser
551# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
552# @DESCRIPTION:
553# Same as enewgroup, you are not required to understand how to properly add
554# a user to the system. The only required parameter is the username.
555# Default uid is (pass -1 for this) next available, default shell is
556# /bin/false, default homedir is /dev/null, there are no default groups,
557# and default params sets the comment as 'added by portage for ${PN}'.
558enewuser() {
559 case ${EBUILD_PHASE} in
560 unpack|compile|test|install)
561 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
562 eerror "Package fails at QA and at life. Please file a bug."
563 die "Bad package! enewuser is only for use in pkg_* functions!"
564 esac
565
566 # get the username
567 local euser=$1; shift
568 if [[ -z ${euser} ]] ; then
569 eerror "No username specified !"
570 die "Cannot call enewuser without a username"
571 fi
572
573 # lets see if the username already exists
574 if [[ -n $(egetent passwd "${euser}") ]] ; then
575 return 0
576 fi
577 einfo "Adding user '${euser}' to your system ..."
578
579 # options to pass to useradd
580 local opts=
581
582 # handle uid
583 local euid=$1; shift
584 if [[ -n ${euid} && ${euid} != -1 ]] ; then
585 if [[ ${euid} -gt 0 ]] ; then
586 if [[ -n $(egetent passwd ${euid}) ]] ; then
587 euid="next"
588 fi
589 else
590 eerror "Userid given but is not greater than 0 !"
591 die "${euid} is not a valid UID"
592 fi
593 else
594 euid="next"
595 fi
596 if [[ ${euid} == "next" ]] ; then
597 for ((euid = 101; euid <= 999; euid++)); do
598 [[ -z $(egetent passwd ${euid}) ]] && break
599 done
600 fi
601 opts="${opts} -u ${euid}"
602 einfo " - Userid: ${euid}"
603
604 # handle shell
605 local eshell=$1; shift
606 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
607 if [[ ! -e ${ROOT}${eshell} ]] ; then
608 eerror "A shell was specified but it does not exist !"
609 die "${eshell} does not exist in ${ROOT}"
610 fi
611 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
612 eerror "Do not specify ${eshell} yourself, use -1"
613 die "Pass '-1' as the shell parameter"
614 fi
615 else
616 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
617 [[ -x ${ROOT}${shell} ]] && break
618 done
619
620 if [[ ${shell} == "/dev/null" ]] ; then
621 eerror "Unable to identify the shell to use, proceeding with userland default."
622 case ${USERLAND} in
623 GNU) shell="/bin/false" ;;
624 BSD) shell="/sbin/nologin" ;;
625 Darwin) shell="/usr/sbin/nologin" ;;
626 *) die "Unable to identify the default shell for userland ${USERLAND}"
627 esac
628 fi
629
630 eshell=${shell}
631 fi
632 einfo " - Shell: ${eshell}"
633 opts="${opts} -s ${eshell}"
634
635 # handle homedir
636 local ehome=$1; shift
637 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
638 ehome="/dev/null"
639 fi
640 einfo " - Home: ${ehome}"
641 opts="${opts} -d ${ehome}"
642
643 # handle groups
644 local egroups=$1; shift
645 if [[ ! -z ${egroups} ]] ; then
646 local oldifs=${IFS}
647 local defgroup="" exgroups=""
648
649 export IFS=","
650 for g in ${egroups} ; do
651 export IFS=${oldifs}
652 if [[ -z $(egetent group "${g}") ]] ; then
653 eerror "You must add group ${g} to the system first"
654 die "${g} is not a valid GID"
655 fi
656 if [[ -z ${defgroup} ]] ; then
657 defgroup=${g}
658 else
659 exgroups="${exgroups},${g}"
660 fi
661 export IFS=","
662 done
663 export IFS=${oldifs}
664
665 opts="${opts} -g ${defgroup}"
666 if [[ ! -z ${exgroups} ]] ; then
667 opts="${opts} -G ${exgroups:1}"
668 fi
669 else
670 egroups="(none)"
671 fi
672 einfo " - Groups: ${egroups}"
673
674 # handle extra and add the user
675 local oldsandbox=${SANDBOX_ON}
676 export SANDBOX_ON="0"
677 case ${CHOST} in
678 *-darwin*)
679 ### Make the user
680 if [[ -z $@ ]] ; then
681 dscl . create /users/${euser} uid ${euid}
682 dscl . create /users/${euser} shell ${eshell}
683 dscl . create /users/${euser} home ${ehome}
684 dscl . create /users/${euser} realname "added by portage for ${PN}"
685 ### Add the user to the groups specified
686 local oldifs=${IFS}
687 export IFS=","
688 for g in ${egroups} ; do
689 dscl . merge /groups/${g} users ${euser}
690 done
691 export IFS=${oldifs}
692 else
693 einfo "Extra options are not supported on Darwin yet"
694 einfo "Please report the ebuild along with the info below"
695 einfo "eextra: $@"
696 die "Required function missing"
697 fi
698 ;;
699 *-freebsd*|*-dragonfly*)
700 if [[ -z $@ ]] ; then
701 pw useradd ${euser} ${opts} \
702 -c "added by portage for ${PN}" \
703 die "enewuser failed"
704 else
705 einfo " - Extra: $@"
706 pw useradd ${euser} ${opts} \
707 "$@" || die "enewuser failed"
708 fi
709 ;;
710
711 *-netbsd*)
712 if [[ -z $@ ]] ; then
713 useradd ${opts} ${euser} || die "enewuser failed"
714 else
715 einfo " - Extra: $@"
716 useradd ${opts} ${euser} "$@" || die "enewuser failed"
717 fi
718 ;;
719
720 *-openbsd*)
721 if [[ -z $@ ]] ; then
722 useradd -u ${euid} -s ${eshell} \
723 -d ${ehome} -c "Added by portage for ${PN}" \
724 -g ${egroups} ${euser} || die "enewuser failed"
725 else
726 einfo " - Extra: $@"
727 useradd -u ${euid} -s ${eshell} \
728 -d ${ehome} -c "Added by portage for ${PN}" \
729 -g ${egroups} ${euser} "$@" || die "enewuser failed"
730 fi
731 ;;
732
733 *)
734 if [[ -z $@ ]] ; then
735 useradd -r ${opts} \
736 -c "added by portage for ${PN}" \
737 ${euser} \
738 || die "enewuser failed"
739 else
740 einfo " - Extra: $@"
741 useradd -r ${opts} "$@" \
742 ${euser} \
743 || die "enewuser failed"
744 fi
745 ;;
746 esac
747
748 if [[ ! -e ${ROOT}/${ehome} ]] ; then
749 einfo " - Creating ${ehome} in ${ROOT}"
750 mkdir -p "${ROOT}/${ehome}"
751 chown ${euser} "${ROOT}/${ehome}"
752 chmod 755 "${ROOT}/${ehome}"
753 fi
754
755 export SANDBOX_ON=${oldsandbox}
756}
757
758# @FUNCTION: enewgroup
759# @USAGE: <group> [gid]
760# @DESCRIPTION:
761# This function does not require you to understand how to properly add a
762# group to the system. Just give it a group name to add and enewgroup will
763# do the rest. You may specify the gid for the group or allow the group to
764# allocate the next available one.
765enewgroup() {
766 case ${EBUILD_PHASE} in
767 unpack|compile|test|install)
768 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
769 eerror "Package fails at QA and at life. Please file a bug."
770 die "Bad package! enewgroup is only for use in pkg_* functions!"
771 esac
772
773 # get the group
774 local egroup="$1"; shift
775 if [ -z "${egroup}" ]
776 then
777 eerror "No group specified !"
778 die "Cannot call enewgroup without a group"
779 fi
780
781 # see if group already exists
782 if [[ -n $(egetent group "${egroup}") ]]; then
783 return 0
784 fi
785 einfo "Adding group '${egroup}' to your system ..."
786
787 # options to pass to useradd
788 local opts=
789
790 # handle gid
791 local egid="$1"; shift
792 if [ ! -z "${egid}" ]
793 then
794 if [ "${egid}" -gt 0 ]
795 then
796 if [ -z "`egetent group ${egid}`" ]
797 then
798 if [[ "${CHOST}" == *-darwin* ]]; then
799 opts="${opts} ${egid}"
800 else
801 opts="${opts} -g ${egid}"
802 fi
803 else
804 egid="next available; requested gid taken"
805 fi
806 else
807 eerror "Groupid given but is not greater than 0 !"
808 die "${egid} is not a valid GID"
809 fi
810 else
811 egid="next available"
812 fi
813 einfo " - Groupid: ${egid}"
814
815 # handle extra
816 local eextra="$@"
817 opts="${opts} ${eextra}"
818
819 # add the group
820 local oldsandbox="${SANDBOX_ON}"
821 export SANDBOX_ON="0"
822 case ${CHOST} in
823 *-darwin*)
824 if [ ! -z "${eextra}" ];
825 then
826 einfo "Extra options are not supported on Darwin/OS X yet"
827 einfo "Please report the ebuild along with the info below"
828 einfo "eextra: ${eextra}"
829 die "Required function missing"
830 fi
831
832 # If we need the next available
833 case ${egid} in
834 *[!0-9]*) # Non numeric
835 for ((egid = 101; egid <= 999; egid++)); do
836 [[ -z $(egetent group ${egid}) ]] && break
837 done
838 esac
839 dscl . create /groups/${egroup} gid ${egid}
840 dscl . create /groups/${egroup} passwd '*'
841 ;;
842
843 *-freebsd*|*-dragonfly*)
844 case ${egid} in
845 *[!0-9]*) # Non numeric
846 for ((egid = 101; egid <= 999; egid++)); do
847 [[ -z $(egetent group ${egid}) ]] && break
848 done
849 esac
850 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
851 ;;
852
853 *-netbsd*)
854 case ${egid} in
855 *[!0-9]*) # Non numeric
856 for ((egid = 101; egid <= 999; egid++)); do
857 [[ -z $(egetent group ${egid}) ]] && break
858 done
859 esac
860 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
861 ;;
862
863 *)
864 # We specify -r so that we get a GID in the system range from login.defs
865 groupadd -r ${opts} ${egroup} || die "enewgroup failed"
866 ;;
867 esac
868 export SANDBOX_ON="${oldsandbox}"
869}
870
871# @FUNCTION: edos2unix 602# @FUNCTION: edos2unix
872# @USAGE: <file> [more files ...] 603# @USAGE: <file> [more files ...]
873# @DESCRIPTION: 604# @DESCRIPTION:
874# A handy replacement for dos2unix, recode, fixdos, etc... This allows you 605# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
875# 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
876# 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
877# 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.
878edos2unix() { 609edos2unix() {
879 echo "$@" | xargs sed -i 's/\r$//' 610 [[ $# -eq 0 ]] && return 0
611 sed -i 's/\r$//' -- "$@" || die
880} 612}
881 613
882# Make a desktop file ! 614# Make a desktop file !
883# Great for making those icons in kde/gnome startmenu ! 615# Great for making those icons in kde/gnome startmenu !
884# Amaze your friends ! Get the women ! Join today ! 616# Amaze your friends ! Get the women ! Join today !
1418 eerror "Unknown filetype \"${filetype}\" ?" 1150 eerror "Unknown filetype \"${filetype}\" ?"
1419 false 1151 false
1420 ;; 1152 ;;
1421 esac 1153 esac
1422 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1154 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1423}
1424
1425# @FUNCTION: check_license
1426# @USAGE: [license]
1427# @DESCRIPTION:
1428# Display a license for user to accept. If no license is
1429# specified, then ${LICENSE} is used.
1430check_license() {
1431 local lic=$1
1432 if [ -z "${lic}" ] ; then
1433 lic="${PORTDIR}/licenses/${LICENSE}"
1434 else
1435 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1436 lic="${PORTDIR}/licenses/${lic}"
1437 elif [ -e "${PWD}/${lic}" ] ; then
1438 lic="${PWD}/${lic}"
1439 elif [ -e "${lic}" ] ; then
1440 lic="${lic}"
1441 fi
1442 fi
1443 local l="`basename ${lic}`"
1444
1445 # here is where we check for the licenses the user already
1446 # accepted ... if we don't find a match, we make the user accept
1447 local alic
1448 eshopts_push -o noglob # so that bash doesn't expand "*"
1449 for alic in ${ACCEPT_LICENSE} ; do
1450 if [[ ${alic} == ${l} ]]; then
1451 eshopts_pop
1452 return 0
1453 fi
1454 done
1455 eshopts_pop
1456 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1457
1458 local licmsg=$(emktemp)
1459 cat <<-EOF > ${licmsg}
1460 **********************************************************
1461 The following license outlines the terms of use of this
1462 package. You MUST accept this license for installation to
1463 continue. When you are done viewing, hit 'q'. If you
1464 CTRL+C out of this, the install will not run!
1465 **********************************************************
1466
1467 EOF
1468 cat ${lic} >> ${licmsg}
1469 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1470 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1471 read alic
1472 case ${alic} in
1473 yes|Yes|y|Y)
1474 return 0
1475 ;;
1476 *)
1477 echo;echo;echo
1478 eerror "You MUST accept the license to continue! Exiting!"
1479 die "Failed to accept license"
1480 ;;
1481 esac
1482} 1155}
1483 1156
1484# @FUNCTION: cdrom_get_cds 1157# @FUNCTION: cdrom_get_cds
1485# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...] 1158# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1486# @DESCRIPTION: 1159# @DESCRIPTION:
1983 case ${opt} in 1656 case ${opt} in
1984 -a) return $(( r != 0 )) ;; 1657 -a) return $(( r != 0 )) ;;
1985 -o) return $(( r == $# )) ;; 1658 -o) return $(( r == $# )) ;;
1986 esac 1659 esac
1987} 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.359  
changed lines
  Added in v.1.373

  ViewVC Help
Powered by ViewVC 1.1.20