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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.138 - (hide annotations) (download)
Fri Jan 7 12:04:40 2005 UTC (9 years, 11 months ago) by eradicator
Branch: MAIN
Changes since 1.137: +85 -61 lines
Added get_all_libdirs.  Changed die to eerror/exit since die doesn't have the expected result when called from a subshell.

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

  ViewVC Help
Powered by ViewVC 1.1.20