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

Diff of /eclass/eutils.eclass

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

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

  ViewVC Help
Powered by ViewVC 1.1.20