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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.95 - (hide annotations) (download)
Sun Aug 15 03:25:19 2004 UTC (9 years, 11 months ago) by lv
Branch: MAIN
Changes since 1.94: +10 -5 lines
added CONF_LIBDIR support to gen_usr_ldscript()

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

  ViewVC Help
Powered by ViewVC 1.1.20