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

Diff of /eclass/eutils.eclass

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

Revision 1.76 Revision 1.110
1# Copyright 1999-2004 Gentoo Technologies, Inc. 1# Copyright 1999-2004 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.76 2004/01/26 23:40:07 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.110 2004/10/02 17:47:48 iggy Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 8# have to implement themselves.
10# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
11 11
12ECLASS=eutils 12ECLASS=eutils
13INHERITED="$INHERITED $ECLASS" 13INHERITED="$INHERITED $ECLASS"
14 14
15newdepend "!bootstrap? ( sys-devel/patch )" 15DEPEND="!bootstrap? ( sys-devel/patch )"
16 16
17DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
18
19# Wait for the supplied number of seconds. If no argument is supplied, defaults
20# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
21# outputting to a terminal, don't wait. For compatability purposes, the argument
22# must be an integer greater than zero.
23# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
24epause() {
25 if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
26 sleep ${1:-5}
27 fi
28}
29
30# Beep the specified number of times (defaults to five). If our output
31# is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
32# don't beep.
33# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
34ebeep() {
35 local n
36 if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
37 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
38 echo -ne "\a"
39 sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
40 echo -ne "\a"
41 sleep 1
42 done
43 fi
44}
45
46# This function simply returns the desired lib directory. With portage
47# 2.0.51, we now have support for installing libraries to lib32/lib64
48# to accomidate the needs of multilib systems. It's no longer a good idea
49# to assume all libraries will end up in lib. Replace any (sane) instances
50# where lib is named directly with $(get_libdir) if possible.
51#
52# Travis Tilley <lv@gentoo.org> (24 Aug 2004)
53get_libdir() {
54 LIBDIR_TEST=$(type econf)
55 if [ ! -z "${CONF_LIBDIR_OVERRIDE}" ] ; then
56 # if there is an override, we want to use that... always.
57 CONF_LIBDIR="${CONF_LIBDIR_OVERRIDE}"
58 # We don't need to know the verison of portage. We only need to know
59 # if there is support for CONF_LIBDIR in econf and co.
60 # Danny van Dyk <kugelfang@gentoo.org> 2004/17/09
61 #elif portageq has_version / '<sys-apps/portage-2.0.51_pre20' ; then
62 # # and if there isnt an override, and we're using a version of
63 # # portage without CONF_LIBDIR support, force the use of lib. dolib
64 # # and friends from portage 2.0.50 wont be too happy otherwise.
65 # CONF_LIBDIR="lib"
66 #fi
67 elif [ "${LIBDIR_TEST/CONF_LIBDIR}" == "${LIBDIR_TEST}" ]; then # we don't have CONF_LIBDIR support
68 # will be <portage-2.0.51_pre20
69 CONF_LIBDIR="lib"
70 fi
71 # and of course, default to lib if CONF_LIBDIR isnt set
72 echo ${CONF_LIBDIR:=lib}
73 unset LIBDIR_TEST
74}
75
76
77get_multilibdir() {
78 echo ${CONF_MULTILIBDIR:=lib32}
79}
80
81
82# Sometimes you need to override the value returned by get_libdir. A good
83# example of this is xorg-x11, where lib32 isnt a supported configuration,
84# and where lib64 -must- be used on amd64 (for applications that need lib
85# to be 32bit, such as adobe acrobat). Note that this override also bypasses
86# portage version sanity checking.
87# get_libdir_override expects one argument, the result get_libdir should
88# return:
89#
90# get_libdir_override lib64
91#
92# Travis Tilley <lv@gentoo.org> (31 Aug 2004)
93get_libdir_override() {
94 CONF_LIBDIR="$1"
95 CONF_LIBDIR_OVERRIDE="$1"
96}
18 97
19# This function generate linker scripts in /usr/lib for dynamic 98# This function generate linker scripts in /usr/lib for dynamic
20# libs in /lib. This is to fix linking problems when you have 99# libs in /lib. This is to fix linking problems when you have
21# the .so in /lib, and the .a in /usr/lib. What happens is that 100# the .so in /lib, and the .a in /usr/lib. What happens is that
22# in some cases when linking dynamic, the .a in /usr/lib is used 101# in some cases when linking dynamic, the .a in /usr/lib is used
33# to point to the latest version of the library present. 112# to point to the latest version of the library present.
34# 113#
35# <azarah@gentoo.org> (26 Oct 2002) 114# <azarah@gentoo.org> (26 Oct 2002)
36# 115#
37gen_usr_ldscript() { 116gen_usr_ldscript() {
38 117 local libdir="$(get_libdir)"
39 # Just make sure it exists 118 # Just make sure it exists
40 dodir /usr/lib 119 dodir /usr/${libdir}
41 120
42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 121 cat > "${D}/usr/${libdir}/${1}" << END_LDSCRIPT
43/* GNU ld script 122/* GNU ld script
44 Because Gentoo have critical dynamic libraries 123 Because Gentoo have critical dynamic libraries
45 in /lib, and the static versions in /usr/lib, we 124 in /lib, and the static versions in /usr/lib, we
46 need to have a "fake" dynamic lib in /usr/lib, 125 need to have a "fake" dynamic lib in /usr/lib,
47 otherwise we run into linking problems. 126 otherwise we run into linking problems.
48 See bug #4411 on http://bugs.gentoo.org/ for 127 See bug #4411 on http://bugs.gentoo.org/ for
49 more info. */ 128 more info. */
50GROUP ( /lib/libxxx ) 129GROUP ( /${libdir}/${1} )
51END_LDSCRIPT 130END_LDSCRIPT
52 131 fperms a+x "/usr/${libdir}/${1}"
53 dosed "s:libxxx:$1:" /usr/lib/$1
54
55 return 0
56} 132}
57 133
58# Simple function to draw a line consisting of '=' the same length as $* 134# Simple function to draw a line consisting of '=' the same length as $*
59# 135#
60# <azarah@gentoo.org> (11 Nov 2002) 136# <azarah@gentoo.org> (11 Nov 2002)
144 local SINGLE_PATCH="no" 220 local SINGLE_PATCH="no"
145 local x="" 221 local x=""
146 222
147 if [ "$#" -gt 1 ] 223 if [ "$#" -gt 1 ]
148 then 224 then
149 eerror "Invalid arguments to epatch()" 225 local m=""
150 die "Invalid arguments to epatch()" 226 einfo "${#} patches to apply..."
227 for m in "$@" ; do
228 epatch "${m}"
229 done
230 return 0
151 fi 231 fi
152 232
153 if [ -n "$1" -a -f "$1" ] 233 if [ -n "$1" -a -f "$1" ]
154 then 234 then
155 SINGLE_PATCH="yes" 235 SINGLE_PATCH="yes"
258 else 338 else
259 PATCH_TARGET="${x}" 339 PATCH_TARGET="${x}"
260 fi 340 fi
261 341
262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 342 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 343 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 344
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 345 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 346 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267 347
268 if [ "${PATCH_SUFFIX}" != "patch" ] 348 if [ "${PATCH_SUFFIX}" != "patch" ]
275 count=5 355 count=5
276 break 356 break
277 fi 357 fi
278 fi 358 fi
279 359
280 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 360 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 then 361 then
282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 362 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 363 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 364 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 365 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 366 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287 367
288 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 368 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289 369
290 if [ "$?" -ne 0 ] 370 if [ "$?" -ne 0 ]
291 then 371 then
292 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 372 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293 echo 373 echo
336# This function return true if we are using the NPTL pthreads 416# This function return true if we are using the NPTL pthreads
337# implementation. 417# implementation.
338# 418#
339# <azarah@gentoo.org> (06 March 2003) 419# <azarah@gentoo.org> (06 March 2003)
340# 420#
341
342have_NPTL() { 421have_NPTL() {
343
344 cat > ${T}/test-nptl.c <<-"END" 422 cat > ${T}/test-nptl.c <<-"END"
345 #define _XOPEN_SOURCE 423 #define _XOPEN_SOURCE
346 #include <unistd.h> 424 #include <unistd.h>
347 #include <stdio.h> 425 #include <stdio.h>
348 426
422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 500 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 else 501 else
424 jobs=2 502 jobs=2
425 fi 503 fi
426 504
427 elif [ "${ARCH}" = "ppc" ] 505 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
428 then 506 then
429 # ppc has "processor", but only when compiled with SMP 507 # ppc has "processor", but only when compiled with SMP
430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 508 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 then 509 then
432 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))" 510 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 else 511 else
434 jobs=2 512 jobs=2
435 fi 513 fi
514 elif [ "${ARCH}" = "s390" ]
515 then
516 # s390 has "# processors : "
517 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
436 else 518 else
437 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))" 519 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 die "Unknown ARCH -- ${ARCH}!" 520 die "Unknown ARCH -- ${ARCH}!"
439 fi 521 fi
440 522
456 fi 538 fi
457 fi 539 fi
458} 540}
459 541
460# Cheap replacement for when debianutils (and thus mktemp) 542# Cheap replacement for when debianutils (and thus mktemp)
461# do not exist on the users system 543# does not exist on the users system
462# vapier@gentoo.org 544# vapier@gentoo.org
463# 545#
464# Takes just 1 parameter (the directory to create tmpfile in) 546# Takes just 1 parameter (the directory to create tmpfile in)
465mymktemp() { 547mymktemp() {
466 local topdir="$1" 548 local topdir="$1"
467 549
468 [ -z "${topdir}" ] && topdir=/tmp 550 [ -z "${topdir}" ] && topdir=/tmp
469 if [ "`which mktemp 2>/dev/null`" ] 551 if [ "`which mktemp 2>/dev/null`" ]
470 then 552 then
471 mktemp -p ${topdir} 553 mktemp -p ${topdir}
472 else 554 else
473 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 555 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474 touch ${tmp} 556 touch ${tmp}
475 echo ${tmp} 557 echo ${tmp}
558 fi
559}
560
561# Small wrapper for getent (Linux), nidump (Mac OS X),
562# and pw (FreeBSD) used in enewuser()/enewgroup()
563# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
564# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
565#
566# egetent(database, key)
567egetent() {
568 if use macos || use ppc-macos ; then
569 case "$2" in
570 *[!0-9]*) # Non numeric
571 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
572 ;;
573 *) # Numeric
574 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
575 ;;
576 esac
577 elif useq x86-fbsd ; then
578 local action
579 if [ "$1" == "passwd" ]
580 then
581 action="user"
582 else
583 action="group"
584 fi
585 pw show "${action}" "$2" -q
586 else
587 getent "$1" "$2"
476 fi 588 fi
477} 589}
478 590
479# Simplify/standardize adding users to the system 591# Simplify/standardize adding users to the system
480# vapier@gentoo.org 592# vapier@gentoo.org
496 then 608 then
497 eerror "No username specified !" 609 eerror "No username specified !"
498 die "Cannot call enewuser without a username" 610 die "Cannot call enewuser without a username"
499 fi 611 fi
500 612
501 # setup a file for testing usernames/groups
502 local tmpfile="`mymktemp ${T}`"
503 chown ${euser} ${tmpfile} >& /dev/null
504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
505
506 # see if user already exists 613 # lets see if the username already exists
507 if [ "${euser}" == "${realuser}" ] 614 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ]
508 then 615 then
509 return 0 616 return 0
510 fi 617 fi
511 einfo "Adding user '${euser}' to your system ..." 618 einfo "Adding user '${euser}' to your system ..."
512 619
517 local euid="$1"; shift 624 local euid="$1"; shift
518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] 625 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then 626 then
520 if [ "${euid}" -gt 0 ] 627 if [ "${euid}" -gt 0 ]
521 then 628 then
522 opts="${opts} -u ${euid}" 629 if [ ! -z "`egetent passwd ${euid}`" ]
630 then
631 euid="next"
632 fi
523 else 633 else
524 eerror "Userid given but is not greater than 0 !" 634 eerror "Userid given but is not greater than 0 !"
525 die "${euid} is not a valid UID" 635 die "${euid} is not a valid UID"
526 fi 636 fi
527 else 637 else
528 euid="next available" 638 euid="next"
639 fi
640 if [ "${euid}" == "next" ]
641 then
642 local pwrange
643 if use macos || use ppc-macos || [ "${USERLAND}" == "BSD" ] ; then
644 pwrange="`jot 898 101`"
645 else
646 pwrange="`seq 101 999`"
529 fi 647 fi
648 for euid in ${pwrange} ; do
649 [ -z "`egetent passwd ${euid}`" ] && break
650 done
651 fi
652 opts="${opts} -u ${euid}"
530 einfo " - Userid: ${euid}" 653 einfo " - Userid: ${euid}"
531 654
532 # handle shell 655 # handle shell
533 local eshell="$1"; shift 656 local eshell="$1"; shift
534 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] 657 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
537 then 660 then
538 eerror "A shell was specified but it does not exist !" 661 eerror "A shell was specified but it does not exist !"
539 die "${eshell} does not exist" 662 die "${eshell} does not exist"
540 fi 663 fi
541 else 664 else
665 if [ "${USERLAND}" == "BSD" ]
666 then
667 eshell="/usr/bin/false"
668 else
542 eshell="/bin/false" 669 eshell="/bin/false"
670 fi
543 fi 671 fi
544 einfo " - Shell: ${eshell}" 672 einfo " - Shell: ${eshell}"
545 opts="${opts} -s ${eshell}" 673 opts="${opts} -s ${eshell}"
546 674
547 # handle homedir 675 # handle homedir
555 683
556 # handle groups 684 # handle groups
557 local egroups="$1"; shift 685 local egroups="$1"; shift
558 if [ ! -z "${egroups}" ] 686 if [ ! -z "${egroups}" ]
559 then 687 then
560 local realgroup=
561 local oldifs="${IFS}" 688 local oldifs="${IFS}"
689 local defgroup="" exgroups=""
690
562 export IFS="," 691 export IFS=","
563 for g in ${egroups} 692 for g in ${egroups}
564 do 693 do
565 chgrp ${g} ${tmpfile} >& /dev/null 694 if [ -z "`egetent group \"${g}\"`" ]
566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
567 if [ "${g}" != "${realgroup}" ]
568 then 695 then
569 eerror "You must add ${g} to the system first" 696 eerror "You must add group ${g} to the system first"
570 die "${g} is not a valid GID" 697 die "${g} is not a valid GID"
698 fi
699 if [ -z "${defgroup}" ]
700 then
701 defgroup="${g}"
702 else
703 exgroups="${exgroups},${g}"
571 fi 704 fi
572 done 705 done
573 export IFS="${oldifs}" 706 export IFS="${oldifs}"
707
574 opts="${opts} -g ${egroups}" 708 opts="${opts} -g ${defgroup}"
709 if [ ! -z "${exgroups}" ]
710 then
711 opts="${opts} -G ${exgroups:1}"
712 fi
575 else 713 else
576 egroups="(none)" 714 egroups="(none)"
577 fi 715 fi
578 einfo " - Groups: ${egroups}" 716 einfo " - Groups: ${egroups}"
579 717
580 # handle extra and add the user 718 # handle extra and add the user
581 local eextra="$@" 719 local eextra="$@"
582 local oldsandbox="${SANDBOX_ON}" 720 local oldsandbox="${SANDBOX_ON}"
583 export SANDBOX_ON="0" 721 export SANDBOX_ON="0"
722 if use macos || use ppc-macos ;
723 then
724 ### Make the user
584 if [ -z "${eextra}" ] 725 if [ -z "${eextra}" ]
585 then 726 then
586 useradd ${opts} ${euser} \ 727 dscl . create /users/${euser} uid ${euid}
728 dscl . create /users/${euser} shell ${eshell}
729 dscl . create /users/${euser} home ${ehome}
730 dscl . create /users/${euser} realname "added by portage for ${PN}"
731 ### Add the user to the groups specified
732 for g in ${egroups}
733 do
734 # $egroups is , delimited, not space
735 ewarn "This is code is wrong; someone on the OS X team should fix it"
736 dscl . merge /groups/${g} users ${euser}
737 done
738 else
739 einfo "Extra options are not supported on macos yet"
740 einfo "Please report the ebuild along with the info below"
741 einfo "eextra: ${eextra}"
742 die "Required function missing"
743 fi
744 elif use x86-fbsd ; then
745 if [ -z "${eextra}" ]
746 then
747 pw useradd ${euser} ${opts} \
587 -c "added by portage for ${PN}" \ 748 -c "added by portage for ${PN}" \
588 || die "enewuser failed" 749 die "enewuser failed"
589 else 750 else
590 einfo " - Extra: ${eextra}" 751 einfo " - Extra: ${eextra}"
752 pw useradd ${euser} ${opts} \
753 -c ${eextra} || die "enewuser failed"
754 fi
755 else
756 if [ -z "${eextra}" ]
757 then
758 useradd ${opts} ${euser} \
759 -c "added by portage for ${PN}" \
760 || die "enewuser failed"
761 else
762 einfo " - Extra: ${eextra}"
591 useradd ${opts} ${euser} ${eextra} \ 763 useradd ${opts} ${euser} ${eextra} \
592 || die "enewuser failed" 764 || die "enewuser failed"
765 fi
593 fi 766 fi
594 export SANDBOX_ON="${oldsandbox}" 767 export SANDBOX_ON="${oldsandbox}"
595 768
596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ] 769 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then 770 then
618 then 791 then
619 eerror "No group specified !" 792 eerror "No group specified !"
620 die "Cannot call enewgroup without a group" 793 die "Cannot call enewgroup without a group"
621 fi 794 fi
622 795
623 # setup a file for testing groupname
624 local tmpfile="`mymktemp ${T}`"
625 chgrp ${egroup} ${tmpfile} >& /dev/null
626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
627
628 # see if group already exists 796 # see if group already exists
629 if [ "${egroup}" == "${realgroup}" ] 797 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
630 then 798 then
631 return 0 799 return 0
632 fi 800 fi
633 einfo "Adding group '${egroup}' to your system ..." 801 einfo "Adding group '${egroup}' to your system ..."
634 802
639 local egid="$1"; shift 807 local egid="$1"; shift
640 if [ ! -z "${egid}" ] 808 if [ ! -z "${egid}" ]
641 then 809 then
642 if [ "${egid}" -gt 0 ] 810 if [ "${egid}" -gt 0 ]
643 then 811 then
812 if [ -z "`egetent group ${egid}`" ]
813 then
814 if use macos || use ppc-macos ; then
815 opts="${opts} ${egid}"
816 else
644 opts="${opts} -g ${egid}" 817 opts="${opts} -g ${egid}"
818 fi
819 else
820 egid="next available; requested gid taken"
821 fi
645 else 822 else
646 eerror "Groupid given but is not greater than 0 !" 823 eerror "Groupid given but is not greater than 0 !"
647 die "${egid} is not a valid GID" 824 die "${egid} is not a valid GID"
648 fi 825 fi
649 else 826 else
656 opts="${opts} ${eextra}" 833 opts="${opts} ${eextra}"
657 834
658 # add the group 835 # add the group
659 local oldsandbox="${SANDBOX_ON}" 836 local oldsandbox="${SANDBOX_ON}"
660 export SANDBOX_ON="0" 837 export SANDBOX_ON="0"
838 if use macos || use ppc-macos ;
839 then
840 if [ ! -z "${eextra}" ];
841 then
842 einfo "Extra options are not supported on macos yet"
843 einfo "Please report the ebuild along with the info below"
844 einfo "eextra: ${eextra}"
845 die "Required function missing"
846 fi
847
848 # If we need the next available
849 case ${egid} in
850 *[!0-9]*) # Non numeric
851 for egid in `jot 898 101`; do
852 [ -z "`egetent group ${egid}`" ] && break
853 done
854 esac
855 dscl . create /groups/${egroup} gid ${egid}
856 dscl . create /groups/${egroup} passwd '*'
857 elif use x86-fbsd ; then
858 case ${egid} in
859 *[!0-9]*) # Non numeric
860 for egid in `jot 898 101`; do
861 [ -z "`egetent group ${egid}`" ] && break
862 done
863 esac
864 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
865 else
661 groupadd ${opts} ${egroup} || die "enewgroup failed" 866 groupadd ${opts} ${egroup} || die "enewgroup failed"
867 fi
662 export SANDBOX_ON="${oldsandbox}" 868 export SANDBOX_ON="${oldsandbox}"
663} 869}
664 870
665# Simple script to replace 'dos2unix' binaries 871# Simple script to replace 'dos2unix' binaries
666# vapier@gentoo.org 872# vapier@gentoo.org
687# name: the name that will show up in the menu 893# name: the name that will show up in the menu
688# icon: give your little like a pretty little icon ... 894# icon: give your little like a pretty little icon ...
689# this can be relative (to /usr/share/pixmaps) or 895# this can be relative (to /usr/share/pixmaps) or
690# a full path to an icon 896# a full path to an icon
691# type: what kind of application is this ? for categories: 897# type: what kind of application is this ? for categories:
692# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html 898# http://www.freedesktop.org/standards/menu-spec/
693# path: if your app needs to startup in a specific dir 899# path: if your app needs to startup in a specific dir
694make_desktop_entry() { 900make_desktop_entry() {
695 [ -z "$1" ] && eerror "You must specify the executable" && return 1 901 [ -z "$1" ] && eerror "You must specify the executable" && return 1
696 902
697 local exec="${1}" 903 local exec="${1}"
698 local name="${2:-${PN}}" 904 local name="${2:-${PN}}"
699 local icon="${3:-${PN}.png}" 905 local icon="${3:-${PN}.png}"
700 local type="${4}" 906 local type="${4}"
907 local subdir="${6}"
701 local path="${5:-${GAMES_PREFIX}}" 908 local path="${5:-${GAMES_BINDIR}}"
702 if [ -z "${type}" ] 909 if [ -z "${type}" ]
703 then 910 then
704 case ${CATEGORY} in 911 case ${CATEGORY} in
705 "app-emulation") 912 "app-emulation")
706 type=Emulator 913 type=Emulator
914 subdir="Emulation"
707 ;; 915 ;;
708 "games-"*) 916 "games-"*)
709 type=Game 917 type=Game
918 subdir="Games"
710 ;; 919 ;;
711 "net-"*) 920 "net-"*)
712 type=Network; 921 type=Network
922 subdir="${type}"
713 ;; 923 ;;
714 *) 924 *)
715 type= 925 type=
926 subdir=
716 ;; 927 ;;
717 esac 928 esac
718 fi 929 fi
719 local desktop="${T}/${exec}.desktop" 930 local desktop="${T}/${exec}.desktop"
720 931
725Type=Application 936Type=Application
726Comment=${DESCRIPTION} 937Comment=${DESCRIPTION}
727Exec=${exec} 938Exec=${exec}
728Path=${path} 939Path=${path}
729Icon=${icon} 940Icon=${icon}
730Categories=Application;${type};" > ${desktop} 941Categories=Application;${type};" > "${desktop}"
731 942
732 if [ -d "/usr/share/applications" ] 943 if [ -d "/usr/share/applications" ]
733 then 944 then
734 insinto /usr/share/applications 945 insinto /usr/share/applications
735 doins ${desktop} 946 doins "${desktop}"
736 fi 947 fi
737 948
738 #if [ -d "/usr/share/gnome/apps" ] 949 #if [ -d "/usr/share/gnome/apps" ]
739 #then 950 #then
740 # insinto /usr/share/gnome/apps/Games 951 # insinto /usr/share/gnome/apps/Games
750 # done 961 # done
751 #fi 962 #fi
752 963
753 if [ -d "/usr/share/applnk" ] 964 if [ -d "/usr/share/applnk" ]
754 then 965 then
755 insinto /usr/share/applnk/${type} 966 insinto /usr/share/applnk/${subdir}
756 doins ${desktop} 967 doins "${desktop}"
757 fi 968 fi
758 969
759 return 0 970 return 0
760}
761
762# new convenience patch wrapper function to eventually replace epatch(),
763# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
764# /usr/bin/patch
765# Features:
766# - bulk patch handling similar to epatch()'s
767# - automatic patch level detection like epatch()'s
768# - automatic patch uncompression like epatch()'s
769# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
770# manually instead
771# - once I decide it's production-ready, it'll be called from base_src_unpack
772# to handle $PATCHES to avoid defining src_unpack just to use xpatch
773
774# accepts zero or more parameters specifying patchfiles and/or patchdirs
775
776# known issues:
777# - only supports unified style patches (does anyone _really_ use anything
778# else?)
779# - because it doesn't use --dry-run there is a risk of it failing
780# to find the files to patch, ie detect the patchlevel, properly. It doesn't use
781# any of the backup heuristics that patch employs to discover a filename.
782# however, this isn't dangerous because if it works for the developer who's
783# writing the ebuild, it'll always work for the users, and if it doesn't,
784# then we'll fix it :-)
785# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
786xpatch() {
787
788 debug-print-function ${FUNCNAME} $*
789
790 local list=
791 local list2=
792 declare -i plevel
793
794 # parse patch sources
795 for x in $*
796 do
797 debug-print "${FUNCNAME}: parsing parameter ${x}"
798 if [ -f "${x}" ]
799 then
800 list="${list} ${x}"
801 elif [ -d "${x}" ]
802 then
803 # handles patchdirs like epatch() for now: no recursion.
804 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
805 # only patches with _$ARCH_ or _all_ in their filenames are applied.
806 for file in `ls -A ${x}`
807 do
808 debug-print "${FUNCNAME}: parsing in subdir: file ${file}"
809 if [ -f "${x}/${file}" -a "${file}" != "${file/_all_}" -o \
810 "${file}" != "${file/_$ARCH_}" ]
811 then
812 list2="${list2} ${x}/${file}"
813 fi
814 done
815 list="`echo ${list2} | sort` ${list}"
816 else
817 die "Couldn't find ${x}"
818 fi
819 done
820
821 debug-print "${FUNCNAME}: final list of patches: ${list}"
822
823 for x in ${list};
824 do
825 debug-print "${FUNCNAME}: processing ${x}"
826 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
827 case "`/usr/bin/file -b ${x}`" in
828 *gzip*)
829 patchfile="${T}/current.patch"
830 ungzip -c "${x}" > "${patchfile}"
831 ;;
832 *bzip2*)
833 patchfile="${T}/current.patch"
834 bunzip2 -c "${x}" > "${patchfile}"
835 ;;
836 *text*)
837 patchfile="${x}"
838 ;;
839 *)
840 die "Could not determine filetype of patch ${x}"
841 ;;
842 esac
843 debug-print "${FUNCNAME}: patchfile=${patchfile}"
844
845 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
846 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
847 debug-print "${FUNCNAME}: raw target=${target}"
848 # strip target down to the path/filename, remove leading +++
849 target="${target/+++ }"; target="${target%% *}"
850 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
851 # to discard them as well to calculate the correct patchlevel.
852 target="${target//\/\//\/}"
853 debug-print "${FUNCNAME}: stripped target=${target}"
854
855 # look for target
856 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
857 debug-print "${FUNCNAME}: looking in basedir=${basedir}"
858 cd "${basedir}"
859
860 # try stripping leading directories
861 target2="${target}"
862 plevel=0
863 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
864 while [ ! -f "${target2}" ]
865 do
866 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
867 plevel=$((plevel+1))
868 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
869 [ "${target2}" == "${target2/\/}" ] && break
870 done
871 test -f "${target2}" && break
872
873 # try stripping filename - needed to support patches creating new files
874 target2="${target%/*}"
875 plevel=0
876 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
877 while [ ! -d "${target2}" ]
878 do
879 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
880 plevel=$((plevel+1))
881 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
882 [ "${target2}" == "${target2/\/}" ] && break
883 done
884 test -d "${target2}" && break
885
886 done
887
888 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
889 || die "Could not determine patchlevel for ${x}"
890 debug-print "${FUNCNAME}: determined plevel=${plevel}"
891 # do the patching
892 ebegin "Applying patch ${x##*/}..."
893 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
894 || die "Failed to apply patch ${x}"
895 eend $?
896
897 done
898
899} 971}
900 972
901# for internal use only (unpack_pdv and unpack_makeself) 973# for internal use only (unpack_pdv and unpack_makeself)
902find_unpackable_file() { 974find_unpackable_file() {
903 local src="$1" 975 local src="$1"
1071 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf - 1143 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
1072 ;; 1144 ;;
1073 gzip*) 1145 gzip*)
1074 tail -n +${skip} ${src} | tar --no-same-owner -xzf - 1146 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
1075 ;; 1147 ;;
1148 compress*)
1149 tail -n +${skip} ${src} | gunzip | tar --no-same-owner -xf -
1150 ;;
1076 *) 1151 *)
1152 eerror "Unknown filetype \"${filetype}\" ?"
1077 false 1153 false
1078 ;; 1154 ;;
1079 esac 1155 esac
1080 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1156 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1081} 1157}
1100 [ ! -f "${lic}" ] && die "Could not find requested license ${src}" 1176 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1101 local l="`basename ${lic}`" 1177 local l="`basename ${lic}`"
1102 1178
1103 # here is where we check for the licenses the user already 1179 # here is where we check for the licenses the user already
1104 # accepted ... if we don't find a match, we make the user accept 1180 # accepted ... if we don't find a match, we make the user accept
1181 local shopts=$-
1105 local alic 1182 local alic
1183 set -o noglob #so that bash doesn't expand "*"
1106 for alic in "${ACCEPT_LICENSE}" ; do 1184 for alic in ${ACCEPT_LICENSE} ; do
1107 [ "${alic}" == "*" ] && return 0 1185 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1108 [ "${alic}" == "${l}" ] && return 0 1186 set +o noglob; set -${shopts} #reset old shell opts
1187 return 0
1188 fi
1109 done 1189 done
1190 set +o noglob; set -$shopts #reset old shell opts
1110 1191
1111 local licmsg="`mymktemp ${T}`" 1192 local licmsg="`mymktemp ${T}`"
1112 cat << EOF > ${licmsg} 1193 cat << EOF > ${licmsg}
1113********************************************************** 1194**********************************************************
1114The following license outlines the terms of use of this 1195The following license outlines the terms of use of this
1239# remember, you can only go forward in the cd chain, you can't go back. 1320# remember, you can only go forward in the cd chain, you can't go back.
1240cdrom_load_next_cd() { 1321cdrom_load_next_cd() {
1241 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1)) 1322 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1242 local var= 1323 local var=
1243 1324
1325 if [ ! -z "${CD_ROOT}" ] ; then
1326 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1327 return
1328 fi
1329
1244 unset CDROM_ROOT 1330 unset CDROM_ROOT
1245 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1331 var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1246 if [ -z "${!var}" ] ; then 1332 if [ -z "${!var}" ] ; then
1247 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1333 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1248 cdrom_locate_file_on_cd ${!var} 1334 cdrom_locate_file_on_cd ${!var}
1296 einfo "or hit CTRL+C to abort the emerge." 1382 einfo "or hit CTRL+C to abort the emerge."
1297 read 1383 read
1298 fi 1384 fi
1299 done 1385 done
1300} 1386}
1387
1388# Make sure that LINGUAS only contains languages that
1389# a package can support
1390#
1391# usage: strip-linguas <allow LINGUAS>
1392# strip-linguas -i <directories of .po files>
1393# strip-linguas -u <directories of .po files>
1394#
1395# The first form allows you to specify a list of LINGUAS.
1396# The -i builds a list of po files found in all the
1397# directories and uses the intersection of the lists.
1398# The -u builds a list of po files found in all the
1399# directories and uses the union of the lists.
1400strip-linguas() {
1401 local ls newls
1402 if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then
1403 local op="$1"; shift
1404 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1405 local d f
1406 for d in "$@" ; do
1407 if [ "${op}" == "-u" ] ; then
1408 newls="${ls}"
1409 else
1410 newls=""
1411 fi
1412 for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1413 if [ "${op}" == "-i" ] ; then
1414 [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}"
1415 else
1416 [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}"
1417 fi
1418 done
1419 ls="${newls}"
1420 done
1421 ls="${ls//.po}"
1422 else
1423 ls="$@"
1424 fi
1425
1426 ls=" ${ls} "
1427 newls=""
1428 for f in ${LINGUAS} ; do
1429 if [ "${ls/ ${f} /}" != "${ls}" ] ; then
1430 nl="${newls} ${f}"
1431 else
1432 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1433 fi
1434 done
1435 if [ -z "${newls}" ] ; then
1436 unset LINGUAS
1437 else
1438 export LINGUAS="${newls}"
1439 fi
1440}
1441
1442# moved from kernel.eclass since they are generally useful outside of
1443# kernel.eclass -iggy (20041002)
1444
1445# the following functions are useful in kernel module ebuilds, etc.
1446# for an example see ivtv or drbd ebuilds
1447
1448# set's ARCH to match what the kernel expects
1449set_arch_to_kernel() {
1450 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1451 case ${ARCH} in
1452 x86) export ARCH="i386";;
1453 amd64) export ARCH="x86_64";;
1454 hppa) export ARCH="parisc";;
1455 mips) export ARCH="mips";;
1456 *) export ARCH="${ARCH}";;
1457 esac
1458}
1459
1460# set's ARCH back to what portage expects
1461set_arch_to_portage() {
1462 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1463}

Legend:
Removed from v.1.76  
changed lines
  Added in v.1.110

  ViewVC Help
Powered by ViewVC 1.1.20