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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.142 - (hide annotations) (download)
Sun Jan 23 20:47:42 2005 UTC (9 years, 10 months ago) by eradicator
Branch: MAIN
Changes since 1.141: +2 -1 lines
Correct ARCH setting on sparc64.

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

  ViewVC Help
Powered by ViewVC 1.1.20