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

Diff of /eclass/eutils.eclass

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

Revision 1.164 Revision 1.247
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2006 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.164 2005/03/30 14:12:25 wolf31o2 Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.247 2006/08/11 02:21:47 vapier Exp $
4#
5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 4#
7# This eclass is for general purpose functions that most ebuilds 5# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 6# have to implement themselves.
9# 7#
10# NB: If you add anything, please comment it! 8# NB: If you add anything, please comment it!
9#
10# Maintainer: see each individual function, base-system@gentoo.org as default
11 11
12inherit multilib 12inherit multilib portability
13ECLASS=eutils
14INHERITED="$INHERITED $ECLASS"
15
16DEPEND="!bootstrap? ( sys-devel/patch )"
17 13
18DESCRIPTION="Based on the ${ECLASS} eclass" 14DESCRIPTION="Based on the ${ECLASS} eclass"
19
20# ecpu_check
21# Usage:
22#
23# ecpu_check array_of_cpu_flags
24#
25# array_of_cpu_flags - An array of cpu flags to check against USE flags
26#
27# Checks user USE related cpu flags against /proc/cpuinfo. If user enables a
28# cpu flag that is not supported in their processor flags, it will warn the
29# user if CROSSCOMPILE is not set to 1 ( because cross compile users are
30# obviously using different cpu flags than their own cpu ). Examples:
31#
32# CPU_FLAGS=(mmx mmx2 sse sse2)
33# ecpu_check CPU_FLAGS
34# Chris White <chriswhite@gentoo.org> (03 Feb 2005)
35
36ecpu_check() {
37 # Think about changing below to: if [ "${CROSSCOMPILE}" -ne 1 -a -e "/proc/cpuinfo" ]
38 # and dropping the else if you do not plan on adding anything to that
39 # empty block ....
40 # PS: also try to add some quoting, and consider rather using ${foo} than $foo ...
41 if [ "${CROSSCOMPILE}" != "1" -a -e "/proc/cpuinfo" ]
42 then
43 CPU_FLAGS=${1}
44 USER_CPU=`grep "flags" /proc/cpuinfo`
45
46 for flags in `seq 1 ${#CPU_FLAGS[@]}`
47 do
48 if has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && ! has ${CPU_FLAGS[${flags} - 1]} ${USE}
49 then
50 ewarn "Your system is ${CPU_FLAGS[${flags} - 1]} capable but you don't have it enabled!"
51 ewarn "You might be cross compiling (in this case set CROSSCOMPILE to 1 to disable this warning."
52 fi
53
54 if ! has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && has ${CPU_FLAGS[${flags} -1]} ${USE}
55 then
56 ewarn "You have ${CPU_FLAGS[${flags} - 1]} support enabled but your processor doesn't"
57 ewarn "Seem to support it! You might be cross compiling or do not have /proc filesystem"
58 ewarn "enabled. If either is the case, set CROSSCOMPILE to 1 to disable this warning."
59 fi
60 done
61 fi
62}
63 15
64# Wait for the supplied number of seconds. If no argument is supplied, defaults 16# Wait for the supplied number of seconds. If no argument is supplied, defaults
65# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not 17# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
66# outputting to a terminal, don't wait. For compatability purposes, the argument 18# outputting to a terminal, don't wait. For compatability purposes, the argument
67# must be an integer greater than zero. 19# must be an integer greater than zero.
68# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004) 20# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
69epause() { 21epause() {
70 if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then 22 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
71 sleep ${1:-5}
72 fi
73} 23}
74 24
75# Beep the specified number of times (defaults to five). If our output 25# Beep the specified number of times (defaults to five). If our output
76# is not a terminal, don't beep. If the EBEEP_IGNORE env var is set, 26# is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
77# don't beep. 27# don't beep.
78# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004) 28# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
79ebeep() { 29ebeep() {
80 local n 30 local n
81 if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then 31 if [[ -z ${EBEEP_IGNORE} ]] ; then
82 for ((n=1 ; n <= ${1:-5} ; n++)) ; do 32 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
83 echo -ne "\a" 33 echo -ne "\a"
84 sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null 34 sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
85 echo -ne "\a" 35 echo -ne "\a"
86 sleep 1 36 sleep 1
105# to point to the latest version of the library present. 55# to point to the latest version of the library present.
106# 56#
107# <azarah@gentoo.org> (26 Oct 2002) 57# <azarah@gentoo.org> (26 Oct 2002)
108# 58#
109gen_usr_ldscript() { 59gen_usr_ldscript() {
110 local libdir="$(get_libdir)" 60 local lib libdir=$(get_libdir)
111 # Just make sure it exists 61 # Just make sure it exists
112 dodir /usr/${libdir} 62 dodir /usr/${libdir}
113 63
114 for lib in "${@}" ; do 64 for lib in "${@}" ; do
115 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT 65 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
116 /* GNU ld script 66 /* GNU ld script
117 Since Gentoo has critical dynamic libraries 67 Since Gentoo has critical dynamic libraries
118 in /lib, and the static versions in /usr/lib, 68 in /lib, and the static versions in /usr/lib,
119 we need to have a "fake" dynamic lib in /usr/lib, 69 we need to have a "fake" dynamic lib in /usr/lib,
120 otherwise we run into linking problems. 70 otherwise we run into linking problems.
121 71
122 See bug http://bugs.gentoo.org/4411 for more info. 72 See bug http://bugs.gentoo.org/4411 for more info.
123 */ 73 */
124 GROUP ( /${libdir}/${lib} ) 74 GROUP ( /${libdir}/${lib} )
125 END_LDSCRIPT 75 END_LDSCRIPT
126 fperms a+x "/usr/${libdir}/${lib}" 76 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
127 done 77 done
128} 78}
129 79
130# Simple function to draw a line consisting of '=' the same length as $*
131#
132# <azarah@gentoo.org> (11 Nov 2002)
133#
134draw_line() {
135 local i=0
136 local str_length=""
137
138 # Handle calls that do not have args, or wc not being installed ...
139 if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
140 then
141 echo "==============================================================="
142 return 0
143 fi
144
145 # Get the length of $*
146 str_length="$(echo -n "$*" | wc -m)"
147
148 while [ "$i" -lt "${str_length}" ]
149 do
150 echo -n "="
151
152 i=$((i + 1))
153 done
154
155 echo
156
157 return 0
158}
159 80
160# Default directory where patches are located 81# Default directory where patches are located
161EPATCH_SOURCE="${WORKDIR}/patch" 82EPATCH_SOURCE="${WORKDIR}/patch"
162# Default extension for patches 83# Default extension for patches
163EPATCH_SUFFIX="patch.bz2" 84EPATCH_SUFFIX="patch.bz2"
164# Default options for patch 85# Default options for patch
165# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 86# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
166EPATCH_OPTS="-g0" 87# Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
88# Set -E to automatically remove empty files.
89EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
167# List of patches not to apply. Not this is only file names, 90# List of patches not to apply. Not this is only file names,
168# and not the full path .. 91# and not the full path ..
169EPATCH_EXCLUDE="" 92EPATCH_EXCLUDE=""
170# Change the printed message for a single patch. 93# Change the printed message for a single patch.
171EPATCH_SINGLE_MSG="" 94EPATCH_SINGLE_MSG=""
95# Change the printed message for multiple patches.
96EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
172# Force applying bulk patches even if not following the style: 97# Force applying bulk patches even if not following the style:
173# 98#
174# ??_${ARCH}_foo.${EPATCH_SUFFIX} 99# ??_${ARCH}_foo.${EPATCH_SUFFIX}
175# 100#
176EPATCH_FORCE="no" 101EPATCH_FORCE="no"
207# hand its a directory, it will set EPATCH_SOURCE to this. 132# hand its a directory, it will set EPATCH_SOURCE to this.
208# 133#
209# <azarah@gentoo.org> (10 Nov 2002) 134# <azarah@gentoo.org> (10 Nov 2002)
210# 135#
211epatch() { 136epatch() {
137 _epatch_draw_line() {
138 [[ -z $1 ]] && set "$(printf "%65s" '')"
139 echo "${1//?/=}"
140 }
141 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
212 local PIPE_CMD="" 142 local PIPE_CMD=""
213 local STDERR_TARGET="${T}/$$.out" 143 local STDERR_TARGET="${T}/$$.out"
214 local PATCH_TARGET="${T}/$$.patch" 144 local PATCH_TARGET="${T}/$$.patch"
215 local PATCH_SUFFIX="" 145 local PATCH_SUFFIX=""
216 local SINGLE_PATCH="no" 146 local SINGLE_PATCH="no"
217 local x="" 147 local x=""
218 148
149 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
150
219 if [ "$#" -gt 1 ] 151 if [ "$#" -gt 1 ]
220 then 152 then
221 local m="" 153 local m=""
222 einfo "${#} patches to apply ..."
223 for m in "$@" ; do 154 for m in "$@" ; do
224 epatch "${m}" 155 epatch "${m}"
225 done 156 done
226 return 0 157 return 0
227 fi 158 fi
281 ;; 212 ;;
282 esac 213 esac
283 214
284 if [ "${SINGLE_PATCH}" = "no" ] 215 if [ "${SINGLE_PATCH}" = "no" ]
285 then 216 then
286 einfo "Applying various patches (bugfixes/updates) ..." 217 einfo "${EPATCH_MULTI_MSG}"
287 fi 218 fi
288 for x in ${EPATCH_SOURCE} 219 for x in ${EPATCH_SOURCE}
289 do 220 do
290 # New ARCH dependant patch naming scheme ... 221 # New ARCH dependant patch naming scheme ...
291 # 222 #
292 # ???_arch_foo.patch 223 # ???_arch_foo.patch
293 # 224 #
294 if [ -f ${x} ] && \ 225 if [ -f ${x} ] && \
295 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \ 226 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
296 [ "${EPATCH_FORCE}" = "yes" ]) 227 [ "${EPATCH_FORCE}" = "yes" ])
297 then 228 then
298 local count=0 229 local count=0
299 local popts="${EPATCH_OPTS}" 230 local popts="${EPATCH_OPTS}"
300 local patchname=${x##*/} 231 local patchname=${x##*/}
324 255
325 # Allow for prefix to differ ... im lazy, so shoot me :/ 256 # Allow for prefix to differ ... im lazy, so shoot me :/
326 while [ "${count}" -lt 5 ] 257 while [ "${count}" -lt 5 ]
327 do 258 do
328 # Generate some useful debug info ... 259 # Generate some useful debug info ...
329 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 260 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
330 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 261 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
331 262
332 if [ "${PATCH_SUFFIX}" != "patch" ] 263 if [ "${PATCH_SUFFIX}" != "patch" ]
333 then 264 then
334 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 265 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
339 270
340 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 271 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
341 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 272 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
342 273
343 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 274 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
344 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 275 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
345 276
346 if [ "${PATCH_SUFFIX}" != "patch" ] 277 if [ "${PATCH_SUFFIX}" != "patch" ]
347 then 278 then
348 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 279 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
349 then 280 then
353 count=5 284 count=5
354 break 285 break
355 fi 286 fi
356 fi 287 fi
357 288
358 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 289 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
359 then 290 then
360 draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 291 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
361 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 292 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
362 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 293 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
363 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 294 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
364 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 295 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
365 296
366 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1 297 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
298 _epatch_assert
367 299
368 if [ "$?" -ne 0 ] 300 if [ "$?" -ne 0 ]
369 then 301 then
370 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 302 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
371 echo 303 echo
410 then 342 then
411 einfo "Done with patching" 343 einfo "Done with patching"
412 fi 344 fi
413} 345}
414 346
415# This function return true if we are using the NPTL pthreads
416# implementation.
417#
418# <azarah@gentoo.org> (06 March 2003)
419#
420have_NPTL() {
421 cat > ${T}/test-nptl.c <<-"END"
422 #define _XOPEN_SOURCE
423 #include <unistd.h>
424 #include <stdio.h>
425
426 int main()
427 {
428 char buf[255];
429 char *str = buf;
430
431 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
432 if (NULL != str) {
433 printf("%s\n", str);
434 if (NULL != strstr(str, "NPTL"))
435 return 0;
436 }
437
438 return 1;
439 }
440 END
441
442 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ..."
443 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
444 then
445 echo "yes"
446 einfon "Checking what PTHREADS implementation we have ..."
447 if ${T}/nptl
448 then
449 return 0
450 else
451 return 1
452 fi
453 else
454 echo "no"
455 fi
456
457 return 1
458}
459
460# This function check how many cpu's are present, and then set
461# -j in MAKEOPTS accordingly.
462#
463# Thanks to nall <nall@gentoo.org> for this.
464#
465get_number_of_jobs() {
466 local jobs=0
467
468 if [ ! -r /proc/cpuinfo ]
469 then
470 return 1
471 fi
472
473 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
474 if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
475 then
476 ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
477 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
478 ADMINPARAM="${ADMINPARAM/-j}"
479 fi
480
481 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
482
483 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
484 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
485 then
486 # these archs will always have "[Pp]rocessor"
487 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
488
489 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
490 then
491 # sparc always has "ncpus active"
492 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
493
494 elif [ "${ARCH}" = "alpha" ]
495 then
496 # alpha has "cpus active", but only when compiled with SMP
497 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
498 then
499 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
500 else
501 jobs=2
502 fi
503
504 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
505 then
506 # ppc has "processor", but only when compiled with SMP
507 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
508 then
509 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
510 else
511 jobs=2
512 fi
513 elif [ "${ARCH}" = "s390" ]
514 then
515 # s390 has "# processors : "
516 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
517 else
518 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
519 die "Unknown ARCH -- ${ARCH}!"
520 fi
521
522 # Make sure the number is valid ...
523 if [ "${jobs}" -lt 1 ]
524 then
525 jobs=1
526 fi
527
528 if [ -n "${ADMINPARAM}" ]
529 then
530 if [ "${jobs}" -gt "${ADMINPARAM}" ]
531 then
532 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge ..."
533 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
534 else
535 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge ..."
536 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
537 fi
538 fi
539}
540
541# Cheap replacement for when debianutils (and thus mktemp) 347# Cheap replacement for when debianutils (and thus mktemp)
542# does not exist on the users system 348# does not exist on the users system
543# vapier@gentoo.org 349# vapier@gentoo.org
544# 350#
545# Takes just 1 optional parameter (the directory to create tmpfile in) 351# Takes just 1 optional parameter (the directory to create tmpfile in)
546emktemp() { 352emktemp() {
547 local exe="touch" 353 local exe="touch"
548 [ "$1" == "-d" ] && exe="mkdir" && shift 354 [[ $1 == -d ]] && exe="mkdir" && shift
549 local topdir="$1" 355 local topdir=$1
550 356
551 if [ -z "${topdir}" ] 357 if [[ -z ${topdir} ]] ; then
552 then
553 [ -z "${T}" ] \ 358 [[ -z ${T} ]] \
554 && topdir="/tmp" \ 359 && topdir="/tmp" \
555 || topdir="${T}" 360 || topdir=${T}
556 fi 361 fi
557 362
558 if [ -z "$(type -p mktemp)" ] 363 if [[ -z $(type -p mktemp) ]] ; then
559 then
560 local tmp=/ 364 local tmp=/
561 while [ -e "${tmp}" ] ; do 365 while [[ -e ${tmp} ]] ; do
562 tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 366 tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
563 done 367 done
564 ${exe} "${tmp}" 368 ${exe} "${tmp}" || ${exe} -p "${tmp}"
565 echo "${tmp}" 369 echo "${tmp}"
566 else 370 else
567 [ "${exe}" == "touch" ] \ 371 if [[ ${exe} == "touch" ]] ; then
568 && exe="-p" \ 372 [[ ${USERLAND} == "GNU" ]] \
569 || exe="-d" 373 && mktemp -p "${topdir}" \
570 mktemp ${exe} "${topdir}" 374 || TMPDIR="${topdir}" mktemp -t tmp
375 else
376 [[ ${USERLAND} == "GNU" ]] \
377 && mktemp -d "${topdir}" \
378 || TMPDIR="${topdir}" mktemp -dt tmp
379 fi
571 fi 380 fi
572} 381}
573 382
574# Small wrapper for getent (Linux), nidump (Mac OS X), 383# Small wrapper for getent (Linux), nidump (Mac OS X),
575# and pw (FreeBSD) used in enewuser()/enewgroup() 384# and pw (FreeBSD) used in enewuser()/enewgroup()
576# Joe Jezak <josejx@gmail.com> and usata@gentoo.org 385# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
577# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org> 386# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
578# 387#
579# egetent(database, key) 388# egetent(database, key)
580egetent() { 389egetent() {
581 if useq ppc-macos ; then 390 case ${CHOST} in
391 *-darwin*)
582 case "$2" in 392 case "$2" in
583 *[!0-9]*) # Non numeric 393 *[!0-9]*) # Non numeric
584 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 394 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
585 ;; 395 ;;
586 *) # Numeric 396 *) # Numeric
587 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 397 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
588 ;; 398 ;;
589 esac 399 esac
590 elif useq x86-fbsd ; then 400 ;;
591 local action 401 *-freebsd*|*-dragonfly*)
592 if [ "$1" == "passwd" ] 402 local opts action="user"
593 then 403 [[ $1 == "passwd" ]] || action="group"
594 action="user" 404
595 else 405 # lookup by uid/gid
596 action="group" 406 if [[ $2 == [[:digit:]]* ]] ; then
407 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
597 fi 408 fi
409
598 pw show "${action}" "$2" -q 410 pw show ${action} ${opts} "$2" -q
599 else 411 ;;
412 *-netbsd*|*-openbsd*)
413 grep "$2:\*:" /etc/$1
414 ;;
415 *)
600 which nscd >& /dev/null && nscd -i "$1" 416 type -p nscd >& /dev/null && nscd -i "$1"
601 getent "$1" "$2" 417 getent "$1" "$2"
602 fi 418 ;;
419 esac
603} 420}
604 421
605# Simplify/standardize adding users to the system 422# Simplify/standardize adding users to the system
606# vapier@gentoo.org 423# vapier@gentoo.org
607# 424#
614# shell: /bin/false 431# shell: /bin/false
615# homedir: /dev/null 432# homedir: /dev/null
616# groups: none 433# groups: none
617# extra: comment of 'added by portage for ${PN}' 434# extra: comment of 'added by portage for ${PN}'
618enewuser() { 435enewuser() {
436 case ${EBUILD_PHASE} in
437 unpack|compile|test|install)
438 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
439 eerror "Package fails at QA and at life. Please file a bug."
440 die "Bad package! enewuser is only for use in pkg_* functions!"
441 esac
442
619 # get the username 443 # get the username
620 local euser="$1"; shift 444 local euser=$1; shift
621 if [ -z "${euser}" ] 445 if [[ -z ${euser} ]] ; then
622 then
623 eerror "No username specified !" 446 eerror "No username specified !"
624 die "Cannot call enewuser without a username" 447 die "Cannot call enewuser without a username"
625 fi 448 fi
626 449
627 # lets see if the username already exists 450 # lets see if the username already exists
628 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ] 451 if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then
629 then
630 return 0 452 return 0
631 fi 453 fi
632 einfo "Adding user '${euser}' to your system ..." 454 einfo "Adding user '${euser}' to your system ..."
633 455
634 # options to pass to useradd 456 # options to pass to useradd
635 local opts= 457 local opts=
636 458
637 # handle uid 459 # handle uid
638 local euid="$1"; shift 460 local euid=$1; shift
639 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] 461 if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then
640 then
641 if [ "${euid}" -gt 0 ] 462 if [[ ${euid} -gt 0 ]] ; then
642 then
643 if [ ! -z "`egetent passwd ${euid}`" ] 463 if [[ ! -z $(egetent passwd ${euid}) ]] ; then
644 then
645 euid="next" 464 euid="next"
646 fi 465 fi
647 else 466 else
648 eerror "Userid given but is not greater than 0 !" 467 eerror "Userid given but is not greater than 0 !"
649 die "${euid} is not a valid UID" 468 die "${euid} is not a valid UID"
650 fi 469 fi
651 else 470 else
652 euid="next" 471 euid="next"
653 fi 472 fi
654 if [ "${euid}" == "next" ] 473 if [[ ${euid} == "next" ]] ; then
655 then 474 for euid in $(seq 101 999) ; do
656 local pwrange
657 if [ "${USERLAND}" == "BSD" ] ; then
658 pwrange="`jot 898 101`"
659 else
660 pwrange="`seq 101 999`"
661 fi
662 for euid in ${pwrange} ; do
663 [ -z "`egetent passwd ${euid}`" ] && break 475 [[ -z $(egetent passwd ${euid}) ]] && break
664 done 476 done
665 fi 477 fi
666 opts="${opts} -u ${euid}" 478 opts="${opts} -u ${euid}"
667 einfo " - Userid: ${euid}" 479 einfo " - Userid: ${euid}"
668 480
669 # handle shell 481 # handle shell
670 local eshell="$1"; shift 482 local eshell=$1; shift
671 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] 483 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
672 then 484 if [[ ! -e ${ROOT}${eshell} ]] ; then
673 if [ ! -e "${eshell}" ]
674 then
675 eerror "A shell was specified but it does not exist !" 485 eerror "A shell was specified but it does not exist !"
676 die "${eshell} does not exist" 486 die "${eshell} does not exist in ${ROOT}"
487 fi
488 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
489 eerror "Do not specify ${eshell} yourself, use -1"
490 die "Pass '-1' as the shell parameter"
677 fi 491 fi
678 else 492 else
679 if [ "${USERLAND}" == "BSD" ] 493 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
680 then 494 [[ -x ${ROOT}${shell} ]] && break
681 eshell="/usr/bin/false" 495 done
682 else 496
683 eshell="/bin/false" 497 if [[ ${shell} == "/dev/null" ]] ; then
498 eerror "Unable to identify the shell to use"
499 die "Unable to identify the shell to use"
684 fi 500 fi
501
502 eshell=${shell}
685 fi 503 fi
686 einfo " - Shell: ${eshell}" 504 einfo " - Shell: ${eshell}"
687 opts="${opts} -s ${eshell}" 505 opts="${opts} -s ${eshell}"
688 506
689 # handle homedir 507 # handle homedir
690 local ehome="$1"; shift 508 local ehome=$1; shift
691 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ] 509 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
692 then
693 ehome="/dev/null" 510 ehome="/dev/null"
694 fi 511 fi
695 einfo " - Home: ${ehome}" 512 einfo " - Home: ${ehome}"
696 opts="${opts} -d ${ehome}" 513 opts="${opts} -d ${ehome}"
697 514
698 # handle groups 515 # handle groups
699 local egroups="$1"; shift 516 local egroups=$1; shift
700 if [ ! -z "${egroups}" ] 517 if [[ ! -z ${egroups} ]] ; then
701 then
702 local oldifs="${IFS}" 518 local oldifs=${IFS}
703 local defgroup="" exgroups="" 519 local defgroup="" exgroups=""
704 520
705 export IFS="," 521 export IFS=","
706 for g in ${egroups} 522 for g in ${egroups} ; do
707 do
708 export IFS="${oldifs}" 523 export IFS=${oldifs}
709 if [ -z "`egetent group \"${g}\"`" ] 524 if [[ -z $(egetent group "${g}") ]] ; then
710 then
711 eerror "You must add group ${g} to the system first" 525 eerror "You must add group ${g} to the system first"
712 die "${g} is not a valid GID" 526 die "${g} is not a valid GID"
713 fi 527 fi
714 if [ -z "${defgroup}" ] 528 if [[ -z ${defgroup} ]] ; then
715 then
716 defgroup="${g}" 529 defgroup=${g}
717 else 530 else
718 exgroups="${exgroups},${g}" 531 exgroups="${exgroups},${g}"
719 fi 532 fi
720 export IFS="," 533 export IFS=","
721 done 534 done
722 export IFS="${oldifs}" 535 export IFS=${oldifs}
723 536
724 opts="${opts} -g ${defgroup}" 537 opts="${opts} -g ${defgroup}"
725 if [ ! -z "${exgroups}" ] 538 if [[ ! -z ${exgroups} ]] ; then
726 then
727 opts="${opts} -G ${exgroups:1}" 539 opts="${opts} -G ${exgroups:1}"
728 fi 540 fi
729 else 541 else
730 egroups="(none)" 542 egroups="(none)"
731 fi 543 fi
732 einfo " - Groups: ${egroups}" 544 einfo " - Groups: ${egroups}"
733 545
734 # handle extra and add the user 546 # handle extra and add the user
735 local eextra="$@"
736 local oldsandbox="${SANDBOX_ON}" 547 local oldsandbox=${SANDBOX_ON}
737 export SANDBOX_ON="0" 548 export SANDBOX_ON="0"
738 if useq ppc-macos 549 case ${CHOST} in
739 then 550 *-darwin*)
740 ### Make the user 551 ### Make the user
741 if [ -z "${eextra}" ] 552 if [[ -z $@ ]] ; then
742 then
743 dscl . create /users/${euser} uid ${euid} 553 dscl . create /users/${euser} uid ${euid}
744 dscl . create /users/${euser} shell ${eshell} 554 dscl . create /users/${euser} shell ${eshell}
745 dscl . create /users/${euser} home ${ehome} 555 dscl . create /users/${euser} home ${ehome}
746 dscl . create /users/${euser} realname "added by portage for ${PN}" 556 dscl . create /users/${euser} realname "added by portage for ${PN}"
747 ### Add the user to the groups specified 557 ### Add the user to the groups specified
748 local oldifs="${IFS}" 558 local oldifs=${IFS}
749 export IFS="," 559 export IFS=","
750 for g in ${egroups} 560 for g in ${egroups} ; do
751 do
752 dscl . merge /groups/${g} users ${euser} 561 dscl . merge /groups/${g} users ${euser}
753 done 562 done
754 export IFS="${oldifs}" 563 export IFS=${oldifs}
755 else 564 else
756 einfo "Extra options are not supported on macos yet" 565 einfo "Extra options are not supported on Darwin yet"
757 einfo "Please report the ebuild along with the info below" 566 einfo "Please report the ebuild along with the info below"
758 einfo "eextra: ${eextra}" 567 einfo "eextra: $@"
759 die "Required function missing" 568 die "Required function missing"
760 fi 569 fi
761 elif use x86-fbsd ; then 570 ;;
762 if [ -z "${eextra}" ] 571 *-freebsd*|*-dragonfly*)
763 then 572 if [[ -z $@ ]] ; then
764 pw useradd ${euser} ${opts} \ 573 pw useradd ${euser} ${opts} \
765 -c "added by portage for ${PN}" \ 574 -c "added by portage for ${PN}" \
766 die "enewuser failed" 575 die "enewuser failed"
767 else 576 else
768 einfo " - Extra: ${eextra}" 577 einfo " - Extra: $@"
769 pw useradd ${euser} ${opts} \ 578 pw useradd ${euser} ${opts} \
770 -c ${eextra} || die "enewuser failed" 579 "$@" || die "enewuser failed"
771 fi 580 fi
581 ;;
582
583 *-netbsd*)
584 if [[ -z $@ ]] ; then
585 useradd ${opts} ${euser} || die "enewuser failed"
772 else 586 else
773 if [ -z "${eextra}" ] 587 einfo " - Extra: $@"
774 then 588 useradd ${opts} ${euser} "$@" || die "enewuser failed"
589 fi
590 ;;
591
592 *-openbsd*)
593 if [[ -z $@ ]] ; then
594 useradd -u ${euid} -s ${eshell} \
595 -d ${ehome} -c "Added by portage for ${PN}" \
596 -g ${egroups} ${euser} || die "enewuser failed"
597 else
598 einfo " - Extra: $@"
599 useradd -u ${euid} -s ${eshell} \
600 -d ${ehome} -c "Added by portage for ${PN}" \
601 -g ${egroups} ${euser} "$@" || die "enewuser failed"
602 fi
603 ;;
604
605 *)
606 if [[ -z $@ ]] ; then
775 useradd ${opts} ${euser} \ 607 useradd ${opts} ${euser} \
776 -c "added by portage for ${PN}" \ 608 -c "added by portage for ${PN}" \
777 || die "enewuser failed" 609 || die "enewuser failed"
778 else 610 else
779 einfo " - Extra: ${eextra}" 611 einfo " - Extra: $@"
780 useradd ${opts} ${euser} ${eextra} \ 612 useradd ${opts} ${euser} "$@" \
781 || die "enewuser failed" 613 || die "enewuser failed"
782 fi 614 fi
615 ;;
616 esac
617
618 if [[ ! -e ${ROOT}/${ehome} ]] ; then
619 einfo " - Creating ${ehome} in ${ROOT}"
620 mkdir -p "${ROOT}/${ehome}"
621 chown ${euser} "${ROOT}/${ehome}"
622 chmod 755 "${ROOT}/${ehome}"
783 fi 623 fi
624
784 export SANDBOX_ON="${oldsandbox}" 625 export SANDBOX_ON=${oldsandbox}
785
786 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
787 then
788 einfo " - Creating ${ehome} in ${D}"
789 dodir ${ehome}
790 fowners ${euser} ${ehome}
791 fperms 755 ${ehome}
792 fi
793} 626}
794 627
795# Simplify/standardize adding groups to the system 628# Simplify/standardize adding groups to the system
796# vapier@gentoo.org 629# vapier@gentoo.org
797# 630#
800# Default values if you do not specify any: 633# Default values if you do not specify any:
801# groupname: REQUIRED ! 634# groupname: REQUIRED !
802# gid: next available (see groupadd(8)) 635# gid: next available (see groupadd(8))
803# extra: none 636# extra: none
804enewgroup() { 637enewgroup() {
638 case ${EBUILD_PHASE} in
639 unpack|compile|test|install)
640 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
641 eerror "Package fails at QA and at life. Please file a bug."
642 die "Bad package! enewgroup is only for use in pkg_* functions!"
643 esac
644
805 # get the group 645 # get the group
806 local egroup="$1"; shift 646 local egroup="$1"; shift
807 if [ -z "${egroup}" ] 647 if [ -z "${egroup}" ]
808 then 648 then
809 eerror "No group specified !" 649 eerror "No group specified !"
826 then 666 then
827 if [ "${egid}" -gt 0 ] 667 if [ "${egid}" -gt 0 ]
828 then 668 then
829 if [ -z "`egetent group ${egid}`" ] 669 if [ -z "`egetent group ${egid}`" ]
830 then 670 then
831 if useq ppc-macos ; then 671 if [[ "${CHOST}" == *-darwin* ]]; then
832 opts="${opts} ${egid}" 672 opts="${opts} ${egid}"
833 else 673 else
834 opts="${opts} -g ${egid}" 674 opts="${opts} -g ${egid}"
835 fi 675 fi
836 else 676 else
850 opts="${opts} ${eextra}" 690 opts="${opts} ${eextra}"
851 691
852 # add the group 692 # add the group
853 local oldsandbox="${SANDBOX_ON}" 693 local oldsandbox="${SANDBOX_ON}"
854 export SANDBOX_ON="0" 694 export SANDBOX_ON="0"
855 if useq ppc-macos ; then 695 case ${CHOST} in
696 *-darwin*)
856 if [ ! -z "${eextra}" ]; 697 if [ ! -z "${eextra}" ];
857 then 698 then
858 einfo "Extra options are not supported on macos yet" 699 einfo "Extra options are not supported on Darwin/OS X yet"
859 einfo "Please report the ebuild along with the info below" 700 einfo "Please report the ebuild along with the info below"
860 einfo "eextra: ${eextra}" 701 einfo "eextra: ${eextra}"
861 die "Required function missing" 702 die "Required function missing"
862 fi 703 fi
863 704
864 # If we need the next available 705 # If we need the next available
865 case ${egid} in 706 case ${egid} in
866 *[!0-9]*) # Non numeric 707 *[!0-9]*) # Non numeric
867 for egid in `jot 898 101`; do 708 for egid in $(seq 101 999); do
868 [ -z "`egetent group ${egid}`" ] && break 709 [ -z "`egetent group ${egid}`" ] && break
869 done 710 done
870 esac 711 esac
871 dscl . create /groups/${egroup} gid ${egid} 712 dscl . create /groups/${egroup} gid ${egid}
872 dscl . create /groups/${egroup} passwd '*' 713 dscl . create /groups/${egroup} passwd '*'
873 elif use x86-fbsd ; then 714 ;;
715
716 *-freebsd*|*-dragonfly*)
874 case ${egid} in 717 case ${egid} in
875 *[!0-9]*) # Non numeric 718 *[!0-9]*) # Non numeric
876 for egid in `jot 898 101`; do 719 for egid in $(seq 101 999); do
877 [ -z "`egetent group ${egid}`" ] && break 720 [ -z "`egetent group ${egid}`" ] && break
878 done 721 done
879 esac 722 esac
880 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed" 723 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
881 else 724 ;;
725
726 *-netbsd*)
727 case ${egid} in
728 *[!0-9]*) # Non numeric
729 for egid in $(seq 101 999); do
730 [ -z "`egetent group ${egid}`" ] && break
731 done
732 esac
733 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
734 ;;
735
736 *)
882 groupadd ${opts} ${egroup} || die "enewgroup failed" 737 groupadd ${opts} ${egroup} || die "enewgroup failed"
883 fi 738 ;;
739 esac
884 export SANDBOX_ON="${oldsandbox}" 740 export SANDBOX_ON="${oldsandbox}"
885} 741}
886 742
887# Simple script to replace 'dos2unix' binaries 743# Simple script to replace 'dos2unix' binaries
888# vapier@gentoo.org 744# vapier@gentoo.org
905 761
906# Make a desktop file ! 762# Make a desktop file !
907# Great for making those icons in kde/gnome startmenu ! 763# Great for making those icons in kde/gnome startmenu !
908# Amaze your friends ! Get the women ! Join today ! 764# Amaze your friends ! Get the women ! Join today !
909# 765#
910# make_desktop_entry(<binary>, [name], [icon], [type], [path]) 766# make_desktop_entry(<command>, [name], [icon], [type], [path])
911# 767#
912# binary: what binary does the app run with ? 768# binary: what command does the app run with ?
913# name: the name that will show up in the menu 769# name: the name that will show up in the menu
914# icon: give your little like a pretty little icon ... 770# icon: give your little like a pretty little icon ...
915# this can be relative (to /usr/share/pixmaps) or 771# this can be relative (to /usr/share/pixmaps) or
916# a full path to an icon 772# a full path to an icon
917# type: what kind of application is this ? for categories: 773# type: what kind of application is this ? for categories:
918# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec 774# http://www.freedesktop.org/Standards/desktop-entry-spec
919# path: if your app needs to startup in a specific dir 775# path: if your app needs to startup in a specific dir
920make_desktop_entry() { 776make_desktop_entry() {
921 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1 777 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
922 778
923 local exec=${1} 779 local exec=${1}
949 dev) 805 dev)
950 type="Development" 806 type="Development"
951 ;; 807 ;;
952 808
953 games) 809 games)
954 [[ -z ${path} ]] && path=${GAMES_BINDIR}
955
956 case ${catmin} in 810 case ${catmin} in
957 action) type=ActionGame;; 811 action) type=ActionGame;;
958 arcade) type=ArcadeGame;; 812 arcade) type=ArcadeGame;;
959 board) type=BoardGame;; 813 board) type=BoardGame;;
960 kid) type=KidsGame;; 814 kid) type=KidsGame;;
1001 type="Network;${type}" 855 type="Network;${type}"
1002 ;; 856 ;;
1003 857
1004 sci) 858 sci)
1005 case ${catmin} in 859 case ${catmin} in
1006 astro*) type=Astronomoy;; 860 astro*) type=Astronomy;;
1007 bio*) type=Biology;; 861 bio*) type=Biology;;
1008 calc*) type=Calculator;; 862 calc*) type=Calculator;;
1009 chem*) type=Chemistry;; 863 chem*) type=Chemistry;;
1010 geo*) type=Geology;; 864 geo*) type=Geology;;
1011 math*) type=Math;; 865 math*) type=Math;;
1025 *) 879 *)
1026 type= 880 type=
1027 ;; 881 ;;
1028 esac 882 esac
1029 fi 883 fi
1030 884 if [ "${SLOT}" == "0" ] ; then
885 local desktop_name="${PN}"
886 else
887 local desktop_name="${PN}-${SLOT}"
888 fi
1031 local desktop=${T}/${exec%% *}-${P}.desktop 889 local desktop=${T}/${exec%% *}-${desktop_name}.desktop
890# local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
1032 891
1033echo "[Desktop Entry] 892echo "[Desktop Entry]
1034Encoding=UTF-8 893Encoding=UTF-8
1035Version=0.9.2 894Version=0.9.2
1036Name=${name} 895Name=${name}
1037Type=Application 896Type=Application
1038Comment=${DESCRIPTION} 897Comment=${DESCRIPTION}
1039Exec=${exec} 898Exec=${exec}
899TryExec=${exec%% *}
1040Path=${path} 900Path=${path}
1041Icon=${icon} 901Icon=${icon}
1042Categories=Application;${type};" > "${desktop}" 902Categories=Application;${type};" > "${desktop}"
1043 903
904 (
905 # wrap the env here so that the 'insinto' call
906 # doesn't corrupt the env of the caller
1044 insinto /usr/share/applications 907 insinto /usr/share/applications
1045 doins "${desktop}" 908 doins "${desktop}"
1046 909 )
1047 return 0
1048} 910}
1049 911
1050# Make a GDM/KDM Session file 912# Make a GDM/KDM Session file
1051# 913#
1052# make_desktop_entry(<title>, <command>) 914# make_desktop_entry(<title>, <command>)
1053# title: File to execute to start the Window Manager 915# title: File to execute to start the Window Manager
1054# command: Name of the Window Manager 916# command: Name of the Window Manager
1055 917
1056make_session_desktop() { 918make_session_desktop() {
1057
1058 [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1 919 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
1059 [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1 920 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
1060 921
1061 local title="${1}" 922 local title=$1
1062 local command="${2}" 923 local command=$2
1063 local desktop="${T}/${wm}.desktop" 924 local desktop=${T}/${wm}.desktop
1064 925
1065echo "[Desktop Entry] 926echo "[Desktop Entry]
1066Encoding=UTF-8 927Encoding=UTF-8
1067Name=${title} 928Name=${title}
1068Comment=This session logs you into ${title} 929Comment=This session logs you into ${title}
1070TryExec=${command} 931TryExec=${command}
1071Type=Application" > "${desktop}" 932Type=Application" > "${desktop}"
1072 933
1073 insinto /usr/share/xsessions 934 insinto /usr/share/xsessions
1074 doins "${desktop}" 935 doins "${desktop}"
1075
1076 return 0
1077} 936}
1078 937
1079domenu() { 938domenu() {
1080 local i 939 local i j
1081 local j
1082 insinto /usr/share/applications 940 insinto /usr/share/applications
1083 for i in ${@} 941 for i in "$@" ; do
1084 do
1085 if [ -f "${i}" ]; 942 if [[ -f ${i} ]] ; then
1086 then
1087 doins ${i} 943 doins "${i}"
1088 elif [ -d "${i}" ]; 944 elif [[ -d ${i} ]] ; then
1089 then
1090 for j in ${i}/*.desktop 945 for j in "${i}"/*.desktop ; do
1091 do
1092 doins ${j} 946 doins "${j}"
1093 done 947 done
1094 fi 948 fi
1095 done 949 done
1096} 950}
951newmenu() {
952 insinto /usr/share/applications
953 newins "$1" "$2"
954}
1097 955
1098doicon() { 956doicon() {
1099 local i 957 local i j
1100 local j
1101 insinto /usr/share/pixmaps 958 insinto /usr/share/pixmaps
1102 for i in ${@} 959 for i in "$@" ; do
1103 do
1104 if [ -f "${i}" ]; 960 if [[ -f ${i} ]] ; then
1105 then
1106 doins ${i} 961 doins "${i}"
1107 elif [ -d "${i}" ]; 962 elif [[ -d ${i} ]] ; then
1108 then
1109 for j in ${i}/*.png 963 for j in "${i}"/*.png ; do
1110 do
1111 doins ${j} 964 doins "${j}"
1112 done 965 done
1113 fi 966 fi
1114 done 967 done
968}
969newicon() {
970 insinto /usr/share/pixmaps
971 newins "$1" "$2"
1115} 972}
1116 973
1117############################################################## 974##############################################################
1118# END: Handle .desktop files and menu entries # 975# END: Handle .desktop files and menu entries #
1119############################################################## 976##############################################################
1120 977
1121 978
1122# for internal use only (unpack_pdv and unpack_makeself) 979# for internal use only (unpack_pdv and unpack_makeself)
1123find_unpackable_file() { 980find_unpackable_file() {
1124 local src="$1" 981 local src=$1
1125 if [ -z "${src}" ] 982 if [[ -z ${src} ]] ; then
1126 then
1127 src="${DISTDIR}/${A}" 983 src=${DISTDIR}/${A}
1128 else 984 else
1129 if [ -e "${DISTDIR}/${src}" ] 985 if [[ -e ${DISTDIR}/${src} ]] ; then
1130 then
1131 src="${DISTDIR}/${src}" 986 src=${DISTDIR}/${src}
1132 elif [ -e "${PWD}/${src}" ] 987 elif [[ -e ${PWD}/${src} ]] ; then
1133 then
1134 src="${PWD}/${src}" 988 src=${PWD}/${src}
1135 elif [ -e "${src}" ] 989 elif [[ -e ${src} ]] ; then
1136 then
1137 src="${src}" 990 src=${src}
1138 fi
1139 fi 991 fi
1140 [ ! -e "${src}" ] && die "Could not find requested archive ${src}" 992 fi
993 [[ ! -e ${src} ]] && return 1
1141 echo "${src}" 994 echo "${src}"
1142} 995}
1143 996
1144# Unpack those pesky pdv generated files ... 997# Unpack those pesky pdv generated files ...
1145# They're self-unpacking programs with the binary package stuffed in 998# They're self-unpacking programs with the binary package stuffed in
1160# lseek 1013# lseek
1161# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin 1014# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1162# lseek(3, -4, SEEK_END) = 2981250 1015# lseek(3, -4, SEEK_END) = 2981250
1163# thus we would pass in the value of '4' as the second parameter. 1016# thus we would pass in the value of '4' as the second parameter.
1164unpack_pdv() { 1017unpack_pdv() {
1165 local src="`find_unpackable_file $1`" 1018 local src=$(find_unpackable_file $1)
1166 local sizeoff_t="$2" 1019 local sizeoff_t=$2
1167 1020
1021 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1168 [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :(" 1022 [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1169 1023
1170 local shrtsrc="`basename ${src}`" 1024 local shrtsrc=$(basename "${src}")
1171 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1025 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1172 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"` 1026 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1173 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"` 1027 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1174 1028
1175 # grab metadata for debug reasons 1029 # grab metadata for debug reasons
1239# Usage: unpack_makeself [file to unpack] [offset] [tail|dd] 1093# Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1240# - If the file is not specified then unpack will utilize ${A}. 1094# - If the file is not specified then unpack will utilize ${A}.
1241# - If the offset is not specified then we will attempt to extract 1095# - If the offset is not specified then we will attempt to extract
1242# the proper offset from the script itself. 1096# the proper offset from the script itself.
1243unpack_makeself() { 1097unpack_makeself() {
1098 local src_input=${1:-${A}}
1244 local src="$(find_unpackable_file "$1")" 1099 local src=$(find_unpackable_file "${src_input}")
1245 local skip="$2" 1100 local skip=$2
1246 local exe="$3" 1101 local exe=$3
1247 1102
1103 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1104
1248 local shrtsrc="$(basename "${src}")" 1105 local shrtsrc=$(basename "${src}")
1249 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1106 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1250 if [ -z "${skip}" ] 1107 if [[ -z ${skip} ]] ; then
1251 then
1252 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`" 1108 local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1253 local skip=0 1109 local skip=0
1254 exe=tail 1110 exe=tail
1255 case ${ver} in 1111 case ${ver} in
1256 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1112 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1257 skip=$(grep -a ^skip= "${src}" | cut -d= -f2) 1113 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1258 ;; 1114 ;;
1259 2.0|2.0.1) 1115 2.0|2.0.1)
1260 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-) 1116 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1261 ;; 1117 ;;
1269 ;; 1125 ;;
1270 2.1.3) 1126 2.1.3)
1271 skip=`grep -a ^offset= "${src}" | awk '{print $3}'` 1127 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1272 let skip="skip + 1" 1128 let skip="skip + 1"
1273 ;; 1129 ;;
1274 2.1.4) 1130 2.1.4|2.1.5)
1275 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) 1131 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1276 skip=$(head -n ${skip} "${src}" | wc -c) 1132 skip=$(head -n ${skip} "${src}" | wc -c)
1277 exe="dd" 1133 exe="dd"
1278 ;; 1134 ;;
1279 *) 1135 *)
1324check_license() { 1180check_license() {
1325 local lic=$1 1181 local lic=$1
1326 if [ -z "${lic}" ] ; then 1182 if [ -z "${lic}" ] ; then
1327 lic="${PORTDIR}/licenses/${LICENSE}" 1183 lic="${PORTDIR}/licenses/${LICENSE}"
1328 else 1184 else
1329 if [ -e "${PORTDIR}/licenses/${src}" ] ; then 1185 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1330 lic="${PORTDIR}/licenses/${src}" 1186 lic="${PORTDIR}/licenses/${lic}"
1331 elif [ -e "${PWD}/${src}" ] ; then 1187 elif [ -e "${PWD}/${lic}" ] ; then
1332 lic="${PWD}/${src}" 1188 lic="${PWD}/${lic}"
1333 elif [ -e "${src}" ] ; then 1189 elif [ -e "${lic}" ] ; then
1334 lic="${src}" 1190 lic="${lic}"
1335 fi
1336 fi 1191 fi
1192 fi
1337 [ ! -f "${lic}" ] && die "Could not find requested license ${src}" 1193 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1338 local l="`basename ${lic}`" 1194 local l="`basename ${lic}`"
1339 1195
1340 # here is where we check for the licenses the user already 1196 # here is where we check for the licenses the user already
1341 # accepted ... if we don't find a match, we make the user accept 1197 # accepted ... if we don't find a match, we make the user accept
1342 local shopts=$- 1198 local shopts=$-
1384# and when the function returns, you can assume that the cd has been 1240# and when the function returns, you can assume that the cd has been
1385# found at CDROM_ROOT. 1241# found at CDROM_ROOT.
1386# 1242#
1387# normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2', 1243# normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1388# etc... if you want to give the cds better names, then just export 1244# etc... if you want to give the cds better names, then just export
1389# the CDROM_NAME_X variables before calling cdrom_get_cds(). 1245# the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1246# - CDROM_NAME="fooie cd" - for when you only want 1 cd
1247# - CDROM_NAME_1="install cd" - for when you want more than 1 cd
1248# CDROM_NAME_2="data cd"
1249# - CDROM_NAME_SET=( "install cd" "data cd" ) - short hand for CDROM_NAME_#
1390# 1250#
1391# for those multi cd ebuilds, see the cdrom_load_next_cd() below. 1251# for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1392# 1252#
1393# Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...] 1253# Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1394# - this will attempt to locate a cd based upon a file that is on 1254# - this will attempt to locate a cd based upon a file that is on
1398 # first we figure out how many cds we're dealing with by 1258 # first we figure out how many cds we're dealing with by
1399 # the # of files they gave us 1259 # the # of files they gave us
1400 local cdcnt=0 1260 local cdcnt=0
1401 local f= 1261 local f=
1402 for f in "$@" ; do 1262 for f in "$@" ; do
1403 cdcnt=$((cdcnt + 1)) 1263 ((++cdcnt))
1404 export CDROM_CHECK_${cdcnt}="$f" 1264 export CDROM_CHECK_${cdcnt}="$f"
1405 done 1265 done
1406 export CDROM_TOTAL_CDS=${cdcnt} 1266 export CDROM_TOTAL_CDS=${cdcnt}
1407 export CDROM_CURRENT_CD=1 1267 export CDROM_CURRENT_CD=1
1408 1268
1409 # now we see if the user gave use CD_ROOT ... 1269 # now we see if the user gave use CD_ROOT ...
1410 # if they did, let's just believe them that it's correct 1270 # if they did, let's just believe them that it's correct
1411 if [[ ! -z ${CD_ROOT} ]] ; then
1412 export CDROM_ROOT=${CD_ROOT}
1413 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1414 return
1415 fi
1416 # do the same for CD_ROOT_X
1417 if [[ ! -z ${CD_ROOT_1} ]] ; then 1271 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1418 local var= 1272 local var=
1419 cdcnt=0 1273 cdcnt=0
1420 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1274 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1421 cdcnt=$((cdcnt + 1)) 1275 ((++cdcnt))
1422 var="CD_ROOT_${cdcnt}" 1276 var="CD_ROOT_${cdcnt}"
1277 [[ -z ${!var} ]] && var="CD_ROOT"
1423 if [[ -z ${!var} ]] ; then 1278 if [[ -z ${!var} ]] ; then
1424 eerror "You must either use just the CD_ROOT" 1279 eerror "You must either use just the CD_ROOT"
1425 eerror "or specify ALL the CD_ROOT_X variables." 1280 eerror "or specify ALL the CD_ROOT_X variables."
1426 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables." 1281 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1427 die "could not locate CD_ROOT_${cdcnt}" 1282 die "could not locate CD_ROOT_${cdcnt}"
1428 fi 1283 fi
1429 export CDROM_ROOTS_${cdcnt}="${!var}"
1430 done 1284 done
1431 export CDROM_ROOT=${CDROM_ROOTS_1} 1285 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1432 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1286 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1287 export CDROM_SET=-1
1288 for f in ${CDROM_CHECK_1//:/ } ; do
1289 ((++CDROM_SET))
1290 [[ -e ${CD_ROOT}/${f} ]] && break
1291 done
1292 export CDROM_MATCH=${f}
1433 return 1293 return
1434 fi 1294 fi
1435 1295
1296 # User didn't help us out so lets make sure they know they can
1297 # simplify the whole process ...
1436 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then 1298 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1437 einfon "This ebuild will need the " 1299 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1438 if [[ -z ${CDROM_NAME} ]] ; then
1439 echo "cdrom for ${PN}."
1440 else
1441 echo "${CDROM_NAME}."
1442 fi
1443 echo 1300 echo
1444 einfo "If you do not have the CD, but have the data files" 1301 einfo "If you do not have the CD, but have the data files"
1445 einfo "mounted somewhere on your filesystem, just export" 1302 einfo "mounted somewhere on your filesystem, just export"
1446 einfo "the variable CD_ROOT so that it points to the" 1303 einfo "the variable CD_ROOT so that it points to the"
1447 einfo "directory containing the files." 1304 einfo "directory containing the files."
1448 echo 1305 echo
1449 einfo "For example:" 1306 einfo "For example:"
1450 einfo "export CD_ROOT=/mnt/cdrom" 1307 einfo "export CD_ROOT=/mnt/cdrom"
1451 echo 1308 echo
1452 else 1309 else
1310 if [[ -n ${CDROM_NAME_SET} ]] ; then
1311 # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1312 cdcnt=0
1313 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1314 ((++cdcnt))
1315 export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1316 done
1317 fi
1318
1453 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds." 1319 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1454 cdcnt=0 1320 cdcnt=0
1455 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1321 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1456 cdcnt=$((cdcnt + 1)) 1322 ((++cdcnt))
1457 var="CDROM_NAME_${cdcnt}" 1323 var="CDROM_NAME_${cdcnt}"
1458 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}" 1324 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1459 done 1325 done
1460 echo 1326 echo
1461 einfo "If you do not have the CDs, but have the data files" 1327 einfo "If you do not have the CDs, but have the data files"
1462 einfo "mounted somewhere on your filesystem, just export" 1328 einfo "mounted somewhere on your filesystem, just export"
1463 einfo "the following variables so they point to the right place:" 1329 einfo "the following variables so they point to the right place:"
1464 einfon "" 1330 einfon ""
1465 cdcnt=0 1331 cdcnt=0
1466 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do 1332 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1467 cdcnt=$((cdcnt + 1)) 1333 ((++cdcnt))
1468 echo -n " CD_ROOT_${cdcnt}" 1334 echo -n " CD_ROOT_${cdcnt}"
1469 done 1335 done
1470 echo 1336 echo
1471 einfo "Or, if you have all the files in the same place, or" 1337 einfo "Or, if you have all the files in the same place, or"
1472 einfo "you only have one cdrom, you can export CD_ROOT" 1338 einfo "you only have one cdrom, you can export CD_ROOT"
1475 echo 1341 echo
1476 einfo "For example:" 1342 einfo "For example:"
1477 einfo "export CD_ROOT_1=/mnt/cdrom" 1343 einfo "export CD_ROOT_1=/mnt/cdrom"
1478 echo 1344 echo
1479 fi 1345 fi
1346
1347 export CDROM_SET=""
1480 export CDROM_CURRENT_CD=0 1348 export CDROM_CURRENT_CD=0
1481 cdrom_load_next_cd 1349 cdrom_load_next_cd
1482} 1350}
1483 1351
1484# this is only used when you need access to more than one cd. 1352# this is only used when you need access to more than one cd.
1485# when you have finished using the first cd, just call this function. 1353# when you have finished using the first cd, just call this function.
1486# when it returns, CDROM_ROOT will be pointing to the second cd. 1354# when it returns, CDROM_ROOT will be pointing to the second cd.
1487# remember, you can only go forward in the cd chain, you can't go back. 1355# remember, you can only go forward in the cd chain, you can't go back.
1488cdrom_load_next_cd() { 1356cdrom_load_next_cd() {
1489 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1490 local var= 1357 local var
1491 1358 ((++CDROM_CURRENT_CD))
1492 if [[ ! -z ${CD_ROOT} ]] ; then
1493 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1494 return
1495 fi
1496 1359
1497 unset CDROM_ROOT 1360 unset CDROM_ROOT
1498 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1361 var=CD_ROOT_${CDROM_CURRENT_CD}
1362 [[ -z ${!var} ]] && var="CD_ROOT"
1499 if [[ -z ${!var} ]] ; then 1363 if [[ -z ${!var} ]] ; then
1500 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1364 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1501 cdrom_locate_file_on_cd ${!var} 1365 _cdrom_locate_file_on_cd ${!var}
1502 else 1366 else
1503 export CDROM_ROOT=${!var} 1367 export CDROM_ROOT=${!var}
1504 fi 1368 fi
1505 1369
1506 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1370 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1511# all it does is try to locate a give file on a cd ... if the cd isn't 1375# all it does is try to locate a give file on a cd ... if the cd isn't
1512# found, then a message asking for the user to insert the cdrom will be 1376# found, then a message asking for the user to insert the cdrom will be
1513# displayed and we'll hang out here until: 1377# displayed and we'll hang out here until:
1514# (1) the file is found on a mounted cdrom 1378# (1) the file is found on a mounted cdrom
1515# (2) the user hits CTRL+C 1379# (2) the user hits CTRL+C
1516cdrom_locate_file_on_cd() { 1380_cdrom_locate_file_on_cd() {
1381 local mline=""
1382 local showedmsg=0
1383
1517 while [[ -z ${CDROM_ROOT} ]] ; do 1384 while [[ -z ${CDROM_ROOT} ]] ; do
1385 local i=0
1386 local -a cdset=(${*//:/ })
1387 if [[ -n ${CDROM_SET} ]] ; then
1388 cdset=(${cdset[${CDROM_SET}]})
1389 fi
1390
1391 while [[ -n ${cdset[${i}]} ]] ; do
1518 local dir="$(dirname ${@})" 1392 local dir=$(dirname ${cdset[${i}]})
1519 local file="$(basename ${@})" 1393 local file=$(basename ${cdset[${i}]})
1520 local mline=""
1521 local showedmsg=0
1522 1394
1523 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do 1395 for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do
1524 [[ -d ${mline}/${dir} ]] || continue 1396 [[ -d ${mline}/${dir} ]] || continue
1525 [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \ 1397 if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then
1526 && export CDROM_ROOT=${mline} 1398 export CDROM_ROOT=${mline}
1399 export CDROM_SET=${i}
1400 export CDROM_MATCH=${cdset[${i}]}
1401 return
1402 fi
1403 done
1404
1405 ((++i))
1527 done 1406 done
1528 1407
1529 if [[ -z ${CDROM_ROOT} ]] ; then
1530 echo 1408 echo
1531 if [[ ${showedmsg} -eq 0 ]] ; then 1409 if [[ ${showedmsg} -eq 0 ]] ; then
1532 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then 1410 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1533 if [[ -z ${CDROM_NAME} ]] ; then 1411 if [[ -z ${CDROM_NAME} ]] ; then
1534 einfo "Please insert the cdrom for ${PN} now !" 1412 einfo "Please insert+mount the cdrom for ${PN} now !"
1535 else
1536 einfo "Please insert the ${CDROM_NAME} cdrom now !"
1537 fi
1538 else 1413 else
1539 if [[ -z ${CDROM_NAME_1} ]] ; then
1540 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1541 else
1542 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1543 einfo "Please insert+mount the ${!var} cdrom now !" 1414 einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1544 fi
1545 fi 1415 fi
1546 showedmsg=1 1416 else
1417 if [[ -z ${CDROM_NAME_1} ]] ; then
1418 einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1419 else
1420 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1421 einfo "Please insert+mount the ${!var} cdrom now !"
1422 fi
1547 fi 1423 fi
1424 showedmsg=1
1425 fi
1548 einfo "Press return to scan for the cd again" 1426 einfo "Press return to scan for the cd again"
1549 einfo "or hit CTRL+C to abort the emerge." 1427 einfo "or hit CTRL+C to abort the emerge."
1550 read 1428 echo
1551 fi 1429 einfo "If you are having trouble with the detection"
1430 einfo "of your CD, it is possible that you do not have"
1431 einfo "Joliet support enabled in your kernel. Please"
1432 einfo "check that CONFIG_JOLIET is enabled in your kernel."
1433 read || die "something is screwed with your system"
1552 done 1434 done
1553} 1435}
1554 1436
1555# Make sure that LINGUAS only contains languages that 1437# Make sure that LINGUAS only contains languages that
1556# a package can support 1438# a package can support
1563# The -i builds a list of po files found in all the 1445# The -i builds a list of po files found in all the
1564# directories and uses the intersection of the lists. 1446# directories and uses the intersection of the lists.
1565# The -u builds a list of po files found in all the 1447# The -u builds a list of po files found in all the
1566# directories and uses the union of the lists. 1448# directories and uses the union of the lists.
1567strip-linguas() { 1449strip-linguas() {
1568 local ls newls 1450 local ls newls nols
1569 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then 1451 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1570 local op=$1; shift 1452 local op=$1; shift
1571 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift 1453 ls=$(find "$1" -name '*.po' -exec basename {} .po \;); shift
1572 local d f 1454 local d f
1573 for d in "$@" ; do 1455 for d in "$@" ; do
1574 if [[ ${op} == "-u" ]] ; then 1456 if [[ ${op} == "-u" ]] ; then
1575 newls=${ls} 1457 newls=${ls}
1576 else 1458 else
1577 newls="" 1459 newls=""
1578 fi 1460 fi
1579 for f in $(find "$d" -name '*.po' -printf '%f ') ; do 1461 for f in $(find "$d" -name '*.po' -exec basename {} .po \;) ; do
1580 if [[ ${op} == "-i" ]] ; then 1462 if [[ ${op} == "-i" ]] ; then
1581 [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}" 1463 hasq ${f} ${ls} && newls="${newls} ${f}"
1582 else 1464 else
1583 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}" 1465 hasq ${f} ${ls} || newls="${newls} ${f}"
1584 fi 1466 fi
1585 done 1467 done
1586 ls=${newls} 1468 ls=${newls}
1587 done 1469 done
1588 ls=${ls//.po}
1589 else 1470 else
1590 ls=$@ 1471 ls="$@"
1591 fi 1472 fi
1592 1473
1593 ls=" ${ls} " 1474 nols=""
1594 newls="" 1475 newls=""
1595 for f in ${LINGUAS} ; do 1476 for f in ${LINGUAS} ; do
1596 if [[ ${ls/ ${f} /} != ${ls} ]] ; then 1477 if hasq ${f} ${ls} ; then
1597 newls="${newls} ${f}" 1478 newls="${newls} ${f}"
1598 else 1479 else
1599 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA" 1480 nols="${nols} ${f}"
1600 fi 1481 fi
1601 done 1482 done
1602 if [[ -z ${newls} ]] ; then 1483 [[ -n ${nols} ]] \
1603 unset LINGUAS 1484 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols}
1604 else
1605 export LINGUAS=${newls:1} 1485 export LINGUAS=${newls:1}
1606 fi
1607} 1486}
1608 1487
1609# moved from kernel.eclass since they are generally useful outside of 1488# moved from kernel.eclass since they are generally useful outside of
1610# kernel.eclass -iggy (20041002) 1489# kernel.eclass -iggy (20041002)
1611 1490
1618 while ((i--)) ; do 1497 while ((i--)) ; do
1619 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass" 1498 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1620 done 1499 done
1621 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}" 1500 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1622 case ${ARCH} in 1501 case ${ARCH} in
1623 x86) export ARCH="i386";; 1502 x86) export ARCH="i386";;
1624 amd64) export ARCH="x86_64";; 1503 amd64) export ARCH="x86_64";;
1625 hppa) export ARCH="parisc";; 1504 hppa) export ARCH="parisc";;
1626 mips) export ARCH="mips";; 1505 mips) export ARCH="mips";;
1627 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one! 1506 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1628 *) export ARCH="${ARCH}";; 1507 *) export ARCH="${ARCH}";;
1629 esac 1508 esac
1630} 1509}
1631 1510
1632# set's ARCH back to what portage expects 1511# set's ARCH back to what portage expects
1633set_arch_to_portage() { 1512set_arch_to_portage() {
1640 1519
1641# Jeremy Huddleston <eradicator@gentoo.org>: 1520# Jeremy Huddleston <eradicator@gentoo.org>:
1642# preserve_old_lib /path/to/libblah.so.0 1521# preserve_old_lib /path/to/libblah.so.0
1643# preserve_old_lib_notify /path/to/libblah.so.0 1522# preserve_old_lib_notify /path/to/libblah.so.0
1644# 1523#
1645# These functions are useful when a lib in your package changes --soname. Such 1524# These functions are useful when a lib in your package changes --library. Such
1646# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0 1525# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1647# would break packages that link against it. Most people get around this 1526# would break packages that link against it. Most people get around this
1648# by using the portage SLOT mechanism, but that is not always a relevant 1527# by using the portage SLOT mechanism, but that is not always a relevant
1649# solution, so instead you can add the following to your ebuilds: 1528# solution, so instead you can add the following to your ebuilds:
1650# 1529#
1677 LIB=$1 1556 LIB=$1
1678 1557
1679 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then 1558 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1680 SONAME=`basename ${LIB}` 1559 SONAME=`basename ${LIB}`
1681 1560
1682 einfo "An old version of an installed library was detected on your system." 1561 ewarn "An old version of an installed library was detected on your system."
1683 einfo "In order to avoid breaking packages that link against is, this older version" 1562 ewarn "In order to avoid breaking packages that link against it, this older version"
1684 einfo "is not being removed. In order to make full use of this newer version," 1563 ewarn "is not being removed. In order to make full use of this newer version,"
1685 einfo "you will need to execute the following command:" 1564 ewarn "you will need to execute the following command:"
1686 einfo " revdep-rebuild --soname ${SONAME}" 1565 ewarn " revdep-rebuild --library ${SONAME}"
1687 einfo 1566 ewarn
1688 einfo "After doing that, you can safely remove ${LIB}" 1567 ewarn "After doing that, you can safely remove ${LIB}"
1689 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild" 1568 ewarn "Note: 'emerge gentoolkit' to get revdep-rebuild"
1690 fi 1569 fi
1691} 1570}
1692 1571
1693# Hack for people to figure out if a package was built with 1572# Hack for people to figure out if a package was built with
1694# certain USE flags 1573# certain USE flags
1702built_with_use() { 1581built_with_use() {
1703 local opt=$1 1582 local opt=$1
1704 [[ ${opt:0:1} = "-" ]] && shift || opt="-a" 1583 [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1705 1584
1706 local PKG=$(best_version $1) 1585 local PKG=$(best_version $1)
1586 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1707 shift 1587 shift
1708 1588
1709 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE" 1589 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1710 [[ ! -e ${USEFILE} ]] && return 1 1590
1591 # if the USE file doesnt exist, assume the $PKG is either
1592 # injected or package.provided
1593 [[ ! -e ${USEFILE} ]] && die "Unable to determine what USE flags $PKG was built with"
1711 1594
1712 local USE_BUILT=$(<${USEFILE}) 1595 local USE_BUILT=$(<${USEFILE})
1713 while [[ $# -gt 0 ]] ; do 1596 while [[ $# -gt 0 ]] ; do
1714 if [[ ${opt} = "-o" ]] ; then 1597 if [[ ${opt} = "-o" ]] ; then
1715 has $1 ${USE_BUILT} && return 0 1598 has $1 ${USE_BUILT} && return 0
1740dopamd() { 1623dopamd() {
1741 [[ -z $1 ]] && die "dopamd requires at least one argument" 1624 [[ -z $1 ]] && die "dopamd requires at least one argument"
1742 1625
1743 use pam || return 0 1626 use pam || return 0
1744 1627
1745 insinto /etc/pam.d 1628 INSDESTTREE=/etc/pam.d \
1746 doins "$@" || die "failed to install $@" 1629 doins "$@" || die "failed to install $@"
1747} 1630}
1748# newpamd <old name> <new name> 1631# newpamd <old name> <new name>
1749# 1632#
1750# Install pam file <old name> as <new name> in /etc/pam.d 1633# Install pam file <old name> as <new name> in /etc/pam.d
1751newpamd() { 1634newpamd() {
1752 [[ $# -ne 2 ]] && die "newpamd requires two arguements" 1635 [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1753 1636
1754 use pam || return 0 1637 use pam || return 0
1755 1638
1756 insinto /etc/pam.d 1639 INSDESTTREE=/etc/pam.d \
1757 newins "$1" "$2" || die "failed to install $1 as $2" 1640 newins "$1" "$2" || die "failed to install $1 as $2"
1758} 1641}
1759 1642
1760# make a wrapper script ... 1643# make a wrapper script ...
1761# NOTE: this was originally games_make_wrapper, but I noticed other places where 1644# NOTE: this was originally games_make_wrapper, but I noticed other places where
1767# $4 == extra LD_LIBRARY_PATH's (make it : delimited) 1650# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1768# $5 == path for wrapper 1651# $5 == path for wrapper
1769make_wrapper() { 1652make_wrapper() {
1770 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5 1653 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1771 local tmpwrapper=$(emktemp) 1654 local tmpwrapper=$(emktemp)
1655 # We don't want to quote ${bin} so that people can pass complex
1656 # things as $bin ... "./someprog --args"
1772 cat << EOF > "${tmpwrapper}" 1657 cat << EOF > "${tmpwrapper}"
1773#!/bin/sh 1658#!/bin/sh
1774cd "${chdir}" 1659cd "${chdir:-.}"
1660if [ -n "${libdir}" ] ; then
1661 if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1775export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}" 1662 export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1663 else
1664 export LD_LIBRARY_PATH="${libdir}"
1665 fi
1666fi
1776exec ${bin} "\$@" 1667exec ${bin} "\$@"
1777EOF 1668EOF
1778 chmod go+rx "${tmpwrapper}" 1669 chmod go+rx "${tmpwrapper}"
1779 if [ -n "${5}" ] 1670 if [[ -n ${path} ]] ; then
1780 then
1781 exeinto ${5} 1671 exeinto "${path}"
1782 newexe "${tmpwrapper}" "${wrapper}" 1672 newexe "${tmpwrapper}" "${wrapper}"
1783 else 1673 else
1784 newbin "${tmpwrapper}" "${wrapper}" 1674 newbin "${tmpwrapper}" "${wrapper}"
1785 fi 1675 fi
1786} 1676}

Legend:
Removed from v.1.164  
changed lines
  Added in v.1.247

  ViewVC Help
Powered by ViewVC 1.1.20