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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.85 - (hide annotations) (download)
Sun Feb 29 22:34:41 2004 UTC (10 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.84: +3 -6 lines
fix group check in enewuser #43278

1 vapier 1.76 # Copyright 1999-2004 Gentoo Technologies, Inc.
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.85 # $Header: /home/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.84 2004/02/29 07:17:27 vapier Exp $
4 vapier 1.18 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 vapier 1.18 #
7 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
8 vapier 1.7 # have to implement themselves.
9 azarah 1.1 #
10     # NB: If you add anything, please comment it!
11    
12     ECLASS=eutils
13     INHERITED="$INHERITED $ECLASS"
14    
15 vapier 1.83 DEPEND="!bootstrap? ( sys-devel/patch )"
16 azarah 1.1
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19     # This function generate linker scripts in /usr/lib for dynamic
20     # libs in /lib. This is to fix linking problems when you have
21     # the .so in /lib, and the .a in /usr/lib. What happens is that
22     # in some cases when linking dynamic, the .a in /usr/lib is used
23     # instead of the .so in /lib due to gcc/libtool tweaking ld's
24     # library search path. This cause many builds to fail.
25     # See bug #4411 for more info.
26     #
27     # To use, simply call:
28     #
29     # gen_usr_ldscript libfoo.so
30     #
31     # Note that you should in general use the unversioned name of
32     # the library, as ldconfig should usually update it correctly
33     # to point to the latest version of the library present.
34     #
35     # <azarah@gentoo.org> (26 Oct 2002)
36     #
37     gen_usr_ldscript() {
38    
39     # Just make sure it exists
40     dodir /usr/lib
41 danarmak 1.32
42 azarah 1.1 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43     /* GNU ld script
44     Because Gentoo have critical dynamic libraries
45     in /lib, and the static versions in /usr/lib, we
46     need to have a "fake" dynamic lib in /usr/lib,
47     otherwise we run into linking problems.
48     See bug #4411 on http://bugs.gentoo.org/ for
49     more info. */
50     GROUP ( /lib/libxxx )
51     END_LDSCRIPT
52    
53     dosed "s:libxxx:$1:" /usr/lib/$1
54 azarah 1.5
55     return 0
56 azarah 1.2 }
57    
58 azarah 1.5 # Simple function to draw a line consisting of '=' the same length as $*
59     #
60     # <azarah@gentoo.org> (11 Nov 2002)
61     #
62     draw_line() {
63     local i=0
64     local str_length=""
65    
66     # Handle calls that do not have args, or wc not being installed ...
67     if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
68     then
69     echo "==============================================================="
70     return 0
71     fi
72    
73     # Get the length of $*
74     str_length="$(echo -n "$*" | wc -m)"
75 danarmak 1.32
76 azarah 1.5 while [ "$i" -lt "${str_length}" ]
77     do
78     echo -n "="
79 danarmak 1.32
80 azarah 1.5 i=$((i + 1))
81     done
82    
83     echo
84    
85     return 0
86     }
87 azarah 1.2
88     # Default directory where patches are located
89     EPATCH_SOURCE="${WORKDIR}/patch"
90     # Default extension for patches
91     EPATCH_SUFFIX="patch.bz2"
92     # Default options for patch
93 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
94     EPATCH_OPTS="-g0"
95 azarah 1.6 # List of patches not to apply. Not this is only file names,
96     # and not the full path ..
97     EPATCH_EXCLUDE=""
98 azarah 1.9 # Change the printed message for a single patch.
99     EPATCH_SINGLE_MSG=""
100 azarah 1.29 # Force applying bulk patches even if not following the style:
101     #
102     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
103     #
104     EPATCH_FORCE="no"
105 azarah 1.2
106     # This function is for bulk patching, or in theory for just one
107     # or two patches.
108     #
109     # It should work with .bz2, .gz, .zip and plain text patches.
110     # Currently all patches should be the same format.
111     #
112     # You do not have to specify '-p' option to patch, as it will
113     # try with -p0 to -p5 until it succeed, or fail at -p5.
114     #
115     # Above EPATCH_* variables can be used to control various defaults,
116     # bug they should be left as is to ensure an ebuild can rely on
117     # them for.
118     #
119 azarah 1.3 # Patches are applied in current directory.
120     #
121     # Bulk Patches should preferibly have the form of:
122 azarah 1.2 #
123     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
124     #
125     # For example:
126     #
127     # 01_all_misc-fix.patch.bz2
128     # 02_sparc_another-fix.patch.bz2
129     #
130     # This ensures that there are a set order, and you can have ARCH
131     # specific patches.
132     #
133 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
134     # single patch that need to be applied if its a file. If on the other
135     # hand its a directory, it will set EPATCH_SOURCE to this.
136     #
137 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
138     #
139     epatch() {
140     local PIPE_CMD=""
141     local STDERR_TARGET="${T}/$$.out"
142 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
143     local PATCH_SUFFIX=""
144 azarah 1.3 local SINGLE_PATCH="no"
145 azarah 1.4 local x=""
146 azarah 1.3
147     if [ "$#" -gt 1 ]
148     then
149     eerror "Invalid arguments to epatch()"
150     die "Invalid arguments to epatch()"
151     fi
152    
153     if [ -n "$1" -a -f "$1" ]
154     then
155     SINGLE_PATCH="yes"
156 danarmak 1.32
157 azarah 1.4 local EPATCH_SOURCE="$1"
158     local EPATCH_SUFFIX="${1##*\.}"
159 danarmak 1.32
160 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
161     then
162 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
163     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
164     then
165     local EPATCH_SOURCE="$1/*"
166     else
167     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168     fi
169 azarah 1.3 else
170 azarah 1.8 if [ ! -d ${EPATCH_SOURCE} ]
171     then
172 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
173     then
174     EPATCH_SOURCE="$1"
175     fi
176    
177 azarah 1.8 echo
178 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
179     eerror
180     eerror " ${EPATCH_SOURCE}"
181 azarah 1.8 echo
182     die "Cannot find \$EPATCH_SOURCE!"
183     fi
184 danarmak 1.32
185 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
186 azarah 1.3 fi
187 azarah 1.2
188     case ${EPATCH_SUFFIX##*\.} in
189     bz2)
190     PIPE_CMD="bzip2 -dc"
191 azarah 1.8 PATCH_SUFFIX="bz2"
192 azarah 1.2 ;;
193 azarah 1.6 gz|Z|z)
194 azarah 1.2 PIPE_CMD="gzip -dc"
195 azarah 1.8 PATCH_SUFFIX="gz"
196 azarah 1.2 ;;
197 azarah 1.6 ZIP|zip)
198 azarah 1.2 PIPE_CMD="unzip -p"
199 azarah 1.8 PATCH_SUFFIX="zip"
200 azarah 1.2 ;;
201     *)
202     PIPE_CMD="cat"
203 azarah 1.8 PATCH_SUFFIX="patch"
204 azarah 1.2 ;;
205     esac
206    
207 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
208     then
209     einfo "Applying various patches (bugfixes/updates)..."
210     fi
211     for x in ${EPATCH_SOURCE}
212 azarah 1.2 do
213     # New ARCH dependant patch naming scheme...
214     #
215     # ???_arch_foo.patch
216     #
217     if [ -f ${x} ] && \
218 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219     [ "${EPATCH_FORCE}" = "yes" ])
220 azarah 1.2 then
221     local count=0
222     local popts="${EPATCH_OPTS}"
223 azarah 1.6
224     if [ -n "${EPATCH_EXCLUDE}" ]
225     then
226 azarah 1.9 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
227 azarah 1.6 then
228     continue
229     fi
230     fi
231 danarmak 1.32
232 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
233     then
234 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
235     then
236     einfo "${EPATCH_SINGLE_MSG}"
237     else
238     einfo "Applying ${x##*/}..."
239     fi
240 azarah 1.3 else
241     einfo " ${x##*/}..."
242     fi
243 azarah 1.2
244 azarah 1.8 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 azarah 1.2
247     # Allow for prefix to differ ... im lazy, so shoot me :/
248     while [ "${count}" -lt 5 ]
249     do
250 azarah 1.5 # Generate some useful debug info ...
251 azarah 1.8 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
252     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253    
254     if [ "${PATCH_SUFFIX}" != "patch" ]
255     then
256     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
258     else
259     PATCH_TARGET="${x}"
260     fi
261 danarmak 1.32
262 azarah 1.8 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263     echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 danarmak 1.32
265 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267    
268     if [ "${PATCH_SUFFIX}" != "patch" ]
269     then
270     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
271     then
272     echo
273     eerror "Could not extract patch!"
274     #die "Could not extract patch!"
275     count=5
276     break
277     fi
278     fi
279 danarmak 1.32
280 azarah 1.19 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 azarah 1.2 then
282 azarah 1.8 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284     echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287    
288 azarah 1.19 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289 azarah 1.8
290     if [ "$?" -ne 0 ]
291     then
292     cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293     echo
294     eerror "A dry-run of patch command succeeded, but actually"
295     eerror "applying the patch failed!"
296     #die "Real world sux compared to the dreamworld!"
297     count=5
298     fi
299    
300     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
301 danarmak 1.32
302 azarah 1.2 break
303     fi
304    
305     count=$((count + 1))
306     done
307    
308 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
309     then
310     rm -f ${PATCH_TARGET}
311     fi
312    
313 azarah 1.2 if [ "${count}" -eq 5 ]
314     then
315 azarah 1.8 echo
316 azarah 1.2 eerror "Failed Patch: ${x##*/}!"
317     eerror
318     eerror "Include in your bugreport the contents of:"
319     eerror
320 azarah 1.8 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
321     echo
322 azarah 1.2 die "Failed Patch: ${x##*/}!"
323     fi
324 azarah 1.8
325     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
326 azarah 1.3
327     eend 0
328 azarah 1.2 fi
329     done
330 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
331     then
332     einfo "Done with patching"
333 azarah 1.10 fi
334 azarah 1.26 }
335    
336     # This function return true if we are using the NPTL pthreads
337     # implementation.
338     #
339     # <azarah@gentoo.org> (06 March 2003)
340     #
341    
342     have_NPTL() {
343    
344     cat > ${T}/test-nptl.c <<-"END"
345     #define _XOPEN_SOURCE
346     #include <unistd.h>
347     #include <stdio.h>
348    
349     int main()
350     {
351     char buf[255];
352     char *str = buf;
353    
354     confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355     if (NULL != str) {
356     printf("%s\n", str);
357     if (NULL != strstr(str, "NPTL"))
358     return 0;
359     }
360    
361     return 1;
362     }
363     END
364    
365     einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366     if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367     then
368     echo "yes"
369     einfon "Checking what PTHREADS implementation we have ... "
370     if ${T}/nptl
371     then
372     return 0
373     else
374     return 1
375     fi
376     else
377     echo "no"
378     fi
379    
380     return 1
381 azarah 1.10 }
382    
383     # This function check how many cpu's are present, and then set
384     # -j in MAKEOPTS accordingly.
385     #
386     # Thanks to nall <nall@gentoo.org> for this.
387     #
388     get_number_of_jobs() {
389 azarah 1.13 local jobs=0
390    
391 azarah 1.10 if [ ! -r /proc/cpuinfo ]
392     then
393     return 1
394     fi
395    
396 azarah 1.14 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
397     if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
398     then
399     ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
400 azarah 1.17 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
401     ADMINPARAM="${ADMINPARAM/-j}"
402 azarah 1.14 fi
403    
404 azarah 1.17 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
405 danarmak 1.32
406 drobbins 1.35 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
407 avenj 1.54 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
408 azarah 1.10 then
409 zwelch 1.21 # these archs will always have "[Pp]rocessor"
410     jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
411 danarmak 1.32
412 azarah 1.10 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
413     then
414     # sparc always has "ncpus active"
415 azarah 1.13 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
416 danarmak 1.32
417 azarah 1.10 elif [ "${ARCH}" = "alpha" ]
418     then
419     # alpha has "cpus active", but only when compiled with SMP
420 azarah 1.13 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
421 azarah 1.10 then
422 azarah 1.13 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 azarah 1.10 else
424 azarah 1.13 jobs=2
425 azarah 1.10 fi
426 danarmak 1.32
427 brad_mssw 1.78 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
428 azarah 1.10 then
429     # ppc has "processor", but only when compiled with SMP
430 azarah 1.13 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 azarah 1.10 then
432 azarah 1.13 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 azarah 1.10 else
434 azarah 1.13 jobs=2
435 azarah 1.10 fi
436     else
437 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
439 azarah 1.3 fi
440 azarah 1.13
441     # Make sure the number is valid ...
442     if [ "${jobs}" -lt 1 ]
443     then
444     jobs=1
445     fi
446 danarmak 1.32
447 azarah 1.15 if [ -n "${ADMINPARAM}" ]
448 azarah 1.14 then
449 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
450     then
451     einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
452     export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
453     else
454     einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
455     export MAKEOPTS="${MAKEOPTS} -j${jobs}"
456     fi
457 azarah 1.14 fi
458 azarah 1.1 }
459    
460 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
461 vapier 1.80 # does not exist on the users system
462 vapier 1.52 # vapier@gentoo.org
463     #
464     # Takes just 1 parameter (the directory to create tmpfile in)
465     mymktemp() {
466 azarah 1.59 local topdir="$1"
467    
468 vapier 1.52 [ -z "${topdir}" ] && topdir=/tmp
469 azarah 1.59 if [ "`which mktemp 2>/dev/null`" ]
470     then
471 vapier 1.52 mktemp -p ${topdir}
472     else
473     local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474     touch ${tmp}
475     echo ${tmp}
476     fi
477     }
478    
479 vapier 1.23 # Simplify/standardize adding users to the system
480     # vapier@gentoo.org
481     #
482     # enewuser(username, uid, shell, homedir, groups, extra options)
483     #
484     # Default values if you do not specify any:
485     # username: REQUIRED !
486     # uid: next available (see useradd(8))
487 vapier 1.27 # note: pass -1 to get default behavior
488 vapier 1.23 # shell: /bin/false
489     # homedir: /dev/null
490     # groups: none
491     # extra: comment of 'added by portage for ${PN}'
492     enewuser() {
493     # get the username
494     local euser="$1"; shift
495 azarah 1.59 if [ -z "${euser}" ]
496     then
497 vapier 1.23 eerror "No username specified !"
498     die "Cannot call enewuser without a username"
499     fi
500    
501 vapier 1.84 # lets see if the username already exists
502     if [ "${euser}" == "`getent passwd \"${euser}\" | cut -d: -f1`" ]
503 azarah 1.59 then
504 vapier 1.23 return 0
505     fi
506 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
507 vapier 1.23
508     # options to pass to useradd
509 azarah 1.59 local opts=
510 vapier 1.23
511     # handle uid
512     local euid="$1"; shift
513 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
514     then
515     if [ "${euid}" -gt 0 ]
516     then
517 vapier 1.84 if [ ! -z "`getent passwd ${euid}`" ]
518 vapier 1.82 then
519 vapier 1.84 euid="next"
520 vapier 1.82 fi
521 vapier 1.23 else
522     eerror "Userid given but is not greater than 0 !"
523     die "${euid} is not a valid UID"
524     fi
525     else
526 vapier 1.84 euid="next"
527     fi
528     if [ "${euid}" == "next" ]
529     then
530     for euid in `seq 101 999` ; do
531     [ -z "`getent passwd ${euid}`" ] && break
532     done
533 vapier 1.23 fi
534 vapier 1.84 opts="${opts} -u ${euid}"
535 vapier 1.23 einfo " - Userid: ${euid}"
536    
537     # handle shell
538     local eshell="$1"; shift
539 vapier 1.67 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
540 azarah 1.59 then
541     if [ ! -e "${eshell}" ]
542     then
543 vapier 1.23 eerror "A shell was specified but it does not exist !"
544     die "${eshell} does not exist"
545     fi
546     else
547 azarah 1.59 eshell="/bin/false"
548 vapier 1.23 fi
549     einfo " - Shell: ${eshell}"
550     opts="${opts} -s ${eshell}"
551    
552     # handle homedir
553     local ehome="$1"; shift
554 vapier 1.67 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
555 azarah 1.59 then
556     ehome="/dev/null"
557 vapier 1.23 fi
558     einfo " - Home: ${ehome}"
559     opts="${opts} -d ${ehome}"
560    
561     # handle groups
562     local egroups="$1"; shift
563 azarah 1.59 if [ ! -z "${egroups}" ]
564     then
565 vapier 1.23 local oldifs="${IFS}"
566     export IFS=","
567 azarah 1.59 for g in ${egroups}
568     do
569 vapier 1.85 if [ -z "`getent group \"${g}\"`" ]
570 azarah 1.59 then
571 vapier 1.85 eerror "You must add group ${g} to the system first"
572 vapier 1.23 die "${g} is not a valid GID"
573     fi
574     done
575     export IFS="${oldifs}"
576     opts="${opts} -g ${egroups}"
577     else
578     egroups="(none)"
579     fi
580     einfo " - Groups: ${egroups}"
581    
582     # handle extra and add the user
583     local eextra="$@"
584 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
585 vapier 1.23 export SANDBOX_ON="0"
586 azarah 1.59 if [ -z "${eextra}" ]
587     then
588 vapier 1.23 useradd ${opts} ${euser} \
589     -c "added by portage for ${PN}" \
590     || die "enewuser failed"
591     else
592     einfo " - Extra: ${eextra}"
593     useradd ${opts} ${euser} ${eextra} \
594 danarmak 1.32 || die "enewuser failed"
595 vapier 1.23 fi
596     export SANDBOX_ON="${oldsandbox}"
597    
598 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
599     then
600 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
601     dodir ${ehome}
602 vapier 1.37 fowners ${euser} ${ehome}
603 vapier 1.38 fperms 755 ${ehome}
604 vapier 1.23 fi
605     }
606    
607     # Simplify/standardize adding groups to the system
608     # vapier@gentoo.org
609     #
610     # enewgroup(group, gid)
611     #
612     # Default values if you do not specify any:
613     # groupname: REQUIRED !
614     # gid: next available (see groupadd(8))
615     # extra: none
616     enewgroup() {
617     # get the group
618     local egroup="$1"; shift
619 azarah 1.59 if [ -z "${egroup}" ]
620     then
621 vapier 1.23 eerror "No group specified !"
622     die "Cannot call enewgroup without a group"
623     fi
624    
625     # see if group already exists
626 vapier 1.84 if [ "${egroup}" == "`getent group \"${egroup}\" | cut -d: -f1`" ]
627 azarah 1.59 then
628 vapier 1.23 return 0
629     fi
630 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
631 vapier 1.23
632     # options to pass to useradd
633 azarah 1.59 local opts=
634 vapier 1.23
635     # handle gid
636     local egid="$1"; shift
637 azarah 1.59 if [ ! -z "${egid}" ]
638     then
639     if [ "${egid}" -gt 0 ]
640     then
641 vapier 1.84 if [ -z "`getent group ${egid}`" ]
642 vapier 1.83 then
643 vapier 1.84 opts="${opts} -g ${egid}"
644 vapier 1.83 else
645 vapier 1.84 egid="next available; requested gid taken"
646 vapier 1.83 fi
647 vapier 1.23 else
648     eerror "Groupid given but is not greater than 0 !"
649     die "${egid} is not a valid GID"
650     fi
651     else
652     egid="next available"
653     fi
654     einfo " - Groupid: ${egid}"
655    
656     # handle extra
657     local eextra="$@"
658     opts="${opts} ${eextra}"
659    
660     # add the group
661 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
662 vapier 1.23 export SANDBOX_ON="0"
663     groupadd ${opts} ${egroup} || die "enewgroup failed"
664     export SANDBOX_ON="${oldsandbox}"
665 vapier 1.24 }
666    
667     # Simple script to replace 'dos2unix' binaries
668     # vapier@gentoo.org
669     #
670     # edos2unix(file, <more files>...)
671     edos2unix() {
672 vapier 1.61 for f in "$@"
673 azarah 1.59 do
674 vapier 1.61 cp "${f}" ${T}/edos2unix
675     sed 's/\r$//' ${T}/edos2unix > "${f}"
676 vapier 1.24 done
677 vapier 1.39 }
678    
679     # Make a desktop file !
680     # Great for making those icons in kde/gnome startmenu !
681     # Amaze your friends ! Get the women ! Join today !
682     # gnome2 /usr/share/applications
683     # gnome1 /usr/share/gnome/apps/
684     # KDE ${KDEDIR}/share/applnk /usr/share/applnk
685     #
686     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
687     #
688     # binary: what binary does the app run with ?
689     # name: the name that will show up in the menu
690     # icon: give your little like a pretty little icon ...
691     # this can be relative (to /usr/share/pixmaps) or
692     # a full path to an icon
693     # type: what kind of application is this ? for categories:
694     # http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
695     # path: if your app needs to startup in a specific dir
696     make_desktop_entry() {
697     [ -z "$1" ] && eerror "You must specify the executable" && return 1
698    
699 azarah 1.59 local exec="${1}"
700     local name="${2:-${PN}}"
701     local icon="${3:-${PN}.png}"
702     local type="${4}"
703 vapier 1.81 local subdir="${6}"
704 azarah 1.59 local path="${5:-${GAMES_PREFIX}}"
705     if [ -z "${type}" ]
706     then
707 vapier 1.39 case ${CATEGORY} in
708 azarah 1.59 "app-emulation")
709     type=Emulator
710 vapier 1.81 subdir="Games"
711 azarah 1.59 ;;
712     "games-"*)
713     type=Game
714 vapier 1.81 subdir="Games"
715 wolf31o2 1.65 ;;
716     "net-"*)
717 vapier 1.81 type=Network
718     subdir="${type}"
719 azarah 1.59 ;;
720     *)
721     type=
722 vapier 1.81 subdir=
723 azarah 1.59 ;;
724 vapier 1.39 esac
725     fi
726 azarah 1.59 local desktop="${T}/${exec}.desktop"
727 vapier 1.39
728     echo "[Desktop Entry]
729     Encoding=UTF-8
730     Version=0.9.2
731     Name=${name}
732     Type=Application
733     Comment=${DESCRIPTION}
734     Exec=${exec}
735     Path=${path}
736     Icon=${icon}
737 vapier 1.40 Categories=Application;${type};" > ${desktop}
738 vapier 1.39
739 azarah 1.59 if [ -d "/usr/share/applications" ]
740     then
741 vapier 1.39 insinto /usr/share/applications
742 vapier 1.40 doins ${desktop}
743 vapier 1.39 fi
744    
745 azarah 1.59 #if [ -d "/usr/share/gnome/apps" ]
746     #then
747 vapier 1.40 # insinto /usr/share/gnome/apps/Games
748     # doins ${desktop}
749     #fi
750    
751 azarah 1.59 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
752     #then
753     # for ver in /usr/kde/*
754     # do
755 vapier 1.40 # insinto ${ver}/share/applnk/Games
756     # doins ${desktop}
757     # done
758     #fi
759 vapier 1.39
760 azarah 1.59 if [ -d "/usr/share/applnk" ]
761     then
762 vapier 1.81 insinto /usr/share/applnk/${subdir}
763 vapier 1.40 doins ${desktop}
764 vapier 1.39 fi
765    
766     return 0
767 danarmak 1.32 }
768    
769 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
770     find_unpackable_file() {
771 azarah 1.59 local src="$1"
772     if [ -z "${src}" ]
773     then
774 vapier 1.50 src="${DISTDIR}/${A}"
775     else
776 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
777     then
778 vapier 1.50 src="${DISTDIR}/${src}"
779 azarah 1.59 elif [ -e "${PWD}/${src}" ]
780     then
781 vapier 1.50 src="${PWD}/${src}"
782 azarah 1.59 elif [ -e "${src}" ]
783     then
784 vapier 1.50 src="${src}"
785     fi
786     fi
787 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
788     echo "${src}"
789     }
790    
791     # Unpack those pesky pdv generated files ...
792     # They're self-unpacking programs with the binary package stuffed in
793     # the middle of the archive. Valve seems to use it a lot ... too bad
794     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
795     #
796     # Usage: unpack_pdv [file to unpack] [size of off_t]
797     # - you have to specify the off_t size ... i have no idea how to extract that
798     # information out of the binary executable myself. basically you pass in
799     # the size of the off_t type (in bytes) on the machine that built the pdv
800     # archive. one way to determine this is by running the following commands:
801     # strings <pdv archive> | grep lseek
802     # strace -elseek <pdv archive>
803     # basically look for the first lseek command (we do the strings/grep because
804     # sometimes the function call is _llseek or something) and steal the 2nd
805     # parameter. here is an example:
806     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
807     # lseek
808     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
809     # lseek(3, -4, SEEK_END) = 2981250
810     # thus we would pass in the value of '4' as the second parameter.
811     unpack_pdv() {
812     local src="`find_unpackable_file $1`"
813     local sizeoff_t="$2"
814    
815     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
816    
817     local shrtsrc="`basename ${src}`"
818     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
819     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
820     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
821    
822     # grab metadata for debug reasons
823     local metafile="`mymktemp ${T}`"
824     tail -c +$((${metaskip}+1)) ${src} > ${metafile}
825    
826     # rip out the final file name from the metadata
827     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
828     datafile="`basename ${datafile}`"
829    
830 vapier 1.71 # now lets uncompress/untar the file if need be
831 vapier 1.70 local tmpfile="`mymktemp ${T}`"
832     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
833 vapier 1.71
834     local iscompressed="`file -b ${tmpfile}`"
835     if [ "${iscompressed:0:8}" == "compress" ] ; then
836     iscompressed=1
837     mv ${tmpfile}{,.Z}
838     gunzip ${tmpfile}
839     else
840     iscompressed=0
841     fi
842     local istar="`file -b ${tmpfile}`"
843     if [ "${istar:0:9}" == "POSIX tar" ] ; then
844     istar=1
845     else
846     istar=0
847     fi
848    
849     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
850     #dd if=${src} ibs=${metaskip} count=1 \
851     # | dd ibs=${tailskip} skip=1 \
852     # | gzip -dc \
853     # > ${datafile}
854     if [ ${iscompressed} -eq 1 ] ; then
855     if [ ${istar} -eq 1 ] ; then
856     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
857     | head -c $((${metaskip}-${tailskip})) \
858     | tar -xzf -
859     else
860 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
861     | head -c $((${metaskip}-${tailskip})) \
862     | gzip -dc \
863     > ${datafile}
864 vapier 1.71 fi
865     else
866     if [ ${istar} -eq 1 ] ; then
867     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
868     | head -c $((${metaskip}-${tailskip})) \
869 vapier 1.73 | tar --no-same-owner -xf -
870 vapier 1.71 else
871 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
872     | head -c $((${metaskip}-${tailskip})) \
873     > ${datafile}
874 vapier 1.71 fi
875     fi
876     true
877     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
878 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
879     }
880    
881     # Unpack those pesky makeself generated files ...
882     # They're shell scripts with the binary package tagged onto
883     # the end of the archive. Loki utilized the format as does
884     # many other game companies.
885     #
886     # Usage: unpack_makeself [file to unpack] [offset]
887     # - If the file is not specified then unpack will utilize ${A}.
888     # - If the offset is not specified then we will attempt to extract
889     # the proper offset from the script itself.
890     unpack_makeself() {
891     local src="`find_unpackable_file $1`"
892     local skip="$2"
893 vapier 1.50
894 azarah 1.59 local shrtsrc="`basename ${src}`"
895 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
896 azarah 1.59 if [ -z "${skip}" ]
897     then
898 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
899     local skip=0
900     case ${ver} in
901     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
902     skip=`grep -a ^skip= ${src} | cut -d= -f2`
903     ;;
904     2.0|2.0.1)
905     skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
906     ;;
907 wolf31o2 1.48 2.1.1)
908 vapier 1.41 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
909 wolf31o2 1.48 let skip="skip + 1"
910     ;;
911 vapier 1.49 2.1.2)
912     skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
913     let skip="skip + 1"
914     ;;
915 wolf31o2 1.48 2.1.3)
916     skip=`grep -a ^offset= ${src} | awk '{print $3}'`
917 vapier 1.41 let skip="skip + 1"
918     ;;
919     *)
920     eerror "I'm sorry, but I was unable to support the Makeself file."
921     eerror "The version I detected was '${ver}'."
922     eerror "Please file a bug about the file ${shrtsrc} at"
923     eerror "http://bugs.gentoo.org/ so that support can be added."
924     die "makeself version '${ver}' not supported"
925     ;;
926     esac
927     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
928     fi
929    
930 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
931     local tmpfile="`mymktemp ${T}`"
932     tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
933     local filetype="`file -b ${tmpfile}`"
934     case ${filetype} in
935     *tar\ archive)
936 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xf -
937 vapier 1.68 ;;
938     bzip2*)
939 vapier 1.73 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
940 mr_bones_ 1.69 ;;
941 vapier 1.68 gzip*)
942 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
943 vapier 1.68 ;;
944     *)
945     false
946     ;;
947     esac
948     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
949 wolf31o2 1.56 }
950    
951     # Display a license for user to accept.
952     #
953     # Usage: check_license [license]
954     # - If the file is not specified then ${LICENSE} is used.
955     check_license() {
956 vapier 1.60 local lic=$1
957     if [ -z "${lic}" ] ; then
958     lic="${PORTDIR}/licenses/${LICENSE}"
959 wolf31o2 1.56 else
960 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
961     lic="${PORTDIR}/licenses/${src}"
962     elif [ -e "${PWD}/${src}" ] ; then
963     lic="${PWD}/${src}"
964     elif [ -e "${src}" ] ; then
965     lic="${src}"
966 wolf31o2 1.56 fi
967     fi
968 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
969 vapier 1.64 local l="`basename ${lic}`"
970 wolf31o2 1.56
971 vapier 1.60 # here is where we check for the licenses the user already
972     # accepted ... if we don't find a match, we make the user accept
973     local alic
974 vapier 1.74 for alic in "${ACCEPT_LICENSE}" ; do
975 vapier 1.60 [ "${alic}" == "*" ] && return 0
976 vapier 1.64 [ "${alic}" == "${l}" ] && return 0
977 vapier 1.60 done
978    
979     local licmsg="`mymktemp ${T}`"
980     cat << EOF > ${licmsg}
981     **********************************************************
982     The following license outlines the terms of use of this
983     package. You MUST accept this license for installation to
984     continue. When you are done viewing, hit 'q'. If you
985     CTRL+C out of this, the install will not run!
986     **********************************************************
987    
988     EOF
989     cat ${lic} >> ${licmsg}
990     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
991 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
992 vapier 1.60 read alic
993     case ${alic} in
994     yes|Yes|y|Y)
995     return 0
996     ;;
997     *)
998     echo;echo;echo
999     eerror "You MUST accept the license to continue! Exiting!"
1000     die "Failed to accept license"
1001     ;;
1002     esac
1003 vapier 1.23 }
1004 vapier 1.75
1005     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1006     # the whole 'non-interactive' policy, but damnit I want CD support !
1007     #
1008     # with these cdrom functions we handle all the user interaction and
1009     # standardize everything. all you have to do is call cdrom_get_cds()
1010     # and when the function returns, you can assume that the cd has been
1011     # found at CDROM_ROOT.
1012     #
1013     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1014     # etc... if you want to give the cds better names, then just export
1015     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1016     #
1017     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1018     #
1019     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1020     # - this will attempt to locate a cd based upon a file that is on
1021     # the cd ... the more files you give this function, the more cds
1022     # the cdrom functions will handle
1023     cdrom_get_cds() {
1024     # first we figure out how many cds we're dealing with by
1025     # the # of files they gave us
1026     local cdcnt=0
1027     local f=
1028     for f in "$@" ; do
1029     cdcnt=$((cdcnt + 1))
1030     export CDROM_CHECK_${cdcnt}="$f"
1031     done
1032     export CDROM_TOTAL_CDS=${cdcnt}
1033     export CDROM_CURRENT_CD=1
1034    
1035     # now we see if the user gave use CD_ROOT ...
1036     # if they did, let's just believe them that it's correct
1037     if [ ! -z "${CD_ROOT}" ] ; then
1038     export CDROM_ROOT="${CD_ROOT}"
1039     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1040     return
1041     fi
1042     # do the same for CD_ROOT_X
1043     if [ ! -z "${CD_ROOT_1}" ] ; then
1044     local var=
1045     cdcnt=0
1046     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1047     cdcnt=$((cdcnt + 1))
1048     var="CD_ROOT_${cdcnt}"
1049     if [ -z "${!var}" ] ; then
1050     eerror "You must either use just the CD_ROOT"
1051     eerror "or specify ALL the CD_ROOT_X variables."
1052     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1053     die "could not locate CD_ROOT_${cdcnt}"
1054     fi
1055     export CDROM_ROOTS_${cdcnt}="${!var}"
1056     done
1057     export CDROM_ROOT=${CDROM_ROOTS_1}
1058     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1059     return
1060     fi
1061    
1062     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1063     einfon "This ebuild will need the "
1064     if [ -z "${CDROM_NAME}" ] ; then
1065     echo "cdrom for ${PN}."
1066     else
1067     echo "${CDROM_NAME}."
1068     fi
1069     echo
1070     einfo "If you do not have the CD, but have the data files"
1071     einfo "mounted somewhere on your filesystem, just export"
1072     einfo "the variable CD_ROOT so that it points to the"
1073     einfo "directory containing the files."
1074     echo
1075     else
1076     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1077     cdcnt=0
1078     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1079     cdcnt=$((cdcnt + 1))
1080     var="CDROM_NAME_${cdcnt}"
1081     [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}"
1082     done
1083     echo
1084     einfo "If you do not have the CDs, but have the data files"
1085     einfo "mounted somewhere on your filesystem, just export"
1086     einfo "the following variables so they point to the right place:"
1087     einfon ""
1088     cdcnt=0
1089     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1090     cdcnt=$((cdcnt + 1))
1091     echo -n " CD_ROOT_${cdcnt}"
1092     done
1093     echo
1094     einfo "Or, if you have all the files in the same place, or"
1095     einfo "you only have one cdrom, you can export CD_ROOT"
1096     einfo "and that place will be used as the same data source"
1097     einfo "for all the CDs."
1098     echo
1099     fi
1100     export CDROM_CURRENT_CD=0
1101     cdrom_load_next_cd
1102     }
1103    
1104     # this is only used when you need access to more than one cd.
1105     # when you have finished using the first cd, just call this function.
1106     # when it returns, CDROM_ROOT will be pointing to the second cd.
1107     # remember, you can only go forward in the cd chain, you can't go back.
1108     cdrom_load_next_cd() {
1109     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1110     local var=
1111    
1112 vapier 1.79 if [ ! -z "${CD_ROOT}" ] ; then
1113     einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1114     return
1115     fi
1116    
1117 vapier 1.75 unset CDROM_ROOT
1118     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1119     if [ -z "${!var}" ] ; then
1120     var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1121     cdrom_locate_file_on_cd ${!var}
1122     else
1123     export CDROM_ROOT="${!var}"
1124     fi
1125    
1126     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1127     }
1128    
1129     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1130     # functions. this should *never* be called from an ebuild.
1131     # all it does is try to locate a give file on a cd ... if the cd isn't
1132     # found, then a message asking for the user to insert the cdrom will be
1133     # displayed and we'll hang out here until:
1134     # (1) the file is found on a mounted cdrom
1135     # (2) the user hits CTRL+C
1136     cdrom_locate_file_on_cd() {
1137     while [ -z "${CDROM_ROOT}" ] ; do
1138     local dir="$(dirname ${@})"
1139     local file="$(basename ${@})"
1140     local mline=""
1141     local showedmsg=0
1142    
1143     for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do
1144     [ -d "${mline}/${dir}" ] || continue
1145     [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \
1146     && export CDROM_ROOT=${mline}
1147     done
1148    
1149     if [ -z "${CDROM_ROOT}" ] ; then
1150     echo
1151     if [ ${showedmsg} -eq 0 ] ; then
1152     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1153     if [ -z "${CDROM_NAME}" ] ; then
1154     einfo "Please insert the cdrom for ${PN} now !"
1155     else
1156     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1157     fi
1158     else
1159     if [ -z "${CDROM_NAME_1}" ] ; then
1160     einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1161     else
1162     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1163     einfo "Please insert+mount the ${!var} cdrom now !"
1164     fi
1165     fi
1166     showedmsg=1
1167     fi
1168     einfo "Press return to scan for the cd again"
1169     einfo "or hit CTRL+C to abort the emerge."
1170     read
1171     fi
1172     done
1173     }

  ViewVC Help
Powered by ViewVC 1.1.20