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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.146 - (hide annotations) (download)
Thu Feb 3 22:40:47 2005 UTC (9 years, 5 months ago) by chriswhite
Branch: MAIN
Changes since 1.145: +2 -2 lines
Last one.. really :|.  Making sure /proc/cpuinfo is present before doing anything.

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 chriswhite 1.146 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.145 2005/02/03 22:33:36 chriswhite 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 eradicator 1.141 inherit multilib
13 azarah 1.1 ECLASS=eutils
14     INHERITED="$INHERITED $ECLASS"
15    
16 vapier 1.83 DEPEND="!bootstrap? ( sys-devel/patch )"
17 azarah 1.1
18 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
19 azarah 1.1
20 chriswhite 1.144 # ecpu_check
21     # Usage:
22     #
23     # ecpu_check array_of_cpu_flags
24     #
25     # array_of_cpu_flags - An array of cpu flags to check against USE flags
26     #
27     # Checks user USE related cpu flags against /proc/cpuinfo. If user enables a
28     # cpu flag that is not supported in their processor flags, it will warn the
29     # user if CROSSCOMPILE is not set to 1 ( because cross compile users are
30     # obviously using different cpu flags than their own cpu ). Examples:
31     #
32     # CPU_FLAGS=(mmx mmx2 sse sse2)
33     # ecpu_check CPU_FLAGS
34     # Chris White <chriswhite@gentoo.org> (03 Feb 2005)
35    
36     ecpu_check() {
37 chriswhite 1.146 if [ $CROSSCOMPILE -eq 1 ] || [ ! -e /proc/cpuinfo ]
38 chriswhite 1.145 then
39     else
40     CPU_FLAGS=$1
41     USER_CPU=`grep "flags" /proc/cpuinfo`
42    
43     for flags in `seq 1 ${#CPU_FLAGS[@]}`
44     do
45     if has ${CPU_FLAGS[$flags - 1]} $USER_CPU && ! has ${CPU_FLAGS[$flags - 1]} $USE
46     then
47     ewarn "Your system is ${CPU_FLAGS[$flags - 1]} capable but you don't have it enabled!"
48     ewarn "You might be cross compiling (in this case set CROSSCOMPILE to 1 to disable this warning."
49     fi
50 chriswhite 1.144
51 chriswhite 1.145 if ! has ${CPU_FLAGS[$flags - 1]} $USER_CPU && has ${CPU_FLAGS[$flags -1]} $USE
52     then
53     ewarn "You have ${CPU_FLAGS[$flags - 1]} support enabled but your processor doesn't"
54     ewarn "Seem to support it! You might be cross compiling or do not have /proc filesystem"
55     ewarn "enabled. If either is the case, set CROSSCOMPILE to 1 to disable this warning."
56     fi
57     done
58     fi
59 chriswhite 1.144 }
60    
61 ciaranm 1.98 # Wait for the supplied number of seconds. If no argument is supplied, defaults
62     # to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
63     # outputting to a terminal, don't wait. For compatability purposes, the argument
64     # must be an integer greater than zero.
65     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
66     epause() {
67     if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
68     sleep ${1:-5}
69     fi
70     }
71    
72     # Beep the specified number of times (defaults to five). If our output
73     # is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
74     # don't beep.
75     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
76     ebeep() {
77     local n
78     if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
79     for ((n=1 ; n <= ${1:-5} ; n++)) ; do
80     echo -ne "\a"
81     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
82     echo -ne "\a"
83     sleep 1
84     done
85     fi
86     }
87    
88 azarah 1.1 # This function generate linker scripts in /usr/lib for dynamic
89     # libs in /lib. This is to fix linking problems when you have
90     # the .so in /lib, and the .a in /usr/lib. What happens is that
91     # in some cases when linking dynamic, the .a in /usr/lib is used
92     # instead of the .so in /lib due to gcc/libtool tweaking ld's
93     # library search path. This cause many builds to fail.
94     # See bug #4411 for more info.
95     #
96     # To use, simply call:
97     #
98     # gen_usr_ldscript libfoo.so
99     #
100     # Note that you should in general use the unversioned name of
101     # the library, as ldconfig should usually update it correctly
102     # to point to the latest version of the library present.
103     #
104     # <azarah@gentoo.org> (26 Oct 2002)
105     #
106     gen_usr_ldscript() {
107 vapier 1.109 local libdir="$(get_libdir)"
108 azarah 1.1 # Just make sure it exists
109 vapier 1.109 dodir /usr/${libdir}
110 danarmak 1.32
111 vapier 1.109 cat > "${D}/usr/${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 vapier 1.109 GROUP ( /${libdir}/${1} )
120 azarah 1.1 END_LDSCRIPT
121 vapier 1.109 fperms a+x "/usr/${libdir}/${1}"
122 azarah 1.2 }
123    
124 azarah 1.5 # Simple function to draw a line consisting of '=' the same length as $*
125     #
126     # <azarah@gentoo.org> (11 Nov 2002)
127     #
128     draw_line() {
129     local i=0
130     local str_length=""
131    
132     # Handle calls that do not have args, or wc not being installed ...
133     if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
134     then
135     echo "==============================================================="
136     return 0
137     fi
138    
139     # Get the length of $*
140     str_length="$(echo -n "$*" | wc -m)"
141 danarmak 1.32
142 azarah 1.5 while [ "$i" -lt "${str_length}" ]
143     do
144     echo -n "="
145 danarmak 1.32
146 azarah 1.5 i=$((i + 1))
147     done
148    
149     echo
150    
151     return 0
152     }
153 azarah 1.2
154     # Default directory where patches are located
155     EPATCH_SOURCE="${WORKDIR}/patch"
156     # Default extension for patches
157     EPATCH_SUFFIX="patch.bz2"
158     # Default options for patch
159 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
160     EPATCH_OPTS="-g0"
161 azarah 1.6 # List of patches not to apply. Not this is only file names,
162     # and not the full path ..
163     EPATCH_EXCLUDE=""
164 azarah 1.9 # Change the printed message for a single patch.
165     EPATCH_SINGLE_MSG=""
166 azarah 1.29 # Force applying bulk patches even if not following the style:
167     #
168     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
169     #
170     EPATCH_FORCE="no"
171 azarah 1.2
172     # This function is for bulk patching, or in theory for just one
173     # or two patches.
174     #
175     # It should work with .bz2, .gz, .zip and plain text patches.
176     # Currently all patches should be the same format.
177     #
178     # You do not have to specify '-p' option to patch, as it will
179     # try with -p0 to -p5 until it succeed, or fail at -p5.
180     #
181     # Above EPATCH_* variables can be used to control various defaults,
182     # bug they should be left as is to ensure an ebuild can rely on
183     # them for.
184     #
185 azarah 1.3 # Patches are applied in current directory.
186     #
187     # Bulk Patches should preferibly have the form of:
188 azarah 1.2 #
189     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
190     #
191     # For example:
192     #
193     # 01_all_misc-fix.patch.bz2
194     # 02_sparc_another-fix.patch.bz2
195     #
196     # This ensures that there are a set order, and you can have ARCH
197     # specific patches.
198     #
199 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
200     # single patch that need to be applied if its a file. If on the other
201     # hand its a directory, it will set EPATCH_SOURCE to this.
202     #
203 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
204     #
205     epatch() {
206     local PIPE_CMD=""
207     local STDERR_TARGET="${T}/$$.out"
208 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
209     local PATCH_SUFFIX=""
210 azarah 1.3 local SINGLE_PATCH="no"
211 azarah 1.4 local x=""
212 azarah 1.3
213     if [ "$#" -gt 1 ]
214     then
215 vapier 1.94 local m=""
216 vapier 1.121 einfo "${#} patches to apply ..."
217 vapier 1.94 for m in "$@" ; do
218     epatch "${m}"
219     done
220     return 0
221 azarah 1.3 fi
222    
223     if [ -n "$1" -a -f "$1" ]
224     then
225     SINGLE_PATCH="yes"
226 danarmak 1.32
227 azarah 1.4 local EPATCH_SOURCE="$1"
228     local EPATCH_SUFFIX="${1##*\.}"
229 danarmak 1.32
230 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
231     then
232 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
233     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
234     then
235     local EPATCH_SOURCE="$1/*"
236     else
237     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
238     fi
239 azarah 1.3 else
240 vapier 1.123 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
241 azarah 1.8 then
242 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
243     then
244     EPATCH_SOURCE="$1"
245     fi
246    
247 azarah 1.8 echo
248 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
249     eerror
250     eerror " ${EPATCH_SOURCE}"
251 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
252 azarah 1.8 echo
253     die "Cannot find \$EPATCH_SOURCE!"
254     fi
255 danarmak 1.32
256 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
257 azarah 1.3 fi
258 azarah 1.2
259     case ${EPATCH_SUFFIX##*\.} in
260     bz2)
261     PIPE_CMD="bzip2 -dc"
262 azarah 1.8 PATCH_SUFFIX="bz2"
263 azarah 1.2 ;;
264 azarah 1.6 gz|Z|z)
265 azarah 1.2 PIPE_CMD="gzip -dc"
266 azarah 1.8 PATCH_SUFFIX="gz"
267 azarah 1.2 ;;
268 azarah 1.6 ZIP|zip)
269 azarah 1.2 PIPE_CMD="unzip -p"
270 azarah 1.8 PATCH_SUFFIX="zip"
271 azarah 1.2 ;;
272     *)
273     PIPE_CMD="cat"
274 azarah 1.8 PATCH_SUFFIX="patch"
275 azarah 1.2 ;;
276     esac
277    
278 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
279     then
280 vapier 1.121 einfo "Applying various patches (bugfixes/updates) ..."
281 azarah 1.3 fi
282     for x in ${EPATCH_SOURCE}
283 azarah 1.2 do
284 vapier 1.121 # New ARCH dependant patch naming scheme ...
285 azarah 1.2 #
286     # ???_arch_foo.patch
287     #
288     if [ -f ${x} ] && \
289 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
290     [ "${EPATCH_FORCE}" = "yes" ])
291 azarah 1.2 then
292     local count=0
293     local popts="${EPATCH_OPTS}"
294 azarah 1.6
295     if [ -n "${EPATCH_EXCLUDE}" ]
296     then
297 azarah 1.9 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
298 azarah 1.6 then
299     continue
300     fi
301     fi
302 danarmak 1.32
303 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
304     then
305 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
306     then
307     einfo "${EPATCH_SINGLE_MSG}"
308     else
309 vapier 1.121 einfo "Applying ${x##*/} ..."
310 azarah 1.9 fi
311 azarah 1.3 else
312 vapier 1.121 einfo " ${x##*/} ..."
313 azarah 1.3 fi
314 azarah 1.2
315 azarah 1.8 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
316     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
317 azarah 1.2
318     # Allow for prefix to differ ... im lazy, so shoot me :/
319     while [ "${count}" -lt 5 ]
320     do
321 azarah 1.5 # Generate some useful debug info ...
322 azarah 1.8 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
323     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
324    
325     if [ "${PATCH_SUFFIX}" != "patch" ]
326     then
327     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
328     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
329     else
330     PATCH_TARGET="${x}"
331     fi
332 danarmak 1.32
333 azarah 1.8 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
334 vapier 1.88 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
335 danarmak 1.32
336 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
337     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
338    
339     if [ "${PATCH_SUFFIX}" != "patch" ]
340     then
341     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
342     then
343     echo
344     eerror "Could not extract patch!"
345     #die "Could not extract patch!"
346     count=5
347     break
348     fi
349     fi
350 danarmak 1.32
351 vapier 1.88 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
352 azarah 1.2 then
353 azarah 1.8 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
354     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
355 vapier 1.121 echo "ACTUALLY APPLYING ${x##*/} ..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
356 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
357     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
358    
359 vapier 1.88 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
360 azarah 1.8
361     if [ "$?" -ne 0 ]
362     then
363     cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
364     echo
365     eerror "A dry-run of patch command succeeded, but actually"
366     eerror "applying the patch failed!"
367     #die "Real world sux compared to the dreamworld!"
368     count=5
369     fi
370    
371     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
372 danarmak 1.32
373 azarah 1.2 break
374     fi
375    
376     count=$((count + 1))
377     done
378    
379 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
380     then
381     rm -f ${PATCH_TARGET}
382     fi
383    
384 azarah 1.2 if [ "${count}" -eq 5 ]
385     then
386 azarah 1.8 echo
387 azarah 1.2 eerror "Failed Patch: ${x##*/}!"
388     eerror
389     eerror "Include in your bugreport the contents of:"
390     eerror
391 azarah 1.8 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
392     echo
393 azarah 1.2 die "Failed Patch: ${x##*/}!"
394     fi
395 azarah 1.8
396     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
397 azarah 1.3
398     eend 0
399 azarah 1.2 fi
400     done
401 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
402     then
403     einfo "Done with patching"
404 azarah 1.10 fi
405 azarah 1.26 }
406    
407     # This function return true if we are using the NPTL pthreads
408     # implementation.
409     #
410     # <azarah@gentoo.org> (06 March 2003)
411     #
412     have_NPTL() {
413     cat > ${T}/test-nptl.c <<-"END"
414     #define _XOPEN_SOURCE
415     #include <unistd.h>
416     #include <stdio.h>
417    
418     int main()
419     {
420     char buf[255];
421     char *str = buf;
422    
423     confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
424     if (NULL != str) {
425     printf("%s\n", str);
426     if (NULL != strstr(str, "NPTL"))
427     return 0;
428     }
429    
430     return 1;
431     }
432     END
433    
434 vapier 1.121 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ..."
435 azarah 1.26 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
436     then
437     echo "yes"
438 vapier 1.121 einfon "Checking what PTHREADS implementation we have ..."
439 azarah 1.26 if ${T}/nptl
440     then
441     return 0
442     else
443     return 1
444     fi
445     else
446     echo "no"
447     fi
448    
449     return 1
450 azarah 1.10 }
451    
452     # This function check how many cpu's are present, and then set
453     # -j in MAKEOPTS accordingly.
454     #
455     # Thanks to nall <nall@gentoo.org> for this.
456     #
457     get_number_of_jobs() {
458 azarah 1.13 local jobs=0
459    
460 azarah 1.10 if [ ! -r /proc/cpuinfo ]
461     then
462     return 1
463     fi
464    
465 azarah 1.14 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
466     if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
467     then
468     ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
469 azarah 1.17 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
470     ADMINPARAM="${ADMINPARAM/-j}"
471 azarah 1.14 fi
472    
473 azarah 1.17 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
474 danarmak 1.32
475 drobbins 1.35 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
476 avenj 1.54 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
477 azarah 1.10 then
478 zwelch 1.21 # these archs will always have "[Pp]rocessor"
479     jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
480 danarmak 1.32
481 azarah 1.10 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
482     then
483     # sparc always has "ncpus active"
484 azarah 1.13 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
485 danarmak 1.32
486 azarah 1.10 elif [ "${ARCH}" = "alpha" ]
487     then
488     # alpha has "cpus active", but only when compiled with SMP
489 azarah 1.13 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
490 azarah 1.10 then
491 azarah 1.13 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
492 azarah 1.10 else
493 azarah 1.13 jobs=2
494 azarah 1.10 fi
495 danarmak 1.32
496 brad_mssw 1.78 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
497 azarah 1.10 then
498     # ppc has "processor", but only when compiled with SMP
499 azarah 1.13 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
500 azarah 1.10 then
501 azarah 1.13 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
502 azarah 1.10 else
503 azarah 1.13 jobs=2
504 azarah 1.10 fi
505 iggy 1.87 elif [ "${ARCH}" = "s390" ]
506     then
507     # s390 has "# processors : "
508     jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
509 azarah 1.10 else
510 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
511 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
512 azarah 1.3 fi
513 azarah 1.13
514     # Make sure the number is valid ...
515     if [ "${jobs}" -lt 1 ]
516     then
517     jobs=1
518     fi
519 danarmak 1.32
520 azarah 1.15 if [ -n "${ADMINPARAM}" ]
521 azarah 1.14 then
522 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
523     then
524 vapier 1.121 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge ..."
525 azarah 1.15 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
526     else
527 vapier 1.121 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge ..."
528 azarah 1.15 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
529     fi
530 azarah 1.14 fi
531 azarah 1.1 }
532    
533 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
534 vapier 1.80 # does not exist on the users system
535 vapier 1.52 # vapier@gentoo.org
536     #
537 vapier 1.117 # Takes just 1 optional parameter (the directory to create tmpfile in)
538     emktemp() {
539 vapier 1.119 local exe="touch"
540     [ "$1" == "-d" ] && exe="mkdir" && shift
541 azarah 1.59 local topdir="$1"
542 mr_bones_ 1.100
543 vapier 1.117 if [ -z "${topdir}" ]
544 azarah 1.59 then
545 vapier 1.117 [ -z "${T}" ] \
546     && topdir="/tmp" \
547     || topdir="${T}"
548     fi
549    
550     if [ -z "$(type -p mktemp)" ]
551     then
552     local tmp=/
553     while [ -e "${tmp}" ] ; do
554     tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
555     done
556 vapier 1.119 ${exe} "${tmp}"
557 vapier 1.117 echo "${tmp}"
558 vapier 1.52 else
559 vapier 1.119 [ "${exe}" == "touch" ] \
560     && exe="-p" \
561     || exe="-d"
562     mktemp ${exe} "${topdir}"
563 vapier 1.52 fi
564     }
565    
566 ka0ttic 1.108 # Small wrapper for getent (Linux), nidump (Mac OS X),
567     # and pw (FreeBSD) used in enewuser()/enewgroup()
568 usata 1.91 # Joe Jezak <josejx@gmail.com> and usata@gentoo.org
569 ka0ttic 1.108 # FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
570 usata 1.91 #
571     # egetent(database, key)
572     egetent() {
573 usata 1.124 if useq ppc-macos ; then
574 usata 1.91 case "$2" in
575     *[!0-9]*) # Non numeric
576     nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
577     ;;
578     *) # Numeric
579     nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
580     ;;
581     esac
582 ka0ttic 1.108 elif useq x86-fbsd ; then
583     local action
584     if [ "$1" == "passwd" ]
585     then
586     action="user"
587     else
588     action="group"
589     fi
590     pw show "${action}" "$2" -q
591 usata 1.91 else
592 vapier 1.113 which nscd >& /dev/null && nscd -i "$1"
593 vapier 1.107 getent "$1" "$2"
594 usata 1.91 fi
595     }
596    
597 vapier 1.23 # Simplify/standardize adding users to the system
598     # vapier@gentoo.org
599     #
600     # enewuser(username, uid, shell, homedir, groups, extra options)
601     #
602     # Default values if you do not specify any:
603     # username: REQUIRED !
604     # uid: next available (see useradd(8))
605 vapier 1.27 # note: pass -1 to get default behavior
606 vapier 1.23 # shell: /bin/false
607     # homedir: /dev/null
608     # groups: none
609     # extra: comment of 'added by portage for ${PN}'
610     enewuser() {
611     # get the username
612     local euser="$1"; shift
613 azarah 1.59 if [ -z "${euser}" ]
614     then
615 vapier 1.23 eerror "No username specified !"
616     die "Cannot call enewuser without a username"
617     fi
618    
619 vapier 1.84 # lets see if the username already exists
620 usata 1.91 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ]
621 azarah 1.59 then
622 vapier 1.23 return 0
623     fi
624 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
625 vapier 1.23
626     # options to pass to useradd
627 azarah 1.59 local opts=
628 vapier 1.23
629     # handle uid
630     local euid="$1"; shift
631 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
632     then
633     if [ "${euid}" -gt 0 ]
634     then
635 usata 1.91 if [ ! -z "`egetent passwd ${euid}`" ]
636 vapier 1.82 then
637 vapier 1.84 euid="next"
638 vapier 1.82 fi
639 vapier 1.23 else
640     eerror "Userid given but is not greater than 0 !"
641     die "${euid} is not a valid UID"
642     fi
643     else
644 vapier 1.84 euid="next"
645     fi
646     if [ "${euid}" == "next" ]
647     then
648 usata 1.91 local pwrange
649 usata 1.114 if [ "${USERLAND}" == "BSD" ] ; then
650 usata 1.91 pwrange="`jot 898 101`"
651     else
652     pwrange="`seq 101 999`"
653     fi
654     for euid in ${pwrange} ; do
655     [ -z "`egetent passwd ${euid}`" ] && break
656 vapier 1.84 done
657 vapier 1.23 fi
658 vapier 1.84 opts="${opts} -u ${euid}"
659 vapier 1.23 einfo " - Userid: ${euid}"
660    
661     # handle shell
662     local eshell="$1"; shift
663 vapier 1.67 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
664 azarah 1.59 then
665     if [ ! -e "${eshell}" ]
666     then
667 vapier 1.23 eerror "A shell was specified but it does not exist !"
668     die "${eshell} does not exist"
669     fi
670     else
671 ka0ttic 1.108 if [ "${USERLAND}" == "BSD" ]
672     then
673     eshell="/usr/bin/false"
674     else
675     eshell="/bin/false"
676     fi
677 vapier 1.23 fi
678     einfo " - Shell: ${eshell}"
679     opts="${opts} -s ${eshell}"
680    
681     # handle homedir
682     local ehome="$1"; shift
683 vapier 1.67 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
684 azarah 1.59 then
685     ehome="/dev/null"
686 vapier 1.23 fi
687     einfo " - Home: ${ehome}"
688     opts="${opts} -d ${ehome}"
689    
690     # handle groups
691     local egroups="$1"; shift
692 azarah 1.59 if [ ! -z "${egroups}" ]
693     then
694 vapier 1.23 local oldifs="${IFS}"
695 vapier 1.107 local defgroup="" exgroups=""
696    
697 vapier 1.23 export IFS=","
698 azarah 1.59 for g in ${egroups}
699     do
700 usata 1.115 export IFS="${oldifs}"
701 usata 1.91 if [ -z "`egetent group \"${g}\"`" ]
702 azarah 1.59 then
703 vapier 1.85 eerror "You must add group ${g} to the system first"
704 vapier 1.23 die "${g} is not a valid GID"
705     fi
706 vapier 1.107 if [ -z "${defgroup}" ]
707     then
708     defgroup="${g}"
709     else
710     exgroups="${exgroups},${g}"
711     fi
712 usata 1.115 export IFS=","
713 vapier 1.23 done
714     export IFS="${oldifs}"
715 vapier 1.107
716     opts="${opts} -g ${defgroup}"
717     if [ ! -z "${exgroups}" ]
718     then
719     opts="${opts} -G ${exgroups:1}"
720     fi
721 vapier 1.23 else
722     egroups="(none)"
723     fi
724     einfo " - Groups: ${egroups}"
725    
726     # handle extra and add the user
727     local eextra="$@"
728 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
729 vapier 1.23 export SANDBOX_ON="0"
730 usata 1.124 if useq ppc-macos
731 azarah 1.59 then
732 usata 1.91 ### Make the user
733     if [ -z "${eextra}" ]
734     then
735     dscl . create /users/${euser} uid ${euid}
736     dscl . create /users/${euser} shell ${eshell}
737     dscl . create /users/${euser} home ${ehome}
738     dscl . create /users/${euser} realname "added by portage for ${PN}"
739     ### Add the user to the groups specified
740 usata 1.115 local oldifs="${IFS}"
741     export IFS=","
742 usata 1.91 for g in ${egroups}
743     do
744     dscl . merge /groups/${g} users ${euser}
745     done
746 usata 1.115 export IFS="${oldifs}"
747 usata 1.91 else
748     einfo "Extra options are not supported on macos yet"
749     einfo "Please report the ebuild along with the info below"
750     einfo "eextra: ${eextra}"
751     die "Required function missing"
752     fi
753 ka0ttic 1.108 elif use x86-fbsd ; then
754     if [ -z "${eextra}" ]
755     then
756     pw useradd ${euser} ${opts} \
757     -c "added by portage for ${PN}" \
758     die "enewuser failed"
759     else
760     einfo " - Extra: ${eextra}"
761     pw useradd ${euser} ${opts} \
762     -c ${eextra} || die "enewuser failed"
763     fi
764 vapier 1.23 else
765 usata 1.91 if [ -z "${eextra}" ]
766     then
767     useradd ${opts} ${euser} \
768     -c "added by portage for ${PN}" \
769     || die "enewuser failed"
770     else
771     einfo " - Extra: ${eextra}"
772     useradd ${opts} ${euser} ${eextra} \
773     || die "enewuser failed"
774     fi
775 vapier 1.23 fi
776     export SANDBOX_ON="${oldsandbox}"
777    
778 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
779     then
780 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
781     dodir ${ehome}
782 vapier 1.37 fowners ${euser} ${ehome}
783 vapier 1.38 fperms 755 ${ehome}
784 vapier 1.23 fi
785     }
786    
787     # Simplify/standardize adding groups to the system
788     # vapier@gentoo.org
789     #
790     # enewgroup(group, gid)
791     #
792     # Default values if you do not specify any:
793     # groupname: REQUIRED !
794     # gid: next available (see groupadd(8))
795     # extra: none
796     enewgroup() {
797     # get the group
798     local egroup="$1"; shift
799 azarah 1.59 if [ -z "${egroup}" ]
800     then
801 vapier 1.23 eerror "No group specified !"
802     die "Cannot call enewgroup without a group"
803     fi
804    
805     # see if group already exists
806 usata 1.91 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
807 azarah 1.59 then
808 vapier 1.23 return 0
809     fi
810 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
811 vapier 1.23
812     # options to pass to useradd
813 azarah 1.59 local opts=
814 vapier 1.23
815     # handle gid
816     local egid="$1"; shift
817 azarah 1.59 if [ ! -z "${egid}" ]
818     then
819     if [ "${egid}" -gt 0 ]
820     then
821 usata 1.91 if [ -z "`egetent group ${egid}`" ]
822 vapier 1.83 then
823 usata 1.124 if useq ppc-macos ; then
824 usata 1.91 opts="${opts} ${egid}"
825     else
826     opts="${opts} -g ${egid}"
827     fi
828 vapier 1.83 else
829 vapier 1.84 egid="next available; requested gid taken"
830 vapier 1.83 fi
831 vapier 1.23 else
832     eerror "Groupid given but is not greater than 0 !"
833     die "${egid} is not a valid GID"
834     fi
835     else
836     egid="next available"
837     fi
838     einfo " - Groupid: ${egid}"
839    
840     # handle extra
841     local eextra="$@"
842     opts="${opts} ${eextra}"
843    
844     # add the group
845 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
846 vapier 1.23 export SANDBOX_ON="0"
847 usata 1.124 if useq ppc-macos ; then
848 usata 1.91 if [ ! -z "${eextra}" ];
849     then
850     einfo "Extra options are not supported on macos yet"
851     einfo "Please report the ebuild along with the info below"
852     einfo "eextra: ${eextra}"
853     die "Required function missing"
854     fi
855 mr_bones_ 1.100
856 usata 1.91 # If we need the next available
857     case ${egid} in
858     *[!0-9]*) # Non numeric
859     for egid in `jot 898 101`; do
860     [ -z "`egetent group ${egid}`" ] && break
861     done
862     esac
863     dscl . create /groups/${egroup} gid ${egid}
864 mr_bones_ 1.100 dscl . create /groups/${egroup} passwd '*'
865 ka0ttic 1.108 elif use x86-fbsd ; then
866     case ${egid} in
867     *[!0-9]*) # Non numeric
868     for egid in `jot 898 101`; do
869     [ -z "`egetent group ${egid}`" ] && break
870     done
871     esac
872     pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
873 usata 1.91 else
874     groupadd ${opts} ${egroup} || die "enewgroup failed"
875     fi
876 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
877 vapier 1.24 }
878    
879     # Simple script to replace 'dos2unix' binaries
880     # vapier@gentoo.org
881     #
882 vapier 1.121 # edos2unix(file, <more files> ...)
883 vapier 1.24 edos2unix() {
884 vapier 1.61 for f in "$@"
885 azarah 1.59 do
886 vapier 1.61 cp "${f}" ${T}/edos2unix
887     sed 's/\r$//' ${T}/edos2unix > "${f}"
888 vapier 1.24 done
889 vapier 1.39 }
890    
891 lanius 1.133
892     ##############################################################
893     # START: Handle .desktop files and menu entries #
894     # maybe this should be separated into a new eclass some time #
895     # lanius@gentoo.org #
896     ##############################################################
897    
898 vapier 1.39 # Make a desktop file !
899     # Great for making those icons in kde/gnome startmenu !
900     # Amaze your friends ! Get the women ! Join today !
901     #
902     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
903     #
904     # binary: what binary does the app run with ?
905     # name: the name that will show up in the menu
906     # icon: give your little like a pretty little icon ...
907 vapier 1.118 # this can be relative (to /usr/share/pixmaps) or
908     # a full path to an icon
909 vapier 1.39 # type: what kind of application is this ? for categories:
910 vapier 1.118 # http://www.freedesktop.org/standards/menu-spec/
911 vapier 1.39 # path: if your app needs to startup in a specific dir
912     make_desktop_entry() {
913 vapier 1.118 [ -z "$1" ] && eerror "make_desktop_entry: You must specify the executable" && return 1
914 vapier 1.39
915 azarah 1.59 local exec="${1}"
916     local name="${2:-${PN}}"
917     local icon="${3:-${PN}.png}"
918     local type="${4}"
919 vapier 1.81 local subdir="${6}"
920 mr_bones_ 1.100 local path="${5:-${GAMES_BINDIR}}"
921 azarah 1.59 if [ -z "${type}" ]
922     then
923 vapier 1.39 case ${CATEGORY} in
924 azarah 1.59 "app-emulation")
925     type=Emulator
926 vapier 1.86 subdir="Emulation"
927 azarah 1.59 ;;
928     "games-"*)
929     type=Game
930 vapier 1.81 subdir="Games"
931 wolf31o2 1.65 ;;
932     "net-"*)
933 vapier 1.81 type=Network
934     subdir="${type}"
935 azarah 1.59 ;;
936     *)
937     type=
938 vapier 1.81 subdir=
939 azarah 1.59 ;;
940 vapier 1.39 esac
941     fi
942 azarah 1.59 local desktop="${T}/${exec}.desktop"
943 vapier 1.39
944     echo "[Desktop Entry]
945     Encoding=UTF-8
946     Version=0.9.2
947     Name=${name}
948     Type=Application
949     Comment=${DESCRIPTION}
950     Exec=${exec}
951     Path=${path}
952     Icon=${icon}
953 vapier 1.99 Categories=Application;${type};" > "${desktop}"
954 vapier 1.39
955 vapier 1.118 insinto /usr/share/applications
956     doins "${desktop}"
957 vapier 1.39
958     return 0
959 danarmak 1.32 }
960    
961 lanius 1.133 # Make a GDM/KDM Session file
962     #
963     # make_desktop_entry(<title>, <command>)
964     # title: File to execute to start the Window Manager
965     # command: Name of the Window Manager
966    
967     make_session_desktop() {
968    
969     [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1
970     [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1
971    
972     local title="${1}"
973     local command="${2}"
974     local desktop="${T}/${wm}.desktop"
975    
976     echo "[Desktop Entry]
977     Encoding=UTF-8
978     Name=${title}
979     Comment=This session logs you into ${title}
980     Exec=${command}
981     TryExec=${command}
982     Type=Application" > "${desktop}"
983    
984     insinto /usr/share/xsessions
985     doins "${desktop}"
986    
987     return 0
988     }
989    
990     domenu() {
991     local i
992     local j
993     insinto /usr/share/applications
994     for i in ${@}
995     do
996     if [ -f "${i}" ];
997     then
998     doins ${i}
999     elif [ -d "${i}" ];
1000     then
1001     for j in ${i}/*.desktop
1002     do
1003     doins ${j}
1004     done
1005     fi
1006     done
1007     }
1008    
1009     doicon() {
1010     local i
1011     local j
1012     insinto /usr/share/pixmaps
1013     for i in ${@}
1014     do
1015     if [ -f "${i}" ];
1016     then
1017     doins ${i}
1018     elif [ -d "${i}" ];
1019     then
1020     for j in ${i}/*.png
1021     do
1022     doins ${j}
1023     done
1024     fi
1025     done
1026     }
1027    
1028     ##############################################################
1029     # END: Handle .desktop files and menu entries #
1030     ##############################################################
1031    
1032    
1033 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1034     find_unpackable_file() {
1035 azarah 1.59 local src="$1"
1036     if [ -z "${src}" ]
1037     then
1038 vapier 1.50 src="${DISTDIR}/${A}"
1039     else
1040 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
1041     then
1042 vapier 1.50 src="${DISTDIR}/${src}"
1043 azarah 1.59 elif [ -e "${PWD}/${src}" ]
1044     then
1045 vapier 1.50 src="${PWD}/${src}"
1046 azarah 1.59 elif [ -e "${src}" ]
1047     then
1048 vapier 1.50 src="${src}"
1049     fi
1050     fi
1051 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
1052     echo "${src}"
1053     }
1054    
1055     # Unpack those pesky pdv generated files ...
1056     # They're self-unpacking programs with the binary package stuffed in
1057     # the middle of the archive. Valve seems to use it a lot ... too bad
1058     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1059     #
1060     # Usage: unpack_pdv [file to unpack] [size of off_t]
1061     # - you have to specify the off_t size ... i have no idea how to extract that
1062     # information out of the binary executable myself. basically you pass in
1063     # the size of the off_t type (in bytes) on the machine that built the pdv
1064     # archive. one way to determine this is by running the following commands:
1065     # strings <pdv archive> | grep lseek
1066     # strace -elseek <pdv archive>
1067     # basically look for the first lseek command (we do the strings/grep because
1068     # sometimes the function call is _llseek or something) and steal the 2nd
1069     # parameter. here is an example:
1070     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1071     # lseek
1072     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1073     # lseek(3, -4, SEEK_END) = 2981250
1074     # thus we would pass in the value of '4' as the second parameter.
1075     unpack_pdv() {
1076     local src="`find_unpackable_file $1`"
1077     local sizeoff_t="$2"
1078    
1079     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
1080    
1081     local shrtsrc="`basename ${src}`"
1082     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1083     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1084     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1085    
1086     # grab metadata for debug reasons
1087 vapier 1.117 local metafile="$(emktemp)"
1088 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1089    
1090     # rip out the final file name from the metadata
1091     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1092     datafile="`basename ${datafile}`"
1093    
1094 vapier 1.71 # now lets uncompress/untar the file if need be
1095 vapier 1.117 local tmpfile="$(emktemp)"
1096 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1097 vapier 1.71
1098     local iscompressed="`file -b ${tmpfile}`"
1099     if [ "${iscompressed:0:8}" == "compress" ] ; then
1100     iscompressed=1
1101     mv ${tmpfile}{,.Z}
1102     gunzip ${tmpfile}
1103     else
1104     iscompressed=0
1105     fi
1106     local istar="`file -b ${tmpfile}`"
1107     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1108     istar=1
1109     else
1110     istar=0
1111     fi
1112    
1113     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1114     #dd if=${src} ibs=${metaskip} count=1 \
1115     # | dd ibs=${tailskip} skip=1 \
1116     # | gzip -dc \
1117     # > ${datafile}
1118     if [ ${iscompressed} -eq 1 ] ; then
1119     if [ ${istar} -eq 1 ] ; then
1120     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1121     | head -c $((${metaskip}-${tailskip})) \
1122     | tar -xzf -
1123     else
1124 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1125     | head -c $((${metaskip}-${tailskip})) \
1126     | gzip -dc \
1127     > ${datafile}
1128 vapier 1.71 fi
1129     else
1130     if [ ${istar} -eq 1 ] ; then
1131     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1132     | head -c $((${metaskip}-${tailskip})) \
1133 vapier 1.73 | tar --no-same-owner -xf -
1134 vapier 1.71 else
1135 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1136     | head -c $((${metaskip}-${tailskip})) \
1137     > ${datafile}
1138 vapier 1.71 fi
1139     fi
1140     true
1141     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1142 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1143     }
1144    
1145     # Unpack those pesky makeself generated files ...
1146     # They're shell scripts with the binary package tagged onto
1147     # the end of the archive. Loki utilized the format as does
1148     # many other game companies.
1149     #
1150 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1151 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1152     # - If the offset is not specified then we will attempt to extract
1153     # the proper offset from the script itself.
1154     unpack_makeself() {
1155 vapier 1.112 local src="$(find_unpackable_file "$1")"
1156 vapier 1.70 local skip="$2"
1157 vapier 1.112 local exe="$3"
1158 vapier 1.50
1159 vapier 1.112 local shrtsrc="$(basename "${src}")"
1160 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1161 azarah 1.59 if [ -z "${skip}" ]
1162     then
1163 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
1164     local skip=0
1165 vapier 1.112 exe=tail
1166 vapier 1.41 case ${ver} in
1167     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1168 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1169 vapier 1.41 ;;
1170     2.0|2.0.1)
1171 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1172 vapier 1.41 ;;
1173 wolf31o2 1.48 2.1.1)
1174 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1175 wolf31o2 1.48 let skip="skip + 1"
1176     ;;
1177 vapier 1.49 2.1.2)
1178 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1179 vapier 1.49 let skip="skip + 1"
1180     ;;
1181 wolf31o2 1.48 2.1.3)
1182 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1183 vapier 1.41 let skip="skip + 1"
1184     ;;
1185 vapier 1.112 2.1.4)
1186     skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1187     skip=$(head -n ${skip} "${src}" | wc -c)
1188     exe="dd"
1189     ;;
1190 vapier 1.41 *)
1191     eerror "I'm sorry, but I was unable to support the Makeself file."
1192     eerror "The version I detected was '${ver}'."
1193     eerror "Please file a bug about the file ${shrtsrc} at"
1194     eerror "http://bugs.gentoo.org/ so that support can be added."
1195     die "makeself version '${ver}' not supported"
1196     ;;
1197     esac
1198     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1199     fi
1200 vapier 1.112 case ${exe} in
1201     tail) exe="tail -n +${skip} '${src}'";;
1202     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1203     *) die "makeself cant handle exe '${exe}'"
1204     esac
1205 vapier 1.41
1206 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1207 vapier 1.117 local tmpfile="$(emktemp)"
1208 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1209     local filetype="$(file -b "${tmpfile}")"
1210 vapier 1.68 case ${filetype} in
1211     *tar\ archive)
1212 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1213 vapier 1.68 ;;
1214     bzip2*)
1215 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1216 mr_bones_ 1.69 ;;
1217 vapier 1.68 gzip*)
1218 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1219 vapier 1.68 ;;
1220 vapier 1.93 compress*)
1221 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1222 vapier 1.93 ;;
1223 vapier 1.68 *)
1224 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1225 vapier 1.68 false
1226     ;;
1227     esac
1228     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1229 wolf31o2 1.56 }
1230    
1231     # Display a license for user to accept.
1232     #
1233     # Usage: check_license [license]
1234     # - If the file is not specified then ${LICENSE} is used.
1235     check_license() {
1236 vapier 1.60 local lic=$1
1237     if [ -z "${lic}" ] ; then
1238     lic="${PORTDIR}/licenses/${LICENSE}"
1239 wolf31o2 1.56 else
1240 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1241     lic="${PORTDIR}/licenses/${src}"
1242     elif [ -e "${PWD}/${src}" ] ; then
1243     lic="${PWD}/${src}"
1244     elif [ -e "${src}" ] ; then
1245     lic="${src}"
1246 wolf31o2 1.56 fi
1247     fi
1248 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1249 vapier 1.64 local l="`basename ${lic}`"
1250 wolf31o2 1.56
1251 vapier 1.60 # here is where we check for the licenses the user already
1252     # accepted ... if we don't find a match, we make the user accept
1253 wolf31o2 1.106 local shopts=$-
1254 vapier 1.60 local alic
1255 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1256 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1257 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1258     set +o noglob; set -${shopts} #reset old shell opts
1259     return 0
1260     fi
1261 vapier 1.60 done
1262 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1263 vapier 1.60
1264 vapier 1.117 local licmsg="$(emktemp)"
1265 vapier 1.60 cat << EOF > ${licmsg}
1266     **********************************************************
1267     The following license outlines the terms of use of this
1268     package. You MUST accept this license for installation to
1269     continue. When you are done viewing, hit 'q'. If you
1270     CTRL+C out of this, the install will not run!
1271     **********************************************************
1272    
1273     EOF
1274     cat ${lic} >> ${licmsg}
1275     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1276 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1277 vapier 1.60 read alic
1278     case ${alic} in
1279     yes|Yes|y|Y)
1280     return 0
1281     ;;
1282     *)
1283     echo;echo;echo
1284     eerror "You MUST accept the license to continue! Exiting!"
1285     die "Failed to accept license"
1286     ;;
1287     esac
1288 vapier 1.23 }
1289 vapier 1.75
1290     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1291     # the whole 'non-interactive' policy, but damnit I want CD support !
1292     #
1293     # with these cdrom functions we handle all the user interaction and
1294     # standardize everything. all you have to do is call cdrom_get_cds()
1295     # and when the function returns, you can assume that the cd has been
1296     # found at CDROM_ROOT.
1297     #
1298     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1299     # etc... if you want to give the cds better names, then just export
1300     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1301     #
1302     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1303     #
1304     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1305     # - this will attempt to locate a cd based upon a file that is on
1306     # the cd ... the more files you give this function, the more cds
1307     # the cdrom functions will handle
1308     cdrom_get_cds() {
1309     # first we figure out how many cds we're dealing with by
1310     # the # of files they gave us
1311     local cdcnt=0
1312     local f=
1313     for f in "$@" ; do
1314     cdcnt=$((cdcnt + 1))
1315     export CDROM_CHECK_${cdcnt}="$f"
1316     done
1317     export CDROM_TOTAL_CDS=${cdcnt}
1318     export CDROM_CURRENT_CD=1
1319    
1320     # now we see if the user gave use CD_ROOT ...
1321     # if they did, let's just believe them that it's correct
1322 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1323     export CDROM_ROOT=${CD_ROOT}
1324 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1325     return
1326     fi
1327     # do the same for CD_ROOT_X
1328 vapier 1.131 if [[ ! -z ${CD_ROOT_1} ]] ; then
1329 vapier 1.75 local var=
1330     cdcnt=0
1331 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1332 vapier 1.75 cdcnt=$((cdcnt + 1))
1333     var="CD_ROOT_${cdcnt}"
1334 vapier 1.131 if [[ -z ${!var} ]] ; then
1335 vapier 1.75 eerror "You must either use just the CD_ROOT"
1336     eerror "or specify ALL the CD_ROOT_X variables."
1337     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1338     die "could not locate CD_ROOT_${cdcnt}"
1339     fi
1340     export CDROM_ROOTS_${cdcnt}="${!var}"
1341     done
1342     export CDROM_ROOT=${CDROM_ROOTS_1}
1343     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1344     return
1345     fi
1346    
1347 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1348 vapier 1.75 einfon "This ebuild will need the "
1349 vapier 1.131 if [[ -z ${CDROM_NAME} ]] ; then
1350 vapier 1.75 echo "cdrom for ${PN}."
1351     else
1352     echo "${CDROM_NAME}."
1353     fi
1354     echo
1355     einfo "If you do not have the CD, but have the data files"
1356     einfo "mounted somewhere on your filesystem, just export"
1357     einfo "the variable CD_ROOT so that it points to the"
1358     einfo "directory containing the files."
1359     echo
1360 vapier 1.132 einfo "For example:"
1361     einfo "export CD_ROOT=/mnt/cdrom"
1362     echo
1363 vapier 1.75 else
1364     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1365     cdcnt=0
1366 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1367 vapier 1.75 cdcnt=$((cdcnt + 1))
1368     var="CDROM_NAME_${cdcnt}"
1369 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1370 vapier 1.75 done
1371     echo
1372     einfo "If you do not have the CDs, but have the data files"
1373     einfo "mounted somewhere on your filesystem, just export"
1374     einfo "the following variables so they point to the right place:"
1375     einfon ""
1376     cdcnt=0
1377 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1378 vapier 1.75 cdcnt=$((cdcnt + 1))
1379     echo -n " CD_ROOT_${cdcnt}"
1380     done
1381     echo
1382     einfo "Or, if you have all the files in the same place, or"
1383     einfo "you only have one cdrom, you can export CD_ROOT"
1384     einfo "and that place will be used as the same data source"
1385     einfo "for all the CDs."
1386     echo
1387 vapier 1.132 einfo "For example:"
1388     einfo "export CD_ROOT_1=/mnt/cdrom"
1389     echo
1390 vapier 1.75 fi
1391     export CDROM_CURRENT_CD=0
1392     cdrom_load_next_cd
1393     }
1394    
1395     # this is only used when you need access to more than one cd.
1396     # when you have finished using the first cd, just call this function.
1397     # when it returns, CDROM_ROOT will be pointing to the second cd.
1398     # remember, you can only go forward in the cd chain, you can't go back.
1399     cdrom_load_next_cd() {
1400     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1401     local var=
1402    
1403 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1404 vapier 1.79 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1405     return
1406     fi
1407    
1408 vapier 1.75 unset CDROM_ROOT
1409     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1410 vapier 1.131 if [[ -z ${!var} ]] ; then
1411 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1412     cdrom_locate_file_on_cd ${!var}
1413     else
1414 vapier 1.131 export CDROM_ROOT=${!var}
1415 vapier 1.75 fi
1416    
1417     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1418     }
1419    
1420     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1421     # functions. this should *never* be called from an ebuild.
1422     # all it does is try to locate a give file on a cd ... if the cd isn't
1423     # found, then a message asking for the user to insert the cdrom will be
1424     # displayed and we'll hang out here until:
1425     # (1) the file is found on a mounted cdrom
1426     # (2) the user hits CTRL+C
1427     cdrom_locate_file_on_cd() {
1428 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1429 vapier 1.75 local dir="$(dirname ${@})"
1430     local file="$(basename ${@})"
1431     local mline=""
1432     local showedmsg=0
1433    
1434 vapier 1.131 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1435     [[ -d ${mline}/${dir} ]] || continue
1436     [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \
1437 vapier 1.75 && export CDROM_ROOT=${mline}
1438     done
1439    
1440 vapier 1.131 if [[ -z ${CDROM_ROOT} ]] ; then
1441 vapier 1.75 echo
1442 vapier 1.131 if [[ ${showedmsg} -eq 0 ]] ; then
1443     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1444     if [[ -z ${CDROM_NAME} ]] ; then
1445 vapier 1.75 einfo "Please insert the cdrom for ${PN} now !"
1446     else
1447     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1448     fi
1449     else
1450 vapier 1.131 if [[ -z ${CDROM_NAME_1} ]] ; then
1451 vapier 1.75 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1452     else
1453     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1454     einfo "Please insert+mount the ${!var} cdrom now !"
1455     fi
1456     fi
1457     showedmsg=1
1458     fi
1459     einfo "Press return to scan for the cd again"
1460     einfo "or hit CTRL+C to abort the emerge."
1461     read
1462     fi
1463     done
1464     }
1465 vapier 1.92
1466 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1467 vapier 1.92 # a package can support
1468     #
1469     # usage: strip-linguas <allow LINGUAS>
1470     # strip-linguas -i <directories of .po files>
1471     # strip-linguas -u <directories of .po files>
1472     #
1473     # The first form allows you to specify a list of LINGUAS.
1474 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1475 vapier 1.92 # directories and uses the intersection of the lists.
1476 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1477 vapier 1.92 # directories and uses the union of the lists.
1478     strip-linguas() {
1479     local ls newls
1480     if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then
1481     local op="$1"; shift
1482     ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1483     local d f
1484     for d in "$@" ; do
1485     if [ "${op}" == "-u" ] ; then
1486     newls="${ls}"
1487     else
1488     newls=""
1489     fi
1490     for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1491     if [ "${op}" == "-i" ] ; then
1492     [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}"
1493     else
1494     [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}"
1495     fi
1496     done
1497     ls="${newls}"
1498     done
1499     ls="${ls//.po}"
1500     else
1501     ls="$@"
1502     fi
1503    
1504     ls=" ${ls} "
1505     newls=""
1506     for f in ${LINGUAS} ; do
1507     if [ "${ls/ ${f} /}" != "${ls}" ] ; then
1508 vapier 1.120 newls="${newls} ${f}"
1509 vapier 1.92 else
1510     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1511     fi
1512     done
1513     if [ -z "${newls}" ] ; then
1514     unset LINGUAS
1515     else
1516     export LINGUAS="${newls}"
1517     fi
1518     }
1519 iggy 1.110
1520     # moved from kernel.eclass since they are generally useful outside of
1521     # kernel.eclass -iggy (20041002)
1522    
1523     # the following functions are useful in kernel module ebuilds, etc.
1524     # for an example see ivtv or drbd ebuilds
1525    
1526     # set's ARCH to match what the kernel expects
1527     set_arch_to_kernel() {
1528 vapier 1.140 i=10
1529     while ((i--)) ; do
1530     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1531     done
1532 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1533     case ${ARCH} in
1534     x86) export ARCH="i386";;
1535     amd64) export ARCH="x86_64";;
1536     hppa) export ARCH="parisc";;
1537     mips) export ARCH="mips";;
1538 eradicator 1.142 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1539 iggy 1.110 *) export ARCH="${ARCH}";;
1540     esac
1541     }
1542    
1543     # set's ARCH back to what portage expects
1544     set_arch_to_portage() {
1545 vapier 1.140 i=10
1546     while ((i--)) ; do
1547     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1548     done
1549 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1550     }
1551 eradicator 1.111
1552     # Jeremy Huddleston <eradicator@gentoo.org>:
1553     # preserve_old_lib /path/to/libblah.so.0
1554     # preserve_old_lib_notify /path/to/libblah.so.0
1555     #
1556     # These functions are useful when a lib in your package changes --soname. Such
1557     # an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1558     # would break packages that link against it. Most people get around this
1559     # by using the portage SLOT mechanism, but that is not always a relevant
1560     # solution, so instead you can add the following to your ebuilds:
1561     #
1562     # src_install() {
1563     # ...
1564     # preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1565     # ...
1566     # }
1567     #
1568     # pkg_postinst() {
1569     # ...
1570     # preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1571     # ...
1572     # }
1573    
1574     preserve_old_lib() {
1575     LIB=$1
1576    
1577     if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1578     SONAME=`basename ${LIB}`
1579     DIRNAME=`dirname ${LIB}`
1580    
1581     dodir ${DIRNAME}
1582     cp ${ROOT}${LIB} ${D}${DIRNAME}
1583     touch ${D}${LIB}
1584     fi
1585     }
1586    
1587     preserve_old_lib_notify() {
1588 seemant 1.134 LIB=$1
1589 eradicator 1.111
1590 seemant 1.134 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1591     SONAME=`basename ${LIB}`
1592 eradicator 1.111
1593     einfo "An old version of an installed library was detected on your system."
1594     einfo "In order to avoid breaking packages that link against is, this older version"
1595     einfo "is not being removed. In order to make full use of this newer version,"
1596     einfo "you will need to execute the following command:"
1597     einfo " revdep-rebuild --soname ${SONAME}"
1598     einfo
1599     einfo "After doing that, you can safely remove ${LIB}"
1600 eradicator 1.116 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild"
1601 seemant 1.134 fi
1602 eradicator 1.111 }
1603 vapier 1.125
1604 ka0ttic 1.143 # Hack for people to figure out if a package was built with
1605 vapier 1.125 # certain USE flags
1606     #
1607 vapier 1.130 # Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1608 vapier 1.125 # ex: built_with_use xchat gtk2
1609 vapier 1.130 #
1610     # Flags: -a all USE flags should be utilized
1611     # -o at least one USE flag should be utilized
1612     # Note: the default flag is '-a'
1613 vapier 1.125 built_with_use() {
1614 vapier 1.130 local opt=$1
1615     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1616    
1617     local PKG=$(best_version $1)
1618     shift
1619    
1620 vapier 1.125 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE"
1621     [[ ! -e ${USEFILE} ]] && return 1
1622    
1623     local USE_BUILT=$(<${USEFILE})
1624 vapier 1.130 while [[ $# -gt 0 ]] ; do
1625     if [[ ${opt} = "-o" ]] ; then
1626     has $1 ${USE_BUILT} && return 0
1627     else
1628     has $1 ${USE_BUILT} || return 1
1629     fi
1630 vapier 1.125 shift
1631     done
1632 vapier 1.130 [[ ${opt} = "-a" ]]
1633 vapier 1.125 }
1634 vapier 1.126
1635 ka0ttic 1.143 # Many configure scripts wrongly bail when a C++ compiler
1636 vapier 1.126 # could not be detected. #73450
1637     epunt_cxx() {
1638 vapier 1.127 local dir=$1
1639     [[ -z ${dir} ]] && dir=${S}
1640     ebegin "Removing useless C++ checks"
1641     local f
1642     for f in $(find ${dir} -name configure) ; do
1643     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1644     done
1645     eend 0
1646 vapier 1.126 }
1647 ka0ttic 1.143
1648     # dopamd [ file ] [ new file ]
1649     #
1650     # Install pam auth config file in /etc/pam.d
1651     #
1652     # The first argument, 'file' is required. Install as 'new file', if
1653     # specified.
1654    
1655     dopamd() {
1656     local pamd="$1" newpamd="${2:-$1}"
1657     [[ -z "$1" ]] && die "dopamd requires at least one argument."
1658    
1659     use pam || return 0
1660    
1661     insinto /etc/pam.d
1662     # these are the default doins options, but be explicit just in case
1663     insopts -m 0644 -o root -g root
1664     newins ${pamd} ${newpamd} || die "failed to install ${newpamd}"
1665     }

  ViewVC Help
Powered by ViewVC 1.1.20