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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.100 - (hide annotations) (download)
Sun Sep 12 07:16:45 2004 UTC (9 years, 11 months ago) by mr_bones_
Branch: MAIN
Changes since 1.99: +11 -13 lines
GAMES_BINDIR, not GAMES_PREFIX for default path

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

  ViewVC Help
Powered by ViewVC 1.1.20