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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.94 - (hide annotations) (download)
Fri Aug 13 15:39:40 2004 UTC (9 years, 11 months ago) by vapier
Branch: MAIN
Changes since 1.93: +7 -3 lines
if given multiple patches, apply them all

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.94 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.93 2004/08/10 01:11:14 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 vapier 1.94 local m=""
150     einfo "${#} patches to apply..."
151     for m in "$@" ; do
152     epatch "${m}"
153     done
154     return 0
155 azarah 1.3 fi
156    
157     if [ -n "$1" -a -f "$1" ]
158     then
159     SINGLE_PATCH="yes"
160 danarmak 1.32
161 azarah 1.4 local EPATCH_SOURCE="$1"
162     local EPATCH_SUFFIX="${1##*\.}"
163 danarmak 1.32
164 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
165     then
166 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
167     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
168     then
169     local EPATCH_SOURCE="$1/*"
170     else
171     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
172     fi
173 azarah 1.3 else
174 azarah 1.8 if [ ! -d ${EPATCH_SOURCE} ]
175     then
176 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
177     then
178     EPATCH_SOURCE="$1"
179     fi
180    
181 azarah 1.8 echo
182 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
183     eerror
184     eerror " ${EPATCH_SOURCE}"
185 azarah 1.8 echo
186     die "Cannot find \$EPATCH_SOURCE!"
187     fi
188 danarmak 1.32
189 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
190 azarah 1.3 fi
191 azarah 1.2
192     case ${EPATCH_SUFFIX##*\.} in
193     bz2)
194     PIPE_CMD="bzip2 -dc"
195 azarah 1.8 PATCH_SUFFIX="bz2"
196 azarah 1.2 ;;
197 azarah 1.6 gz|Z|z)
198 azarah 1.2 PIPE_CMD="gzip -dc"
199 azarah 1.8 PATCH_SUFFIX="gz"
200 azarah 1.2 ;;
201 azarah 1.6 ZIP|zip)
202 azarah 1.2 PIPE_CMD="unzip -p"
203 azarah 1.8 PATCH_SUFFIX="zip"
204 azarah 1.2 ;;
205     *)
206     PIPE_CMD="cat"
207 azarah 1.8 PATCH_SUFFIX="patch"
208 azarah 1.2 ;;
209     esac
210    
211 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
212     then
213     einfo "Applying various patches (bugfixes/updates)..."
214     fi
215     for x in ${EPATCH_SOURCE}
216 azarah 1.2 do
217     # New ARCH dependant patch naming scheme...
218     #
219     # ???_arch_foo.patch
220     #
221     if [ -f ${x} ] && \
222 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
223     [ "${EPATCH_FORCE}" = "yes" ])
224 azarah 1.2 then
225     local count=0
226     local popts="${EPATCH_OPTS}"
227 azarah 1.6
228     if [ -n "${EPATCH_EXCLUDE}" ]
229     then
230 azarah 1.9 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
231 azarah 1.6 then
232     continue
233     fi
234     fi
235 danarmak 1.32
236 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
237     then
238 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
239     then
240     einfo "${EPATCH_SINGLE_MSG}"
241     else
242     einfo "Applying ${x##*/}..."
243     fi
244 azarah 1.3 else
245     einfo " ${x##*/}..."
246     fi
247 azarah 1.2
248 azarah 1.8 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
249     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
250 azarah 1.2
251     # Allow for prefix to differ ... im lazy, so shoot me :/
252     while [ "${count}" -lt 5 ]
253     do
254 azarah 1.5 # Generate some useful debug info ...
255 azarah 1.8 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
256     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257    
258     if [ "${PATCH_SUFFIX}" != "patch" ]
259     then
260     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
261     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
262     else
263     PATCH_TARGET="${x}"
264     fi
265 danarmak 1.32
266 azarah 1.8 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267 vapier 1.88 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
268 danarmak 1.32
269 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
270     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
271    
272     if [ "${PATCH_SUFFIX}" != "patch" ]
273     then
274     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
275     then
276     echo
277     eerror "Could not extract patch!"
278     #die "Could not extract patch!"
279     count=5
280     break
281     fi
282     fi
283 danarmak 1.32
284 vapier 1.88 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
285 azarah 1.2 then
286 azarah 1.8 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
288     echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
289     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
290     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
291    
292 vapier 1.88 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
293 azarah 1.8
294     if [ "$?" -ne 0 ]
295     then
296     cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
297     echo
298     eerror "A dry-run of patch command succeeded, but actually"
299     eerror "applying the patch failed!"
300     #die "Real world sux compared to the dreamworld!"
301     count=5
302     fi
303    
304     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
305 danarmak 1.32
306 azarah 1.2 break
307     fi
308    
309     count=$((count + 1))
310     done
311    
312 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
313     then
314     rm -f ${PATCH_TARGET}
315     fi
316    
317 azarah 1.2 if [ "${count}" -eq 5 ]
318     then
319 azarah 1.8 echo
320 azarah 1.2 eerror "Failed Patch: ${x##*/}!"
321     eerror
322     eerror "Include in your bugreport the contents of:"
323     eerror
324 azarah 1.8 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
325     echo
326 azarah 1.2 die "Failed Patch: ${x##*/}!"
327     fi
328 azarah 1.8
329     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
330 azarah 1.3
331     eend 0
332 azarah 1.2 fi
333     done
334 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
335     then
336     einfo "Done with patching"
337 azarah 1.10 fi
338 azarah 1.26 }
339    
340     # This function return true if we are using the NPTL pthreads
341     # implementation.
342     #
343     # <azarah@gentoo.org> (06 March 2003)
344     #
345    
346     have_NPTL() {
347    
348     cat > ${T}/test-nptl.c <<-"END"
349     #define _XOPEN_SOURCE
350     #include <unistd.h>
351     #include <stdio.h>
352    
353     int main()
354     {
355     char buf[255];
356     char *str = buf;
357    
358     confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
359     if (NULL != str) {
360     printf("%s\n", str);
361     if (NULL != strstr(str, "NPTL"))
362     return 0;
363     }
364    
365     return 1;
366     }
367     END
368    
369     einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
370     if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
371     then
372     echo "yes"
373     einfon "Checking what PTHREADS implementation we have ... "
374     if ${T}/nptl
375     then
376     return 0
377     else
378     return 1
379     fi
380     else
381     echo "no"
382     fi
383    
384     return 1
385 azarah 1.10 }
386    
387     # This function check how many cpu's are present, and then set
388     # -j in MAKEOPTS accordingly.
389     #
390     # Thanks to nall <nall@gentoo.org> for this.
391     #
392     get_number_of_jobs() {
393 azarah 1.13 local jobs=0
394    
395 azarah 1.10 if [ ! -r /proc/cpuinfo ]
396     then
397     return 1
398     fi
399    
400 azarah 1.14 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
401     if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
402     then
403     ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
404 azarah 1.17 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
405     ADMINPARAM="${ADMINPARAM/-j}"
406 azarah 1.14 fi
407    
408 azarah 1.17 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
409 danarmak 1.32
410 drobbins 1.35 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
411 avenj 1.54 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
412 azarah 1.10 then
413 zwelch 1.21 # these archs will always have "[Pp]rocessor"
414     jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
415 danarmak 1.32
416 azarah 1.10 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
417     then
418     # sparc always has "ncpus active"
419 azarah 1.13 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
420 danarmak 1.32
421 azarah 1.10 elif [ "${ARCH}" = "alpha" ]
422     then
423     # alpha has "cpus active", but only when compiled with SMP
424 azarah 1.13 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
425 azarah 1.10 then
426 azarah 1.13 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
427 azarah 1.10 else
428 azarah 1.13 jobs=2
429 azarah 1.10 fi
430 danarmak 1.32
431 brad_mssw 1.78 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
432 azarah 1.10 then
433     # ppc has "processor", but only when compiled with SMP
434 azarah 1.13 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
435 azarah 1.10 then
436 azarah 1.13 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
437 azarah 1.10 else
438 azarah 1.13 jobs=2
439 azarah 1.10 fi
440 iggy 1.87 elif [ "${ARCH}" = "s390" ]
441     then
442     # s390 has "# processors : "
443     jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
444 azarah 1.10 else
445 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
446 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
447 azarah 1.3 fi
448 azarah 1.13
449     # Make sure the number is valid ...
450     if [ "${jobs}" -lt 1 ]
451     then
452     jobs=1
453     fi
454 danarmak 1.32
455 azarah 1.15 if [ -n "${ADMINPARAM}" ]
456 azarah 1.14 then
457 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
458     then
459     einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
460     export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
461     else
462     einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
463     export MAKEOPTS="${MAKEOPTS} -j${jobs}"
464     fi
465 azarah 1.14 fi
466 azarah 1.1 }
467    
468 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
469 vapier 1.80 # does not exist on the users system
470 vapier 1.52 # vapier@gentoo.org
471     #
472     # Takes just 1 parameter (the directory to create tmpfile in)
473     mymktemp() {
474 azarah 1.59 local topdir="$1"
475    
476 vapier 1.52 [ -z "${topdir}" ] && topdir=/tmp
477 azarah 1.59 if [ "`which mktemp 2>/dev/null`" ]
478     then
479 vapier 1.52 mktemp -p ${topdir}
480     else
481     local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
482     touch ${tmp}
483     echo ${tmp}
484     fi
485     }
486    
487 usata 1.91 # Small wrapper for getent (Linux) and nidump (Mac OS X)
488     # used in enewuser()/enewgroup()
489     # Joe Jezak <josejx@gmail.com> and usata@gentoo.org
490     #
491     # egetent(database, key)
492     egetent() {
493     if [ "${ARCH}" == "macos" ] ; then
494     case "$2" in
495     *[!0-9]*) # Non numeric
496     nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
497     ;;
498     *) # Numeric
499     nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
500     ;;
501     esac
502     else
503     getent $1 $2
504     fi
505     }
506    
507 vapier 1.23 # Simplify/standardize adding users to the system
508     # vapier@gentoo.org
509     #
510     # enewuser(username, uid, shell, homedir, groups, extra options)
511     #
512     # Default values if you do not specify any:
513     # username: REQUIRED !
514     # uid: next available (see useradd(8))
515 vapier 1.27 # note: pass -1 to get default behavior
516 vapier 1.23 # shell: /bin/false
517     # homedir: /dev/null
518     # groups: none
519     # extra: comment of 'added by portage for ${PN}'
520     enewuser() {
521     # get the username
522     local euser="$1"; shift
523 azarah 1.59 if [ -z "${euser}" ]
524     then
525 vapier 1.23 eerror "No username specified !"
526     die "Cannot call enewuser without a username"
527     fi
528    
529 vapier 1.84 # lets see if the username already exists
530 usata 1.91 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ]
531 azarah 1.59 then
532 vapier 1.23 return 0
533     fi
534 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
535 vapier 1.23
536     # options to pass to useradd
537 azarah 1.59 local opts=
538 vapier 1.23
539     # handle uid
540     local euid="$1"; shift
541 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
542     then
543     if [ "${euid}" -gt 0 ]
544     then
545 usata 1.91 if [ ! -z "`egetent passwd ${euid}`" ]
546 vapier 1.82 then
547 vapier 1.84 euid="next"
548 vapier 1.82 fi
549 vapier 1.23 else
550     eerror "Userid given but is not greater than 0 !"
551     die "${euid} is not a valid UID"
552     fi
553     else
554 vapier 1.84 euid="next"
555     fi
556     if [ "${euid}" == "next" ]
557     then
558 usata 1.91 local pwrange
559     if [ "${ARCH}" == "macos" ] ; then
560     pwrange="`jot 898 101`"
561     else
562     pwrange="`seq 101 999`"
563     fi
564     for euid in ${pwrange} ; do
565     [ -z "`egetent passwd ${euid}`" ] && break
566 vapier 1.84 done
567 vapier 1.23 fi
568 vapier 1.84 opts="${opts} -u ${euid}"
569 vapier 1.23 einfo " - Userid: ${euid}"
570    
571     # handle shell
572     local eshell="$1"; shift
573 vapier 1.67 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
574 azarah 1.59 then
575     if [ ! -e "${eshell}" ]
576     then
577 vapier 1.23 eerror "A shell was specified but it does not exist !"
578     die "${eshell} does not exist"
579     fi
580     else
581 azarah 1.59 eshell="/bin/false"
582 vapier 1.23 fi
583     einfo " - Shell: ${eshell}"
584     opts="${opts} -s ${eshell}"
585    
586     # handle homedir
587     local ehome="$1"; shift
588 vapier 1.67 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
589 azarah 1.59 then
590     ehome="/dev/null"
591 vapier 1.23 fi
592     einfo " - Home: ${ehome}"
593     opts="${opts} -d ${ehome}"
594    
595     # handle groups
596     local egroups="$1"; shift
597 azarah 1.59 if [ ! -z "${egroups}" ]
598     then
599 vapier 1.23 local oldifs="${IFS}"
600     export IFS=","
601 azarah 1.59 for g in ${egroups}
602     do
603 usata 1.91 if [ -z "`egetent group \"${g}\"`" ]
604 azarah 1.59 then
605 vapier 1.85 eerror "You must add group ${g} to the system first"
606 vapier 1.23 die "${g} is not a valid GID"
607     fi
608     done
609     export IFS="${oldifs}"
610     opts="${opts} -g ${egroups}"
611     else
612     egroups="(none)"
613     fi
614     einfo " - Groups: ${egroups}"
615    
616     # handle extra and add the user
617     local eextra="$@"
618 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
619 vapier 1.23 export SANDBOX_ON="0"
620 usata 1.91 if [ "${ARCH}" == "macos" ];
621 azarah 1.59 then
622 usata 1.91 ### Make the user
623     if [ -z "${eextra}" ]
624     then
625     dscl . create /users/${euser} uid ${euid}
626     dscl . create /users/${euser} shell ${eshell}
627     dscl . create /users/${euser} home ${ehome}
628     dscl . create /users/${euser} realname "added by portage for ${PN}"
629     ### Add the user to the groups specified
630     for g in ${egroups}
631     do
632     dscl . merge /groups/${g} users ${euser}
633     done
634     else
635     einfo "Extra options are not supported on macos yet"
636     einfo "Please report the ebuild along with the info below"
637     einfo "eextra: ${eextra}"
638     die "Required function missing"
639     fi
640 vapier 1.23 else
641 usata 1.91 if [ -z "${eextra}" ]
642     then
643     useradd ${opts} ${euser} \
644     -c "added by portage for ${PN}" \
645     || die "enewuser failed"
646     else
647     einfo " - Extra: ${eextra}"
648     useradd ${opts} ${euser} ${eextra} \
649     || die "enewuser failed"
650     fi
651 vapier 1.23 fi
652     export SANDBOX_ON="${oldsandbox}"
653    
654 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
655     then
656 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
657     dodir ${ehome}
658 vapier 1.37 fowners ${euser} ${ehome}
659 vapier 1.38 fperms 755 ${ehome}
660 vapier 1.23 fi
661     }
662    
663     # Simplify/standardize adding groups to the system
664     # vapier@gentoo.org
665     #
666     # enewgroup(group, gid)
667     #
668     # Default values if you do not specify any:
669     # groupname: REQUIRED !
670     # gid: next available (see groupadd(8))
671     # extra: none
672     enewgroup() {
673     # get the group
674     local egroup="$1"; shift
675 azarah 1.59 if [ -z "${egroup}" ]
676     then
677 vapier 1.23 eerror "No group specified !"
678     die "Cannot call enewgroup without a group"
679     fi
680    
681     # see if group already exists
682 usata 1.91 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
683 azarah 1.59 then
684 vapier 1.23 return 0
685     fi
686 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
687 vapier 1.23
688     # options to pass to useradd
689 azarah 1.59 local opts=
690 vapier 1.23
691     # handle gid
692     local egid="$1"; shift
693 azarah 1.59 if [ ! -z "${egid}" ]
694     then
695     if [ "${egid}" -gt 0 ]
696     then
697 usata 1.91 if [ -z "`egetent group ${egid}`" ]
698 vapier 1.83 then
699 usata 1.91 if [ "${ARCH}" == "macos" ] ; then
700     opts="${opts} ${egid}"
701     else
702     opts="${opts} -g ${egid}"
703     fi
704 vapier 1.83 else
705 vapier 1.84 egid="next available; requested gid taken"
706 vapier 1.83 fi
707 vapier 1.23 else
708     eerror "Groupid given but is not greater than 0 !"
709     die "${egid} is not a valid GID"
710     fi
711     else
712     egid="next available"
713     fi
714     einfo " - Groupid: ${egid}"
715    
716     # handle extra
717     local eextra="$@"
718     opts="${opts} ${eextra}"
719    
720     # add the group
721 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
722 vapier 1.23 export SANDBOX_ON="0"
723 usata 1.91 if [ "${ARCH}" == "macos" ];
724     then
725     if [ ! -z "${eextra}" ];
726     then
727     einfo "Extra options are not supported on macos yet"
728     einfo "Please report the ebuild along with the info below"
729     einfo "eextra: ${eextra}"
730     die "Required function missing"
731     fi
732    
733     # If we need the next available
734     case ${egid} in
735     *[!0-9]*) # Non numeric
736     for egid in `jot 898 101`; do
737     [ -z "`egetent group ${egid}`" ] && break
738     done
739     esac
740     dscl . create /groups/${egroup} gid ${egid}
741     dscl . create /groups/${egroup} passwd '*'
742     else
743     groupadd ${opts} ${egroup} || die "enewgroup failed"
744     fi
745 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
746 vapier 1.24 }
747    
748     # Simple script to replace 'dos2unix' binaries
749     # vapier@gentoo.org
750     #
751     # edos2unix(file, <more files>...)
752     edos2unix() {
753 vapier 1.61 for f in "$@"
754 azarah 1.59 do
755 vapier 1.61 cp "${f}" ${T}/edos2unix
756     sed 's/\r$//' ${T}/edos2unix > "${f}"
757 vapier 1.24 done
758 vapier 1.39 }
759    
760     # Make a desktop file !
761     # Great for making those icons in kde/gnome startmenu !
762     # Amaze your friends ! Get the women ! Join today !
763     # gnome2 /usr/share/applications
764     # gnome1 /usr/share/gnome/apps/
765     # KDE ${KDEDIR}/share/applnk /usr/share/applnk
766     #
767     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
768     #
769     # binary: what binary does the app run with ?
770     # name: the name that will show up in the menu
771     # icon: give your little like a pretty little icon ...
772     # this can be relative (to /usr/share/pixmaps) or
773     # a full path to an icon
774     # type: what kind of application is this ? for categories:
775 vapier 1.89 # http://www.freedesktop.org/standards/menu-spec/
776 vapier 1.39 # path: if your app needs to startup in a specific dir
777     make_desktop_entry() {
778     [ -z "$1" ] && eerror "You must specify the executable" && return 1
779    
780 azarah 1.59 local exec="${1}"
781     local name="${2:-${PN}}"
782     local icon="${3:-${PN}.png}"
783     local type="${4}"
784 vapier 1.81 local subdir="${6}"
785 azarah 1.59 local path="${5:-${GAMES_PREFIX}}"
786     if [ -z "${type}" ]
787     then
788 vapier 1.39 case ${CATEGORY} in
789 azarah 1.59 "app-emulation")
790     type=Emulator
791 vapier 1.86 subdir="Emulation"
792 azarah 1.59 ;;
793     "games-"*)
794     type=Game
795 vapier 1.81 subdir="Games"
796 wolf31o2 1.65 ;;
797     "net-"*)
798 vapier 1.81 type=Network
799     subdir="${type}"
800 azarah 1.59 ;;
801     *)
802     type=
803 vapier 1.81 subdir=
804 azarah 1.59 ;;
805 vapier 1.39 esac
806     fi
807 azarah 1.59 local desktop="${T}/${exec}.desktop"
808 vapier 1.39
809     echo "[Desktop Entry]
810     Encoding=UTF-8
811     Version=0.9.2
812     Name=${name}
813     Type=Application
814     Comment=${DESCRIPTION}
815     Exec=${exec}
816     Path=${path}
817     Icon=${icon}
818 vapier 1.40 Categories=Application;${type};" > ${desktop}
819 vapier 1.39
820 azarah 1.59 if [ -d "/usr/share/applications" ]
821     then
822 vapier 1.39 insinto /usr/share/applications
823 vapier 1.40 doins ${desktop}
824 vapier 1.39 fi
825    
826 azarah 1.59 #if [ -d "/usr/share/gnome/apps" ]
827     #then
828 vapier 1.40 # insinto /usr/share/gnome/apps/Games
829     # doins ${desktop}
830     #fi
831    
832 azarah 1.59 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
833     #then
834     # for ver in /usr/kde/*
835     # do
836 vapier 1.40 # insinto ${ver}/share/applnk/Games
837     # doins ${desktop}
838     # done
839     #fi
840 vapier 1.39
841 azarah 1.59 if [ -d "/usr/share/applnk" ]
842     then
843 vapier 1.81 insinto /usr/share/applnk/${subdir}
844 vapier 1.40 doins ${desktop}
845 vapier 1.39 fi
846    
847     return 0
848 danarmak 1.32 }
849    
850 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
851     find_unpackable_file() {
852 azarah 1.59 local src="$1"
853     if [ -z "${src}" ]
854     then
855 vapier 1.50 src="${DISTDIR}/${A}"
856     else
857 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
858     then
859 vapier 1.50 src="${DISTDIR}/${src}"
860 azarah 1.59 elif [ -e "${PWD}/${src}" ]
861     then
862 vapier 1.50 src="${PWD}/${src}"
863 azarah 1.59 elif [ -e "${src}" ]
864     then
865 vapier 1.50 src="${src}"
866     fi
867     fi
868 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
869     echo "${src}"
870     }
871    
872     # Unpack those pesky pdv generated files ...
873     # They're self-unpacking programs with the binary package stuffed in
874     # the middle of the archive. Valve seems to use it a lot ... too bad
875     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
876     #
877     # Usage: unpack_pdv [file to unpack] [size of off_t]
878     # - you have to specify the off_t size ... i have no idea how to extract that
879     # information out of the binary executable myself. basically you pass in
880     # the size of the off_t type (in bytes) on the machine that built the pdv
881     # archive. one way to determine this is by running the following commands:
882     # strings <pdv archive> | grep lseek
883     # strace -elseek <pdv archive>
884     # basically look for the first lseek command (we do the strings/grep because
885     # sometimes the function call is _llseek or something) and steal the 2nd
886     # parameter. here is an example:
887     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
888     # lseek
889     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
890     # lseek(3, -4, SEEK_END) = 2981250
891     # thus we would pass in the value of '4' as the second parameter.
892     unpack_pdv() {
893     local src="`find_unpackable_file $1`"
894     local sizeoff_t="$2"
895    
896     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
897    
898     local shrtsrc="`basename ${src}`"
899     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
900     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
901     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
902    
903     # grab metadata for debug reasons
904     local metafile="`mymktemp ${T}`"
905     tail -c +$((${metaskip}+1)) ${src} > ${metafile}
906    
907     # rip out the final file name from the metadata
908     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
909     datafile="`basename ${datafile}`"
910    
911 vapier 1.71 # now lets uncompress/untar the file if need be
912 vapier 1.70 local tmpfile="`mymktemp ${T}`"
913     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
914 vapier 1.71
915     local iscompressed="`file -b ${tmpfile}`"
916     if [ "${iscompressed:0:8}" == "compress" ] ; then
917     iscompressed=1
918     mv ${tmpfile}{,.Z}
919     gunzip ${tmpfile}
920     else
921     iscompressed=0
922     fi
923     local istar="`file -b ${tmpfile}`"
924     if [ "${istar:0:9}" == "POSIX tar" ] ; then
925     istar=1
926     else
927     istar=0
928     fi
929    
930     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
931     #dd if=${src} ibs=${metaskip} count=1 \
932     # | dd ibs=${tailskip} skip=1 \
933     # | gzip -dc \
934     # > ${datafile}
935     if [ ${iscompressed} -eq 1 ] ; then
936     if [ ${istar} -eq 1 ] ; then
937     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
938     | head -c $((${metaskip}-${tailskip})) \
939     | tar -xzf -
940     else
941 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
942     | head -c $((${metaskip}-${tailskip})) \
943     | gzip -dc \
944     > ${datafile}
945 vapier 1.71 fi
946     else
947     if [ ${istar} -eq 1 ] ; then
948     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
949     | head -c $((${metaskip}-${tailskip})) \
950 vapier 1.73 | tar --no-same-owner -xf -
951 vapier 1.71 else
952 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
953     | head -c $((${metaskip}-${tailskip})) \
954     > ${datafile}
955 vapier 1.71 fi
956     fi
957     true
958     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
959 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
960     }
961    
962     # Unpack those pesky makeself generated files ...
963     # They're shell scripts with the binary package tagged onto
964     # the end of the archive. Loki utilized the format as does
965     # many other game companies.
966     #
967     # Usage: unpack_makeself [file to unpack] [offset]
968     # - If the file is not specified then unpack will utilize ${A}.
969     # - If the offset is not specified then we will attempt to extract
970     # the proper offset from the script itself.
971     unpack_makeself() {
972     local src="`find_unpackable_file $1`"
973     local skip="$2"
974 vapier 1.50
975 azarah 1.59 local shrtsrc="`basename ${src}`"
976 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
977 azarah 1.59 if [ -z "${skip}" ]
978     then
979 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
980     local skip=0
981     case ${ver} in
982     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
983     skip=`grep -a ^skip= ${src} | cut -d= -f2`
984     ;;
985     2.0|2.0.1)
986     skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
987     ;;
988 wolf31o2 1.48 2.1.1)
989 vapier 1.41 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
990 wolf31o2 1.48 let skip="skip + 1"
991     ;;
992 vapier 1.49 2.1.2)
993     skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
994     let skip="skip + 1"
995     ;;
996 wolf31o2 1.48 2.1.3)
997     skip=`grep -a ^offset= ${src} | awk '{print $3}'`
998 vapier 1.41 let skip="skip + 1"
999     ;;
1000     *)
1001     eerror "I'm sorry, but I was unable to support the Makeself file."
1002     eerror "The version I detected was '${ver}'."
1003     eerror "Please file a bug about the file ${shrtsrc} at"
1004     eerror "http://bugs.gentoo.org/ so that support can be added."
1005     die "makeself version '${ver}' not supported"
1006     ;;
1007     esac
1008     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1009     fi
1010    
1011 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1012     local tmpfile="`mymktemp ${T}`"
1013     tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1014     local filetype="`file -b ${tmpfile}`"
1015     case ${filetype} in
1016     *tar\ archive)
1017 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xf -
1018 vapier 1.68 ;;
1019     bzip2*)
1020 vapier 1.73 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
1021 mr_bones_ 1.69 ;;
1022 vapier 1.68 gzip*)
1023 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
1024 vapier 1.68 ;;
1025 vapier 1.93 compress*)
1026     tail -n +${skip} ${src} | gunzip | tar --no-same-owner -xf -
1027     ;;
1028 vapier 1.68 *)
1029 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1030 vapier 1.68 false
1031     ;;
1032     esac
1033     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1034 wolf31o2 1.56 }
1035    
1036     # Display a license for user to accept.
1037     #
1038     # Usage: check_license [license]
1039     # - If the file is not specified then ${LICENSE} is used.
1040     check_license() {
1041 vapier 1.60 local lic=$1
1042     if [ -z "${lic}" ] ; then
1043     lic="${PORTDIR}/licenses/${LICENSE}"
1044 wolf31o2 1.56 else
1045 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1046     lic="${PORTDIR}/licenses/${src}"
1047     elif [ -e "${PWD}/${src}" ] ; then
1048     lic="${PWD}/${src}"
1049     elif [ -e "${src}" ] ; then
1050     lic="${src}"
1051 wolf31o2 1.56 fi
1052     fi
1053 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1054 vapier 1.64 local l="`basename ${lic}`"
1055 wolf31o2 1.56
1056 vapier 1.60 # here is where we check for the licenses the user already
1057     # accepted ... if we don't find a match, we make the user accept
1058     local alic
1059 vapier 1.74 for alic in "${ACCEPT_LICENSE}" ; do
1060 vapier 1.60 [ "${alic}" == "*" ] && return 0
1061 vapier 1.64 [ "${alic}" == "${l}" ] && return 0
1062 vapier 1.60 done
1063    
1064     local licmsg="`mymktemp ${T}`"
1065     cat << EOF > ${licmsg}
1066     **********************************************************
1067     The following license outlines the terms of use of this
1068     package. You MUST accept this license for installation to
1069     continue. When you are done viewing, hit 'q'. If you
1070     CTRL+C out of this, the install will not run!
1071     **********************************************************
1072    
1073     EOF
1074     cat ${lic} >> ${licmsg}
1075     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1076 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1077 vapier 1.60 read alic
1078     case ${alic} in
1079     yes|Yes|y|Y)
1080     return 0
1081     ;;
1082     *)
1083     echo;echo;echo
1084     eerror "You MUST accept the license to continue! Exiting!"
1085     die "Failed to accept license"
1086     ;;
1087     esac
1088 vapier 1.23 }
1089 vapier 1.75
1090     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1091     # the whole 'non-interactive' policy, but damnit I want CD support !
1092     #
1093     # with these cdrom functions we handle all the user interaction and
1094     # standardize everything. all you have to do is call cdrom_get_cds()
1095     # and when the function returns, you can assume that the cd has been
1096     # found at CDROM_ROOT.
1097     #
1098     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1099     # etc... if you want to give the cds better names, then just export
1100     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1101     #
1102     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1103     #
1104     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1105     # - this will attempt to locate a cd based upon a file that is on
1106     # the cd ... the more files you give this function, the more cds
1107     # the cdrom functions will handle
1108     cdrom_get_cds() {
1109     # first we figure out how many cds we're dealing with by
1110     # the # of files they gave us
1111     local cdcnt=0
1112     local f=
1113     for f in "$@" ; do
1114     cdcnt=$((cdcnt + 1))
1115     export CDROM_CHECK_${cdcnt}="$f"
1116     done
1117     export CDROM_TOTAL_CDS=${cdcnt}
1118     export CDROM_CURRENT_CD=1
1119    
1120     # now we see if the user gave use CD_ROOT ...
1121     # if they did, let's just believe them that it's correct
1122     if [ ! -z "${CD_ROOT}" ] ; then
1123     export CDROM_ROOT="${CD_ROOT}"
1124     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1125     return
1126     fi
1127     # do the same for CD_ROOT_X
1128     if [ ! -z "${CD_ROOT_1}" ] ; then
1129     local var=
1130     cdcnt=0
1131     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1132     cdcnt=$((cdcnt + 1))
1133     var="CD_ROOT_${cdcnt}"
1134     if [ -z "${!var}" ] ; then
1135     eerror "You must either use just the CD_ROOT"
1136     eerror "or specify ALL the CD_ROOT_X variables."
1137     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1138     die "could not locate CD_ROOT_${cdcnt}"
1139     fi
1140     export CDROM_ROOTS_${cdcnt}="${!var}"
1141     done
1142     export CDROM_ROOT=${CDROM_ROOTS_1}
1143     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1144     return
1145     fi
1146    
1147     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1148     einfon "This ebuild will need the "
1149     if [ -z "${CDROM_NAME}" ] ; then
1150     echo "cdrom for ${PN}."
1151     else
1152     echo "${CDROM_NAME}."
1153     fi
1154     echo
1155     einfo "If you do not have the CD, but have the data files"
1156     einfo "mounted somewhere on your filesystem, just export"
1157     einfo "the variable CD_ROOT so that it points to the"
1158     einfo "directory containing the files."
1159     echo
1160     else
1161     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1162     cdcnt=0
1163     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1164     cdcnt=$((cdcnt + 1))
1165     var="CDROM_NAME_${cdcnt}"
1166     [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}"
1167     done
1168     echo
1169     einfo "If you do not have the CDs, but have the data files"
1170     einfo "mounted somewhere on your filesystem, just export"
1171     einfo "the following variables so they point to the right place:"
1172     einfon ""
1173     cdcnt=0
1174     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1175     cdcnt=$((cdcnt + 1))
1176     echo -n " CD_ROOT_${cdcnt}"
1177     done
1178     echo
1179     einfo "Or, if you have all the files in the same place, or"
1180     einfo "you only have one cdrom, you can export CD_ROOT"
1181     einfo "and that place will be used as the same data source"
1182     einfo "for all the CDs."
1183     echo
1184     fi
1185     export CDROM_CURRENT_CD=0
1186     cdrom_load_next_cd
1187     }
1188    
1189     # this is only used when you need access to more than one cd.
1190     # when you have finished using the first cd, just call this function.
1191     # when it returns, CDROM_ROOT will be pointing to the second cd.
1192     # remember, you can only go forward in the cd chain, you can't go back.
1193     cdrom_load_next_cd() {
1194     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1195     local var=
1196    
1197 vapier 1.79 if [ ! -z "${CD_ROOT}" ] ; then
1198     einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1199     return
1200     fi
1201    
1202 vapier 1.75 unset CDROM_ROOT
1203     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1204     if [ -z "${!var}" ] ; then
1205     var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1206     cdrom_locate_file_on_cd ${!var}
1207     else
1208     export CDROM_ROOT="${!var}"
1209     fi
1210    
1211     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1212     }
1213    
1214     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1215     # functions. this should *never* be called from an ebuild.
1216     # all it does is try to locate a give file on a cd ... if the cd isn't
1217     # found, then a message asking for the user to insert the cdrom will be
1218     # displayed and we'll hang out here until:
1219     # (1) the file is found on a mounted cdrom
1220     # (2) the user hits CTRL+C
1221     cdrom_locate_file_on_cd() {
1222     while [ -z "${CDROM_ROOT}" ] ; do
1223     local dir="$(dirname ${@})"
1224     local file="$(basename ${@})"
1225     local mline=""
1226     local showedmsg=0
1227    
1228     for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do
1229     [ -d "${mline}/${dir}" ] || continue
1230     [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \
1231     && export CDROM_ROOT=${mline}
1232     done
1233    
1234     if [ -z "${CDROM_ROOT}" ] ; then
1235     echo
1236     if [ ${showedmsg} -eq 0 ] ; then
1237     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1238     if [ -z "${CDROM_NAME}" ] ; then
1239     einfo "Please insert the cdrom for ${PN} now !"
1240     else
1241     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1242     fi
1243     else
1244     if [ -z "${CDROM_NAME_1}" ] ; then
1245     einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1246     else
1247     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1248     einfo "Please insert+mount the ${!var} cdrom now !"
1249     fi
1250     fi
1251     showedmsg=1
1252     fi
1253     einfo "Press return to scan for the cd again"
1254     einfo "or hit CTRL+C to abort the emerge."
1255     read
1256     fi
1257     done
1258     }
1259 vapier 1.92
1260     # Make sure that LINGUAS only contains languages that
1261     # a package can support
1262     #
1263     # usage: strip-linguas <allow LINGUAS>
1264     # strip-linguas -i <directories of .po files>
1265     # strip-linguas -u <directories of .po files>
1266     #
1267     # The first form allows you to specify a list of LINGUAS.
1268     # The -i builds a list of po files found in all the
1269     # directories and uses the intersection of the lists.
1270     # The -u builds a list of po files found in all the
1271     # directories and uses the union of the lists.
1272     strip-linguas() {
1273     local ls newls
1274     if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then
1275     local op="$1"; shift
1276     ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1277     local d f
1278     for d in "$@" ; do
1279     if [ "${op}" == "-u" ] ; then
1280     newls="${ls}"
1281     else
1282     newls=""
1283     fi
1284     for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1285     if [ "${op}" == "-i" ] ; then
1286     [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}"
1287     else
1288     [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}"
1289     fi
1290     done
1291     ls="${newls}"
1292     done
1293     ls="${ls//.po}"
1294     else
1295     ls="$@"
1296     fi
1297    
1298     ls=" ${ls} "
1299     newls=""
1300     for f in ${LINGUAS} ; do
1301     if [ "${ls/ ${f} /}" != "${ls}" ] ; then
1302     nl="${newls} ${f}"
1303     else
1304     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1305     fi
1306     done
1307     if [ -z "${newls}" ] ; then
1308     unset LINGUAS
1309     else
1310     export LINGUAS="${newls}"
1311     fi
1312     }

  ViewVC Help
Powered by ViewVC 1.1.20