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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.90 - (hide annotations) (download)
Fri Jun 25 00:39:48 2004 UTC (10 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.89: +2 -2 lines
update the copyright info

1 vapier 1.90 # Copyright 1999-2004 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.90 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.89 2004/06/22 22:36:22 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 vapier 1.88 echo "patch -p${count} ${popts} < ${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 vapier 1.88 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${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 vapier 1.88 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${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 iggy 1.87 elif [ "${ARCH}" = "s390" ]
437     then
438     # s390 has "# processors : "
439     jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
440 azarah 1.10 else
441 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
442 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
443 azarah 1.3 fi
444 azarah 1.13
445     # Make sure the number is valid ...
446     if [ "${jobs}" -lt 1 ]
447     then
448     jobs=1
449     fi
450 danarmak 1.32
451 azarah 1.15 if [ -n "${ADMINPARAM}" ]
452 azarah 1.14 then
453 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
454     then
455     einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
456     export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
457     else
458     einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
459     export MAKEOPTS="${MAKEOPTS} -j${jobs}"
460     fi
461 azarah 1.14 fi
462 azarah 1.1 }
463    
464 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
465 vapier 1.80 # does not exist on the users system
466 vapier 1.52 # vapier@gentoo.org
467     #
468     # Takes just 1 parameter (the directory to create tmpfile in)
469     mymktemp() {
470 azarah 1.59 local topdir="$1"
471    
472 vapier 1.52 [ -z "${topdir}" ] && topdir=/tmp
473 azarah 1.59 if [ "`which mktemp 2>/dev/null`" ]
474     then
475 vapier 1.52 mktemp -p ${topdir}
476     else
477     local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
478     touch ${tmp}
479     echo ${tmp}
480     fi
481     }
482    
483 vapier 1.23 # Simplify/standardize adding users to the system
484     # vapier@gentoo.org
485     #
486     # enewuser(username, uid, shell, homedir, groups, extra options)
487     #
488     # Default values if you do not specify any:
489     # username: REQUIRED !
490     # uid: next available (see useradd(8))
491 vapier 1.27 # note: pass -1 to get default behavior
492 vapier 1.23 # shell: /bin/false
493     # homedir: /dev/null
494     # groups: none
495     # extra: comment of 'added by portage for ${PN}'
496     enewuser() {
497     # get the username
498     local euser="$1"; shift
499 azarah 1.59 if [ -z "${euser}" ]
500     then
501 vapier 1.23 eerror "No username specified !"
502     die "Cannot call enewuser without a username"
503     fi
504    
505 vapier 1.84 # lets see if the username already exists
506     if [ "${euser}" == "`getent passwd \"${euser}\" | cut -d: -f1`" ]
507 azarah 1.59 then
508 vapier 1.23 return 0
509     fi
510 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
511 vapier 1.23
512     # options to pass to useradd
513 azarah 1.59 local opts=
514 vapier 1.23
515     # handle uid
516     local euid="$1"; shift
517 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
518     then
519     if [ "${euid}" -gt 0 ]
520     then
521 vapier 1.84 if [ ! -z "`getent passwd ${euid}`" ]
522 vapier 1.82 then
523 vapier 1.84 euid="next"
524 vapier 1.82 fi
525 vapier 1.23 else
526     eerror "Userid given but is not greater than 0 !"
527     die "${euid} is not a valid UID"
528     fi
529     else
530 vapier 1.84 euid="next"
531     fi
532     if [ "${euid}" == "next" ]
533     then
534     for euid in `seq 101 999` ; do
535     [ -z "`getent passwd ${euid}`" ] && break
536     done
537 vapier 1.23 fi
538 vapier 1.84 opts="${opts} -u ${euid}"
539 vapier 1.23 einfo " - Userid: ${euid}"
540    
541     # handle shell
542     local eshell="$1"; shift
543 vapier 1.67 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
544 azarah 1.59 then
545     if [ ! -e "${eshell}" ]
546     then
547 vapier 1.23 eerror "A shell was specified but it does not exist !"
548     die "${eshell} does not exist"
549     fi
550     else
551 azarah 1.59 eshell="/bin/false"
552 vapier 1.23 fi
553     einfo " - Shell: ${eshell}"
554     opts="${opts} -s ${eshell}"
555    
556     # handle homedir
557     local ehome="$1"; shift
558 vapier 1.67 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
559 azarah 1.59 then
560     ehome="/dev/null"
561 vapier 1.23 fi
562     einfo " - Home: ${ehome}"
563     opts="${opts} -d ${ehome}"
564    
565     # handle groups
566     local egroups="$1"; shift
567 azarah 1.59 if [ ! -z "${egroups}" ]
568     then
569 vapier 1.23 local oldifs="${IFS}"
570     export IFS=","
571 azarah 1.59 for g in ${egroups}
572     do
573 vapier 1.85 if [ -z "`getent group \"${g}\"`" ]
574 azarah 1.59 then
575 vapier 1.85 eerror "You must add group ${g} to the system first"
576 vapier 1.23 die "${g} is not a valid GID"
577     fi
578     done
579     export IFS="${oldifs}"
580     opts="${opts} -g ${egroups}"
581     else
582     egroups="(none)"
583     fi
584     einfo " - Groups: ${egroups}"
585    
586     # handle extra and add the user
587     local eextra="$@"
588 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
589 vapier 1.23 export SANDBOX_ON="0"
590 azarah 1.59 if [ -z "${eextra}" ]
591     then
592 vapier 1.23 useradd ${opts} ${euser} \
593     -c "added by portage for ${PN}" \
594     || die "enewuser failed"
595     else
596     einfo " - Extra: ${eextra}"
597     useradd ${opts} ${euser} ${eextra} \
598 danarmak 1.32 || die "enewuser failed"
599 vapier 1.23 fi
600     export SANDBOX_ON="${oldsandbox}"
601    
602 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
603     then
604 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
605     dodir ${ehome}
606 vapier 1.37 fowners ${euser} ${ehome}
607 vapier 1.38 fperms 755 ${ehome}
608 vapier 1.23 fi
609     }
610    
611     # Simplify/standardize adding groups to the system
612     # vapier@gentoo.org
613     #
614     # enewgroup(group, gid)
615     #
616     # Default values if you do not specify any:
617     # groupname: REQUIRED !
618     # gid: next available (see groupadd(8))
619     # extra: none
620     enewgroup() {
621     # get the group
622     local egroup="$1"; shift
623 azarah 1.59 if [ -z "${egroup}" ]
624     then
625 vapier 1.23 eerror "No group specified !"
626     die "Cannot call enewgroup without a group"
627     fi
628    
629     # see if group already exists
630 vapier 1.84 if [ "${egroup}" == "`getent group \"${egroup}\" | cut -d: -f1`" ]
631 azarah 1.59 then
632 vapier 1.23 return 0
633     fi
634 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
635 vapier 1.23
636     # options to pass to useradd
637 azarah 1.59 local opts=
638 vapier 1.23
639     # handle gid
640     local egid="$1"; shift
641 azarah 1.59 if [ ! -z "${egid}" ]
642     then
643     if [ "${egid}" -gt 0 ]
644     then
645 vapier 1.84 if [ -z "`getent group ${egid}`" ]
646 vapier 1.83 then
647 vapier 1.84 opts="${opts} -g ${egid}"
648 vapier 1.83 else
649 vapier 1.84 egid="next available; requested gid taken"
650 vapier 1.83 fi
651 vapier 1.23 else
652     eerror "Groupid given but is not greater than 0 !"
653     die "${egid} is not a valid GID"
654     fi
655     else
656     egid="next available"
657     fi
658     einfo " - Groupid: ${egid}"
659    
660     # handle extra
661     local eextra="$@"
662     opts="${opts} ${eextra}"
663    
664     # add the group
665 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
666 vapier 1.23 export SANDBOX_ON="0"
667     groupadd ${opts} ${egroup} || die "enewgroup failed"
668     export SANDBOX_ON="${oldsandbox}"
669 vapier 1.24 }
670    
671     # Simple script to replace 'dos2unix' binaries
672     # vapier@gentoo.org
673     #
674     # edos2unix(file, <more files>...)
675     edos2unix() {
676 vapier 1.61 for f in "$@"
677 azarah 1.59 do
678 vapier 1.61 cp "${f}" ${T}/edos2unix
679     sed 's/\r$//' ${T}/edos2unix > "${f}"
680 vapier 1.24 done
681 vapier 1.39 }
682    
683     # Make a desktop file !
684     # Great for making those icons in kde/gnome startmenu !
685     # Amaze your friends ! Get the women ! Join today !
686     # gnome2 /usr/share/applications
687     # gnome1 /usr/share/gnome/apps/
688     # KDE ${KDEDIR}/share/applnk /usr/share/applnk
689     #
690     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
691     #
692     # binary: what binary does the app run with ?
693     # name: the name that will show up in the menu
694     # icon: give your little like a pretty little icon ...
695     # this can be relative (to /usr/share/pixmaps) or
696     # a full path to an icon
697     # type: what kind of application is this ? for categories:
698 vapier 1.89 # http://www.freedesktop.org/standards/menu-spec/
699 vapier 1.39 # path: if your app needs to startup in a specific dir
700     make_desktop_entry() {
701     [ -z "$1" ] && eerror "You must specify the executable" && return 1
702    
703 azarah 1.59 local exec="${1}"
704     local name="${2:-${PN}}"
705     local icon="${3:-${PN}.png}"
706     local type="${4}"
707 vapier 1.81 local subdir="${6}"
708 azarah 1.59 local path="${5:-${GAMES_PREFIX}}"
709     if [ -z "${type}" ]
710     then
711 vapier 1.39 case ${CATEGORY} in
712 azarah 1.59 "app-emulation")
713     type=Emulator
714 vapier 1.86 subdir="Emulation"
715 azarah 1.59 ;;
716     "games-"*)
717     type=Game
718 vapier 1.81 subdir="Games"
719 wolf31o2 1.65 ;;
720     "net-"*)
721 vapier 1.81 type=Network
722     subdir="${type}"
723 azarah 1.59 ;;
724     *)
725     type=
726 vapier 1.81 subdir=
727 azarah 1.59 ;;
728 vapier 1.39 esac
729     fi
730 azarah 1.59 local desktop="${T}/${exec}.desktop"
731 vapier 1.39
732     echo "[Desktop Entry]
733     Encoding=UTF-8
734     Version=0.9.2
735     Name=${name}
736     Type=Application
737     Comment=${DESCRIPTION}
738     Exec=${exec}
739     Path=${path}
740     Icon=${icon}
741 vapier 1.40 Categories=Application;${type};" > ${desktop}
742 vapier 1.39
743 azarah 1.59 if [ -d "/usr/share/applications" ]
744     then
745 vapier 1.39 insinto /usr/share/applications
746 vapier 1.40 doins ${desktop}
747 vapier 1.39 fi
748    
749 azarah 1.59 #if [ -d "/usr/share/gnome/apps" ]
750     #then
751 vapier 1.40 # insinto /usr/share/gnome/apps/Games
752     # doins ${desktop}
753     #fi
754    
755 azarah 1.59 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
756     #then
757     # for ver in /usr/kde/*
758     # do
759 vapier 1.40 # insinto ${ver}/share/applnk/Games
760     # doins ${desktop}
761     # done
762     #fi
763 vapier 1.39
764 azarah 1.59 if [ -d "/usr/share/applnk" ]
765     then
766 vapier 1.81 insinto /usr/share/applnk/${subdir}
767 vapier 1.40 doins ${desktop}
768 vapier 1.39 fi
769    
770     return 0
771 danarmak 1.32 }
772    
773 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
774     find_unpackable_file() {
775 azarah 1.59 local src="$1"
776     if [ -z "${src}" ]
777     then
778 vapier 1.50 src="${DISTDIR}/${A}"
779     else
780 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
781     then
782 vapier 1.50 src="${DISTDIR}/${src}"
783 azarah 1.59 elif [ -e "${PWD}/${src}" ]
784     then
785 vapier 1.50 src="${PWD}/${src}"
786 azarah 1.59 elif [ -e "${src}" ]
787     then
788 vapier 1.50 src="${src}"
789     fi
790     fi
791 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
792     echo "${src}"
793     }
794    
795     # Unpack those pesky pdv generated files ...
796     # They're self-unpacking programs with the binary package stuffed in
797     # the middle of the archive. Valve seems to use it a lot ... too bad
798     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
799     #
800     # Usage: unpack_pdv [file to unpack] [size of off_t]
801     # - you have to specify the off_t size ... i have no idea how to extract that
802     # information out of the binary executable myself. basically you pass in
803     # the size of the off_t type (in bytes) on the machine that built the pdv
804     # archive. one way to determine this is by running the following commands:
805     # strings <pdv archive> | grep lseek
806     # strace -elseek <pdv archive>
807     # basically look for the first lseek command (we do the strings/grep because
808     # sometimes the function call is _llseek or something) and steal the 2nd
809     # parameter. here is an example:
810     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
811     # lseek
812     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
813     # lseek(3, -4, SEEK_END) = 2981250
814     # thus we would pass in the value of '4' as the second parameter.
815     unpack_pdv() {
816     local src="`find_unpackable_file $1`"
817     local sizeoff_t="$2"
818    
819     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
820    
821     local shrtsrc="`basename ${src}`"
822     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
823     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
824     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
825    
826     # grab metadata for debug reasons
827     local metafile="`mymktemp ${T}`"
828     tail -c +$((${metaskip}+1)) ${src} > ${metafile}
829    
830     # rip out the final file name from the metadata
831     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
832     datafile="`basename ${datafile}`"
833    
834 vapier 1.71 # now lets uncompress/untar the file if need be
835 vapier 1.70 local tmpfile="`mymktemp ${T}`"
836     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
837 vapier 1.71
838     local iscompressed="`file -b ${tmpfile}`"
839     if [ "${iscompressed:0:8}" == "compress" ] ; then
840     iscompressed=1
841     mv ${tmpfile}{,.Z}
842     gunzip ${tmpfile}
843     else
844     iscompressed=0
845     fi
846     local istar="`file -b ${tmpfile}`"
847     if [ "${istar:0:9}" == "POSIX tar" ] ; then
848     istar=1
849     else
850     istar=0
851     fi
852    
853     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
854     #dd if=${src} ibs=${metaskip} count=1 \
855     # | dd ibs=${tailskip} skip=1 \
856     # | gzip -dc \
857     # > ${datafile}
858     if [ ${iscompressed} -eq 1 ] ; then
859     if [ ${istar} -eq 1 ] ; then
860     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
861     | head -c $((${metaskip}-${tailskip})) \
862     | tar -xzf -
863     else
864 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
865     | head -c $((${metaskip}-${tailskip})) \
866     | gzip -dc \
867     > ${datafile}
868 vapier 1.71 fi
869     else
870     if [ ${istar} -eq 1 ] ; then
871     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
872     | head -c $((${metaskip}-${tailskip})) \
873 vapier 1.73 | tar --no-same-owner -xf -
874 vapier 1.71 else
875 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
876     | head -c $((${metaskip}-${tailskip})) \
877     > ${datafile}
878 vapier 1.71 fi
879     fi
880     true
881     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
882 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
883     }
884    
885     # Unpack those pesky makeself generated files ...
886     # They're shell scripts with the binary package tagged onto
887     # the end of the archive. Loki utilized the format as does
888     # many other game companies.
889     #
890     # Usage: unpack_makeself [file to unpack] [offset]
891     # - If the file is not specified then unpack will utilize ${A}.
892     # - If the offset is not specified then we will attempt to extract
893     # the proper offset from the script itself.
894     unpack_makeself() {
895     local src="`find_unpackable_file $1`"
896     local skip="$2"
897 vapier 1.50
898 azarah 1.59 local shrtsrc="`basename ${src}`"
899 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
900 azarah 1.59 if [ -z "${skip}" ]
901     then
902 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
903     local skip=0
904     case ${ver} in
905     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
906     skip=`grep -a ^skip= ${src} | cut -d= -f2`
907     ;;
908     2.0|2.0.1)
909     skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
910     ;;
911 wolf31o2 1.48 2.1.1)
912 vapier 1.41 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
913 wolf31o2 1.48 let skip="skip + 1"
914     ;;
915 vapier 1.49 2.1.2)
916     skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
917     let skip="skip + 1"
918     ;;
919 wolf31o2 1.48 2.1.3)
920     skip=`grep -a ^offset= ${src} | awk '{print $3}'`
921 vapier 1.41 let skip="skip + 1"
922     ;;
923     *)
924     eerror "I'm sorry, but I was unable to support the Makeself file."
925     eerror "The version I detected was '${ver}'."
926     eerror "Please file a bug about the file ${shrtsrc} at"
927     eerror "http://bugs.gentoo.org/ so that support can be added."
928     die "makeself version '${ver}' not supported"
929     ;;
930     esac
931     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
932     fi
933    
934 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
935     local tmpfile="`mymktemp ${T}`"
936     tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
937     local filetype="`file -b ${tmpfile}`"
938     case ${filetype} in
939     *tar\ archive)
940 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xf -
941 vapier 1.68 ;;
942     bzip2*)
943 vapier 1.73 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
944 mr_bones_ 1.69 ;;
945 vapier 1.68 gzip*)
946 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
947 vapier 1.68 ;;
948     *)
949     false
950     ;;
951     esac
952     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
953 wolf31o2 1.56 }
954    
955     # Display a license for user to accept.
956     #
957     # Usage: check_license [license]
958     # - If the file is not specified then ${LICENSE} is used.
959     check_license() {
960 vapier 1.60 local lic=$1
961     if [ -z "${lic}" ] ; then
962     lic="${PORTDIR}/licenses/${LICENSE}"
963 wolf31o2 1.56 else
964 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
965     lic="${PORTDIR}/licenses/${src}"
966     elif [ -e "${PWD}/${src}" ] ; then
967     lic="${PWD}/${src}"
968     elif [ -e "${src}" ] ; then
969     lic="${src}"
970 wolf31o2 1.56 fi
971     fi
972 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
973 vapier 1.64 local l="`basename ${lic}`"
974 wolf31o2 1.56
975 vapier 1.60 # here is where we check for the licenses the user already
976     # accepted ... if we don't find a match, we make the user accept
977     local alic
978 vapier 1.74 for alic in "${ACCEPT_LICENSE}" ; do
979 vapier 1.60 [ "${alic}" == "*" ] && return 0
980 vapier 1.64 [ "${alic}" == "${l}" ] && return 0
981 vapier 1.60 done
982    
983     local licmsg="`mymktemp ${T}`"
984     cat << EOF > ${licmsg}
985     **********************************************************
986     The following license outlines the terms of use of this
987     package. You MUST accept this license for installation to
988     continue. When you are done viewing, hit 'q'. If you
989     CTRL+C out of this, the install will not run!
990     **********************************************************
991    
992     EOF
993     cat ${lic} >> ${licmsg}
994     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
995 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
996 vapier 1.60 read alic
997     case ${alic} in
998     yes|Yes|y|Y)
999     return 0
1000     ;;
1001     *)
1002     echo;echo;echo
1003     eerror "You MUST accept the license to continue! Exiting!"
1004     die "Failed to accept license"
1005     ;;
1006     esac
1007 vapier 1.23 }
1008 vapier 1.75
1009     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1010     # the whole 'non-interactive' policy, but damnit I want CD support !
1011     #
1012     # with these cdrom functions we handle all the user interaction and
1013     # standardize everything. all you have to do is call cdrom_get_cds()
1014     # and when the function returns, you can assume that the cd has been
1015     # found at CDROM_ROOT.
1016     #
1017     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1018     # etc... if you want to give the cds better names, then just export
1019     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1020     #
1021     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1022     #
1023     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1024     # - this will attempt to locate a cd based upon a file that is on
1025     # the cd ... the more files you give this function, the more cds
1026     # the cdrom functions will handle
1027     cdrom_get_cds() {
1028     # first we figure out how many cds we're dealing with by
1029     # the # of files they gave us
1030     local cdcnt=0
1031     local f=
1032     for f in "$@" ; do
1033     cdcnt=$((cdcnt + 1))
1034     export CDROM_CHECK_${cdcnt}="$f"
1035     done
1036     export CDROM_TOTAL_CDS=${cdcnt}
1037     export CDROM_CURRENT_CD=1
1038    
1039     # now we see if the user gave use CD_ROOT ...
1040     # if they did, let's just believe them that it's correct
1041     if [ ! -z "${CD_ROOT}" ] ; then
1042     export CDROM_ROOT="${CD_ROOT}"
1043     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1044     return
1045     fi
1046     # do the same for CD_ROOT_X
1047     if [ ! -z "${CD_ROOT_1}" ] ; then
1048     local var=
1049     cdcnt=0
1050     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1051     cdcnt=$((cdcnt + 1))
1052     var="CD_ROOT_${cdcnt}"
1053     if [ -z "${!var}" ] ; then
1054     eerror "You must either use just the CD_ROOT"
1055     eerror "or specify ALL the CD_ROOT_X variables."
1056     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1057     die "could not locate CD_ROOT_${cdcnt}"
1058     fi
1059     export CDROM_ROOTS_${cdcnt}="${!var}"
1060     done
1061     export CDROM_ROOT=${CDROM_ROOTS_1}
1062     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1063     return
1064     fi
1065    
1066     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1067     einfon "This ebuild will need the "
1068     if [ -z "${CDROM_NAME}" ] ; then
1069     echo "cdrom for ${PN}."
1070     else
1071     echo "${CDROM_NAME}."
1072     fi
1073     echo
1074     einfo "If you do not have the CD, but have the data files"
1075     einfo "mounted somewhere on your filesystem, just export"
1076     einfo "the variable CD_ROOT so that it points to the"
1077     einfo "directory containing the files."
1078     echo
1079     else
1080     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1081     cdcnt=0
1082     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1083     cdcnt=$((cdcnt + 1))
1084     var="CDROM_NAME_${cdcnt}"
1085     [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}"
1086     done
1087     echo
1088     einfo "If you do not have the CDs, but have the data files"
1089     einfo "mounted somewhere on your filesystem, just export"
1090     einfo "the following variables so they point to the right place:"
1091     einfon ""
1092     cdcnt=0
1093     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1094     cdcnt=$((cdcnt + 1))
1095     echo -n " CD_ROOT_${cdcnt}"
1096     done
1097     echo
1098     einfo "Or, if you have all the files in the same place, or"
1099     einfo "you only have one cdrom, you can export CD_ROOT"
1100     einfo "and that place will be used as the same data source"
1101     einfo "for all the CDs."
1102     echo
1103     fi
1104     export CDROM_CURRENT_CD=0
1105     cdrom_load_next_cd
1106     }
1107    
1108     # this is only used when you need access to more than one cd.
1109     # when you have finished using the first cd, just call this function.
1110     # when it returns, CDROM_ROOT will be pointing to the second cd.
1111     # remember, you can only go forward in the cd chain, you can't go back.
1112     cdrom_load_next_cd() {
1113     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1114     local var=
1115    
1116 vapier 1.79 if [ ! -z "${CD_ROOT}" ] ; then
1117     einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1118     return
1119     fi
1120    
1121 vapier 1.75 unset CDROM_ROOT
1122     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1123     if [ -z "${!var}" ] ; then
1124     var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1125     cdrom_locate_file_on_cd ${!var}
1126     else
1127     export CDROM_ROOT="${!var}"
1128     fi
1129    
1130     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1131     }
1132    
1133     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1134     # functions. this should *never* be called from an ebuild.
1135     # all it does is try to locate a give file on a cd ... if the cd isn't
1136     # found, then a message asking for the user to insert the cdrom will be
1137     # displayed and we'll hang out here until:
1138     # (1) the file is found on a mounted cdrom
1139     # (2) the user hits CTRL+C
1140     cdrom_locate_file_on_cd() {
1141     while [ -z "${CDROM_ROOT}" ] ; do
1142     local dir="$(dirname ${@})"
1143     local file="$(basename ${@})"
1144     local mline=""
1145     local showedmsg=0
1146    
1147     for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do
1148     [ -d "${mline}/${dir}" ] || continue
1149     [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \
1150     && export CDROM_ROOT=${mline}
1151     done
1152    
1153     if [ -z "${CDROM_ROOT}" ] ; then
1154     echo
1155     if [ ${showedmsg} -eq 0 ] ; then
1156     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1157     if [ -z "${CDROM_NAME}" ] ; then
1158     einfo "Please insert the cdrom for ${PN} now !"
1159     else
1160     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1161     fi
1162     else
1163     if [ -z "${CDROM_NAME_1}" ] ; then
1164     einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1165     else
1166     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1167     einfo "Please insert+mount the ${!var} cdrom now !"
1168     fi
1169     fi
1170     showedmsg=1
1171     fi
1172     einfo "Press return to scan for the cd again"
1173     einfo "or hit CTRL+C to abort the emerge."
1174     read
1175     fi
1176     done
1177     }

  ViewVC Help
Powered by ViewVC 1.1.20