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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.159 - (hide annotations) (download)
Fri Mar 18 22:50:26 2005 UTC (9 years, 9 months ago) by vapier
Branch: MAIN
Changes since 1.158: +9 -9 lines
fix my quoting screwups as pointed out by mr bones

1 vapier 1.154 # Copyright 1999-2005 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.159 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.158 2005/03/17 02:45:10 vapier Exp $
4 vapier 1.18 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 vapier 1.18 #
7 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
8 vapier 1.7 # have to implement themselves.
9 azarah 1.1 #
10     # NB: If you add anything, please comment it!
11    
12 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.149 if [ "${CROSSCOMPILE}" != "1" -a -e "/proc/cpuinfo" ]
42 chriswhite 1.145 then
43 chriswhite 1.149 CPU_FLAGS=${1}
44 chriswhite 1.145 USER_CPU=`grep "flags" /proc/cpuinfo`
45    
46     for flags in `seq 1 ${#CPU_FLAGS[@]}`
47     do
48 chriswhite 1.149 if has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && ! has ${CPU_FLAGS[${flags} - 1]} ${USE}
49 chriswhite 1.145 then
50 chriswhite 1.149 ewarn "Your system is ${CPU_FLAGS[${flags} - 1]} capable but you don't have it enabled!"
51 chriswhite 1.145 ewarn "You might be cross compiling (in this case set CROSSCOMPILE to 1 to disable this warning."
52     fi
53 chriswhite 1.144
54 chriswhite 1.149 if ! has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && has ${CPU_FLAGS[${flags} -1]} ${USE}
55 chriswhite 1.145 then
56 chriswhite 1.149 ewarn "You have ${CPU_FLAGS[${flags} - 1]} support enabled but your processor doesn't"
57 chriswhite 1.145 ewarn "Seem to support it! You might be cross compiling or do not have /proc filesystem"
58     ewarn "enabled. If either is the case, set CROSSCOMPILE to 1 to disable this warning."
59     fi
60     done
61     fi
62 chriswhite 1.144 }
63    
64 ciaranm 1.98 # Wait for the supplied number of seconds. If no argument is supplied, defaults
65     # to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
66     # outputting to a terminal, don't wait. For compatability purposes, the argument
67     # must be an integer greater than zero.
68     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
69     epause() {
70     if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
71     sleep ${1:-5}
72     fi
73     }
74    
75     # Beep the specified number of times (defaults to five). If our output
76     # is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
77     # don't beep.
78     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
79     ebeep() {
80     local n
81     if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
82     for ((n=1 ; n <= ${1:-5} ; n++)) ; do
83     echo -ne "\a"
84     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
85     echo -ne "\a"
86     sleep 1
87     done
88     fi
89     }
90    
91 azarah 1.1 # This function generate linker scripts in /usr/lib for dynamic
92     # libs in /lib. This is to fix linking problems when you have
93     # the .so in /lib, and the .a in /usr/lib. What happens is that
94     # in some cases when linking dynamic, the .a in /usr/lib is used
95     # instead of the .so in /lib due to gcc/libtool tweaking ld's
96     # library search path. This cause many builds to fail.
97     # See bug #4411 for more info.
98     #
99     # To use, simply call:
100     #
101     # gen_usr_ldscript libfoo.so
102     #
103     # Note that you should in general use the unversioned name of
104     # the library, as ldconfig should usually update it correctly
105     # to point to the latest version of the library present.
106     #
107     # <azarah@gentoo.org> (26 Oct 2002)
108     #
109     gen_usr_ldscript() {
110 vapier 1.109 local libdir="$(get_libdir)"
111 azarah 1.1 # Just make sure it exists
112 vapier 1.109 dodir /usr/${libdir}
113 danarmak 1.32
114 vapier 1.109 cat > "${D}/usr/${libdir}/${1}" << END_LDSCRIPT
115 azarah 1.1 /* GNU ld script
116     Because Gentoo have critical dynamic libraries
117     in /lib, and the static versions in /usr/lib, we
118     need to have a "fake" dynamic lib in /usr/lib,
119     otherwise we run into linking problems.
120     See bug #4411 on http://bugs.gentoo.org/ for
121     more info. */
122 vapier 1.109 GROUP ( /${libdir}/${1} )
123 azarah 1.1 END_LDSCRIPT
124 vapier 1.109 fperms a+x "/usr/${libdir}/${1}"
125 azarah 1.2 }
126    
127 azarah 1.5 # Simple function to draw a line consisting of '=' the same length as $*
128     #
129     # <azarah@gentoo.org> (11 Nov 2002)
130     #
131     draw_line() {
132     local i=0
133     local str_length=""
134    
135     # Handle calls that do not have args, or wc not being installed ...
136     if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
137     then
138     echo "==============================================================="
139     return 0
140     fi
141    
142     # Get the length of $*
143     str_length="$(echo -n "$*" | wc -m)"
144 danarmak 1.32
145 azarah 1.5 while [ "$i" -lt "${str_length}" ]
146     do
147     echo -n "="
148 danarmak 1.32
149 azarah 1.5 i=$((i + 1))
150     done
151    
152     echo
153    
154     return 0
155     }
156 azarah 1.2
157     # Default directory where patches are located
158     EPATCH_SOURCE="${WORKDIR}/patch"
159     # Default extension for patches
160     EPATCH_SUFFIX="patch.bz2"
161     # Default options for patch
162 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
163     EPATCH_OPTS="-g0"
164 azarah 1.6 # List of patches not to apply. Not this is only file names,
165     # and not the full path ..
166     EPATCH_EXCLUDE=""
167 azarah 1.9 # Change the printed message for a single patch.
168     EPATCH_SINGLE_MSG=""
169 azarah 1.29 # Force applying bulk patches even if not following the style:
170     #
171     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
172     #
173     EPATCH_FORCE="no"
174 azarah 1.2
175     # This function is for bulk patching, or in theory for just one
176     # or two patches.
177     #
178     # It should work with .bz2, .gz, .zip and plain text patches.
179     # Currently all patches should be the same format.
180     #
181     # You do not have to specify '-p' option to patch, as it will
182     # try with -p0 to -p5 until it succeed, or fail at -p5.
183     #
184     # Above EPATCH_* variables can be used to control various defaults,
185     # bug they should be left as is to ensure an ebuild can rely on
186     # them for.
187     #
188 azarah 1.3 # Patches are applied in current directory.
189     #
190     # Bulk Patches should preferibly have the form of:
191 azarah 1.2 #
192     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
193     #
194     # For example:
195     #
196     # 01_all_misc-fix.patch.bz2
197     # 02_sparc_another-fix.patch.bz2
198     #
199     # This ensures that there are a set order, and you can have ARCH
200     # specific patches.
201     #
202 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
203     # single patch that need to be applied if its a file. If on the other
204     # hand its a directory, it will set EPATCH_SOURCE to this.
205     #
206 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
207     #
208     epatch() {
209     local PIPE_CMD=""
210     local STDERR_TARGET="${T}/$$.out"
211 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
212     local PATCH_SUFFIX=""
213 azarah 1.3 local SINGLE_PATCH="no"
214 azarah 1.4 local x=""
215 azarah 1.3
216     if [ "$#" -gt 1 ]
217     then
218 vapier 1.94 local m=""
219 vapier 1.121 einfo "${#} patches to apply ..."
220 vapier 1.94 for m in "$@" ; do
221     epatch "${m}"
222     done
223     return 0
224 azarah 1.3 fi
225    
226     if [ -n "$1" -a -f "$1" ]
227     then
228     SINGLE_PATCH="yes"
229 danarmak 1.32
230 azarah 1.4 local EPATCH_SOURCE="$1"
231     local EPATCH_SUFFIX="${1##*\.}"
232 danarmak 1.32
233 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
234     then
235 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
236     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
237     then
238     local EPATCH_SOURCE="$1/*"
239     else
240     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
241     fi
242 azarah 1.3 else
243 vapier 1.123 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
244 azarah 1.8 then
245 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
246     then
247     EPATCH_SOURCE="$1"
248     fi
249    
250 azarah 1.8 echo
251 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
252     eerror
253     eerror " ${EPATCH_SOURCE}"
254 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
255 azarah 1.8 echo
256     die "Cannot find \$EPATCH_SOURCE!"
257     fi
258 danarmak 1.32
259 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
260 azarah 1.3 fi
261 azarah 1.2
262     case ${EPATCH_SUFFIX##*\.} in
263     bz2)
264     PIPE_CMD="bzip2 -dc"
265 azarah 1.8 PATCH_SUFFIX="bz2"
266 azarah 1.2 ;;
267 azarah 1.6 gz|Z|z)
268 azarah 1.2 PIPE_CMD="gzip -dc"
269 azarah 1.8 PATCH_SUFFIX="gz"
270 azarah 1.2 ;;
271 azarah 1.6 ZIP|zip)
272 azarah 1.2 PIPE_CMD="unzip -p"
273 azarah 1.8 PATCH_SUFFIX="zip"
274 azarah 1.2 ;;
275     *)
276     PIPE_CMD="cat"
277 azarah 1.8 PATCH_SUFFIX="patch"
278 azarah 1.2 ;;
279     esac
280    
281 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
282     then
283 vapier 1.121 einfo "Applying various patches (bugfixes/updates) ..."
284 azarah 1.3 fi
285     for x in ${EPATCH_SOURCE}
286 azarah 1.2 do
287 vapier 1.121 # New ARCH dependant patch naming scheme ...
288 azarah 1.2 #
289     # ???_arch_foo.patch
290     #
291     if [ -f ${x} ] && \
292 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
293     [ "${EPATCH_FORCE}" = "yes" ])
294 azarah 1.2 then
295     local count=0
296     local popts="${EPATCH_OPTS}"
297 eradicator 1.150 local patchname=${x##*/}
298 azarah 1.6
299     if [ -n "${EPATCH_EXCLUDE}" ]
300     then
301 eradicator 1.150 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
302 azarah 1.6 then
303     continue
304     fi
305     fi
306 danarmak 1.32
307 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
308     then
309 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
310     then
311     einfo "${EPATCH_SINGLE_MSG}"
312     else
313 eradicator 1.150 einfo "Applying ${patchname} ..."
314 azarah 1.9 fi
315 azarah 1.3 else
316 eradicator 1.150 einfo " ${patchname} ..."
317 azarah 1.3 fi
318 azarah 1.2
319 eradicator 1.150 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
320     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
321 azarah 1.2
322     # Allow for prefix to differ ... im lazy, so shoot me :/
323     while [ "${count}" -lt 5 ]
324     do
325 azarah 1.5 # Generate some useful debug info ...
326 eradicator 1.150 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
327     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
328 azarah 1.8
329     if [ "${PATCH_SUFFIX}" != "patch" ]
330     then
331 eradicator 1.150 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
332     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
333 azarah 1.8 else
334     PATCH_TARGET="${x}"
335     fi
336 danarmak 1.32
337 eradicator 1.150 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
338     echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
339 danarmak 1.32
340 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
341     draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
342 azarah 1.8
343     if [ "${PATCH_SUFFIX}" != "patch" ]
344     then
345 eradicator 1.150 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
346 azarah 1.8 then
347     echo
348     eerror "Could not extract patch!"
349     #die "Could not extract patch!"
350     count=5
351     break
352     fi
353     fi
354 danarmak 1.32
355 eradicator 1.150 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
356 azarah 1.2 then
357 eradicator 1.150 draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
358     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
359     echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
360     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
361     draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
362 azarah 1.8
363 eradicator 1.150 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
364 azarah 1.8
365     if [ "$?" -ne 0 ]
366     then
367 eradicator 1.150 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
368 azarah 1.8 echo
369     eerror "A dry-run of patch command succeeded, but actually"
370     eerror "applying the patch failed!"
371     #die "Real world sux compared to the dreamworld!"
372     count=5
373     fi
374    
375 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
376 danarmak 1.32
377 azarah 1.2 break
378     fi
379    
380     count=$((count + 1))
381     done
382    
383 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
384     then
385     rm -f ${PATCH_TARGET}
386     fi
387    
388 azarah 1.2 if [ "${count}" -eq 5 ]
389     then
390 azarah 1.8 echo
391 vapier 1.158 eerror "Failed Patch: ${patchname} !"
392     eerror " ( ${PATCH_TARGET} )"
393 azarah 1.2 eerror
394     eerror "Include in your bugreport the contents of:"
395     eerror
396 eradicator 1.150 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
397 azarah 1.8 echo
398 eradicator 1.150 die "Failed Patch: ${patchname}!"
399 azarah 1.2 fi
400 azarah 1.8
401 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${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 carlo 1.155 # http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec
916 vapier 1.39 # path: if your app needs to startup in a specific dir
917     make_desktop_entry() {
918 vapier 1.158 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
919 vapier 1.39
920 vapier 1.158 local exec=${1}
921     local name=${2:-${PN}}
922     local icon=${3:-${PN}.png}
923     local type=${4}
924     local path=${5}
925    
926     if [[ -z ${type} ]] ; then
927     local catmaj=${CATEGORY%%-*}
928     local catmin=${CATEGORY##*-}
929     case ${catmaj} in
930     app)
931     case ${catmin} in
932     admin) type=System;;
933     cdr) type=DiscBurning;;
934     dicts) type=Dictionary;;
935     editors) type=TextEditor;;
936     emacs) type=TextEditor;;
937     emulation) type=Emulator;;
938     laptop) type=HardwareSettings;;
939     office) type=Office;;
940     vim) type=TextEditor;;
941     xemacs) type=TextEditor;;
942     *) type=;;
943     esac
944 azarah 1.59 ;;
945 vapier 1.158
946     dev)
947 vapier 1.159 type="Development"
948 vapier 1.158 ;;
949    
950     games)
951     [[ -z ${path} ]] && path=${GAMES_BINDIR}
952    
953     case ${catmin} in
954     action) type=ActionGame;;
955     arcade) type=ArcadeGame;;
956     board) type=BoardGame;;
957     kid) type=KidsGame;;
958     emulation) type=Emulator;;
959     puzzle) type=LogicGame;;
960     rpg) type=RolePlaying;;
961     roguelike) type=RolePlaying;;
962     simulation) type=Simulation;;
963     sports) type=SportsGame;;
964     strategy) type=StrategyGame;;
965     *) type=;;
966     esac
967 vapier 1.159 type="Game;${type}"
968 vapier 1.158 ;;
969    
970     mail)
971 vapier 1.159 type="Network;Email"
972 vapier 1.158 ;;
973    
974     media)
975     case ${catmin} in
976     gfx) type=Graphics;;
977     radio) type=Tuner;;
978     sound) type=Audio;;
979     tv) type=TV;;
980     video) type=Video;;
981     *) type=;;
982     esac
983 vapier 1.159 type="AudioVideo;${type}"
984 wolf31o2 1.65 ;;
985 vapier 1.158
986     net)
987     case ${catmin} in
988     dialup) type=Dialup;;
989     ftp) type=FileTransfer;;
990     im) type=InstantMessaging;;
991     irc) type=IRCClient;;
992     mail) type=Email;;
993     news) type=News;;
994     nntp) type=News;;
995     p2p) type=FileTransfer;;
996     *) type=;;
997     esac
998 vapier 1.159 type="Network;${type}"
999 vapier 1.158 ;;
1000    
1001     sci)
1002     case ${catmin} in
1003     astro*) type=Astronomoy;;
1004     bio*) type=Biology;;
1005     calc*) type=Calculator;;
1006     chem*) type=Chemistry;;
1007     geo*) type=Geology;;
1008     math*) type=Math;;
1009     *) type=;;
1010 vapier 1.159 esac
1011     type="Science;${type}"
1012 vapier 1.158 ;;
1013    
1014     www)
1015     case ${catmin} in
1016     client) type=WebBrowser;;
1017     *) type=;;
1018     esac
1019 vapier 1.159 type="Network"
1020 azarah 1.59 ;;
1021 vapier 1.158
1022 azarah 1.59 *)
1023     type=
1024     ;;
1025 vapier 1.39 esac
1026     fi
1027 vapier 1.158
1028     local desktop=${T}/${exec%% *}-${P}.desktop
1029 vapier 1.39
1030     echo "[Desktop Entry]
1031     Encoding=UTF-8
1032     Version=0.9.2
1033     Name=${name}
1034     Type=Application
1035     Comment=${DESCRIPTION}
1036     Exec=${exec}
1037     Path=${path}
1038     Icon=${icon}
1039 vapier 1.99 Categories=Application;${type};" > "${desktop}"
1040 vapier 1.39
1041 vapier 1.118 insinto /usr/share/applications
1042     doins "${desktop}"
1043 vapier 1.39
1044     return 0
1045 danarmak 1.32 }
1046    
1047 lanius 1.133 # Make a GDM/KDM Session file
1048     #
1049     # make_desktop_entry(<title>, <command>)
1050     # title: File to execute to start the Window Manager
1051     # command: Name of the Window Manager
1052    
1053     make_session_desktop() {
1054    
1055     [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1
1056     [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1
1057    
1058     local title="${1}"
1059     local command="${2}"
1060     local desktop="${T}/${wm}.desktop"
1061    
1062     echo "[Desktop Entry]
1063     Encoding=UTF-8
1064     Name=${title}
1065     Comment=This session logs you into ${title}
1066     Exec=${command}
1067     TryExec=${command}
1068     Type=Application" > "${desktop}"
1069    
1070     insinto /usr/share/xsessions
1071     doins "${desktop}"
1072    
1073     return 0
1074     }
1075    
1076     domenu() {
1077     local i
1078     local j
1079     insinto /usr/share/applications
1080     for i in ${@}
1081     do
1082     if [ -f "${i}" ];
1083     then
1084     doins ${i}
1085     elif [ -d "${i}" ];
1086     then
1087     for j in ${i}/*.desktop
1088     do
1089     doins ${j}
1090     done
1091     fi
1092     done
1093     }
1094    
1095     doicon() {
1096     local i
1097     local j
1098     insinto /usr/share/pixmaps
1099     for i in ${@}
1100     do
1101     if [ -f "${i}" ];
1102     then
1103     doins ${i}
1104     elif [ -d "${i}" ];
1105     then
1106     for j in ${i}/*.png
1107     do
1108     doins ${j}
1109     done
1110     fi
1111     done
1112     }
1113    
1114     ##############################################################
1115     # END: Handle .desktop files and menu entries #
1116     ##############################################################
1117    
1118    
1119 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1120     find_unpackable_file() {
1121 azarah 1.59 local src="$1"
1122     if [ -z "${src}" ]
1123     then
1124 vapier 1.50 src="${DISTDIR}/${A}"
1125     else
1126 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
1127     then
1128 vapier 1.50 src="${DISTDIR}/${src}"
1129 azarah 1.59 elif [ -e "${PWD}/${src}" ]
1130     then
1131 vapier 1.50 src="${PWD}/${src}"
1132 azarah 1.59 elif [ -e "${src}" ]
1133     then
1134 vapier 1.50 src="${src}"
1135     fi
1136     fi
1137 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
1138     echo "${src}"
1139     }
1140    
1141     # Unpack those pesky pdv generated files ...
1142     # They're self-unpacking programs with the binary package stuffed in
1143     # the middle of the archive. Valve seems to use it a lot ... too bad
1144     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1145     #
1146     # Usage: unpack_pdv [file to unpack] [size of off_t]
1147     # - you have to specify the off_t size ... i have no idea how to extract that
1148     # information out of the binary executable myself. basically you pass in
1149     # the size of the off_t type (in bytes) on the machine that built the pdv
1150     # archive. one way to determine this is by running the following commands:
1151     # strings <pdv archive> | grep lseek
1152     # strace -elseek <pdv archive>
1153     # basically look for the first lseek command (we do the strings/grep because
1154     # sometimes the function call is _llseek or something) and steal the 2nd
1155     # parameter. here is an example:
1156     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1157     # lseek
1158     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1159     # lseek(3, -4, SEEK_END) = 2981250
1160     # thus we would pass in the value of '4' as the second parameter.
1161     unpack_pdv() {
1162     local src="`find_unpackable_file $1`"
1163     local sizeoff_t="$2"
1164    
1165     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
1166    
1167     local shrtsrc="`basename ${src}`"
1168     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1169     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1170     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1171    
1172     # grab metadata for debug reasons
1173 vapier 1.117 local metafile="$(emktemp)"
1174 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1175    
1176     # rip out the final file name from the metadata
1177     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1178     datafile="`basename ${datafile}`"
1179    
1180 vapier 1.71 # now lets uncompress/untar the file if need be
1181 vapier 1.117 local tmpfile="$(emktemp)"
1182 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1183 vapier 1.71
1184     local iscompressed="`file -b ${tmpfile}`"
1185     if [ "${iscompressed:0:8}" == "compress" ] ; then
1186     iscompressed=1
1187     mv ${tmpfile}{,.Z}
1188     gunzip ${tmpfile}
1189     else
1190     iscompressed=0
1191     fi
1192     local istar="`file -b ${tmpfile}`"
1193     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1194     istar=1
1195     else
1196     istar=0
1197     fi
1198    
1199     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1200     #dd if=${src} ibs=${metaskip} count=1 \
1201     # | dd ibs=${tailskip} skip=1 \
1202     # | gzip -dc \
1203     # > ${datafile}
1204     if [ ${iscompressed} -eq 1 ] ; then
1205     if [ ${istar} -eq 1 ] ; then
1206     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1207     | head -c $((${metaskip}-${tailskip})) \
1208     | tar -xzf -
1209     else
1210 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1211     | head -c $((${metaskip}-${tailskip})) \
1212     | gzip -dc \
1213     > ${datafile}
1214 vapier 1.71 fi
1215     else
1216     if [ ${istar} -eq 1 ] ; then
1217     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1218     | head -c $((${metaskip}-${tailskip})) \
1219 vapier 1.73 | tar --no-same-owner -xf -
1220 vapier 1.71 else
1221 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1222     | head -c $((${metaskip}-${tailskip})) \
1223     > ${datafile}
1224 vapier 1.71 fi
1225     fi
1226     true
1227     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1228 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1229     }
1230    
1231     # Unpack those pesky makeself generated files ...
1232     # They're shell scripts with the binary package tagged onto
1233     # the end of the archive. Loki utilized the format as does
1234     # many other game companies.
1235     #
1236 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1237 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1238     # - If the offset is not specified then we will attempt to extract
1239     # the proper offset from the script itself.
1240     unpack_makeself() {
1241 vapier 1.112 local src="$(find_unpackable_file "$1")"
1242 vapier 1.70 local skip="$2"
1243 vapier 1.112 local exe="$3"
1244 vapier 1.50
1245 vapier 1.112 local shrtsrc="$(basename "${src}")"
1246 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1247 azarah 1.59 if [ -z "${skip}" ]
1248     then
1249 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
1250     local skip=0
1251 vapier 1.112 exe=tail
1252 vapier 1.41 case ${ver} in
1253     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1254 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1255 vapier 1.41 ;;
1256     2.0|2.0.1)
1257 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1258 vapier 1.41 ;;
1259 wolf31o2 1.48 2.1.1)
1260 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1261 wolf31o2 1.48 let skip="skip + 1"
1262     ;;
1263 vapier 1.49 2.1.2)
1264 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1265 vapier 1.49 let skip="skip + 1"
1266     ;;
1267 wolf31o2 1.48 2.1.3)
1268 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1269 vapier 1.41 let skip="skip + 1"
1270     ;;
1271 vapier 1.112 2.1.4)
1272     skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1273     skip=$(head -n ${skip} "${src}" | wc -c)
1274     exe="dd"
1275     ;;
1276 vapier 1.41 *)
1277     eerror "I'm sorry, but I was unable to support the Makeself file."
1278     eerror "The version I detected was '${ver}'."
1279     eerror "Please file a bug about the file ${shrtsrc} at"
1280     eerror "http://bugs.gentoo.org/ so that support can be added."
1281     die "makeself version '${ver}' not supported"
1282     ;;
1283     esac
1284     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1285     fi
1286 vapier 1.112 case ${exe} in
1287     tail) exe="tail -n +${skip} '${src}'";;
1288     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1289     *) die "makeself cant handle exe '${exe}'"
1290     esac
1291 vapier 1.41
1292 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1293 vapier 1.117 local tmpfile="$(emktemp)"
1294 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1295     local filetype="$(file -b "${tmpfile}")"
1296 vapier 1.68 case ${filetype} in
1297     *tar\ archive)
1298 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1299 vapier 1.68 ;;
1300     bzip2*)
1301 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1302 mr_bones_ 1.69 ;;
1303 vapier 1.68 gzip*)
1304 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1305 vapier 1.68 ;;
1306 vapier 1.93 compress*)
1307 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1308 vapier 1.93 ;;
1309 vapier 1.68 *)
1310 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1311 vapier 1.68 false
1312     ;;
1313     esac
1314     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1315 wolf31o2 1.56 }
1316    
1317     # Display a license for user to accept.
1318     #
1319     # Usage: check_license [license]
1320     # - If the file is not specified then ${LICENSE} is used.
1321     check_license() {
1322 vapier 1.60 local lic=$1
1323     if [ -z "${lic}" ] ; then
1324     lic="${PORTDIR}/licenses/${LICENSE}"
1325 wolf31o2 1.56 else
1326 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1327     lic="${PORTDIR}/licenses/${src}"
1328     elif [ -e "${PWD}/${src}" ] ; then
1329     lic="${PWD}/${src}"
1330     elif [ -e "${src}" ] ; then
1331     lic="${src}"
1332 wolf31o2 1.56 fi
1333     fi
1334 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1335 vapier 1.64 local l="`basename ${lic}`"
1336 wolf31o2 1.56
1337 vapier 1.60 # here is where we check for the licenses the user already
1338     # accepted ... if we don't find a match, we make the user accept
1339 wolf31o2 1.106 local shopts=$-
1340 vapier 1.60 local alic
1341 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1342 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1343 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1344     set +o noglob; set -${shopts} #reset old shell opts
1345     return 0
1346     fi
1347 vapier 1.60 done
1348 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1349 vapier 1.60
1350 vapier 1.117 local licmsg="$(emktemp)"
1351 vapier 1.60 cat << EOF > ${licmsg}
1352     **********************************************************
1353     The following license outlines the terms of use of this
1354     package. You MUST accept this license for installation to
1355     continue. When you are done viewing, hit 'q'. If you
1356     CTRL+C out of this, the install will not run!
1357     **********************************************************
1358    
1359     EOF
1360     cat ${lic} >> ${licmsg}
1361     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1362 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1363 vapier 1.60 read alic
1364     case ${alic} in
1365     yes|Yes|y|Y)
1366     return 0
1367     ;;
1368     *)
1369     echo;echo;echo
1370     eerror "You MUST accept the license to continue! Exiting!"
1371     die "Failed to accept license"
1372     ;;
1373     esac
1374 vapier 1.23 }
1375 vapier 1.75
1376     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1377     # the whole 'non-interactive' policy, but damnit I want CD support !
1378     #
1379     # with these cdrom functions we handle all the user interaction and
1380     # standardize everything. all you have to do is call cdrom_get_cds()
1381     # and when the function returns, you can assume that the cd has been
1382     # found at CDROM_ROOT.
1383     #
1384     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1385     # etc... if you want to give the cds better names, then just export
1386     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1387     #
1388     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1389     #
1390     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1391     # - this will attempt to locate a cd based upon a file that is on
1392     # the cd ... the more files you give this function, the more cds
1393     # the cdrom functions will handle
1394     cdrom_get_cds() {
1395     # first we figure out how many cds we're dealing with by
1396     # the # of files they gave us
1397     local cdcnt=0
1398     local f=
1399     for f in "$@" ; do
1400     cdcnt=$((cdcnt + 1))
1401     export CDROM_CHECK_${cdcnt}="$f"
1402     done
1403     export CDROM_TOTAL_CDS=${cdcnt}
1404     export CDROM_CURRENT_CD=1
1405    
1406     # now we see if the user gave use CD_ROOT ...
1407     # if they did, let's just believe them that it's correct
1408 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1409     export CDROM_ROOT=${CD_ROOT}
1410 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1411     return
1412     fi
1413     # do the same for CD_ROOT_X
1414 vapier 1.131 if [[ ! -z ${CD_ROOT_1} ]] ; then
1415 vapier 1.75 local var=
1416     cdcnt=0
1417 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1418 vapier 1.75 cdcnt=$((cdcnt + 1))
1419     var="CD_ROOT_${cdcnt}"
1420 vapier 1.131 if [[ -z ${!var} ]] ; then
1421 vapier 1.75 eerror "You must either use just the CD_ROOT"
1422     eerror "or specify ALL the CD_ROOT_X variables."
1423     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1424     die "could not locate CD_ROOT_${cdcnt}"
1425     fi
1426     export CDROM_ROOTS_${cdcnt}="${!var}"
1427     done
1428     export CDROM_ROOT=${CDROM_ROOTS_1}
1429     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1430     return
1431     fi
1432    
1433 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1434 vapier 1.75 einfon "This ebuild will need the "
1435 vapier 1.131 if [[ -z ${CDROM_NAME} ]] ; then
1436 vapier 1.75 echo "cdrom for ${PN}."
1437     else
1438     echo "${CDROM_NAME}."
1439     fi
1440     echo
1441     einfo "If you do not have the CD, but have the data files"
1442     einfo "mounted somewhere on your filesystem, just export"
1443     einfo "the variable CD_ROOT so that it points to the"
1444     einfo "directory containing the files."
1445     echo
1446 vapier 1.132 einfo "For example:"
1447     einfo "export CD_ROOT=/mnt/cdrom"
1448     echo
1449 vapier 1.75 else
1450     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1451     cdcnt=0
1452 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1453 vapier 1.75 cdcnt=$((cdcnt + 1))
1454     var="CDROM_NAME_${cdcnt}"
1455 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1456 vapier 1.75 done
1457     echo
1458     einfo "If you do not have the CDs, but have the data files"
1459     einfo "mounted somewhere on your filesystem, just export"
1460     einfo "the following variables so they point to the right place:"
1461     einfon ""
1462     cdcnt=0
1463 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1464 vapier 1.75 cdcnt=$((cdcnt + 1))
1465     echo -n " CD_ROOT_${cdcnt}"
1466     done
1467     echo
1468     einfo "Or, if you have all the files in the same place, or"
1469     einfo "you only have one cdrom, you can export CD_ROOT"
1470     einfo "and that place will be used as the same data source"
1471     einfo "for all the CDs."
1472     echo
1473 vapier 1.132 einfo "For example:"
1474     einfo "export CD_ROOT_1=/mnt/cdrom"
1475     echo
1476 vapier 1.75 fi
1477     export CDROM_CURRENT_CD=0
1478     cdrom_load_next_cd
1479     }
1480    
1481     # this is only used when you need access to more than one cd.
1482     # when you have finished using the first cd, just call this function.
1483     # when it returns, CDROM_ROOT will be pointing to the second cd.
1484     # remember, you can only go forward in the cd chain, you can't go back.
1485     cdrom_load_next_cd() {
1486     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1487     local var=
1488    
1489 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1490 vapier 1.79 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1491     return
1492     fi
1493    
1494 vapier 1.75 unset CDROM_ROOT
1495     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1496 vapier 1.131 if [[ -z ${!var} ]] ; then
1497 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1498     cdrom_locate_file_on_cd ${!var}
1499     else
1500 vapier 1.131 export CDROM_ROOT=${!var}
1501 vapier 1.75 fi
1502    
1503     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1504     }
1505    
1506     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1507     # functions. this should *never* be called from an ebuild.
1508     # all it does is try to locate a give file on a cd ... if the cd isn't
1509     # found, then a message asking for the user to insert the cdrom will be
1510     # displayed and we'll hang out here until:
1511     # (1) the file is found on a mounted cdrom
1512     # (2) the user hits CTRL+C
1513     cdrom_locate_file_on_cd() {
1514 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1515 vapier 1.75 local dir="$(dirname ${@})"
1516     local file="$(basename ${@})"
1517     local mline=""
1518     local showedmsg=0
1519    
1520 vapier 1.131 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1521     [[ -d ${mline}/${dir} ]] || continue
1522     [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \
1523 vapier 1.75 && export CDROM_ROOT=${mline}
1524     done
1525    
1526 vapier 1.131 if [[ -z ${CDROM_ROOT} ]] ; then
1527 vapier 1.75 echo
1528 vapier 1.131 if [[ ${showedmsg} -eq 0 ]] ; then
1529     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1530     if [[ -z ${CDROM_NAME} ]] ; then
1531 vapier 1.75 einfo "Please insert the cdrom for ${PN} now !"
1532     else
1533     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1534     fi
1535     else
1536 vapier 1.131 if [[ -z ${CDROM_NAME_1} ]] ; then
1537 vapier 1.75 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1538     else
1539     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1540     einfo "Please insert+mount the ${!var} cdrom now !"
1541     fi
1542     fi
1543     showedmsg=1
1544     fi
1545     einfo "Press return to scan for the cd again"
1546     einfo "or hit CTRL+C to abort the emerge."
1547     read
1548     fi
1549     done
1550     }
1551 vapier 1.92
1552 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1553 vapier 1.92 # a package can support
1554     #
1555     # usage: strip-linguas <allow LINGUAS>
1556     # strip-linguas -i <directories of .po files>
1557     # strip-linguas -u <directories of .po files>
1558     #
1559     # The first form allows you to specify a list of LINGUAS.
1560 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1561 vapier 1.92 # directories and uses the intersection of the lists.
1562 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1563 vapier 1.92 # directories and uses the union of the lists.
1564     strip-linguas() {
1565     local ls newls
1566 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1567     local op=$1; shift
1568 vapier 1.92 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1569     local d f
1570     for d in "$@" ; do
1571 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1572     newls=${ls}
1573 vapier 1.92 else
1574     newls=""
1575     fi
1576     for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1577 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1578     [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1579 vapier 1.92 else
1580 vapier 1.154 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1581 vapier 1.92 fi
1582     done
1583 vapier 1.154 ls=${newls}
1584 vapier 1.92 done
1585 vapier 1.154 ls=${ls//.po}
1586 vapier 1.92 else
1587 vapier 1.154 ls=$@
1588 vapier 1.92 fi
1589    
1590     ls=" ${ls} "
1591     newls=""
1592     for f in ${LINGUAS} ; do
1593 vapier 1.154 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1594 vapier 1.120 newls="${newls} ${f}"
1595 vapier 1.92 else
1596     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1597     fi
1598     done
1599 vapier 1.154 if [[ -z ${newls} ]] ; then
1600 vapier 1.92 unset LINGUAS
1601     else
1602 vapier 1.154 export LINGUAS=${newls:1}
1603 vapier 1.92 fi
1604     }
1605 iggy 1.110
1606     # moved from kernel.eclass since they are generally useful outside of
1607     # kernel.eclass -iggy (20041002)
1608    
1609     # the following functions are useful in kernel module ebuilds, etc.
1610     # for an example see ivtv or drbd ebuilds
1611    
1612     # set's ARCH to match what the kernel expects
1613     set_arch_to_kernel() {
1614 vapier 1.140 i=10
1615     while ((i--)) ; do
1616     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1617     done
1618 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1619     case ${ARCH} in
1620     x86) export ARCH="i386";;
1621     amd64) export ARCH="x86_64";;
1622     hppa) export ARCH="parisc";;
1623     mips) export ARCH="mips";;
1624 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!
1625 iggy 1.110 *) export ARCH="${ARCH}";;
1626     esac
1627     }
1628    
1629     # set's ARCH back to what portage expects
1630     set_arch_to_portage() {
1631 vapier 1.140 i=10
1632     while ((i--)) ; do
1633     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1634     done
1635 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1636     }
1637 eradicator 1.111
1638     # Jeremy Huddleston <eradicator@gentoo.org>:
1639     # preserve_old_lib /path/to/libblah.so.0
1640     # preserve_old_lib_notify /path/to/libblah.so.0
1641     #
1642     # These functions are useful when a lib in your package changes --soname. Such
1643     # an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1644     # would break packages that link against it. Most people get around this
1645     # by using the portage SLOT mechanism, but that is not always a relevant
1646     # solution, so instead you can add the following to your ebuilds:
1647     #
1648     # src_install() {
1649     # ...
1650     # preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1651     # ...
1652     # }
1653     #
1654     # pkg_postinst() {
1655     # ...
1656     # preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1657     # ...
1658     # }
1659    
1660     preserve_old_lib() {
1661     LIB=$1
1662    
1663     if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1664     SONAME=`basename ${LIB}`
1665     DIRNAME=`dirname ${LIB}`
1666    
1667     dodir ${DIRNAME}
1668     cp ${ROOT}${LIB} ${D}${DIRNAME}
1669     touch ${D}${LIB}
1670     fi
1671     }
1672    
1673     preserve_old_lib_notify() {
1674 seemant 1.134 LIB=$1
1675 eradicator 1.111
1676 seemant 1.134 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1677     SONAME=`basename ${LIB}`
1678 eradicator 1.111
1679     einfo "An old version of an installed library was detected on your system."
1680     einfo "In order to avoid breaking packages that link against is, this older version"
1681     einfo "is not being removed. In order to make full use of this newer version,"
1682     einfo "you will need to execute the following command:"
1683     einfo " revdep-rebuild --soname ${SONAME}"
1684     einfo
1685     einfo "After doing that, you can safely remove ${LIB}"
1686 eradicator 1.116 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild"
1687 seemant 1.134 fi
1688 eradicator 1.111 }
1689 vapier 1.125
1690 ka0ttic 1.143 # Hack for people to figure out if a package was built with
1691 vapier 1.125 # certain USE flags
1692     #
1693 vapier 1.130 # Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1694 vapier 1.125 # ex: built_with_use xchat gtk2
1695 vapier 1.130 #
1696     # Flags: -a all USE flags should be utilized
1697     # -o at least one USE flag should be utilized
1698     # Note: the default flag is '-a'
1699 vapier 1.125 built_with_use() {
1700 vapier 1.130 local opt=$1
1701     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1702    
1703     local PKG=$(best_version $1)
1704     shift
1705    
1706 vapier 1.125 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE"
1707     [[ ! -e ${USEFILE} ]] && return 1
1708    
1709     local USE_BUILT=$(<${USEFILE})
1710 vapier 1.130 while [[ $# -gt 0 ]] ; do
1711     if [[ ${opt} = "-o" ]] ; then
1712     has $1 ${USE_BUILT} && return 0
1713     else
1714     has $1 ${USE_BUILT} || return 1
1715     fi
1716 vapier 1.125 shift
1717     done
1718 vapier 1.130 [[ ${opt} = "-a" ]]
1719 vapier 1.125 }
1720 vapier 1.126
1721 ka0ttic 1.143 # Many configure scripts wrongly bail when a C++ compiler
1722 vapier 1.126 # could not be detected. #73450
1723     epunt_cxx() {
1724 vapier 1.127 local dir=$1
1725     [[ -z ${dir} ]] && dir=${S}
1726     ebegin "Removing useless C++ checks"
1727     local f
1728     for f in $(find ${dir} -name configure) ; do
1729     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1730     done
1731     eend 0
1732 vapier 1.126 }
1733 ka0ttic 1.143
1734 vapier 1.151 # dopamd <file> [more files]
1735 ka0ttic 1.143 #
1736     # Install pam auth config file in /etc/pam.d
1737 vapier 1.151 dopamd() {
1738     [[ -z $1 ]] && die "dopamd requires at least one argument"
1739    
1740     use pam || return 0
1741    
1742     insinto /etc/pam.d
1743     # these are the default doins options, but be explicit just in case
1744     insopts -m 0644 -o root -g root
1745     doins "$@" || die "failed to install $@"
1746     }
1747     # newpamd <old name> <new name>
1748 ka0ttic 1.143 #
1749 vapier 1.151 # Install pam file <old name> as <new name> in /etc/pam.d
1750     newpamd() {
1751     [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1752 ka0ttic 1.143
1753     use pam || return 0
1754    
1755     insinto /etc/pam.d
1756     # these are the default doins options, but be explicit just in case
1757     insopts -m 0644 -o root -g root
1758 vapier 1.151 newins "$1" "$2" || die "failed to install $1 as $2"
1759 ka0ttic 1.143 }

  ViewVC Help
Powered by ViewVC 1.1.20