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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.101 - (hide annotations) (download)
Sun Sep 12 17:42:33 2004 UTC (9 years, 11 months ago) by lv
Branch: MAIN
Changes since 1.100: +7 -1 lines
get_multilibdir()

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

  ViewVC Help
Powered by ViewVC 1.1.20