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

Diff of /eclass/eutils.eclass

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

Revision 1.181 Revision 1.228
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2005 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.181 2005/06/09 15:25:56 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.228 2006/03/10 23:24:21 vapier 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.
9# 9#
10# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
11 11
12inherit multilib 12inherit multilib portability
13ECLASS=eutils
14INHERITED="$INHERITED $ECLASS"
15 13
16DEPEND="!bootstrap? ( sys-devel/patch userland_GNU? ( sys-apps/shadow ) )" 14DEPEND="!bootstrap? ( sys-devel/patch )"
17# sys-apps/shadow is needed for useradd, etc, bug #94745. 15# sys-apps/shadow is needed for useradd, etc, bug #94745.
18 16
19DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
20 18
21# Wait for the supplied number of seconds. If no argument is supplied, defaults 19# Wait for the supplied number of seconds. If no argument is supplied, defaults
62# to point to the latest version of the library present. 60# to point to the latest version of the library present.
63# 61#
64# <azarah@gentoo.org> (26 Oct 2002) 62# <azarah@gentoo.org> (26 Oct 2002)
65# 63#
66gen_usr_ldscript() { 64gen_usr_ldscript() {
67 local libdir="$(get_libdir)" 65 local lib libdir=$(get_libdir)
68 # Just make sure it exists 66 # Just make sure it exists
69 dodir /usr/${libdir} 67 dodir /usr/${libdir}
70 68
71 for lib in "${@}" ; do 69 for lib in "${@}" ; do
72 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT 70 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
73 /* GNU ld script 71 /* GNU ld script
74 Since Gentoo has critical dynamic libraries 72 Since Gentoo has critical dynamic libraries
75 in /lib, and the static versions in /usr/lib, 73 in /lib, and the static versions in /usr/lib,
76 we need to have a "fake" dynamic lib in /usr/lib, 74 we need to have a "fake" dynamic lib in /usr/lib,
77 otherwise we run into linking problems. 75 otherwise we run into linking problems.
78 76
79 See bug http://bugs.gentoo.org/4411 for more info. 77 See bug http://bugs.gentoo.org/4411 for more info.
80 */ 78 */
81 GROUP ( /${libdir}/${lib} ) 79 GROUP ( /${libdir}/${lib} )
82 END_LDSCRIPT 80 END_LDSCRIPT
83 fperms a+x "/usr/${libdir}/${lib}" 81 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
84 done 82 done
85} 83}
86 84
87# Simple function to draw a line consisting of '=' the same length as $*
88# - only to be used by epatch()
89#
90# <azarah@gentoo.org> (11 Nov 2002)
91#
92draw_line() {
93 local i=0
94 local str_length=""
95
96 # Handle calls that do not have args, or wc not being installed ...
97 if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
98 then
99 echo "==============================================================="
100 return 0
101 fi
102
103 # Get the length of $*
104 str_length="$(echo -n "$*" | wc -m)"
105
106 while [ "$i" -lt "${str_length}" ]
107 do
108 echo -n "="
109
110 i=$((i + 1))
111 done
112
113 echo
114
115 return 0
116}
117 85
118# Default directory where patches are located 86# Default directory where patches are located
119EPATCH_SOURCE="${WORKDIR}/patch" 87EPATCH_SOURCE="${WORKDIR}/patch"
120# Default extension for patches 88# Default extension for patches
121EPATCH_SUFFIX="patch.bz2" 89EPATCH_SUFFIX="patch.bz2"
168# hand its a directory, it will set EPATCH_SOURCE to this. 136# hand its a directory, it will set EPATCH_SOURCE to this.
169# 137#
170# <azarah@gentoo.org> (10 Nov 2002) 138# <azarah@gentoo.org> (10 Nov 2002)
171# 139#
172epatch() { 140epatch() {
141 _epatch_draw_line() {
142 # this func produces a lot of pointless noise when debugging is turned on ...
143 local is_debug=0
144 [[ $- == *x* ]] && is_debug=1 && set +x
145
146 local i=0 str_length="" str_out=""
147
148 # Handle calls that do not have args, or wc not being installed ...
149 if [[ -z $1 ]] || ! type -p wc >/dev/null ; then
150 str_length=65
151 else
152 str_length=$(echo -n "$*" | wc -m)
153 fi
154
155 while ((i++ < ${str_length})) ; do
156 str_out="${str_out}="
157 done
158 echo ${str_out}
159
160 [[ ${is_debug} -eq 1 ]] && set -x
161 return 0
162 }
163 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
173 local PIPE_CMD="" 164 local PIPE_CMD=""
174 local STDERR_TARGET="${T}/$$.out" 165 local STDERR_TARGET="${T}/$$.out"
175 local PATCH_TARGET="${T}/$$.patch" 166 local PATCH_TARGET="${T}/$$.patch"
176 local PATCH_SUFFIX="" 167 local PATCH_SUFFIX=""
177 local SINGLE_PATCH="no" 168 local SINGLE_PATCH="no"
178 local x="" 169 local x=""
170
171 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
179 172
180 if [ "$#" -gt 1 ] 173 if [ "$#" -gt 1 ]
181 then 174 then
182 local m="" 175 local m=""
183 for m in "$@" ; do 176 for m in "$@" ; do
284 277
285 # Allow for prefix to differ ... im lazy, so shoot me :/ 278 # Allow for prefix to differ ... im lazy, so shoot me :/
286 while [ "${count}" -lt 5 ] 279 while [ "${count}" -lt 5 ]
287 do 280 do
288 # Generate some useful debug info ... 281 # Generate some useful debug info ...
289 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 282 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
290 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 283 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
291 284
292 if [ "${PATCH_SUFFIX}" != "patch" ] 285 if [ "${PATCH_SUFFIX}" != "patch" ]
293 then 286 then
294 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 287 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
299 292
300 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 293 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
301 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 294 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
302 295
303 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 296 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
304 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 297 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
305 298
306 if [ "${PATCH_SUFFIX}" != "patch" ] 299 if [ "${PATCH_SUFFIX}" != "patch" ]
307 then 300 then
308 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 301 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
309 then 302 then
313 count=5 306 count=5
314 break 307 break
315 fi 308 fi
316 fi 309 fi
317 310
318 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 311 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
319 then 312 then
320 draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 313 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
321 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 314 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
322 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 315 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
323 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 316 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
324 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 317 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
325 318
326 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1 319 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
320 _epatch_assert
327 321
328 if [ "$?" -ne 0 ] 322 if [ "$?" -ne 0 ]
329 then 323 then
330 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 324 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
331 echo 325 echo
377# vapier@gentoo.org 371# vapier@gentoo.org
378# 372#
379# Takes just 1 optional parameter (the directory to create tmpfile in) 373# Takes just 1 optional parameter (the directory to create tmpfile in)
380emktemp() { 374emktemp() {
381 local exe="touch" 375 local exe="touch"
382 [ "$1" == "-d" ] && exe="mkdir" && shift 376 [[ $1 == -d ]] && exe="mkdir" && shift
383 local topdir="$1" 377 local topdir=$1
384 378
385 if [ -z "${topdir}" ] 379 if [[ -z ${topdir} ]] ; then
386 then
387 [ -z "${T}" ] \ 380 [[ -z ${T} ]] \
388 && topdir="/tmp" \ 381 && topdir="/tmp" \
389 || topdir="${T}" 382 || topdir=${T}
390 fi 383 fi
391 384
392 if [ -z "$(type -p mktemp)" ] 385 if [[ -z $(type -p mktemp) ]] ; then
393 then
394 local tmp=/ 386 local tmp=/
395 while [ -e "${tmp}" ] ; do 387 while [[ -e ${tmp} ]] ; do
396 tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 388 tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
397 done 389 done
398 ${exe} "${tmp}" 390 ${exe} "${tmp}" || ${exe} -p "${tmp}"
399 echo "${tmp}" 391 echo "${tmp}"
400 else 392 else
401 [ "${exe}" == "touch" ] \ 393 if [[ ${exe} == "touch" ]] ; then
402 && exe="-p" \ 394 [[ ${USERLAND} == "GNU" ]] \
403 || exe="-d" 395 && mktemp -p "${topdir}" \
404 mktemp ${exe} "${topdir}" 396 || TMPDIR="${topdir}" mktemp -t tmp
397 else
398 [[ ${USERLAND} == "GNU" ]] \
399 && mktemp -d "${topdir}" \
400 || TMPDIR="${topdir}" mktemp -dt tmp
401 fi
405 fi 402 fi
406} 403}
407 404
408# Small wrapper for getent (Linux), nidump (Mac OS X), 405# Small wrapper for getent (Linux), nidump (Mac OS X),
409# and pw (FreeBSD) used in enewuser()/enewgroup() 406# and pw (FreeBSD) used in enewuser()/enewgroup()
410# Joe Jezak <josejx@gmail.com> and usata@gentoo.org 407# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
411# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org> 408# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
412# 409#
413# egetent(database, key) 410# egetent(database, key)
414egetent() { 411egetent() {
415 if [[ "${USERLAND}" == "Darwin" ]] ; then 412 case ${CHOST} in
413 *-darwin*)
416 case "$2" in 414 case "$2" in
417 *[!0-9]*) # Non numeric 415 *[!0-9]*) # Non numeric
418 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 416 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
419 ;; 417 ;;
420 *) # Numeric 418 *) # Numeric
421 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 419 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
422 ;; 420 ;;
423 esac 421 esac
424 elif [[ "${USERLAND}" == "BSD" ]] ; then 422 ;;
425 local action 423 *-freebsd*|*-dragonfly*)
426 if [ "$1" == "passwd" ] 424 local opts action="user"
427 then 425 [[ $1 == "passwd" ]] || action="group"
428 action="user" 426
429 else 427 # lookup by uid/gid
430 action="group" 428 if [[ $2 == [[:digit:]]* ]] ; then
429 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
431 fi 430 fi
431
432 pw show "${action}" "$2" -q 432 pw show ${action} ${opts} "$2" -q
433 else 433 ;;
434 *-netbsd*|*-openbsd*)
435 grep "$2:\*:" /etc/$1
436 ;;
437 *)
434 which nscd >& /dev/null && nscd -i "$1" 438 type -p nscd >& /dev/null && nscd -i "$1"
435 getent "$1" "$2" 439 getent "$1" "$2"
436 fi 440 ;;
441 esac
437} 442}
438 443
439# Simplify/standardize adding users to the system 444# Simplify/standardize adding users to the system
440# vapier@gentoo.org 445# vapier@gentoo.org
441# 446#
449# homedir: /dev/null 454# homedir: /dev/null
450# groups: none 455# groups: none
451# extra: comment of 'added by portage for ${PN}' 456# extra: comment of 'added by portage for ${PN}'
452enewuser() { 457enewuser() {
453 # get the username 458 # get the username
454 local euser="$1"; shift 459 local euser=$1; shift
455 if [ -z "${euser}" ] 460 if [[ -z ${euser} ]] ; then
456 then
457 eerror "No username specified !" 461 eerror "No username specified !"
458 die "Cannot call enewuser without a username" 462 die "Cannot call enewuser without a username"
459 fi 463 fi
460 464
461 # lets see if the username already exists 465 # lets see if the username already exists
462 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ] 466 if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then
463 then
464 return 0 467 return 0
465 fi 468 fi
466 einfo "Adding user '${euser}' to your system ..." 469 einfo "Adding user '${euser}' to your system ..."
467 470
468 # options to pass to useradd 471 # options to pass to useradd
469 local opts= 472 local opts=
470 473
471 # handle uid 474 # handle uid
472 local euid="$1"; shift 475 local euid=$1; shift
473 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] 476 if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then
474 then
475 if [ "${euid}" -gt 0 ] 477 if [[ ${euid} -gt 0 ]] ; then
476 then
477 if [ ! -z "`egetent passwd ${euid}`" ] 478 if [[ ! -z $(egetent passwd ${euid}) ]] ; then
478 then
479 euid="next" 479 euid="next"
480 fi 480 fi
481 else 481 else
482 eerror "Userid given but is not greater than 0 !" 482 eerror "Userid given but is not greater than 0 !"
483 die "${euid} is not a valid UID" 483 die "${euid} is not a valid UID"
484 fi 484 fi
485 else 485 else
486 euid="next" 486 euid="next"
487 fi 487 fi
488 if [ "${euid}" == "next" ] 488 if [[ ${euid} == "next" ]] ; then
489 then 489 for euid in $(seq 101 999) ; do
490 local pwrange
491 if [ "${USERLAND}" == "BSD" ] ; then
492 pwrange="`jot 898 101`"
493 else
494 pwrange="`seq 101 999`"
495 fi
496 for euid in ${pwrange} ; do
497 [ -z "`egetent passwd ${euid}`" ] && break 490 [[ -z $(egetent passwd ${euid}) ]] && break
498 done 491 done
499 fi 492 fi
500 opts="${opts} -u ${euid}" 493 opts="${opts} -u ${euid}"
501 einfo " - Userid: ${euid}" 494 einfo " - Userid: ${euid}"
502 495
503 # handle shell 496 # handle shell
504 local eshell="$1"; shift 497 local eshell=$1; shift
505 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] 498 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
506 then 499 if [[ ! -e ${ROOT}${eshell} ]] ; then
507 if [ ! -e "${eshell}" ]
508 then
509 eerror "A shell was specified but it does not exist !" 500 eerror "A shell was specified but it does not exist !"
510 die "${eshell} does not exist" 501 die "${eshell} does not exist in ${ROOT}"
511 fi 502 fi
512 else 503 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
513 if [[ "${USERLAND}" == "Darwin" ]]; then 504 eerror "Do not specify ${eshell} yourself, use -1"
514 eshell="/usr/bin/false" 505 die "Pass '-1' as the shell parameter"
515 elif [[ "${USERLAND}" == "BSD" ]]; then 506 fi
516 eshell="/usr/sbin/nologin"
517 else 507 else
518 eshell="/bin/false" 508 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
509 [[ -x ${ROOT}${shell} ]] && break
510 done
511
512 if [[ ${shell} == "/dev/null" ]] ; then
513 eerror "Unable to identify the shell to use"
514 die "Unable to identify the shell to use"
519 fi 515 fi
516
517 eshell=${shell}
520 fi 518 fi
521 einfo " - Shell: ${eshell}" 519 einfo " - Shell: ${eshell}"
522 opts="${opts} -s ${eshell}" 520 opts="${opts} -s ${eshell}"
523 521
524 # handle homedir 522 # handle homedir
525 local ehome="$1"; shift 523 local ehome=$1; shift
526 if [ -z "${ehome}" ] || [ "${ehome}" == "-1" ] 524 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
527 then
528 ehome="/dev/null" 525 ehome="/dev/null"
529 fi 526 fi
530 einfo " - Home: ${ehome}" 527 einfo " - Home: ${ehome}"
531 opts="${opts} -d ${ehome}" 528 opts="${opts} -d ${ehome}"
532 529
533 # handle groups 530 # handle groups
534 local egroups="$1"; shift 531 local egroups=$1; shift
535 if [ ! -z "${egroups}" ] 532 if [[ ! -z ${egroups} ]] ; then
536 then
537 local oldifs="${IFS}" 533 local oldifs=${IFS}
538 local defgroup="" exgroups="" 534 local defgroup="" exgroups=""
539 535
540 export IFS="," 536 export IFS=","
541 for g in ${egroups} 537 for g in ${egroups} ; do
542 do
543 export IFS="${oldifs}" 538 export IFS=${oldifs}
544 if [ -z "`egetent group \"${g}\"`" ] 539 if [[ -z $(egetent group "${g}") ]] ; then
545 then
546 eerror "You must add group ${g} to the system first" 540 eerror "You must add group ${g} to the system first"
547 die "${g} is not a valid GID" 541 die "${g} is not a valid GID"
548 fi 542 fi
549 if [ -z "${defgroup}" ] 543 if [[ -z ${defgroup} ]] ; then
550 then
551 defgroup="${g}" 544 defgroup=${g}
552 else 545 else
553 exgroups="${exgroups},${g}" 546 exgroups="${exgroups},${g}"
554 fi 547 fi
555 export IFS="," 548 export IFS=","
556 done 549 done
557 export IFS="${oldifs}" 550 export IFS=${oldifs}
558 551
559 opts="${opts} -g ${defgroup}" 552 opts="${opts} -g ${defgroup}"
560 if [ ! -z "${exgroups}" ] 553 if [[ ! -z ${exgroups} ]] ; then
561 then
562 opts="${opts} -G ${exgroups:1}" 554 opts="${opts} -G ${exgroups:1}"
563 fi 555 fi
564 else 556 else
565 egroups="(none)" 557 egroups="(none)"
566 fi 558 fi
567 einfo " - Groups: ${egroups}" 559 einfo " - Groups: ${egroups}"
568 560
569 # handle extra and add the user 561 # handle extra and add the user
570 local eextra="$@"
571 local oldsandbox="${SANDBOX_ON}" 562 local oldsandbox=${SANDBOX_ON}
572 export SANDBOX_ON="0" 563 export SANDBOX_ON="0"
573 if [[ "${USERLAND}" == "Darwin" ]] 564 case ${CHOST} in
574 then 565 *-darwin*)
575 ### Make the user 566 ### Make the user
576 if [ -z "${eextra}" ] 567 if [[ -z $@ ]] ; then
577 then
578 dscl . create /users/${euser} uid ${euid} 568 dscl . create /users/${euser} uid ${euid}
579 dscl . create /users/${euser} shell ${eshell} 569 dscl . create /users/${euser} shell ${eshell}
580 dscl . create /users/${euser} home ${ehome} 570 dscl . create /users/${euser} home ${ehome}
581 dscl . create /users/${euser} realname "added by portage for ${PN}" 571 dscl . create /users/${euser} realname "added by portage for ${PN}"
582 ### Add the user to the groups specified 572 ### Add the user to the groups specified
583 local oldifs="${IFS}" 573 local oldifs=${IFS}
584 export IFS="," 574 export IFS=","
585 for g in ${egroups} 575 for g in ${egroups} ; do
586 do
587 dscl . merge /groups/${g} users ${euser} 576 dscl . merge /groups/${g} users ${euser}
588 done 577 done
589 export IFS="${oldifs}" 578 export IFS=${oldifs}
590 else 579 else
591 einfo "Extra options are not supported on macos yet" 580 einfo "Extra options are not supported on Darwin yet"
592 einfo "Please report the ebuild along with the info below" 581 einfo "Please report the ebuild along with the info below"
593 einfo "eextra: ${eextra}" 582 einfo "eextra: $@"
594 die "Required function missing" 583 die "Required function missing"
595 fi 584 fi
596 elif [[ "${USERLAND}" == "BSD" ]] ; then 585 ;;
597 if [ -z "${eextra}" ] 586 *-freebsd*|*-dragonfly*)
598 then 587 if [[ -z $@ ]] ; then
599 pw useradd ${euser} ${opts} \ 588 pw useradd ${euser} ${opts} \
600 -c "added by portage for ${PN}" \ 589 -c "added by portage for ${PN}" \
601 die "enewuser failed" 590 die "enewuser failed"
602 else 591 else
603 einfo " - Extra: ${eextra}" 592 einfo " - Extra: $@"
604 pw useradd ${euser} ${opts} \ 593 pw useradd ${euser} ${opts} \
605 -c ${eextra} || die "enewuser failed" 594 "$@" || die "enewuser failed"
606 fi 595 fi
596 ;;
597
598 *-netbsd*)
599 if [[ -z $@ ]] ; then
600 useradd ${opts} ${euser} || die "enewuser failed"
607 else 601 else
608 if [ -z "${eextra}" ] 602 einfo " - Extra: $@"
609 then 603 useradd ${opts} ${euser} "$@" || die "enewuser failed"
604 fi
605 ;;
606
607 *-openbsd*)
608 if [[ -z $@ ]] ; then
609 useradd -u ${euid} -s ${eshell} \
610 -d ${ehome} -c "Added by portage for ${PN}" \
611 -g ${egroups} ${euser} || die "enewuser failed"
612 else
613 einfo " - Extra: $@"
614 useradd -u ${euid} -s ${eshell} \
615 -d ${ehome} -c "Added by portage for ${PN}" \
616 -g ${egroups} ${euser} "$@" || die "enewuser failed"
617 fi
618 ;;
619
620 *)
621 if [[ -z $@ ]] ; then
610 useradd ${opts} ${euser} \ 622 useradd ${opts} ${euser} \
611 -c "added by portage for ${PN}" \ 623 -c "added by portage for ${PN}" \
612 || die "enewuser failed" 624 || die "enewuser failed"
613 else 625 else
614 einfo " - Extra: ${eextra}" 626 einfo " - Extra: $@"
615 useradd ${opts} ${euser} ${eextra} \ 627 useradd ${opts} ${euser} "$@" \
616 || die "enewuser failed" 628 || die "enewuser failed"
617 fi 629 fi
630 ;;
631 esac
632
633 if [[ ! -e ${ROOT}/${ehome} ]] ; then
634 einfo " - Creating ${ehome} in ${ROOT}"
635 mkdir -p "${ROOT}/${ehome}"
636 chown ${euser} "${ROOT}/${ehome}"
637 chmod 755 "${ROOT}/${ehome}"
618 fi 638 fi
639
619 export SANDBOX_ON="${oldsandbox}" 640 export SANDBOX_ON=${oldsandbox}
620
621 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
622 then
623 einfo " - Creating ${ehome} in ${D}"
624 dodir ${ehome}
625 fowners ${euser} ${ehome}
626 fperms 755 ${ehome}
627 fi
628} 641}
629 642
630# Simplify/standardize adding groups to the system 643# Simplify/standardize adding groups to the system
631# vapier@gentoo.org 644# vapier@gentoo.org
632# 645#
661 then 674 then
662 if [ "${egid}" -gt 0 ] 675 if [ "${egid}" -gt 0 ]
663 then 676 then
664 if [ -z "`egetent group ${egid}`" ] 677 if [ -z "`egetent group ${egid}`" ]
665 then 678 then
666 if [[ "${USERLAND}" == "Darwin" ]]; then 679 if [[ "${CHOST}" == *-darwin* ]]; then
667 opts="${opts} ${egid}" 680 opts="${opts} ${egid}"
668 else 681 else
669 opts="${opts} -g ${egid}" 682 opts="${opts} -g ${egid}"
670 fi 683 fi
671 else 684 else
685 opts="${opts} ${eextra}" 698 opts="${opts} ${eextra}"
686 699
687 # add the group 700 # add the group
688 local oldsandbox="${SANDBOX_ON}" 701 local oldsandbox="${SANDBOX_ON}"
689 export SANDBOX_ON="0" 702 export SANDBOX_ON="0"
690 if [[ "${USERLAND}" == "Darwin" ]]; then 703 case ${CHOST} in
704 *-darwin*)
691 if [ ! -z "${eextra}" ]; 705 if [ ! -z "${eextra}" ];
692 then 706 then
693 einfo "Extra options are not supported on Darwin/OS X yet" 707 einfo "Extra options are not supported on Darwin/OS X yet"
694 einfo "Please report the ebuild along with the info below" 708 einfo "Please report the ebuild along with the info below"
695 einfo "eextra: ${eextra}" 709 einfo "eextra: ${eextra}"
696 die "Required function missing" 710 die "Required function missing"
697 fi 711 fi
698 712
699 # If we need the next available 713 # If we need the next available
700 case ${egid} in 714 case ${egid} in
701 *[!0-9]*) # Non numeric 715 *[!0-9]*) # Non numeric
702 for egid in `jot 898 101`; do 716 for egid in $(seq 101 999); do
703 [ -z "`egetent group ${egid}`" ] && break 717 [ -z "`egetent group ${egid}`" ] && break
704 done 718 done
705 esac 719 esac
706 dscl . create /groups/${egroup} gid ${egid} 720 dscl . create /groups/${egroup} gid ${egid}
707 dscl . create /groups/${egroup} passwd '*' 721 dscl . create /groups/${egroup} passwd '*'
708 elif [[ "${USERLAND}" == "BSD" ]] ; then 722 ;;
723
724 *-freebsd*|*-dragonfly*)
709 case ${egid} in 725 case ${egid} in
710 *[!0-9]*) # Non numeric 726 *[!0-9]*) # Non numeric
711 for egid in `jot 898 101`; do 727 for egid in $(seq 101 999); do
712 [ -z "`egetent group ${egid}`" ] && break 728 [ -z "`egetent group ${egid}`" ] && break
713 done 729 done
714 esac 730 esac
715 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed" 731 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
716 else 732 ;;
733
734 *-netbsd*)
735 case ${egid} in
736 *[!0-9]*) # Non numeric
737 for egid in $(seq 101 999); do
738 [ -z "`egetent group ${egid}`" ] && break
739 done
740 esac
741 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
742 ;;
743
744 *)
717 groupadd ${opts} ${egroup} || die "enewgroup failed" 745 groupadd ${opts} ${egroup} || die "enewgroup failed"
718 fi 746 ;;
747 esac
719 export SANDBOX_ON="${oldsandbox}" 748 export SANDBOX_ON="${oldsandbox}"
720} 749}
721 750
722# Simple script to replace 'dos2unix' binaries 751# Simple script to replace 'dos2unix' binaries
723# vapier@gentoo.org 752# vapier@gentoo.org
748# name: the name that will show up in the menu 777# name: the name that will show up in the menu
749# icon: give your little like a pretty little icon ... 778# icon: give your little like a pretty little icon ...
750# this can be relative (to /usr/share/pixmaps) or 779# this can be relative (to /usr/share/pixmaps) or
751# a full path to an icon 780# a full path to an icon
752# type: what kind of application is this ? for categories: 781# type: what kind of application is this ? for categories:
753# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec 782# http://www.freedesktop.org/Standards/desktop-entry-spec
754# path: if your app needs to startup in a specific dir 783# path: if your app needs to startup in a specific dir
755make_desktop_entry() { 784make_desktop_entry() {
756 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1 785 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
757 786
758 local exec=${1} 787 local exec=${1}
784 dev) 813 dev)
785 type="Development" 814 type="Development"
786 ;; 815 ;;
787 816
788 games) 817 games)
789 [[ -z ${path} ]] && path=${GAMES_BINDIR}
790
791 case ${catmin} in 818 case ${catmin} in
792 action) type=ActionGame;; 819 action) type=ActionGame;;
793 arcade) type=ArcadeGame;; 820 arcade) type=ArcadeGame;;
794 board) type=BoardGame;; 821 board) type=BoardGame;;
795 kid) type=KidsGame;; 822 kid) type=KidsGame;;
836 type="Network;${type}" 863 type="Network;${type}"
837 ;; 864 ;;
838 865
839 sci) 866 sci)
840 case ${catmin} in 867 case ${catmin} in
841 astro*) type=Astronomoy;; 868 astro*) type=Astronomy;;
842 bio*) type=Biology;; 869 bio*) type=Biology;;
843 calc*) type=Calculator;; 870 calc*) type=Calculator;;
844 chem*) type=Chemistry;; 871 chem*) type=Chemistry;;
845 geo*) type=Geology;; 872 geo*) type=Geology;;
846 math*) type=Math;; 873 math*) type=Math;;
878Exec=${exec} 905Exec=${exec}
879Path=${path} 906Path=${path}
880Icon=${icon} 907Icon=${icon}
881Categories=Application;${type};" > "${desktop}" 908Categories=Application;${type};" > "${desktop}"
882 909
910 (
911 # wrap the env here so that the 'insinto' call
912 # doesn't corrupt the env of the caller
883 insinto /usr/share/applications 913 insinto /usr/share/applications
884 doins "${desktop}" 914 doins "${desktop}"
885 915 )
886 return 0
887} 916}
888 917
889# Make a GDM/KDM Session file 918# Make a GDM/KDM Session file
890# 919#
891# make_desktop_entry(<title>, <command>) 920# make_desktop_entry(<title>, <command>)
920 doins "${i}" 949 doins "${i}"
921 elif [[ -d ${i} ]] ; then 950 elif [[ -d ${i} ]] ; then
922 for j in "${i}"/*.desktop ; do 951 for j in "${i}"/*.desktop ; do
923 doins "${j}" 952 doins "${j}"
924 done 953 done
925 fi 954 fi
926 done 955 done
927} 956}
928newmenu() { 957newmenu() {
929 insinto /usr/share/applications 958 insinto /usr/share/applications
930 newins "$1" "$2" 959 newins "$1" "$2"
938 doins "${i}" 967 doins "${i}"
939 elif [[ -d ${i} ]] ; then 968 elif [[ -d ${i} ]] ; then
940 for j in "${i}"/*.png ; do 969 for j in "${i}"/*.png ; do
941 doins "${j}" 970 doins "${j}"
942 done 971 done
943 fi 972 fi
944 done 973 done
945} 974}
946newicon() { 975newicon() {
947 insinto /usr/share/pixmaps 976 insinto /usr/share/pixmaps
948 newins "$1" "$2" 977 newins "$1" "$2"
953############################################################## 982##############################################################
954 983
955 984
956# for internal use only (unpack_pdv and unpack_makeself) 985# for internal use only (unpack_pdv and unpack_makeself)
957find_unpackable_file() { 986find_unpackable_file() {
958 local src="$1" 987 local src=$1
959 if [ -z "${src}" ] 988 if [[ -z ${src} ]] ; then
960 then
961 src="${DISTDIR}/${A}" 989 src=${DISTDIR}/${A}
962 else 990 else
963 if [ -e "${DISTDIR}/${src}" ] 991 if [[ -e ${DISTDIR}/${src} ]] ; then
964 then
965 src="${DISTDIR}/${src}" 992 src=${DISTDIR}/${src}
966 elif [ -e "${PWD}/${src}" ] 993 elif [[ -e ${PWD}/${src} ]] ; then
967 then
968 src="${PWD}/${src}" 994 src=${PWD}/${src}
969 elif [ -e "${src}" ] 995 elif [[ -e ${src} ]] ; then
970 then
971 src="${src}" 996 src=${src}
972 fi
973 fi 997 fi
974 [ ! -e "${src}" ] && die "Could not find requested archive ${src}" 998 fi
999 [[ ! -e ${src} ]] && return 1
975 echo "${src}" 1000 echo "${src}"
976} 1001}
977 1002
978# Unpack those pesky pdv generated files ... 1003# Unpack those pesky pdv generated files ...
979# They're self-unpacking programs with the binary package stuffed in 1004# They're self-unpacking programs with the binary package stuffed in
994# lseek 1019# lseek
995# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin 1020# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
996# lseek(3, -4, SEEK_END) = 2981250 1021# lseek(3, -4, SEEK_END) = 2981250
997# thus we would pass in the value of '4' as the second parameter. 1022# thus we would pass in the value of '4' as the second parameter.
998unpack_pdv() { 1023unpack_pdv() {
999 local src="`find_unpackable_file $1`" 1024 local src=$(find_unpackable_file $1)
1000 local sizeoff_t="$2" 1025 local sizeoff_t=$2
1001 1026
1027 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1002 [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :(" 1028 [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1003 1029
1004 local shrtsrc="`basename ${src}`" 1030 local shrtsrc=$(basename "${src}")
1005 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1031 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1006 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"` 1032 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1007 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"` 1033 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1008 1034
1009 # grab metadata for debug reasons 1035 # grab metadata for debug reasons
1073# Usage: unpack_makeself [file to unpack] [offset] [tail|dd] 1099# Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1074# - If the file is not specified then unpack will utilize ${A}. 1100# - If the file is not specified then unpack will utilize ${A}.
1075# - If the offset is not specified then we will attempt to extract 1101# - If the offset is not specified then we will attempt to extract
1076# the proper offset from the script itself. 1102# the proper offset from the script itself.
1077unpack_makeself() { 1103unpack_makeself() {
1104 local src_input=${1:-${A}}
1078 local src="$(find_unpackable_file "$1")" 1105 local src=$(find_unpackable_file "${src_input}")
1079 local skip="$2" 1106 local skip=$2
1080 local exe="$3" 1107 local exe=$3
1081 1108
1109 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1110
1082 local shrtsrc="$(basename "${src}")" 1111 local shrtsrc=$(basename "${src}")
1083 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1112 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1084 if [ -z "${skip}" ] 1113 if [[ -z ${skip} ]] ; then
1085 then
1086 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`" 1114 local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1087 local skip=0 1115 local skip=0
1088 exe=tail 1116 exe=tail
1089 case ${ver} in 1117 case ${ver} in
1090 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1118 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1091 skip=$(grep -a ^skip= "${src}" | cut -d= -f2) 1119 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1103 ;; 1131 ;;
1104 2.1.3) 1132 2.1.3)
1105 skip=`grep -a ^offset= "${src}" | awk '{print $3}'` 1133 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1106 let skip="skip + 1" 1134 let skip="skip + 1"
1107 ;; 1135 ;;
1108 2.1.4) 1136 2.1.4|2.1.5)
1109 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) 1137 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1110 skip=$(head -n ${skip} "${src}" | wc -c) 1138 skip=$(head -n ${skip} "${src}" | wc -c)
1111 exe="dd" 1139 exe="dd"
1112 ;; 1140 ;;
1113 *) 1141 *)
1158check_license() { 1186check_license() {
1159 local lic=$1 1187 local lic=$1
1160 if [ -z "${lic}" ] ; then 1188 if [ -z "${lic}" ] ; then
1161 lic="${PORTDIR}/licenses/${LICENSE}" 1189 lic="${PORTDIR}/licenses/${LICENSE}"
1162 else 1190 else
1163 if [ -e "${PORTDIR}/licenses/${src}" ] ; then 1191 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1164 lic="${PORTDIR}/licenses/${src}" 1192 lic="${PORTDIR}/licenses/${lic}"
1165 elif [ -e "${PWD}/${src}" ] ; then 1193 elif [ -e "${PWD}/${lic}" ] ; then
1166 lic="${PWD}/${src}" 1194 lic="${PWD}/${lic}"
1167 elif [ -e "${src}" ] ; then 1195 elif [ -e "${lic}" ] ; then
1168 lic="${src}" 1196 lic="${lic}"
1169 fi
1170 fi 1197 fi
1198 fi
1171 [ ! -f "${lic}" ] && die "Could not find requested license ${src}" 1199 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1172 local l="`basename ${lic}`" 1200 local l="`basename ${lic}`"
1173 1201
1174 # here is where we check for the licenses the user already 1202 # here is where we check for the licenses the user already
1175 # accepted ... if we don't find a match, we make the user accept 1203 # accepted ... if we don't find a match, we make the user accept
1176 local shopts=$- 1204 local shopts=$-
1232 # first we figure out how many cds we're dealing with by 1260 # first we figure out how many cds we're dealing with by
1233 # the # of files they gave us 1261 # the # of files they gave us
1234 local cdcnt=0 1262 local cdcnt=0
1235 local f= 1263 local f=
1236 for f in "$@" ; do 1264 for f in "$@" ; do
1237 cdcnt=$((cdcnt + 1)) 1265 ((++cdcnt))
1238 export CDROM_CHECK_${cdcnt}="$f" 1266 export CDROM_CHECK_${cdcnt}="$f"
1239 done 1267 done
1240 export CDROM_TOTAL_CDS=${cdcnt} 1268 export CDROM_TOTAL_CDS=${cdcnt}
1241 export CDROM_CURRENT_CD=1 1269 export CDROM_CURRENT_CD=1
1242 1270
1243 # now we see if the user gave use CD_ROOT ... 1271 # now we see if the user gave use CD_ROOT ...
1244 # if they did, let's just believe them that it's correct 1272 # if they did, let's just believe them that it's correct
1245 if [[ ! -z ${CD_ROOT} ]] ; then
1246 export CDROM_ROOT=${CD_ROOT}
1247 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1248 return
1249 fi
1250 # do the same for CD_ROOT_X
1251 if [[ ! -z ${CD_ROOT_1} ]] ; then 1273 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1252 local var= 1274 local var=
1253 cdcnt=0 1275 cdcnt=0
1254 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1276 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1255 cdcnt=$((cdcnt + 1)) 1277 ((++cdcnt))
1256 var="CD_ROOT_${cdcnt}" 1278 var="CD_ROOT_${cdcnt}"
1279 [[ -z ${!var} ]] && var="CD_ROOT"
1257 if [[ -z ${!var} ]] ; then 1280 if [[ -z ${!var} ]] ; then
1258 eerror "You must either use just the CD_ROOT" 1281 eerror "You must either use just the CD_ROOT"
1259 eerror "or specify ALL the CD_ROOT_X variables." 1282 eerror "or specify ALL the CD_ROOT_X variables."
1260 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables." 1283 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1261 die "could not locate CD_ROOT_${cdcnt}" 1284 die "could not locate CD_ROOT_${cdcnt}"
1262 fi 1285 fi
1263 export CDROM_ROOTS_${cdcnt}="${!var}"
1264 done 1286 done
1265 export CDROM_ROOT=${CDROM_ROOTS_1} 1287 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1266 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1288 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1289 export CDROM_SET=-1
1290 for f in ${CDROM_CHECK_1//:/ } ; do
1291 ((++CDROM_SET))
1292 [[ -e ${CD_ROOT}/${f} ]] && break
1293 done
1294 export CDROM_MATCH=${f}
1267 return 1295 return
1268 fi 1296 fi
1269 1297
1298 # User didn't help us out so lets make sure they know they can
1299 # simplify the whole process ...
1270 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then 1300 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1271 einfon "This ebuild will need the " 1301 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1272 if [[ -z ${CDROM_NAME} ]] ; then
1273 echo "cdrom for ${PN}."
1274 else
1275 echo "${CDROM_NAME}."
1276 fi
1277 echo 1302 echo
1278 einfo "If you do not have the CD, but have the data files" 1303 einfo "If you do not have the CD, but have the data files"
1279 einfo "mounted somewhere on your filesystem, just export" 1304 einfo "mounted somewhere on your filesystem, just export"
1280 einfo "the variable CD_ROOT so that it points to the" 1305 einfo "the variable CD_ROOT so that it points to the"
1281 einfo "directory containing the files." 1306 einfo "directory containing the files."
1285 echo 1310 echo
1286 else 1311 else
1287 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds." 1312 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1288 cdcnt=0 1313 cdcnt=0
1289 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1314 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1290 cdcnt=$((cdcnt + 1)) 1315 ((++cdcnt))
1291 var="CDROM_NAME_${cdcnt}" 1316 var="CDROM_NAME_${cdcnt}"
1292 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}" 1317 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1293 done 1318 done
1294 echo 1319 echo
1295 einfo "If you do not have the CDs, but have the data files" 1320 einfo "If you do not have the CDs, but have the data files"
1296 einfo "mounted somewhere on your filesystem, just export" 1321 einfo "mounted somewhere on your filesystem, just export"
1297 einfo "the following variables so they point to the right place:" 1322 einfo "the following variables so they point to the right place:"
1298 einfon "" 1323 einfon ""
1299 cdcnt=0 1324 cdcnt=0
1300 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1325 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1301 cdcnt=$((cdcnt + 1)) 1326 ((++cdcnt))
1302 echo -n " CD_ROOT_${cdcnt}" 1327 echo -n " CD_ROOT_${cdcnt}"
1303 done 1328 done
1304 echo 1329 echo
1305 einfo "Or, if you have all the files in the same place, or" 1330 einfo "Or, if you have all the files in the same place, or"
1306 einfo "you only have one cdrom, you can export CD_ROOT" 1331 einfo "you only have one cdrom, you can export CD_ROOT"
1309 echo 1334 echo
1310 einfo "For example:" 1335 einfo "For example:"
1311 einfo "export CD_ROOT_1=/mnt/cdrom" 1336 einfo "export CD_ROOT_1=/mnt/cdrom"
1312 echo 1337 echo
1313 fi 1338 fi
1339
1340 export CDROM_SET=""
1314 export CDROM_CURRENT_CD=0 1341 export CDROM_CURRENT_CD=0
1315 cdrom_load_next_cd 1342 cdrom_load_next_cd
1316} 1343}
1317 1344
1318# this is only used when you need access to more than one cd. 1345# this is only used when you need access to more than one cd.
1319# when you have finished using the first cd, just call this function. 1346# when you have finished using the first cd, just call this function.
1320# when it returns, CDROM_ROOT will be pointing to the second cd. 1347# when it returns, CDROM_ROOT will be pointing to the second cd.
1321# remember, you can only go forward in the cd chain, you can't go back. 1348# remember, you can only go forward in the cd chain, you can't go back.
1322cdrom_load_next_cd() { 1349cdrom_load_next_cd() {
1323 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1324 local var= 1350 local var
1325 1351 ((++CDROM_CURRENT_CD))
1326 if [[ ! -z ${CD_ROOT} ]] ; then
1327 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1328 return
1329 fi
1330 1352
1331 unset CDROM_ROOT 1353 unset CDROM_ROOT
1332 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1354 var=CD_ROOT_${CDROM_CURRENT_CD}
1355 [[ -z ${!var} ]] && var="CD_ROOT"
1333 if [[ -z ${!var} ]] ; then 1356 if [[ -z ${!var} ]] ; then
1334 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1357 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1335 cdrom_locate_file_on_cd ${!var} 1358 _cdrom_locate_file_on_cd ${!var}
1336 else 1359 else
1337 export CDROM_ROOT=${!var} 1360 export CDROM_ROOT=${!var}
1338 fi 1361 fi
1339 1362
1340 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1363 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1345# all it does is try to locate a give file on a cd ... if the cd isn't 1368# all it does is try to locate a give file on a cd ... if the cd isn't
1346# found, then a message asking for the user to insert the cdrom will be 1369# found, then a message asking for the user to insert the cdrom will be
1347# displayed and we'll hang out here until: 1370# displayed and we'll hang out here until:
1348# (1) the file is found on a mounted cdrom 1371# (1) the file is found on a mounted cdrom
1349# (2) the user hits CTRL+C 1372# (2) the user hits CTRL+C
1350cdrom_locate_file_on_cd() { 1373_cdrom_locate_file_on_cd() {
1374 local mline=""
1375 local showedmsg=0
1376
1351 while [[ -z ${CDROM_ROOT} ]] ; do 1377 while [[ -z ${CDROM_ROOT} ]] ; do
1378 local i=0
1379 local -a cdset=(${*//:/ })
1380 if [[ -n ${CDROM_SET} ]] ; then
1381 cdset=(${cdset[${CDROM_SET}]})
1382 fi
1383
1384 while [[ -n ${cdset[${i}]} ]] ; do
1352 local dir="$(dirname ${@})" 1385 local dir=$(dirname ${cdset[${i}]})
1353 local file="$(basename ${@})" 1386 local file=$(basename ${cdset[${i}]})
1354 local mline=""
1355 local showedmsg=0
1356 1387
1357 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do 1388 for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do
1358 [[ -d ${mline}/${dir} ]] || continue 1389 [[ -d ${mline}/${dir} ]] || continue
1359 [[ ! -z $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] \ 1390 if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then
1360 && export CDROM_ROOT=${mline} 1391 export CDROM_ROOT=${mline}
1392 export CDROM_SET=${i}
1393 export CDROM_MATCH=${cdset[${i}]}
1394 return
1395 fi
1396 done
1397
1398 ((++i))
1361 done 1399 done
1362 1400
1363 if [[ -z ${CDROM_ROOT} ]] ; then
1364 echo 1401 echo
1365 if [[ ${showedmsg} -eq 0 ]] ; then 1402 if [[ ${showedmsg} -eq 0 ]] ; then
1366 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then 1403 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1367 if [[ -z ${CDROM_NAME} ]] ; then 1404 if [[ -z ${CDROM_NAME} ]] ; then
1368 einfo "Please insert the cdrom for ${PN} now !" 1405 einfo "Please insert+mount the cdrom for ${PN} now !"
1369 else
1370 einfo "Please insert the ${CDROM_NAME} cdrom now !"
1371 fi
1372 else 1406 else
1373 if [[ -z ${CDROM_NAME_1} ]] ; then
1374 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1375 else
1376 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1377 einfo "Please insert+mount the ${!var} cdrom now !" 1407 einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1378 fi
1379 fi 1408 fi
1380 showedmsg=1 1409 else
1410 if [[ -z ${CDROM_NAME_1} ]] ; then
1411 einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1412 else
1413 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1414 einfo "Please insert+mount the ${!var} cdrom now !"
1415 fi
1381 fi 1416 fi
1417 showedmsg=1
1418 fi
1382 einfo "Press return to scan for the cd again" 1419 einfo "Press return to scan for the cd again"
1383 einfo "or hit CTRL+C to abort the emerge." 1420 einfo "or hit CTRL+C to abort the emerge."
1384 read 1421 echo
1385 fi 1422 einfo "If you are having trouble with the detection"
1423 einfo "of your CD, it is possible that you do not have"
1424 einfo "Joliet support enabled in your kernel. Please"
1425 einfo "check that CONFIG_JOLIET is enabled in your kernel."
1426 read || die "something is screwed with your system"
1386 done 1427 done
1387} 1428}
1388 1429
1389# Make sure that LINGUAS only contains languages that 1430# Make sure that LINGUAS only contains languages that
1390# a package can support 1431# a package can support
1400# directories and uses the union of the lists. 1441# directories and uses the union of the lists.
1401strip-linguas() { 1442strip-linguas() {
1402 local ls newls 1443 local ls newls
1403 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then 1444 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1404 local op=$1; shift 1445 local op=$1; shift
1405 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift 1446 ls=" $(find "$1" -name '*.po' -exec basename {} \;) "; shift
1406 local d f 1447 local d f
1407 for d in "$@" ; do 1448 for d in "$@" ; do
1408 if [[ ${op} == "-u" ]] ; then 1449 if [[ ${op} == "-u" ]] ; then
1409 newls=${ls} 1450 newls=${ls}
1410 else 1451 else
1411 newls="" 1452 newls=""
1412 fi 1453 fi
1413 for f in $(find "$d" -name '*.po' -printf '%f ') ; do 1454 for f in $(find "$d" -name '*.po' -exec basename {} \;) ; do
1414 if [[ ${op} == "-i" ]] ; then 1455 if [[ ${op} == "-i" ]] ; then
1415 [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}" 1456 [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1416 else 1457 else
1417 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}" 1458 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1418 fi 1459 fi
1474 1515
1475# Jeremy Huddleston <eradicator@gentoo.org>: 1516# Jeremy Huddleston <eradicator@gentoo.org>:
1476# preserve_old_lib /path/to/libblah.so.0 1517# preserve_old_lib /path/to/libblah.so.0
1477# preserve_old_lib_notify /path/to/libblah.so.0 1518# preserve_old_lib_notify /path/to/libblah.so.0
1478# 1519#
1479# These functions are useful when a lib in your package changes --soname. Such 1520# These functions are useful when a lib in your package changes --library. Such
1480# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0 1521# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1481# would break packages that link against it. Most people get around this 1522# would break packages that link against it. Most people get around this
1482# by using the portage SLOT mechanism, but that is not always a relevant 1523# by using the portage SLOT mechanism, but that is not always a relevant
1483# solution, so instead you can add the following to your ebuilds: 1524# solution, so instead you can add the following to your ebuilds:
1484# 1525#
1511 LIB=$1 1552 LIB=$1
1512 1553
1513 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then 1554 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1514 SONAME=`basename ${LIB}` 1555 SONAME=`basename ${LIB}`
1515 1556
1516 einfo "An old version of an installed library was detected on your system." 1557 ewarn "An old version of an installed library was detected on your system."
1517 einfo "In order to avoid breaking packages that link against is, this older version" 1558 ewarn "In order to avoid breaking packages that link against it, this older version"
1518 einfo "is not being removed. In order to make full use of this newer version," 1559 ewarn "is not being removed. In order to make full use of this newer version,"
1519 einfo "you will need to execute the following command:" 1560 ewarn "you will need to execute the following command:"
1520 einfo " revdep-rebuild --soname ${SONAME}" 1561 ewarn " revdep-rebuild --library ${SONAME}"
1521 einfo 1562 ewarn
1522 einfo "After doing that, you can safely remove ${LIB}" 1563 ewarn "After doing that, you can safely remove ${LIB}"
1523 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild" 1564 ewarn "Note: 'emerge gentoolkit' to get revdep-rebuild"
1524 fi 1565 fi
1525} 1566}
1526 1567
1527# Hack for people to figure out if a package was built with 1568# Hack for people to figure out if a package was built with
1528# certain USE flags 1569# certain USE flags
1538 [[ ${opt:0:1} = "-" ]] && shift || opt="-a" 1579 [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1539 1580
1540 local PKG=$(best_version $1) 1581 local PKG=$(best_version $1)
1541 shift 1582 shift
1542 1583
1543 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE" 1584 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1585
1586 # if the USE file doesnt exist, assume the $PKG is either
1587 # injected or package.provided
1544 [[ ! -e ${USEFILE} ]] && return 1 1588 [[ ! -e ${USEFILE} ]] && return 0
1545 1589
1546 local USE_BUILT=$(<${USEFILE}) 1590 local USE_BUILT=$(<${USEFILE})
1547 while [[ $# -gt 0 ]] ; do 1591 while [[ $# -gt 0 ]] ; do
1548 if [[ ${opt} = "-o" ]] ; then 1592 if [[ ${opt} = "-o" ]] ; then
1549 has $1 ${USE_BUILT} && return 0 1593 has $1 ${USE_BUILT} && return 0
1601# $4 == extra LD_LIBRARY_PATH's (make it : delimited) 1645# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1602# $5 == path for wrapper 1646# $5 == path for wrapper
1603make_wrapper() { 1647make_wrapper() {
1604 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5 1648 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1605 local tmpwrapper=$(emktemp) 1649 local tmpwrapper=$(emktemp)
1650 # We don't want to quote ${bin} so that people can pass complex
1651 # things as $bin ... "./someprog --args"
1606 cat << EOF > "${tmpwrapper}" 1652 cat << EOF > "${tmpwrapper}"
1607#!/bin/sh 1653#!/bin/sh
1608cd "${chdir}" 1654cd "${chdir:-.}"
1655if [ -n "${libdir}" ] ; then
1656 if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1609export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}" 1657 export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1658 else
1659 export LD_LIBRARY_PATH="${libdir}"
1660 fi
1661fi
1610exec ${bin} "\$@" 1662exec ${bin} "\$@"
1611EOF 1663EOF
1612 chmod go+rx "${tmpwrapper}" 1664 chmod go+rx "${tmpwrapper}"
1613 if [ -n "${5}" ] 1665 if [[ -n ${path} ]] ; then
1614 then
1615 exeinto ${5} 1666 exeinto "${path}"
1616 newexe "${tmpwrapper}" "${wrapper}" 1667 newexe "${tmpwrapper}" "${wrapper}"
1617 else 1668 else
1618 newbin "${tmpwrapper}" "${wrapper}" 1669 newbin "${tmpwrapper}" "${wrapper}"
1619 fi 1670 fi
1620} 1671}

Legend:
Removed from v.1.181  
changed lines
  Added in v.1.228

  ViewVC Help
Powered by ViewVC 1.1.20