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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.148 - (hide annotations) (download)
Thu Feb 3 23:55:05 2005 UTC (10 years, 5 months ago) by azarah
Branch: MAIN
Changes since 1.147: +5 -1 lines
Add comment for previously borked function.

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

  ViewVC Help
Powered by ViewVC 1.1.20