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

Diff of /eclass/eutils.eclass

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

Revision 1.24 Revision 1.70
1# Copyright 1999-2003 Gentoo Technologies, Inc. 1# Copyright 1999-2003 Gentoo Technologies, Inc.
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.24 2003/03/03 21:27:15 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.70 2003/11/30 11:22:32 vapier 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.
36# 36#
37gen_usr_ldscript() { 37gen_usr_ldscript() {
38 38
39 # Just make sure it exists 39 # Just make sure it exists
40 dodir /usr/lib 40 dodir /usr/lib
41 41
42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43/* GNU ld script 43/* GNU ld script
44 Because Gentoo have critical dynamic libraries 44 Because Gentoo have critical dynamic libraries
45 in /lib, and the static versions in /usr/lib, we 45 in /lib, and the static versions in /usr/lib, we
46 need to have a "fake" dynamic lib in /usr/lib, 46 need to have a "fake" dynamic lib in /usr/lib,
70 return 0 70 return 0
71 fi 71 fi
72 72
73 # Get the length of $* 73 # Get the length of $*
74 str_length="$(echo -n "$*" | wc -m)" 74 str_length="$(echo -n "$*" | wc -m)"
75 75
76 while [ "$i" -lt "${str_length}" ] 76 while [ "$i" -lt "${str_length}" ]
77 do 77 do
78 echo -n "=" 78 echo -n "="
79 79
80 i=$((i + 1)) 80 i=$((i + 1))
81 done 81 done
82 82
83 echo 83 echo
84 84
88# Default directory where patches are located 88# Default directory where patches are located
89EPATCH_SOURCE="${WORKDIR}/patch" 89EPATCH_SOURCE="${WORKDIR}/patch"
90# Default extension for patches 90# Default extension for patches
91EPATCH_SUFFIX="patch.bz2" 91EPATCH_SUFFIX="patch.bz2"
92# Default options for patch 92# Default options for patch
93# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
93EPATCH_OPTS="" 94EPATCH_OPTS="-g0"
94# List of patches not to apply. Not this is only file names, 95# List of patches not to apply. Not this is only file names,
95# and not the full path .. 96# and not the full path ..
96EPATCH_EXCLUDE="" 97EPATCH_EXCLUDE=""
97# Change the printed message for a single patch. 98# Change the printed message for a single patch.
98EPATCH_SINGLE_MSG="" 99EPATCH_SINGLE_MSG=""
100# Force applying bulk patches even if not following the style:
101#
102# ??_${ARCH}_foo.${EPATCH_SUFFIX}
103#
104EPATCH_FORCE="no"
99 105
100# This function is for bulk patching, or in theory for just one 106# This function is for bulk patching, or in theory for just one
101# or two patches. 107# or two patches.
102# 108#
103# It should work with .bz2, .gz, .zip and plain text patches. 109# It should work with .bz2, .gz, .zip and plain text patches.
145 fi 151 fi
146 152
147 if [ -n "$1" -a -f "$1" ] 153 if [ -n "$1" -a -f "$1" ]
148 then 154 then
149 SINGLE_PATCH="yes" 155 SINGLE_PATCH="yes"
150 156
151 local EPATCH_SOURCE="$1" 157 local EPATCH_SOURCE="$1"
152 local EPATCH_SUFFIX="${1##*\.}" 158 local EPATCH_SUFFIX="${1##*\.}"
153 159
154 elif [ -n "$1" -a -d "$1" ] 160 elif [ -n "$1" -a -d "$1" ]
155 then 161 then
162 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
163 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
164 then
165 local EPATCH_SOURCE="$1/*"
166 else
156 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 167 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168 fi
157 else 169 else
158 if [ ! -d ${EPATCH_SOURCE} ] 170 if [ ! -d ${EPATCH_SOURCE} ]
159 then 171 then
160 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 172 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
161 then 173 then
167 eerror 179 eerror
168 eerror " ${EPATCH_SOURCE}" 180 eerror " ${EPATCH_SOURCE}"
169 echo 181 echo
170 die "Cannot find \$EPATCH_SOURCE!" 182 die "Cannot find \$EPATCH_SOURCE!"
171 fi 183 fi
172 184
173 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
174 fi 186 fi
175 187
176 case ${EPATCH_SUFFIX##*\.} in 188 case ${EPATCH_SUFFIX##*\.} in
177 bz2) 189 bz2)
201 # New ARCH dependant patch naming scheme... 213 # New ARCH dependant patch naming scheme...
202 # 214 #
203 # ???_arch_foo.patch 215 # ???_arch_foo.patch
204 # 216 #
205 if [ -f ${x} ] && \ 217 if [ -f ${x} ] && \
206 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 218 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219 [ "${EPATCH_FORCE}" = "yes" ])
207 then 220 then
208 local count=0 221 local count=0
209 local popts="${EPATCH_OPTS}" 222 local popts="${EPATCH_OPTS}"
210 223
211 if [ -n "${EPATCH_EXCLUDE}" ] 224 if [ -n "${EPATCH_EXCLUDE}" ]
213 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 226 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
214 then 227 then
215 continue 228 continue
216 fi 229 fi
217 fi 230 fi
218 231
219 if [ "${SINGLE_PATCH}" = "yes" ] 232 if [ "${SINGLE_PATCH}" = "yes" ]
220 then 233 then
221 if [ -n "${EPATCH_SINGLE_MSG}" ] 234 if [ -n "${EPATCH_SINGLE_MSG}" ]
222 then 235 then
223 einfo "${EPATCH_SINGLE_MSG}" 236 einfo "${EPATCH_SINGLE_MSG}"
243 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 else 258 else
246 PATCH_TARGET="${x}" 259 PATCH_TARGET="${x}"
247 fi 260 fi
248 261
249 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
250 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 263 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
251 264
252 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
254 267
255 if [ "${PATCH_SUFFIX}" != "patch" ] 268 if [ "${PATCH_SUFFIX}" != "patch" ]
256 then 269 then
261 #die "Could not extract patch!" 274 #die "Could not extract patch!"
262 count=5 275 count=5
263 break 276 break
264 fi 277 fi
265 fi 278 fi
266 279
267 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 280 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
268 then 281 then
269 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
270 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
271 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 #die "Real world sux compared to the dreamworld!" 296 #die "Real world sux compared to the dreamworld!"
284 count=5 297 count=5
285 fi 298 fi
286 299
287 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 300 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
288 301
289 break 302 break
290 fi 303 fi
291 304
292 count=$((count + 1)) 305 count=$((count + 1))
293 done 306 done
318 then 331 then
319 einfo "Done with patching" 332 einfo "Done with patching"
320 fi 333 fi
321} 334}
322 335
336# This function return true if we are using the NPTL pthreads
337# implementation.
338#
339# <azarah@gentoo.org> (06 March 2003)
340#
341
342have_NPTL() {
343
344 cat > ${T}/test-nptl.c <<-"END"
345 #define _XOPEN_SOURCE
346 #include <unistd.h>
347 #include <stdio.h>
348
349 int main()
350 {
351 char buf[255];
352 char *str = buf;
353
354 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355 if (NULL != str) {
356 printf("%s\n", str);
357 if (NULL != strstr(str, "NPTL"))
358 return 0;
359 }
360
361 return 1;
362 }
363 END
364
365 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367 then
368 echo "yes"
369 einfon "Checking what PTHREADS implementation we have ... "
370 if ${T}/nptl
371 then
372 return 0
373 else
374 return 1
375 fi
376 else
377 echo "no"
378 fi
379
380 return 1
381}
382
323# This function check how many cpu's are present, and then set 383# This function check how many cpu's are present, and then set
324# -j in MAKEOPTS accordingly. 384# -j in MAKEOPTS accordingly.
325# 385#
326# Thanks to nall <nall@gentoo.org> for this. 386# Thanks to nall <nall@gentoo.org> for this.
327# 387#
340 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`" 400 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
341 ADMINPARAM="${ADMINPARAM/-j}" 401 ADMINPARAM="${ADMINPARAM/-j}"
342 fi 402 fi
343 403
344 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" 404 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
345 405
346 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ 406 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
347 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] 407 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
348 then 408 then
349 # these archs will always have "[Pp]rocessor" 409 # these archs will always have "[Pp]rocessor"
350 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" 410 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
351 411
352 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 412 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
353 then 413 then
354 # sparc always has "ncpus active" 414 # sparc always has "ncpus active"
355 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 415 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
356 416
357 elif [ "${ARCH}" = "alpha" ] 417 elif [ "${ARCH}" = "alpha" ]
358 then 418 then
359 # alpha has "cpus active", but only when compiled with SMP 419 # alpha has "cpus active", but only when compiled with SMP
360 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ] 420 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
361 then 421 then
362 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
363 else 423 else
364 jobs=2 424 jobs=2
365 fi 425 fi
366 426
367 elif [ "${ARCH}" = "ppc" ] 427 elif [ "${ARCH}" = "ppc" ]
368 then 428 then
369 # ppc has "processor", but only when compiled with SMP 429 # ppc has "processor", but only when compiled with SMP
370 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
371 then 431 then
381 # Make sure the number is valid ... 441 # Make sure the number is valid ...
382 if [ "${jobs}" -lt 1 ] 442 if [ "${jobs}" -lt 1 ]
383 then 443 then
384 jobs=1 444 jobs=1
385 fi 445 fi
386 446
387 if [ -n "${ADMINPARAM}" ] 447 if [ -n "${ADMINPARAM}" ]
388 then 448 then
389 if [ "${jobs}" -gt "${ADMINPARAM}" ] 449 if [ "${jobs}" -gt "${ADMINPARAM}" ]
390 then 450 then
391 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..." 451 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
395 export MAKEOPTS="${MAKEOPTS} -j${jobs}" 455 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
396 fi 456 fi
397 fi 457 fi
398} 458}
399 459
460# Cheap replacement for when debianutils (and thus mktemp)
461# do not exist on the users system
462# vapier@gentoo.org
463#
464# Takes just 1 parameter (the directory to create tmpfile in)
465mymktemp() {
466 local topdir="$1"
467
468 [ -z "${topdir}" ] && topdir=/tmp
469 if [ "`which mktemp 2>/dev/null`" ]
470 then
471 mktemp -p ${topdir}
472 else
473 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474 touch ${tmp}
475 echo ${tmp}
476 fi
477}
478
400# Simplify/standardize adding users to the system 479# Simplify/standardize adding users to the system
401# vapier@gentoo.org 480# vapier@gentoo.org
402# 481#
403# enewuser(username, uid, shell, homedir, groups, extra options) 482# enewuser(username, uid, shell, homedir, groups, extra options)
404# 483#
405# Default values if you do not specify any: 484# Default values if you do not specify any:
406# username: REQUIRED ! 485# username: REQUIRED !
407# uid: next available (see useradd(8)) 486# uid: next available (see useradd(8))
487# note: pass -1 to get default behavior
408# shell: /bin/false 488# shell: /bin/false
409# homedir: /dev/null 489# homedir: /dev/null
410# groups: none 490# groups: none
411# extra: comment of 'added by portage for ${PN}' 491# extra: comment of 'added by portage for ${PN}'
412enewuser() { 492enewuser() {
413 # get the username 493 # get the username
414 local euser="$1"; shift 494 local euser="$1"; shift
415 if [ -z "${euser}" ] ; then 495 if [ -z "${euser}" ]
496 then
416 eerror "No username specified !" 497 eerror "No username specified !"
417 die "Cannot call enewuser without a username" 498 die "Cannot call enewuser without a username"
418 fi 499 fi
419 einfo "Adding user '${euser}' to your system ..."
420 500
421 # setup a file for testing usernames/groups 501 # setup a file for testing usernames/groups
422 local tmpfile="`mktemp -p ${T}`" 502 local tmpfile="`mymktemp ${T}`"
423 touch ${tmpfile}
424 chown ${euser} ${tmpfile} >& /dev/null 503 chown ${euser} ${tmpfile} >& /dev/null
425 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" 504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
426 505
427 # see if user already exists 506 # see if user already exists
428 if [ "${euser}" == "${realuser}" ] ; then 507 if [ "${euser}" == "${realuser}" ]
429 einfo "${euser} already exists on your system :)" 508 then
430 return 0 509 return 0
431 fi 510 fi
511 einfo "Adding user '${euser}' to your system ..."
432 512
433 # options to pass to useradd 513 # options to pass to useradd
434 local opts="" 514 local opts=
435 515
436 # handle uid 516 # handle uid
437 local euid="$1"; shift 517 local euid="$1"; shift
438 if [ ! -z "${euid}" ] ; then 518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then
439 if [ ${euid} -gt 0 ] ; then 520 if [ "${euid}" -gt 0 ]
521 then
440 opts="${opts} -u ${euid}" 522 opts="${opts} -u ${euid}"
441 else 523 else
442 eerror "Userid given but is not greater than 0 !" 524 eerror "Userid given but is not greater than 0 !"
443 die "${euid} is not a valid UID" 525 die "${euid} is not a valid UID"
444 fi 526 fi
447 fi 529 fi
448 einfo " - Userid: ${euid}" 530 einfo " - Userid: ${euid}"
449 531
450 # handle shell 532 # handle shell
451 local eshell="$1"; shift 533 local eshell="$1"; shift
452 if [ ! -z "${eshell}" ] ; then 534 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
535 then
453 if [ ! -e ${eshell} ] ; then 536 if [ ! -e "${eshell}" ]
537 then
454 eerror "A shell was specified but it does not exist !" 538 eerror "A shell was specified but it does not exist !"
455 die "${eshell} does not exist" 539 die "${eshell} does not exist"
456 fi 540 fi
457 else 541 else
458 eshell=/bin/false 542 eshell="/bin/false"
459 fi 543 fi
460 einfo " - Shell: ${eshell}" 544 einfo " - Shell: ${eshell}"
461 opts="${opts} -s ${eshell}" 545 opts="${opts} -s ${eshell}"
462 546
463 # handle homedir 547 # handle homedir
464 local ehome="$1"; shift 548 local ehome="$1"; shift
465 if [ -z "${ehome}" ] ; then 549 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
550 then
466 ehome=/dev/null 551 ehome="/dev/null"
467 fi 552 fi
468 einfo " - Home: ${ehome}" 553 einfo " - Home: ${ehome}"
469 opts="${opts} -d ${ehome}" 554 opts="${opts} -d ${ehome}"
470 555
471 # handle groups 556 # handle groups
472 local egroups="$1"; shift 557 local egroups="$1"; shift
473 if [ ! -z "${egroups}" ] ; then 558 if [ ! -z "${egroups}" ]
559 then
474 local realgroup 560 local realgroup=
475 local oldifs="${IFS}" 561 local oldifs="${IFS}"
476 export IFS="," 562 export IFS=","
477 for g in ${egroups} ; do 563 for g in ${egroups}
564 do
478 chgrp ${g} ${tmpfile} >& /dev/null 565 chgrp ${g} ${tmpfile} >& /dev/null
479 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
480 if [ "${g}" != "${realgroup}" ] ; then 567 if [ "${g}" != "${realgroup}" ]
568 then
481 eerror "You must add ${g} to the system first" 569 eerror "You must add ${g} to the system first"
482 die "${g} is not a valid GID" 570 die "${g} is not a valid GID"
483 fi 571 fi
484 done 572 done
485 export IFS="${oldifs}" 573 export IFS="${oldifs}"
489 fi 577 fi
490 einfo " - Groups: ${egroups}" 578 einfo " - Groups: ${egroups}"
491 579
492 # handle extra and add the user 580 # handle extra and add the user
493 local eextra="$@" 581 local eextra="$@"
494 local oldsandbox="${oldsandbox}" 582 local oldsandbox="${SANDBOX_ON}"
495 export SANDBOX_ON="0" 583 export SANDBOX_ON="0"
496 if [ -z "${eextra}" ] ; then 584 if [ -z "${eextra}" ]
585 then
497 useradd ${opts} ${euser} \ 586 useradd ${opts} ${euser} \
498 -c "added by portage for ${PN}" \ 587 -c "added by portage for ${PN}" \
499 || die "enewuser failed" 588 || die "enewuser failed"
500 else 589 else
501 einfo " - Extra: ${eextra}" 590 einfo " - Extra: ${eextra}"
502 useradd ${opts} ${euser} ${eextra} \ 591 useradd ${opts} ${euser} ${eextra} \
503 || die "enewuser failed" 592 || die "enewuser failed"
504 fi 593 fi
505 export SANDBOX_ON="${oldsandbox}" 594 export SANDBOX_ON="${oldsandbox}"
506 595
507 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then
508 einfo " - Creating ${ehome} in ${D}" 598 einfo " - Creating ${ehome} in ${D}"
509 dodir ${ehome} 599 dodir ${ehome}
510 fperms ${euser} ${ehome} 600 fowners ${euser} ${ehome}
601 fperms 755 ${ehome}
511 fi 602 fi
512} 603}
513 604
514# Simplify/standardize adding groups to the system 605# Simplify/standardize adding groups to the system
515# vapier@gentoo.org 606# vapier@gentoo.org
521# gid: next available (see groupadd(8)) 612# gid: next available (see groupadd(8))
522# extra: none 613# extra: none
523enewgroup() { 614enewgroup() {
524 # get the group 615 # get the group
525 local egroup="$1"; shift 616 local egroup="$1"; shift
526 if [ -z "${egroup}" ] ; then 617 if [ -z "${egroup}" ]
618 then
527 eerror "No group specified !" 619 eerror "No group specified !"
528 die "Cannot call enewgroup without a group" 620 die "Cannot call enewgroup without a group"
529 fi 621 fi
530 einfo "Adding group '${egroup}' to your system ..."
531 622
532 # setup a file for testing groupname 623 # setup a file for testing groupname
533 local tmpfile="`mktemp -p ${T}`" 624 local tmpfile="`mymktemp ${T}`"
534 touch ${tmpfile}
535 chgrp ${egroup} ${tmpfile} >& /dev/null 625 chgrp ${egroup} ${tmpfile} >& /dev/null
536 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
537 627
538 # see if group already exists 628 # see if group already exists
539 if [ "${egroup}" == "${realgroup}" ] ; then 629 if [ "${egroup}" == "${realgroup}" ]
540 einfo "${egroup} already exists on your system :)" 630 then
541 return 0 631 return 0
542 fi 632 fi
633 einfo "Adding group '${egroup}' to your system ..."
543 634
544 # options to pass to useradd 635 # options to pass to useradd
545 local opts="" 636 local opts=
546 637
547 # handle gid 638 # handle gid
548 local egid="$1"; shift 639 local egid="$1"; shift
549 if [ ! -z "${egid}" ] ; then 640 if [ ! -z "${egid}" ]
641 then
550 if [ ${egid} -gt 0 ] ; then 642 if [ "${egid}" -gt 0 ]
643 then
551 opts="${opts} -g ${egid}" 644 opts="${opts} -g ${egid}"
552 else 645 else
553 eerror "Groupid given but is not greater than 0 !" 646 eerror "Groupid given but is not greater than 0 !"
554 die "${egid} is not a valid GID" 647 die "${egid} is not a valid GID"
555 fi 648 fi
561 # handle extra 654 # handle extra
562 local eextra="$@" 655 local eextra="$@"
563 opts="${opts} ${eextra}" 656 opts="${opts} ${eextra}"
564 657
565 # add the group 658 # add the group
566 local oldsandbox="${oldsandbox}" 659 local oldsandbox="${SANDBOX_ON}"
567 export SANDBOX_ON="0" 660 export SANDBOX_ON="0"
568 groupadd ${opts} ${egroup} || die "enewgroup failed" 661 groupadd ${opts} ${egroup} || die "enewgroup failed"
569 export SANDBOX_ON="${oldsandbox}" 662 export SANDBOX_ON="${oldsandbox}"
570} 663}
571 664
572# Simple script to replace 'dos2unix' binaries 665# Simple script to replace 'dos2unix' binaries
573# vapier@gentoo.org 666# vapier@gentoo.org
574# 667#
575# edos2unix(file, <more files>...) 668# edos2unix(file, <more files>...)
576edos2unix() { 669edos2unix() {
577 for f in $@ ; do 670 for f in "$@"
578 cp ${f} ${T}/ 671 do
579 sed 's/\r$//' ${T}/${f}.old > ${f} 672 cp "${f}" ${T}/edos2unix
673 sed 's/\r$//' ${T}/edos2unix > "${f}"
580 done 674 done
581} 675}
676
677# Make a desktop file !
678# Great for making those icons in kde/gnome startmenu !
679# Amaze your friends ! Get the women ! Join today !
680# gnome2 /usr/share/applications
681# gnome1 /usr/share/gnome/apps/
682# KDE ${KDEDIR}/share/applnk /usr/share/applnk
683#
684# make_desktop_entry(<binary>, [name], [icon], [type], [path])
685#
686# binary: what binary does the app run with ?
687# name: the name that will show up in the menu
688# icon: give your little like a pretty little icon ...
689# this can be relative (to /usr/share/pixmaps) or
690# a full path to an icon
691# type: what kind of application is this ? for categories:
692# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
693# path: if your app needs to startup in a specific dir
694make_desktop_entry() {
695 [ -z "$1" ] && eerror "You must specify the executable" && return 1
696
697 local exec="${1}"
698 local name="${2:-${PN}}"
699 local icon="${3:-${PN}.png}"
700 local type="${4}"
701 local path="${5:-${GAMES_PREFIX}}"
702 if [ -z "${type}" ]
703 then
704 case ${CATEGORY} in
705 "app-emulation")
706 type=Emulator
707 ;;
708 "games-"*)
709 type=Game
710 ;;
711 "net-"*)
712 type=Network;
713 ;;
714 *)
715 type=
716 ;;
717 esac
718 fi
719 local desktop="${T}/${exec}.desktop"
720
721echo "[Desktop Entry]
722Encoding=UTF-8
723Version=0.9.2
724Name=${name}
725Type=Application
726Comment=${DESCRIPTION}
727Exec=${exec}
728Path=${path}
729Icon=${icon}
730Categories=Application;${type};" > ${desktop}
731
732 if [ -d "/usr/share/applications" ]
733 then
734 insinto /usr/share/applications
735 doins ${desktop}
736 fi
737
738 #if [ -d "/usr/share/gnome/apps" ]
739 #then
740 # insinto /usr/share/gnome/apps/Games
741 # doins ${desktop}
742 #fi
743
744 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
745 #then
746 # for ver in /usr/kde/*
747 # do
748 # insinto ${ver}/share/applnk/Games
749 # doins ${desktop}
750 # done
751 #fi
752
753 if [ -d "/usr/share/applnk" ]
754 then
755 insinto /usr/share/applnk/${type}
756 doins ${desktop}
757 fi
758
759 return 0
760}
761
762# new convenience patch wrapper function to eventually replace epatch(),
763# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
764# /usr/bin/patch
765# Features:
766# - bulk patch handling similar to epatch()'s
767# - automatic patch level detection like epatch()'s
768# - automatic patch uncompression like epatch()'s
769# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
770# manually instead
771# - once I decide it's production-ready, it'll be called from base_src_unpack
772# to handle $PATCHES to avoid defining src_unpack just to use xpatch
773
774# accepts zero or more parameters specifying patchfiles and/or patchdirs
775
776# known issues:
777# - only supports unified style patches (does anyone _really_ use anything
778# else?)
779# - because it doesn't use --dry-run there is a risk of it failing
780# to find the files to patch, ie detect the patchlevel, properly. It doesn't use
781# any of the backup heuristics that patch employs to discover a filename.
782# however, this isn't dangerous because if it works for the developer who's
783# writing the ebuild, it'll always work for the users, and if it doesn't,
784# then we'll fix it :-)
785# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
786xpatch() {
787
788 debug-print-function ${FUNCNAME} $*
789
790 local list=
791 local list2=
792 declare -i plevel
793
794 # parse patch sources
795 for x in $*
796 do
797 debug-print "${FUNCNAME}: parsing parameter ${x}"
798 if [ -f "${x}" ]
799 then
800 list="${list} ${x}"
801 elif [ -d "${x}" ]
802 then
803 # handles patchdirs like epatch() for now: no recursion.
804 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
805 # only patches with _$ARCH_ or _all_ in their filenames are applied.
806 for file in `ls -A ${x}`
807 do
808 debug-print "${FUNCNAME}: parsing in subdir: file ${file}"
809 if [ -f "${x}/${file}" -a "${file}" != "${file/_all_}" -o \
810 "${file}" != "${file/_$ARCH_}" ]
811 then
812 list2="${list2} ${x}/${file}"
813 fi
814 done
815 list="`echo ${list2} | sort` ${list}"
816 else
817 die "Couldn't find ${x}"
818 fi
819 done
820
821 debug-print "${FUNCNAME}: final list of patches: ${list}"
822
823 for x in ${list};
824 do
825 debug-print "${FUNCNAME}: processing ${x}"
826 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
827 case "`/usr/bin/file -b ${x}`" in
828 *gzip*)
829 patchfile="${T}/current.patch"
830 ungzip -c "${x}" > "${patchfile}"
831 ;;
832 *bzip2*)
833 patchfile="${T}/current.patch"
834 bunzip2 -c "${x}" > "${patchfile}"
835 ;;
836 *text*)
837 patchfile="${x}"
838 ;;
839 *)
840 die "Could not determine filetype of patch ${x}"
841 ;;
842 esac
843 debug-print "${FUNCNAME}: patchfile=${patchfile}"
844
845 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
846 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
847 debug-print "${FUNCNAME}: raw target=${target}"
848 # strip target down to the path/filename, remove leading +++
849 target="${target/+++ }"; target="${target%% *}"
850 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
851 # to discard them as well to calculate the correct patchlevel.
852 target="${target//\/\//\/}"
853 debug-print "${FUNCNAME}: stripped target=${target}"
854
855 # look for target
856 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
857 debug-print "${FUNCNAME}: looking in basedir=${basedir}"
858 cd "${basedir}"
859
860 # try stripping leading directories
861 target2="${target}"
862 plevel=0
863 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
864 while [ ! -f "${target2}" ]
865 do
866 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
867 plevel=$((plevel+1))
868 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
869 [ "${target2}" == "${target2/\/}" ] && break
870 done
871 test -f "${target2}" && break
872
873 # try stripping filename - needed to support patches creating new files
874 target2="${target%/*}"
875 plevel=0
876 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
877 while [ ! -d "${target2}" ]
878 do
879 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
880 plevel=$((plevel+1))
881 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
882 [ "${target2}" == "${target2/\/}" ] && break
883 done
884 test -d "${target2}" && break
885
886 done
887
888 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
889 || die "Could not determine patchlevel for ${x}"
890 debug-print "${FUNCNAME}: determined plevel=${plevel}"
891 # do the patching
892 ebegin "Applying patch ${x##*/}..."
893 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
894 || die "Failed to apply patch ${x}"
895 eend $?
896
897 done
898
899}
900
901# for internal use only (unpack_pdv and unpack_makeself)
902find_unpackable_file() {
903 local src="$1"
904 if [ -z "${src}" ]
905 then
906 src="${DISTDIR}/${A}"
907 else
908 if [ -e "${DISTDIR}/${src}" ]
909 then
910 src="${DISTDIR}/${src}"
911 elif [ -e "${PWD}/${src}" ]
912 then
913 src="${PWD}/${src}"
914 elif [ -e "${src}" ]
915 then
916 src="${src}"
917 fi
918 fi
919 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
920 echo "${src}"
921}
922
923# Unpack those pesky pdv generated files ...
924# They're self-unpacking programs with the binary package stuffed in
925# the middle of the archive. Valve seems to use it a lot ... too bad
926# it seems to like to segfault a lot :(. So lets take it apart ourselves.
927#
928# Usage: unpack_pdv [file to unpack] [size of off_t]
929# - you have to specify the off_t size ... i have no idea how to extract that
930# information out of the binary executable myself. basically you pass in
931# the size of the off_t type (in bytes) on the machine that built the pdv
932# archive. one way to determine this is by running the following commands:
933# strings <pdv archive> | grep lseek
934# strace -elseek <pdv archive>
935# basically look for the first lseek command (we do the strings/grep because
936# sometimes the function call is _llseek or something) and steal the 2nd
937# parameter. here is an example:
938# root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
939# lseek
940# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
941# lseek(3, -4, SEEK_END) = 2981250
942# thus we would pass in the value of '4' as the second parameter.
943unpack_pdv() {
944 local src="`find_unpackable_file $1`"
945 local sizeoff_t="$2"
946
947 [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
948
949 local shrtsrc="`basename ${src}`"
950 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
951 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
952 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
953
954 # grab metadata for debug reasons
955 local metafile="`mymktemp ${T}`"
956 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
957
958 # rip out the final file name from the metadata
959 local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
960 datafile="`basename ${datafile}`"
961
962 # now lets uncompress the file if need be
963 local tmpfile="`mymktemp ${T}`"
964 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
965 local filetype="`file -b ${tmpfile}`"
966 case ${filetype} in
967 compress*)
968 #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
969 #dd if=${src} ibs=${metaskip} count=1 \
970 # | dd ibs=${tailskip} skip=1 \
971 # | gzip -dc \
972 # > ${datafile}
973 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
974 | head -c $((${metaskip}-${tailskip})) \
975 | gzip -dc \
976 > ${datafile}
977 ;;
978 *)
979 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
980 | head -c $((${metaskip}-${tailskip})) \
981 > ${datafile}
982 #dd if=${src} ibs=${metaskip} count=1 \
983 # | dd ibs=${tailskip} skip=1 of=${datafile}
984 ;;
985 esac
986 [ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
987 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
988}
989
990# Unpack those pesky makeself generated files ...
991# They're shell scripts with the binary package tagged onto
992# the end of the archive. Loki utilized the format as does
993# many other game companies.
994#
995# Usage: unpack_makeself [file to unpack] [offset]
996# - If the file is not specified then unpack will utilize ${A}.
997# - If the offset is not specified then we will attempt to extract
998# the proper offset from the script itself.
999unpack_makeself() {
1000 local src="`find_unpackable_file $1`"
1001 local skip="$2"
1002
1003 local shrtsrc="`basename ${src}`"
1004 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1005 if [ -z "${skip}" ]
1006 then
1007 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
1008 local skip=0
1009 case ${ver} in
1010 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1011 skip=`grep -a ^skip= ${src} | cut -d= -f2`
1012 ;;
1013 2.0|2.0.1)
1014 skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
1015 ;;
1016 2.1.1)
1017 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
1018 let skip="skip + 1"
1019 ;;
1020 2.1.2)
1021 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
1022 let skip="skip + 1"
1023 ;;
1024 2.1.3)
1025 skip=`grep -a ^offset= ${src} | awk '{print $3}'`
1026 let skip="skip + 1"
1027 ;;
1028 *)
1029 eerror "I'm sorry, but I was unable to support the Makeself file."
1030 eerror "The version I detected was '${ver}'."
1031 eerror "Please file a bug about the file ${shrtsrc} at"
1032 eerror "http://bugs.gentoo.org/ so that support can be added."
1033 die "makeself version '${ver}' not supported"
1034 ;;
1035 esac
1036 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1037 fi
1038
1039 # lets grab the first few bytes of the file to figure out what kind of archive it is
1040 local tmpfile="`mymktemp ${T}`"
1041 tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1042 local filetype="`file -b ${tmpfile}`"
1043 case ${filetype} in
1044 *tar\ archive)
1045 tail -n +${skip} ${src} | tar -xf -
1046 ;;
1047 bzip2*)
1048 tail -n +${skip} ${src} | bzip2 -dc | tar -xf -
1049 ;;
1050 gzip*)
1051 tail -n +${skip} ${src} | tar -xzf -
1052 ;;
1053 *)
1054 false
1055 ;;
1056 esac
1057 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1058}
1059
1060# Display a license for user to accept.
1061#
1062# Usage: check_license [license]
1063# - If the file is not specified then ${LICENSE} is used.
1064check_license() {
1065 local lic=$1
1066 if [ -z "${lic}" ] ; then
1067 lic="${PORTDIR}/licenses/${LICENSE}"
1068 else
1069 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1070 lic="${PORTDIR}/licenses/${src}"
1071 elif [ -e "${PWD}/${src}" ] ; then
1072 lic="${PWD}/${src}"
1073 elif [ -e "${src}" ] ; then
1074 lic="${src}"
1075 fi
1076 fi
1077 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1078 local l="`basename ${lic}`"
1079
1080 # here is where we check for the licenses the user already
1081 # accepted ... if we don't find a match, we make the user accept
1082 local alic
1083 for alic in ${ACCEPT_LICENSE} ; do
1084 [ "${alic}" == "*" ] && return 0
1085 [ "${alic}" == "${l}" ] && return 0
1086 done
1087
1088 local licmsg="`mymktemp ${T}`"
1089 cat << EOF > ${licmsg}
1090**********************************************************
1091The following license outlines the terms of use of this
1092package. You MUST accept this license for installation to
1093continue. When you are done viewing, hit 'q'. If you
1094CTRL+C out of this, the install will not run!
1095**********************************************************
1096
1097EOF
1098 cat ${lic} >> ${licmsg}
1099 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1100 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1101 read alic
1102 case ${alic} in
1103 yes|Yes|y|Y)
1104 return 0
1105 ;;
1106 *)
1107 echo;echo;echo
1108 eerror "You MUST accept the license to continue! Exiting!"
1109 die "Failed to accept license"
1110 ;;
1111 esac
1112}

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.70

  ViewVC Help
Powered by ViewVC 1.1.20