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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.103 - (hide annotations) (download)
Fri Sep 17 10:37:58 2004 UTC (9 years, 11 months ago) by kugelfang
Branch: MAIN
Changes since 1.102: +14 -5 lines
get_libdir() now check for CONF_LIBDIR in the code of econf() instead of
checking for the portage version. So there is now no more portageq usage
in "global scope". Tested with both portage 2.0.50-r11 and 2.0.51_rc1.

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

  ViewVC Help
Powered by ViewVC 1.1.20