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

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.12 Revision 1.95
1# Copyright 1999-2002 Gentoo Technologies, Inc. 1# Copyright 1999-2004 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.95 2004/08/15 03:25:19 lv Exp $
4#
3# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
4# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.12 2002/12/14 21:46:25 azarah Exp $ 6#
5# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
6# have to implement themselves. 8# have to implement themselves.
7# 9#
8# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
9 11
10ECLASS=eutils 12ECLASS=eutils
11INHERITED="$INHERITED $ECLASS" 13INHERITED="$INHERITED $ECLASS"
12 14
13newdepend "!bootstrap? ( sys-devel/patch )" 15DEPEND="!bootstrap? ( sys-devel/patch )"
14 16
15DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
16 18
17# This function generate linker scripts in /usr/lib for dynamic 19# This function generate linker scripts in /usr/lib for dynamic
18# libs in /lib. This is to fix linking problems when you have 20# libs in /lib. This is to fix linking problems when you have
31# to point to the latest version of the library present. 33# to point to the latest version of the library present.
32# 34#
33# <azarah@gentoo.org> (26 Oct 2002) 35# <azarah@gentoo.org> (26 Oct 2002)
34# 36#
35gen_usr_ldscript() { 37gen_usr_ldscript() {
38 # 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"
36 43
37 # Just make sure it exists 44 # Just make sure it exists
38 dodir /usr/lib 45 dodir /usr/${CONF_LIBDIR}
39 46
40 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 47 cat > ${D}/usr/${CONF_LIBDIR}/$1 <<"END_LDSCRIPT"
41/* GNU ld script 48/* GNU ld script
42 Because Gentoo have critical dynamic libraries 49 Because Gentoo have critical dynamic libraries
43 in /lib, and the static versions in /usr/lib, we 50 in /lib, and the static versions in /usr/lib, we
44 need to have a "fake" dynamic lib in /usr/lib, 51 need to have a "fake" dynamic lib in /usr/lib,
45 otherwise we run into linking problems. 52 otherwise we run into linking problems.
46 See bug #4411 on http://bugs.gentoo.org/ for 53 See bug #4411 on http://bugs.gentoo.org/ for
47 more info. */ 54 more info. */
48GROUP ( /lib/libxxx )
49END_LDSCRIPT 55END_LDSCRIPT
50 56
57 echo "GROUP ( /${CONF_LIBDIR}/libxxx )" >> ${D}/usr/${CONF_LIBDIR}/$1
51 dosed "s:libxxx:$1:" /usr/lib/$1 58 dosed "s:libxxx:$1:" /usr/${CONF_LIBDIR}/$1
52 59
53 return 0 60 return 0
54} 61}
55 62
56# Simple function to draw a line consisting of '=' the same length as $* 63# Simple function to draw a line consisting of '=' the same length as $*
68 return 0 75 return 0
69 fi 76 fi
70 77
71 # Get the length of $* 78 # Get the length of $*
72 str_length="$(echo -n "$*" | wc -m)" 79 str_length="$(echo -n "$*" | wc -m)"
73 80
74 while [ "$i" -lt "${str_length}" ] 81 while [ "$i" -lt "${str_length}" ]
75 do 82 do
76 echo -n "=" 83 echo -n "="
77 84
78 i=$((i + 1)) 85 i=$((i + 1))
79 done 86 done
80 87
81 echo 88 echo
82 89
86# Default directory where patches are located 93# Default directory where patches are located
87EPATCH_SOURCE="${WORKDIR}/patch" 94EPATCH_SOURCE="${WORKDIR}/patch"
88# Default extension for patches 95# Default extension for patches
89EPATCH_SUFFIX="patch.bz2" 96EPATCH_SUFFIX="patch.bz2"
90# Default options for patch 97# Default options for patch
98# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
91EPATCH_OPTS="" 99EPATCH_OPTS="-g0"
92# List of patches not to apply. Not this is only file names, 100# List of patches not to apply. Not this is only file names,
93# and not the full path .. 101# and not the full path ..
94EPATCH_EXCLUDE="" 102EPATCH_EXCLUDE=""
95# Change the printed message for a single patch. 103# Change the printed message for a single patch.
96EPATCH_SINGLE_MSG="" 104EPATCH_SINGLE_MSG=""
105# Force applying bulk patches even if not following the style:
106#
107# ??_${ARCH}_foo.${EPATCH_SUFFIX}
108#
109EPATCH_FORCE="no"
97 110
98# This function is for bulk patching, or in theory for just one 111# This function is for bulk patching, or in theory for just one
99# or two patches. 112# or two patches.
100# 113#
101# It should work with .bz2, .gz, .zip and plain text patches. 114# It should work with .bz2, .gz, .zip and plain text patches.
136 local SINGLE_PATCH="no" 149 local SINGLE_PATCH="no"
137 local x="" 150 local x=""
138 151
139 if [ "$#" -gt 1 ] 152 if [ "$#" -gt 1 ]
140 then 153 then
141 eerror "Invalid arguments to epatch()" 154 local m=""
142 die "Invalid arguments to epatch()" 155 einfo "${#} patches to apply..."
156 for m in "$@" ; do
157 epatch "${m}"
158 done
159 return 0
143 fi 160 fi
144 161
145 if [ -n "$1" -a -f "$1" ] 162 if [ -n "$1" -a -f "$1" ]
146 then 163 then
147 SINGLE_PATCH="yes" 164 SINGLE_PATCH="yes"
148 165
149 local EPATCH_SOURCE="$1" 166 local EPATCH_SOURCE="$1"
150 local EPATCH_SUFFIX="${1##*\.}" 167 local EPATCH_SUFFIX="${1##*\.}"
151 168
152 elif [ -n "$1" -a -d "$1" ] 169 elif [ -n "$1" -a -d "$1" ]
153 then 170 then
171 # 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
154 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 176 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
177 fi
155 else 178 else
156 if [ ! -d ${EPATCH_SOURCE} ] 179 if [ ! -d ${EPATCH_SOURCE} ]
157 then 180 then
181 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
182 then
183 EPATCH_SOURCE="$1"
184 fi
185
158 echo 186 echo
159 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 187 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
160 eerror 188 eerror
161 eerror " ${EPATCH_SOURCE}" 189 eerror " ${EPATCH_SOURCE}"
162 echo 190 echo
163 die "Cannot find \$EPATCH_SOURCE!" 191 die "Cannot find \$EPATCH_SOURCE!"
164 fi 192 fi
165 193
166 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 194 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
167 fi 195 fi
168 196
169 case ${EPATCH_SUFFIX##*\.} in 197 case ${EPATCH_SUFFIX##*\.} in
170 bz2) 198 bz2)
194 # New ARCH dependant patch naming scheme... 222 # New ARCH dependant patch naming scheme...
195 # 223 #
196 # ???_arch_foo.patch 224 # ???_arch_foo.patch
197 # 225 #
198 if [ -f ${x} ] && \ 226 if [ -f ${x} ] && \
199 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 227 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
228 [ "${EPATCH_FORCE}" = "yes" ])
200 then 229 then
201 local count=0 230 local count=0
202 local popts="${EPATCH_OPTS}" 231 local popts="${EPATCH_OPTS}"
203 232
204 if [ -n "${EPATCH_EXCLUDE}" ] 233 if [ -n "${EPATCH_EXCLUDE}" ]
206 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 235 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
207 then 236 then
208 continue 237 continue
209 fi 238 fi
210 fi 239 fi
211 240
212 if [ "${SINGLE_PATCH}" = "yes" ] 241 if [ "${SINGLE_PATCH}" = "yes" ]
213 then 242 then
214 if [ -n "${EPATCH_SINGLE_MSG}" ] 243 if [ -n "${EPATCH_SINGLE_MSG}" ]
215 then 244 then
216 einfo "${EPATCH_SINGLE_MSG}" 245 einfo "${EPATCH_SINGLE_MSG}"
236 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
237 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
238 else 267 else
239 PATCH_TARGET="${x}" 268 PATCH_TARGET="${x}"
240 fi 269 fi
241 270
242 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 271 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
243 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 272 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 273
245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 274 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 275 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
247 276
248 if [ "${PATCH_SUFFIX}" != "patch" ] 277 if [ "${PATCH_SUFFIX}" != "patch" ]
249 then 278 then
254 #die "Could not extract patch!" 283 #die "Could not extract patch!"
255 count=5 284 count=5
256 break 285 break
257 fi 286 fi
258 fi 287 fi
259 288
260 if patch ${popts} --dry-run -f -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 289 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
261 then 290 then
262 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 291 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
263 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 292 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
264 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 293 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 294 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 295 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
267 296
268 patch ${popts} -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 297 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
269 298
270 if [ "$?" -ne 0 ] 299 if [ "$?" -ne 0 ]
271 then 300 then
272 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 301 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
273 echo 302 echo
276 #die "Real world sux compared to the dreamworld!" 305 #die "Real world sux compared to the dreamworld!"
277 count=5 306 count=5
278 fi 307 fi
279 308
280 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 309 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
281 310
282 break 311 break
283 fi 312 fi
284 313
285 count=$((count + 1)) 314 count=$((count + 1))
286 done 315 done
311 then 340 then
312 einfo "Done with patching" 341 einfo "Done with patching"
313 fi 342 fi
314} 343}
315 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
351have_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}
391
316# This function check how many cpu's are present, and then set 392# This function check how many cpu's are present, and then set
317# -j in MAKEOPTS accordingly. 393# -j in MAKEOPTS accordingly.
318# 394#
319# Thanks to nall <nall@gentoo.org> for this. 395# Thanks to nall <nall@gentoo.org> for this.
320# 396#
321get_number_of_jobs() { 397get_number_of_jobs() {
398 local jobs=0
399
322 if [ ! -r /proc/cpuinfo ] 400 if [ ! -r /proc/cpuinfo ]
323 then 401 then
324 return 1 402 return 1
325 fi 403 fi
326 404
405 # 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 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
410 ADMINPARAM="${ADMINPARAM/-j}"
411 fi
412
327 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j[0-9]*::g'`" 413 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
414
415 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
416 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
417 then
418 # these archs will always have "[Pp]rocessor"
419 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
420
421 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
422 then
423 # sparc always has "ncpus active"
424 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
425
426 elif [ "${ARCH}" = "alpha" ]
427 then
428 # alpha has "cpus active", but only when compiled with SMP
429 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
430 then
431 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
432 else
433 jobs=2
434 fi
435
436 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
437 then
438 # ppc has "processor", but only when compiled with SMP
439 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
440 then
441 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
442 else
443 jobs=2
444 fi
445 elif [ "${ARCH}" = "s390" ]
446 then
447 # s390 has "# processors : "
448 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
449 else
450 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
451 die "Unknown ARCH -- ${ARCH}!"
452 fi
453
454 # Make sure the number is valid ...
455 if [ "${jobs}" -lt 1 ]
456 then
457 jobs=1
458 fi
459
460 if [ -n "${ADMINPARAM}" ]
461 then
462 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 fi
471}
472
473# Cheap replacement for when debianutils (and thus mktemp)
474# does not exist on the users system
475# vapier@gentoo.org
476#
477# Takes just 1 parameter (the directory to create tmpfile in)
478mymktemp() {
479 local topdir="$1"
328 480
329 if [ "${ARCH}" = "x86" ] 481 [ -z "${topdir}" ] && topdir=/tmp
482 if [ "`which mktemp 2>/dev/null`" ]
483 then
484 mktemp -p ${topdir}
485 else
486 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
487 touch ${tmp}
488 echo ${tmp}
489 fi
490}
491
492# 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)
497egetent() {
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# 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# note: pass -1 to get default behavior
521# shell: /bin/false
522# homedir: /dev/null
523# groups: none
524# extra: comment of 'added by portage for ${PN}'
525enewuser() {
526 # get the username
527 local euser="$1"; shift
528 if [ -z "${euser}" ]
529 then
530 eerror "No username specified !"
531 die "Cannot call enewuser without a username"
532 fi
533
534 # lets see if the username already exists
535 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ]
536 then
537 return 0
538 fi
539 einfo "Adding user '${euser}' to your system ..."
540
541 # options to pass to useradd
542 local opts=
543
544 # handle uid
545 local euid="$1"; shift
546 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
547 then
548 if [ "${euid}" -gt 0 ]
330 then 549 then
331 # x86 always has "processor" 550 if [ ! -z "`egetent passwd ${euid}`" ]
332 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))"
333
334 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
335 then
336 # sparc always has "ncpus active"
337 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
338
339 elif [ "${ARCH}" = "alpha" ]
340 then
341 # alpha has "cpus active", but only when compiled with SMP
342 if [ "`grep -c "^cpus active" /proc/cpuinfo`" = "1" ]
343 then 551 then
344 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 552 euid="next"
553 fi
345 else 554 else
346 export MAKEOPTS="${MAKEOPTS} -j2" 555 eerror "Userid given but is not greater than 0 !"
556 die "${euid} is not a valid UID"
557 fi
558 else
559 euid="next"
560 fi
561 if [ "${euid}" == "next" ]
562 then
563 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 done
572 fi
573 opts="${opts} -u ${euid}"
574 einfo " - Userid: ${euid}"
575
576 # handle shell
577 local eshell="$1"; shift
578 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
579 then
580 if [ ! -e "${eshell}" ]
581 then
582 eerror "A shell was specified but it does not exist !"
583 die "${eshell} does not exist"
584 fi
585 else
586 eshell="/bin/false"
587 fi
588 einfo " - Shell: ${eshell}"
589 opts="${opts} -s ${eshell}"
590
591 # handle homedir
592 local ehome="$1"; shift
593 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
594 then
595 ehome="/dev/null"
596 fi
597 einfo " - Home: ${ehome}"
598 opts="${opts} -d ${ehome}"
599
600 # handle groups
601 local egroups="$1"; shift
602 if [ ! -z "${egroups}" ]
603 then
604 local oldifs="${IFS}"
605 export IFS=","
606 for g in ${egroups}
607 do
608 if [ -z "`egetent group \"${g}\"`" ]
609 then
610 eerror "You must add group ${g} to the system first"
611 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 local oldsandbox="${SANDBOX_ON}"
624 export SANDBOX_ON="0"
625 if [ "${ARCH}" == "macos" ];
626 then
627 ### 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 else
646 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 fi
657 export SANDBOX_ON="${oldsandbox}"
658
659 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
660 then
661 einfo " - Creating ${ehome} in ${D}"
662 dodir ${ehome}
663 fowners ${euser} ${ehome}
664 fperms 755 ${ehome}
665 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
677enewgroup() {
678 # get the group
679 local egroup="$1"; shift
680 if [ -z "${egroup}" ]
681 then
682 eerror "No group specified !"
683 die "Cannot call enewgroup without a group"
684 fi
685
686 # see if group already exists
687 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
688 then
689 return 0
690 fi
691 einfo "Adding group '${egroup}' to your system ..."
692
693 # options to pass to useradd
694 local opts=
695
696 # handle gid
697 local egid="$1"; shift
698 if [ ! -z "${egid}" ]
699 then
700 if [ "${egid}" -gt 0 ]
701 then
702 if [ -z "`egetent group ${egid}`" ]
703 then
704 if [ "${ARCH}" == "macos" ] ; then
705 opts="${opts} ${egid}"
706 else
707 opts="${opts} -g ${egid}"
708 fi
709 else
710 egid="next available; requested gid taken"
711 fi
712 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 local oldsandbox="${SANDBOX_ON}"
727 export SANDBOX_ON="0"
728 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"
347 fi 736 fi
348 737
349 elif [ "${ARCH}" = "ppc" ] 738 # If we need the next available
350 then 739 case ${egid} in
351 # ppc has "processor", but only when compiled with SMP 740 *[!0-9]*) # Non numeric
352 if [ "`grep -c "^processor" /proc/cpuinfo`" = "1" ] 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 export SANDBOX_ON="${oldsandbox}"
751}
752
753# Simple script to replace 'dos2unix' binaries
754# vapier@gentoo.org
755#
756# edos2unix(file, <more files>...)
757edos2unix() {
758 for f in "$@"
759 do
760 cp "${f}" ${T}/edos2unix
761 sed 's/\r$//' ${T}/edos2unix > "${f}"
762 done
763}
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# http://www.freedesktop.org/standards/menu-spec/
781# path: if your app needs to startup in a specific dir
782make_desktop_entry() {
783 [ -z "$1" ] && eerror "You must specify the executable" && return 1
784
785 local exec="${1}"
786 local name="${2:-${PN}}"
787 local icon="${3:-${PN}.png}"
788 local type="${4}"
789 local subdir="${6}"
790 local path="${5:-${GAMES_PREFIX}}"
791 if [ -z "${type}" ]
353 then 792 then
354 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))" 793 case ${CATEGORY} in
794 "app-emulation")
795 type=Emulator
796 subdir="Emulation"
797 ;;
798 "games-"*)
799 type=Game
800 subdir="Games"
801 ;;
802 "net-"*)
803 type=Network
804 subdir="${type}"
805 ;;
806 *)
807 type=
808 subdir=
809 ;;
810 esac
811 fi
812 local desktop="${T}/${exec}.desktop"
813
814echo "[Desktop Entry]
815Encoding=UTF-8
816Version=0.9.2
817Name=${name}
818Type=Application
819Comment=${DESCRIPTION}
820Exec=${exec}
821Path=${path}
822Icon=${icon}
823Categories=Application;${type};" > ${desktop}
824
825 if [ -d "/usr/share/applications" ]
826 then
827 insinto /usr/share/applications
828 doins ${desktop}
829 fi
830
831 #if [ -d "/usr/share/gnome/apps" ]
832 #then
833 # insinto /usr/share/gnome/apps/Games
834 # doins ${desktop}
835 #fi
836
837 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
838 #then
839 # for ver in /usr/kde/*
840 # do
841 # insinto ${ver}/share/applnk/Games
842 # doins ${desktop}
843 # done
844 #fi
845
846 if [ -d "/usr/share/applnk" ]
847 then
848 insinto /usr/share/applnk/${subdir}
849 doins ${desktop}
850 fi
851
852 return 0
853}
854
855# for internal use only (unpack_pdv and unpack_makeself)
856find_unpackable_file() {
857 local src="$1"
858 if [ -z "${src}" ]
859 then
860 src="${DISTDIR}/${A}"
861 else
862 if [ -e "${DISTDIR}/${src}" ]
863 then
864 src="${DISTDIR}/${src}"
865 elif [ -e "${PWD}/${src}" ]
866 then
867 src="${PWD}/${src}"
868 elif [ -e "${src}" ]
869 then
870 src="${src}"
871 fi
872 fi
873 [ ! -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.
897unpack_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 # now lets uncompress/untar the file if need be
917 local tmpfile="`mymktemp ${T}`"
918 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
919
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 -
355 else 945 else
356 export MAKEOPTS="${MAKEOPTS} -j2" 946 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
947 | head -c $((${metaskip}-${tailskip})) \
948 | gzip -dc \
949 > ${datafile}
357 fi 950 fi
951 else
952 if [ ${istar} -eq 1 ] ; then
953 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
954 | head -c $((${metaskip}-${tailskip})) \
955 | tar --no-same-owner -xf -
358 else 956 else
359 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^cpu /proc/cpuinfo` * 2))" 957 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
360 die "Unknown ARCH -- ${ARCH}!" 958 | head -c $((${metaskip}-${tailskip})) \
959 > ${datafile}
361 fi 960 fi
961 fi
962 true
963 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
964 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
362} 965}
363 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.
976unpack_makeself() {
977 local src="`find_unpackable_file $1`"
978 local skip="$2"
979
980 local shrtsrc="`basename ${src}`"
981 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
982 if [ -z "${skip}" ]
983 then
984 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 2.1.1)
994 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
995 let skip="skip + 1"
996 ;;
997 2.1.2)
998 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
999 let skip="skip + 1"
1000 ;;
1001 2.1.3)
1002 skip=`grep -a ^offset= ${src} | awk '{print $3}'`
1003 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 # 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 tail -n +${skip} ${src} | tar --no-same-owner -xf -
1023 ;;
1024 bzip2*)
1025 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
1026 ;;
1027 gzip*)
1028 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
1029 ;;
1030 compress*)
1031 tail -n +${skip} ${src} | gunzip | tar --no-same-owner -xf -
1032 ;;
1033 *)
1034 eerror "Unknown filetype \"${filetype}\" ?"
1035 false
1036 ;;
1037 esac
1038 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1039}
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.
1045check_license() {
1046 local lic=$1
1047 if [ -z "${lic}" ] ; then
1048 lic="${PORTDIR}/licenses/${LICENSE}"
1049 else
1050 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 fi
1057 fi
1058 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1059 local l="`basename ${lic}`"
1060
1061 # 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 for alic in "${ACCEPT_LICENSE}" ; do
1065 [ "${alic}" == "*" ] && return 0
1066 [ "${alic}" == "${l}" ] && return 0
1067 done
1068
1069 local licmsg="`mymktemp ${T}`"
1070 cat << EOF > ${licmsg}
1071**********************************************************
1072The following license outlines the terms of use of this
1073package. You MUST accept this license for installation to
1074continue. When you are done viewing, hit 'q'. If you
1075CTRL+C out of this, the install will not run!
1076**********************************************************
1077
1078EOF
1079 cat ${lic} >> ${licmsg}
1080 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1081 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1082 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}
1094
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
1113cdrom_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.
1198cdrom_load_next_cd() {
1199 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1200 local var=
1201
1202 if [ ! -z "${CD_ROOT}" ] ; then
1203 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1204 return
1205 fi
1206
1207 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
1226cdrom_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
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.
1277strip-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}

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.95

  ViewVC Help
Powered by ViewVC 1.1.20