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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.139 - (hide annotations) (download)
Mon Jan 10 02:40:00 2005 UTC (9 years, 6 months ago) by vapier
Branch: MAIN
Changes since 1.138: +2 -1 lines
add additional error line to epatch to make copy & paste faster

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

  ViewVC Help
Powered by ViewVC 1.1.20