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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.99 - (hide annotations) (download)
Tue Sep 7 11:41:29 2004 UTC (10 years ago) by vapier
Branch: MAIN
Changes since 1.98: +4 -4 lines
more quoting #63075

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

  ViewVC Help
Powered by ViewVC 1.1.20