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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.96 - (hide annotations) (download)
Tue Aug 24 11:51:28 2004 UTC (10 years, 1 month ago) by lv
Branch: MAIN
Changes since 1.95: +21 -11 lines
added get_libdir for retrieving the current set library directory. made  gen_usr_ldscript use $(get_libdir). get_libdir always returns lib when using portage <2.0.51_pre20 and returns a default of lib when CONF_LIBDIR isnt set, so it should be safe to use --everywhere--.

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

  ViewVC Help
Powered by ViewVC 1.1.20