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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.149 - (hide annotations) (download)
Fri Feb 4 21:24:53 2005 UTC (10 years ago) by chriswhite
Branch: MAIN
Changes since 1.148: +7 -9 lines
Yah, I tested it this time as the CROSSCOMPILE variable detection was still b0rk3d, and I did some of the recommendations that were left in the eclass.  If this breaks.. I'll eat my shoe (and I will >:|).

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

  ViewVC Help
Powered by ViewVC 1.1.20