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

Diff of /eclass/eutils.eclass

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

Revision 1.23 Revision 1.95
1# Copyright 1999-2003 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.23 2003/03/01 03:38:40 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.95 2004/08/15 03:25:19 lv Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 8# have to implement themselves.
10# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
11 11
12ECLASS=eutils 12ECLASS=eutils
13INHERITED="$INHERITED $ECLASS" 13INHERITED="$INHERITED $ECLASS"
14 14
15newdepend "!bootstrap? ( sys-devel/patch )" 15DEPEND="!bootstrap? ( sys-devel/patch )"
16 16
17DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
18 18
19# This function generate linker scripts in /usr/lib for dynamic 19# This function generate linker scripts in /usr/lib for dynamic
20# 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
33# to point to the latest version of the library present. 33# to point to the latest version of the library present.
34# 34#
35# <azarah@gentoo.org> (26 Oct 2002) 35# <azarah@gentoo.org> (26 Oct 2002)
36# 36#
37gen_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"
38 43
39 # Just make sure it exists 44 # Just make sure it exists
40 dodir /usr/lib 45 dodir /usr/${CONF_LIBDIR}
41 46
42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 47 cat > ${D}/usr/${CONF_LIBDIR}/$1 <<"END_LDSCRIPT"
43/* GNU ld script 48/* GNU ld script
44 Because Gentoo have critical dynamic libraries 49 Because Gentoo have critical dynamic libraries
45 in /lib, and the static versions in /usr/lib, we 50 in /lib, and the static versions in /usr/lib, we
46 need to have a "fake" dynamic lib in /usr/lib, 51 need to have a "fake" dynamic lib in /usr/lib,
47 otherwise we run into linking problems. 52 otherwise we run into linking problems.
48 See bug #4411 on http://bugs.gentoo.org/ for 53 See bug #4411 on http://bugs.gentoo.org/ for
49 more info. */ 54 more info. */
50GROUP ( /lib/libxxx )
51END_LDSCRIPT 55END_LDSCRIPT
52 56
57 echo "GROUP ( /${CONF_LIBDIR}/libxxx )" >> ${D}/usr/${CONF_LIBDIR}/$1
53 dosed "s:libxxx:$1:" /usr/lib/$1 58 dosed "s:libxxx:$1:" /usr/${CONF_LIBDIR}/$1
54 59
55 return 0 60 return 0
56} 61}
57 62
58# 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 $*
70 return 0 75 return 0
71 fi 76 fi
72 77
73 # Get the length of $* 78 # Get the length of $*
74 str_length="$(echo -n "$*" | wc -m)" 79 str_length="$(echo -n "$*" | wc -m)"
75 80
76 while [ "$i" -lt "${str_length}" ] 81 while [ "$i" -lt "${str_length}" ]
77 do 82 do
78 echo -n "=" 83 echo -n "="
79 84
80 i=$((i + 1)) 85 i=$((i + 1))
81 done 86 done
82 87
83 echo 88 echo
84 89
88# Default directory where patches are located 93# Default directory where patches are located
89EPATCH_SOURCE="${WORKDIR}/patch" 94EPATCH_SOURCE="${WORKDIR}/patch"
90# Default extension for patches 95# Default extension for patches
91EPATCH_SUFFIX="patch.bz2" 96EPATCH_SUFFIX="patch.bz2"
92# Default options for patch 97# Default options for patch
98# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
93EPATCH_OPTS="" 99EPATCH_OPTS="-g0"
94# 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,
95# and not the full path .. 101# and not the full path ..
96EPATCH_EXCLUDE="" 102EPATCH_EXCLUDE=""
97# Change the printed message for a single patch. 103# Change the printed message for a single patch.
98EPATCH_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"
99 110
100# 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
101# or two patches. 112# or two patches.
102# 113#
103# It should work with .bz2, .gz, .zip and plain text patches. 114# It should work with .bz2, .gz, .zip and plain text patches.
138 local SINGLE_PATCH="no" 149 local SINGLE_PATCH="no"
139 local x="" 150 local x=""
140 151
141 if [ "$#" -gt 1 ] 152 if [ "$#" -gt 1 ]
142 then 153 then
143 eerror "Invalid arguments to epatch()" 154 local m=""
144 die "Invalid arguments to epatch()" 155 einfo "${#} patches to apply..."
156 for m in "$@" ; do
157 epatch "${m}"
158 done
159 return 0
145 fi 160 fi
146 161
147 if [ -n "$1" -a -f "$1" ] 162 if [ -n "$1" -a -f "$1" ]
148 then 163 then
149 SINGLE_PATCH="yes" 164 SINGLE_PATCH="yes"
150 165
151 local EPATCH_SOURCE="$1" 166 local EPATCH_SOURCE="$1"
152 local EPATCH_SUFFIX="${1##*\.}" 167 local EPATCH_SUFFIX="${1##*\.}"
153 168
154 elif [ -n "$1" -a -d "$1" ] 169 elif [ -n "$1" -a -d "$1" ]
155 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
156 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 176 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
177 fi
157 else 178 else
158 if [ ! -d ${EPATCH_SOURCE} ] 179 if [ ! -d ${EPATCH_SOURCE} ]
159 then 180 then
160 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 181 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
161 then 182 then
167 eerror 188 eerror
168 eerror " ${EPATCH_SOURCE}" 189 eerror " ${EPATCH_SOURCE}"
169 echo 190 echo
170 die "Cannot find \$EPATCH_SOURCE!" 191 die "Cannot find \$EPATCH_SOURCE!"
171 fi 192 fi
172 193
173 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 194 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
174 fi 195 fi
175 196
176 case ${EPATCH_SUFFIX##*\.} in 197 case ${EPATCH_SUFFIX##*\.} in
177 bz2) 198 bz2)
201 # New ARCH dependant patch naming scheme... 222 # New ARCH dependant patch naming scheme...
202 # 223 #
203 # ???_arch_foo.patch 224 # ???_arch_foo.patch
204 # 225 #
205 if [ -f ${x} ] && \ 226 if [ -f ${x} ] && \
206 [ "${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" ])
207 then 229 then
208 local count=0 230 local count=0
209 local popts="${EPATCH_OPTS}" 231 local popts="${EPATCH_OPTS}"
210 232
211 if [ -n "${EPATCH_EXCLUDE}" ] 233 if [ -n "${EPATCH_EXCLUDE}" ]
213 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 235 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
214 then 236 then
215 continue 237 continue
216 fi 238 fi
217 fi 239 fi
218 240
219 if [ "${SINGLE_PATCH}" = "yes" ] 241 if [ "${SINGLE_PATCH}" = "yes" ]
220 then 242 then
221 if [ -n "${EPATCH_SINGLE_MSG}" ] 243 if [ -n "${EPATCH_SINGLE_MSG}" ]
222 then 244 then
223 einfo "${EPATCH_SINGLE_MSG}" 245 einfo "${EPATCH_SINGLE_MSG}"
243 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 else 267 else
246 PATCH_TARGET="${x}" 268 PATCH_TARGET="${x}"
247 fi 269 fi
248 270
249 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 271 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
250 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##*/}
251 273
252 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 274 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 275 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
254 276
255 if [ "${PATCH_SUFFIX}" != "patch" ] 277 if [ "${PATCH_SUFFIX}" != "patch" ]
256 then 278 then
261 #die "Could not extract patch!" 283 #die "Could not extract patch!"
262 count=5 284 count=5
263 break 285 break
264 fi 286 fi
265 fi 287 fi
266 288
267 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${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
268 then 290 then
269 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 291 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
270 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 292 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
271 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 293 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
272 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 294 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
273 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 295 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
274 296
275 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 297 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
276 298
277 if [ "$?" -ne 0 ] 299 if [ "$?" -ne 0 ]
278 then 300 then
279 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##*/}
280 echo 302 echo
283 #die "Real world sux compared to the dreamworld!" 305 #die "Real world sux compared to the dreamworld!"
284 count=5 306 count=5
285 fi 307 fi
286 308
287 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 309 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
288 310
289 break 311 break
290 fi 312 fi
291 313
292 count=$((count + 1)) 314 count=$((count + 1))
293 done 315 done
318 then 340 then
319 einfo "Done with patching" 341 einfo "Done with patching"
320 fi 342 fi
321} 343}
322 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
323# 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
324# -j in MAKEOPTS accordingly. 393# -j in MAKEOPTS accordingly.
325# 394#
326# Thanks to nall <nall@gentoo.org> for this. 395# Thanks to nall <nall@gentoo.org> for this.
327# 396#
340 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`" 409 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
341 ADMINPARAM="${ADMINPARAM/-j}" 410 ADMINPARAM="${ADMINPARAM/-j}"
342 fi 411 fi
343 412
344 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" 413 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
345 414
346 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ 415 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
347 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] 416 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
348 then 417 then
349 # these archs will always have "[Pp]rocessor" 418 # these archs will always have "[Pp]rocessor"
350 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" 419 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
351 420
352 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 421 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
353 then 422 then
354 # sparc always has "ncpus active" 423 # sparc always has "ncpus active"
355 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 424 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
356 425
357 elif [ "${ARCH}" = "alpha" ] 426 elif [ "${ARCH}" = "alpha" ]
358 then 427 then
359 # alpha has "cpus active", but only when compiled with SMP 428 # alpha has "cpus active", but only when compiled with SMP
360 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ] 429 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
361 then 430 then
362 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 431 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
363 else 432 else
364 jobs=2 433 jobs=2
365 fi 434 fi
366 435
367 elif [ "${ARCH}" = "ppc" ] 436 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
368 then 437 then
369 # ppc has "processor", but only when compiled with SMP 438 # ppc has "processor", but only when compiled with SMP
370 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 439 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
371 then 440 then
372 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))" 441 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
373 else 442 else
374 jobs=2 443 jobs=2
375 fi 444 fi
445 elif [ "${ARCH}" = "s390" ]
446 then
447 # s390 has "# processors : "
448 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
376 else 449 else
377 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))" 450 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
378 die "Unknown ARCH -- ${ARCH}!" 451 die "Unknown ARCH -- ${ARCH}!"
379 fi 452 fi
380 453
381 # Make sure the number is valid ... 454 # Make sure the number is valid ...
382 if [ "${jobs}" -lt 1 ] 455 if [ "${jobs}" -lt 1 ]
383 then 456 then
384 jobs=1 457 jobs=1
385 fi 458 fi
386 459
387 if [ -n "${ADMINPARAM}" ] 460 if [ -n "${ADMINPARAM}" ]
388 then 461 then
389 if [ "${jobs}" -gt "${ADMINPARAM}" ] 462 if [ "${jobs}" -gt "${ADMINPARAM}" ]
390 then 463 then
391 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..." 464 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
395 export MAKEOPTS="${MAKEOPTS} -j${jobs}" 468 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
396 fi 469 fi
397 fi 470 fi
398} 471}
399 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"
480
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
400# Simplify/standardize adding users to the system 512# Simplify/standardize adding users to the system
401# vapier@gentoo.org 513# vapier@gentoo.org
402# 514#
403# enewuser(username, uid, shell, homedir, groups, extra options) 515# enewuser(username, uid, shell, homedir, groups, extra options)
404# 516#
405# Default values if you do not specify any: 517# Default values if you do not specify any:
406# username: REQUIRED ! 518# username: REQUIRED !
407# uid: next available (see useradd(8)) 519# uid: next available (see useradd(8))
520# note: pass -1 to get default behavior
408# shell: /bin/false 521# shell: /bin/false
409# homedir: /dev/null 522# homedir: /dev/null
410# groups: none 523# groups: none
411# extra: comment of 'added by portage for ${PN}' 524# extra: comment of 'added by portage for ${PN}'
412enewuser() { 525enewuser() {
413 # get the username 526 # get the username
414 local euser="$1"; shift 527 local euser="$1"; shift
415 if [ -z "${euser}" ] ; then 528 if [ -z "${euser}" ]
529 then
416 eerror "No username specified !" 530 eerror "No username specified !"
417 die "Cannot call enewuser without a username" 531 die "Cannot call enewuser without a username"
418 fi 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
419 einfo "Adding user '${euser}' to your system ..." 539 einfo "Adding user '${euser}' to your system ..."
420 540
421 # setup a file for testing usernames/groups
422 local tmpfile="`mktemp -p ${T}`"
423 touch ${tmpfile}
424 chown ${euser} ${tmpfile} >& /dev/null
425 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
426
427 # see if user already exists
428 if [ "${euser}" == "${realuser}" ] ; then
429 einfo "${euser} already exists on your system :)"
430 return 0
431 fi
432
433 # options to pass to useradd 541 # options to pass to useradd
434 local opts="" 542 local opts=
435 543
436 # handle uid 544 # handle uid
437 local euid="$1"; shift 545 local euid="$1"; shift
438 if [ ! -z "${euid}" ] ; then 546 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
547 then
439 if [ ${euid} -gt 0 ] ; then 548 if [ "${euid}" -gt 0 ]
440 opts="${opts} -u ${euid}" 549 then
550 if [ ! -z "`egetent passwd ${euid}`" ]
551 then
552 euid="next"
553 fi
441 else 554 else
442 eerror "Userid given but is not greater than 0 !" 555 eerror "Userid given but is not greater than 0 !"
443 die "${euid} is not a valid UID" 556 die "${euid} is not a valid UID"
444 fi 557 fi
445 else 558 else
446 euid="next available" 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`"
447 fi 568 fi
569 for euid in ${pwrange} ; do
570 [ -z "`egetent passwd ${euid}`" ] && break
571 done
572 fi
573 opts="${opts} -u ${euid}"
448 einfo " - Userid: ${euid}" 574 einfo " - Userid: ${euid}"
449 575
450 # handle shell 576 # handle shell
451 local eshell="$1"; shift 577 local eshell="$1"; shift
452 if [ ! -z "${eshell}" ] ; then 578 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
579 then
453 if [ ! -e ${eshell} ] ; then 580 if [ ! -e "${eshell}" ]
581 then
454 eerror "A shell was specified but it does not exist !" 582 eerror "A shell was specified but it does not exist !"
455 die "${eshell} does not exist" 583 die "${eshell} does not exist"
456 fi 584 fi
457 else 585 else
458 eshell=/bin/false 586 eshell="/bin/false"
459 fi 587 fi
460 einfo " - Shell: ${eshell}" 588 einfo " - Shell: ${eshell}"
461 opts="${opts} -s ${eshell}" 589 opts="${opts} -s ${eshell}"
462 590
463 # handle homedir 591 # handle homedir
464 local ehome="$1"; shift 592 local ehome="$1"; shift
465 if [ -z "${ehome}" ] ; then 593 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
594 then
466 ehome=/dev/null 595 ehome="/dev/null"
467 fi 596 fi
468 einfo " - Home: ${ehome}" 597 einfo " - Home: ${ehome}"
469 opts="${opts} -d ${ehome}" 598 opts="${opts} -d ${ehome}"
470 599
471 # handle groups 600 # handle groups
472 local egroups="$1"; shift 601 local egroups="$1"; shift
473 if [ ! -z "${egroups}" ] ; then 602 if [ ! -z "${egroups}" ]
474 local realgroup 603 then
475 local oldifs="${IFS}" 604 local oldifs="${IFS}"
476 export IFS="," 605 export IFS=","
477 for g in ${egroups} ; do 606 for g in ${egroups}
478 chgrp ${g} ${tmpfile} >& /dev/null 607 do
479 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 608 if [ -z "`egetent group \"${g}\"`" ]
480 if [ "${g}" != "${realgroup}" ] ; then 609 then
481 eerror "You must add ${g} to the system first" 610 eerror "You must add group ${g} to the system first"
482 die "${g} is not a valid GID" 611 die "${g} is not a valid GID"
483 fi 612 fi
484 done 613 done
485 export IFS="${oldifs}" 614 export IFS="${oldifs}"
486 opts="${opts} -g ${egroups}" 615 opts="${opts} -g ${egroups}"
489 fi 618 fi
490 einfo " - Groups: ${egroups}" 619 einfo " - Groups: ${egroups}"
491 620
492 # handle extra and add the user 621 # handle extra and add the user
493 local eextra="$@" 622 local eextra="$@"
494 local oldsandbox="${oldsandbox}" 623 local oldsandbox="${SANDBOX_ON}"
495 export SANDBOX_ON="0" 624 export SANDBOX_ON="0"
625 if [ "${ARCH}" == "macos" ];
626 then
627 ### Make the user
496 if [ -z "${eextra}" ] ; then 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
497 useradd ${opts} ${euser} \ 648 useradd ${opts} ${euser} \
498 -c "added by portage for ${PN}" \ 649 -c "added by portage for ${PN}" \
499 || die "enewuser failed" 650 || die "enewuser failed"
500 else 651 else
501 einfo " - Extra: ${eextra}" 652 einfo " - Extra: ${eextra}"
502 useradd ${opts} ${euser} ${eextra} \ 653 useradd ${opts} ${euser} ${eextra} \
503 || die "enewuser failed" 654 || die "enewuser failed"
655 fi
504 fi 656 fi
505 export SANDBOX_ON="${oldsandbox}" 657 export SANDBOX_ON="${oldsandbox}"
506 658
507 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 659 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
660 then
508 einfo " - Creating ${ehome} in ${D}" 661 einfo " - Creating ${ehome} in ${D}"
509 dodir ${ehome} 662 dodir ${ehome}
510 fperms ${euser} ${ehome} 663 fowners ${euser} ${ehome}
664 fperms 755 ${ehome}
511 fi 665 fi
512} 666}
513 667
514# Simplify/standardize adding groups to the system 668# Simplify/standardize adding groups to the system
515# vapier@gentoo.org 669# vapier@gentoo.org
521# gid: next available (see groupadd(8)) 675# gid: next available (see groupadd(8))
522# extra: none 676# extra: none
523enewgroup() { 677enewgroup() {
524 # get the group 678 # get the group
525 local egroup="$1"; shift 679 local egroup="$1"; shift
526 if [ -z "${egroup}" ] ; then 680 if [ -z "${egroup}" ]
681 then
527 eerror "No group specified !" 682 eerror "No group specified !"
528 die "Cannot call enewgroup without a group" 683 die "Cannot call enewgroup without a group"
529 fi 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
530 einfo "Adding group '${egroup}' to your system ..." 691 einfo "Adding group '${egroup}' to your system ..."
531 692
532 # setup a file for testing groupname
533 local tmpfile="`mktemp -p ${T}`"
534 touch ${tmpfile}
535 chgrp ${egroup} ${tmpfile} >& /dev/null
536 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
537
538 # see if group already exists
539 if [ "${egroup}" == "${realgroup}" ] ; then
540 einfo "${egroup} already exists on your system :)"
541 return 0
542 fi
543
544 # options to pass to useradd 693 # options to pass to useradd
545 local opts="" 694 local opts=
546 695
547 # handle gid 696 # handle gid
548 local egid="$1"; shift 697 local egid="$1"; shift
549 if [ ! -z "${egid}" ] ; then 698 if [ ! -z "${egid}" ]
699 then
550 if [ ${egid} -gt 0 ] ; 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
551 opts="${opts} -g ${egid}" 707 opts="${opts} -g ${egid}"
708 fi
709 else
710 egid="next available; requested gid taken"
711 fi
552 else 712 else
553 eerror "Groupid given but is not greater than 0 !" 713 eerror "Groupid given but is not greater than 0 !"
554 die "${egid} is not a valid GID" 714 die "${egid} is not a valid GID"
555 fi 715 fi
556 else 716 else
561 # handle extra 721 # handle extra
562 local eextra="$@" 722 local eextra="$@"
563 opts="${opts} ${eextra}" 723 opts="${opts} ${eextra}"
564 724
565 # add the group 725 # add the group
566 local oldsandbox="${oldsandbox}" 726 local oldsandbox="${SANDBOX_ON}"
567 export SANDBOX_ON="0" 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"
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
568 groupadd ${opts} ${egroup} || die "enewgroup failed" 748 groupadd ${opts} ${egroup} || die "enewgroup failed"
749 fi
569 export SANDBOX_ON="${oldsandbox}" 750 export SANDBOX_ON="${oldsandbox}"
570} 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}" ]
792 then
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 -
945 else
946 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
947 | head -c $((${metaskip}-${tailskip})) \
948 | gzip -dc \
949 > ${datafile}
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 -
956 else
957 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
958 | head -c $((${metaskip}-${tailskip})) \
959 > ${datafile}
960 fi
961 fi
962 true
963 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
964 #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.
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.23  
changed lines
  Added in v.1.95

  ViewVC Help
Powered by ViewVC 1.1.20