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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.129 - (hide annotations) (download)
Thu Dec 23 20:38:25 2004 UTC (9 years, 10 months ago) by eradicator
Branch: MAIN
Changes since 1.128: +2 -2 lines
brainfart fix in my get_abi_var

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

  ViewVC Help
Powered by ViewVC 1.1.20