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

Diff of /eclass/eutils.eclass

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

Revision 1.29 Revision 1.60
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.29 2003/03/11 21:50:43 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.60 2003/09/23 01:26:58 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=""
150 fi 151 fi
151 152
152 if [ -n "$1" -a -f "$1" ] 153 if [ -n "$1" -a -f "$1" ]
153 then 154 then
154 SINGLE_PATCH="yes" 155 SINGLE_PATCH="yes"
155 156
156 local EPATCH_SOURCE="$1" 157 local EPATCH_SOURCE="$1"
157 local EPATCH_SUFFIX="${1##*\.}" 158 local EPATCH_SUFFIX="${1##*\.}"
158 159
159 elif [ -n "$1" -a -d "$1" ] 160 elif [ -n "$1" -a -d "$1" ]
160 then 161 then
161 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ... 162 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
162 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ] 163 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
163 then 164 then
178 eerror 179 eerror
179 eerror " ${EPATCH_SOURCE}" 180 eerror " ${EPATCH_SOURCE}"
180 echo 181 echo
181 die "Cannot find \$EPATCH_SOURCE!" 182 die "Cannot find \$EPATCH_SOURCE!"
182 fi 183 fi
183 184
184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
185 fi 186 fi
186 187
187 case ${EPATCH_SUFFIX##*\.} in 188 case ${EPATCH_SUFFIX##*\.} in
188 bz2) 189 bz2)
225 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 226 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
226 then 227 then
227 continue 228 continue
228 fi 229 fi
229 fi 230 fi
230 231
231 if [ "${SINGLE_PATCH}" = "yes" ] 232 if [ "${SINGLE_PATCH}" = "yes" ]
232 then 233 then
233 if [ -n "${EPATCH_SINGLE_MSG}" ] 234 if [ -n "${EPATCH_SINGLE_MSG}" ]
234 then 235 then
235 einfo "${EPATCH_SINGLE_MSG}" 236 einfo "${EPATCH_SINGLE_MSG}"
255 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
256 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257 else 258 else
258 PATCH_TARGET="${x}" 259 PATCH_TARGET="${x}"
259 fi 260 fi
260 261
261 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
262 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##*/}
263 264
264 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
265 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266 267
267 if [ "${PATCH_SUFFIX}" != "patch" ] 268 if [ "${PATCH_SUFFIX}" != "patch" ]
268 then 269 then
273 #die "Could not extract patch!" 274 #die "Could not extract patch!"
274 count=5 275 count=5
275 break 276 break
276 fi 277 fi
277 fi 278 fi
278 279
279 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
280 then 281 then
281 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
282 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
295 #die "Real world sux compared to the dreamworld!" 296 #die "Real world sux compared to the dreamworld!"
296 count=5 297 count=5
297 fi 298 fi
298 299
299 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 300 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
300 301
301 break 302 break
302 fi 303 fi
303 304
304 count=$((count + 1)) 305 count=$((count + 1))
305 done 306 done
399 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]}'`"
400 ADMINPARAM="${ADMINPARAM/-j}" 401 ADMINPARAM="${ADMINPARAM/-j}"
401 fi 402 fi
402 403
403 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" 404 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
404 405
405 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ 406 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
406 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] 407 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
407 then 408 then
408 # these archs will always have "[Pp]rocessor" 409 # these archs will always have "[Pp]rocessor"
409 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" 410 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
410 411
411 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 412 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
412 then 413 then
413 # sparc always has "ncpus active" 414 # sparc always has "ncpus active"
414 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 415 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
415 416
416 elif [ "${ARCH}" = "alpha" ] 417 elif [ "${ARCH}" = "alpha" ]
417 then 418 then
418 # alpha has "cpus active", but only when compiled with SMP 419 # alpha has "cpus active", but only when compiled with SMP
419 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ] 420 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
420 then 421 then
421 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
422 else 423 else
423 jobs=2 424 jobs=2
424 fi 425 fi
425 426
426 elif [ "${ARCH}" = "ppc" ] 427 elif [ "${ARCH}" = "ppc" ]
427 then 428 then
428 # ppc has "processor", but only when compiled with SMP 429 # ppc has "processor", but only when compiled with SMP
429 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
430 then 431 then
440 # Make sure the number is valid ... 441 # Make sure the number is valid ...
441 if [ "${jobs}" -lt 1 ] 442 if [ "${jobs}" -lt 1 ]
442 then 443 then
443 jobs=1 444 jobs=1
444 fi 445 fi
445 446
446 if [ -n "${ADMINPARAM}" ] 447 if [ -n "${ADMINPARAM}" ]
447 then 448 then
448 if [ "${jobs}" -gt "${ADMINPARAM}" ] 449 if [ "${jobs}" -gt "${ADMINPARAM}" ]
449 then 450 then
450 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..." 451 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
451 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}" 452 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
452 else 453 else
453 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..." 454 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
454 export MAKEOPTS="${MAKEOPTS} -j${jobs}" 455 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
455 fi 456 fi
457 fi
458}
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}
456 fi 476 fi
457} 477}
458 478
459# Simplify/standardize adding users to the system 479# Simplify/standardize adding users to the system
460# vapier@gentoo.org 480# vapier@gentoo.org
470# groups: none 490# groups: none
471# extra: comment of 'added by portage for ${PN}' 491# extra: comment of 'added by portage for ${PN}'
472enewuser() { 492enewuser() {
473 # get the username 493 # get the username
474 local euser="$1"; shift 494 local euser="$1"; shift
475 if [ -z "${euser}" ] ; then 495 if [ -z "${euser}" ]
496 then
476 eerror "No username specified !" 497 eerror "No username specified !"
477 die "Cannot call enewuser without a username" 498 die "Cannot call enewuser without a username"
478 fi 499 fi
479 einfo "Adding user '${euser}' to your system ..."
480 500
481 # setup a file for testing usernames/groups 501 # setup a file for testing usernames/groups
482 local tmpfile="`mktemp -p ${T}`" 502 local tmpfile="`mymktemp ${T}`"
483 touch ${tmpfile}
484 chown ${euser} ${tmpfile} >& /dev/null 503 chown ${euser} ${tmpfile} >& /dev/null
485 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" 504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
486 505
487 # see if user already exists 506 # see if user already exists
488 if [ "${euser}" == "${realuser}" ] ; then 507 if [ "${euser}" == "${realuser}" ]
489 einfo "${euser} already exists on your system :)" 508 then
490 return 0 509 return 0
491 fi 510 fi
511 einfo "Adding user '${euser}' to your system ..."
492 512
493 # options to pass to useradd 513 # options to pass to useradd
494 local opts="" 514 local opts=
495 515
496 # handle uid 516 # handle uid
497 local euid="$1"; shift 517 local euid="$1"; shift
498 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then 518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then
499 if [ ${euid} -gt 0 ] ; then 520 if [ "${euid}" -gt 0 ]
521 then
500 opts="${opts} -u ${euid}" 522 opts="${opts} -u ${euid}"
501 else 523 else
502 eerror "Userid given but is not greater than 0 !" 524 eerror "Userid given but is not greater than 0 !"
503 die "${euid} is not a valid UID" 525 die "${euid} is not a valid UID"
504 fi 526 fi
507 fi 529 fi
508 einfo " - Userid: ${euid}" 530 einfo " - Userid: ${euid}"
509 531
510 # handle shell 532 # handle shell
511 local eshell="$1"; shift 533 local eshell="$1"; shift
512 if [ ! -z "${eshell}" ] ; then 534 if [ ! -z "${eshell}" ]
535 then
513 if [ ! -e ${eshell} ] ; then 536 if [ ! -e "${eshell}" ]
537 then
514 eerror "A shell was specified but it does not exist !" 538 eerror "A shell was specified but it does not exist !"
515 die "${eshell} does not exist" 539 die "${eshell} does not exist"
516 fi 540 fi
517 else 541 else
518 eshell=/bin/false 542 eshell="/bin/false"
519 fi 543 fi
520 einfo " - Shell: ${eshell}" 544 einfo " - Shell: ${eshell}"
521 opts="${opts} -s ${eshell}" 545 opts="${opts} -s ${eshell}"
522 546
523 # handle homedir 547 # handle homedir
524 local ehome="$1"; shift 548 local ehome="$1"; shift
525 if [ -z "${ehome}" ] ; then 549 if [ -z "${ehome}" ]
550 then
526 ehome=/dev/null 551 ehome="/dev/null"
527 fi 552 fi
528 einfo " - Home: ${ehome}" 553 einfo " - Home: ${ehome}"
529 opts="${opts} -d ${ehome}" 554 opts="${opts} -d ${ehome}"
530 555
531 # handle groups 556 # handle groups
532 local egroups="$1"; shift 557 local egroups="$1"; shift
533 if [ ! -z "${egroups}" ] ; then 558 if [ ! -z "${egroups}" ]
559 then
534 local realgroup 560 local realgroup=
535 local oldifs="${IFS}" 561 local oldifs="${IFS}"
536 export IFS="," 562 export IFS=","
537 for g in ${egroups} ; do 563 for g in ${egroups}
564 do
538 chgrp ${g} ${tmpfile} >& /dev/null 565 chgrp ${g} ${tmpfile} >& /dev/null
539 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
540 if [ "${g}" != "${realgroup}" ] ; then 567 if [ "${g}" != "${realgroup}" ]
568 then
541 eerror "You must add ${g} to the system first" 569 eerror "You must add ${g} to the system first"
542 die "${g} is not a valid GID" 570 die "${g} is not a valid GID"
543 fi 571 fi
544 done 572 done
545 export IFS="${oldifs}" 573 export IFS="${oldifs}"
549 fi 577 fi
550 einfo " - Groups: ${egroups}" 578 einfo " - Groups: ${egroups}"
551 579
552 # handle extra and add the user 580 # handle extra and add the user
553 local eextra="$@" 581 local eextra="$@"
554 local oldsandbox="${oldsandbox}" 582 local oldsandbox="${SANDBOX_ON}"
555 export SANDBOX_ON="0" 583 export SANDBOX_ON="0"
556 if [ -z "${eextra}" ] ; then 584 if [ -z "${eextra}" ]
585 then
557 useradd ${opts} ${euser} \ 586 useradd ${opts} ${euser} \
558 -c "added by portage for ${PN}" \ 587 -c "added by portage for ${PN}" \
559 || die "enewuser failed" 588 || die "enewuser failed"
560 else 589 else
561 einfo " - Extra: ${eextra}" 590 einfo " - Extra: ${eextra}"
562 useradd ${opts} ${euser} ${eextra} \ 591 useradd ${opts} ${euser} ${eextra} \
563 || die "enewuser failed" 592 || die "enewuser failed"
564 fi 593 fi
565 export SANDBOX_ON="${oldsandbox}" 594 export SANDBOX_ON="${oldsandbox}"
566 595
567 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then
568 einfo " - Creating ${ehome} in ${D}" 598 einfo " - Creating ${ehome} in ${D}"
569 dodir ${ehome} 599 dodir ${ehome}
570 fperms ${euser} ${ehome} 600 fowners ${euser} ${ehome}
601 fperms 755 ${ehome}
571 fi 602 fi
572} 603}
573 604
574# Simplify/standardize adding groups to the system 605# Simplify/standardize adding groups to the system
575# vapier@gentoo.org 606# vapier@gentoo.org
581# gid: next available (see groupadd(8)) 612# gid: next available (see groupadd(8))
582# extra: none 613# extra: none
583enewgroup() { 614enewgroup() {
584 # get the group 615 # get the group
585 local egroup="$1"; shift 616 local egroup="$1"; shift
586 if [ -z "${egroup}" ] ; then 617 if [ -z "${egroup}" ]
618 then
587 eerror "No group specified !" 619 eerror "No group specified !"
588 die "Cannot call enewgroup without a group" 620 die "Cannot call enewgroup without a group"
589 fi 621 fi
590 einfo "Adding group '${egroup}' to your system ..."
591 622
592 # setup a file for testing groupname 623 # setup a file for testing groupname
593 local tmpfile="`mktemp -p ${T}`" 624 local tmpfile="`mymktemp ${T}`"
594 touch ${tmpfile}
595 chgrp ${egroup} ${tmpfile} >& /dev/null 625 chgrp ${egroup} ${tmpfile} >& /dev/null
596 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
597 627
598 # see if group already exists 628 # see if group already exists
599 if [ "${egroup}" == "${realgroup}" ] ; then 629 if [ "${egroup}" == "${realgroup}" ]
600 einfo "${egroup} already exists on your system :)" 630 then
601 return 0 631 return 0
602 fi 632 fi
633 einfo "Adding group '${egroup}' to your system ..."
603 634
604 # options to pass to useradd 635 # options to pass to useradd
605 local opts="" 636 local opts=
606 637
607 # handle gid 638 # handle gid
608 local egid="$1"; shift 639 local egid="$1"; shift
609 if [ ! -z "${egid}" ] ; then 640 if [ ! -z "${egid}" ]
641 then
610 if [ ${egid} -gt 0 ] ; then 642 if [ "${egid}" -gt 0 ]
643 then
611 opts="${opts} -g ${egid}" 644 opts="${opts} -g ${egid}"
612 else 645 else
613 eerror "Groupid given but is not greater than 0 !" 646 eerror "Groupid given but is not greater than 0 !"
614 die "${egid} is not a valid GID" 647 die "${egid} is not a valid GID"
615 fi 648 fi
621 # handle extra 654 # handle extra
622 local eextra="$@" 655 local eextra="$@"
623 opts="${opts} ${eextra}" 656 opts="${opts} ${eextra}"
624 657
625 # add the group 658 # add the group
626 local oldsandbox="${oldsandbox}" 659 local oldsandbox="${SANDBOX_ON}"
627 export SANDBOX_ON="0" 660 export SANDBOX_ON="0"
628 groupadd ${opts} ${egroup} || die "enewgroup failed" 661 groupadd ${opts} ${egroup} || die "enewgroup failed"
629 export SANDBOX_ON="${oldsandbox}" 662 export SANDBOX_ON="${oldsandbox}"
630} 663}
631 664
632# Simple script to replace 'dos2unix' binaries 665# Simple script to replace 'dos2unix' binaries
633# vapier@gentoo.org 666# vapier@gentoo.org
634# 667#
635# edos2unix(file, <more files>...) 668# edos2unix(file, <more files>...)
636edos2unix() { 669edos2unix() {
637 for f in $@ ; do 670 for f in $@
671 do
638 cp ${f} ${T}/edos2unix 672 cp ${f} ${T}/edos2unix
639 sed 's/\r$//' ${T}/edos2unix > ${f} 673 sed 's/\r$//' ${T}/edos2unix > ${f}
640 done 674 done
641} 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 *)
712 type=
713 ;;
714 esac
715 fi
716 local desktop="${T}/${exec}.desktop"
717
718echo "[Desktop Entry]
719Encoding=UTF-8
720Version=0.9.2
721Name=${name}
722Type=Application
723Comment=${DESCRIPTION}
724Exec=${exec}
725Path=${path}
726Icon=${icon}
727Categories=Application;${type};" > ${desktop}
728
729 if [ -d "/usr/share/applications" ]
730 then
731 insinto /usr/share/applications
732 doins ${desktop}
733 fi
734
735 #if [ -d "/usr/share/gnome/apps" ]
736 #then
737 # insinto /usr/share/gnome/apps/Games
738 # doins ${desktop}
739 #fi
740
741 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
742 #then
743 # for ver in /usr/kde/*
744 # do
745 # insinto ${ver}/share/applnk/Games
746 # doins ${desktop}
747 # done
748 #fi
749
750 if [ -d "/usr/share/applnk" ]
751 then
752 insinto /usr/share/applnk/${type}
753 doins ${desktop}
754 fi
755
756 return 0
757}
758
759# new convenience patch wrapper function to eventually replace epatch(),
760# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
761# /usr/bin/patch
762# Features:
763# - bulk patch handling similar to epatch()'s
764# - automatic patch level detection like epatch()'s
765# - automatic patch uncompression like epatch()'s
766# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
767# manually instead
768# - once I decide it's production-ready, it'll be called from base_src_unpack
769# to handle $PATCHES to avoid defining src_unpack just to use xpatch
770
771# accepts zero or more parameters specifying patchfiles and/or patchdirs
772
773# known issues:
774# - only supports unified style patches (does anyone _really_ use anything
775# else?)
776# - because it doesn't use --dry-run there is a risk of it failing
777# to find the files to patch, ie detect the patchlevel, properly. It doesn't use
778# any of the backup heuristics that patch employs to discover a filename.
779# however, this isn't dangerous because if it works for the developer who's
780# writing the ebuild, it'll always work for the users, and if it doesn't,
781# then we'll fix it :-)
782# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
783xpatch() {
784
785 debug-print-function ${FUNCNAME} $*
786
787 local list=
788 local list2=
789 declare -i plevel
790
791 # parse patch sources
792 for x in $*
793 do
794 debug-print "${FUNCNAME}: parsing parameter ${x}"
795 if [ -f "${x}" ]
796 then
797 list="${list} ${x}"
798 elif [ -d "${x}" ]
799 then
800 # handles patchdirs like epatch() for now: no recursion.
801 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
802 # only patches with _$ARCH_ or _all_ in their filenames are applied.
803 for file in `ls -A ${x}`
804 do
805 debug-print "${FUNCNAME}: parsing in subdir: file ${file}"
806 if [ -f "${x}/${file}" -a "${file}" != "${file/_all_}" -o \
807 "${file}" != "${file/_$ARCH_}" ]
808 then
809 list2="${list2} ${x}/${file}"
810 fi
811 done
812 list="`echo ${list2} | sort` ${list}"
813 else
814 die "Couldn't find ${x}"
815 fi
816 done
817
818 debug-print "${FUNCNAME}: final list of patches: ${list}"
819
820 for x in ${list};
821 do
822 debug-print "${FUNCNAME}: processing ${x}"
823 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
824 case "`/usr/bin/file -b ${x}`" in
825 *gzip*)
826 patchfile="${T}/current.patch"
827 ungzip -c "${x}" > "${patchfile}"
828 ;;
829 *bzip2*)
830 patchfile="${T}/current.patch"
831 bunzip2 -c "${x}" > "${patchfile}"
832 ;;
833 *text*)
834 patchfile="${x}"
835 ;;
836 *)
837 die "Could not determine filetype of patch ${x}"
838 ;;
839 esac
840 debug-print "${FUNCNAME}: patchfile=${patchfile}"
841
842 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
843 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
844 debug-print "${FUNCNAME}: raw target=${target}"
845 # strip target down to the path/filename, remove leading +++
846 target="${target/+++ }"; target="${target%% *}"
847 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
848 # to discard them as well to calculate the correct patchlevel.
849 target="${target//\/\//\/}"
850 debug-print "${FUNCNAME}: stripped target=${target}"
851
852 # look for target
853 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
854 debug-print "${FUNCNAME}: looking in basedir=${basedir}"
855 cd "${basedir}"
856
857 # try stripping leading directories
858 target2="${target}"
859 plevel=0
860 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
861 while [ ! -f "${target2}" ]
862 do
863 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
864 plevel=$((plevel+1))
865 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
866 [ "${target2}" == "${target2/\/}" ] && break
867 done
868 test -f "${target2}" && break
869
870 # try stripping filename - needed to support patches creating new files
871 target2="${target%/*}"
872 plevel=0
873 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
874 while [ ! -d "${target2}" ]
875 do
876 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
877 plevel=$((plevel+1))
878 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
879 [ "${target2}" == "${target2/\/}" ] && break
880 done
881 test -d "${target2}" && break
882
883 done
884
885 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
886 || die "Could not determine patchlevel for ${x}"
887 debug-print "${FUNCNAME}: determined plevel=${plevel}"
888 # do the patching
889 ebegin "Applying patch ${x##*/}..."
890 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
891 || die "Failed to apply patch ${x}"
892 eend $?
893
894 done
895
896}
897
898# Unpack those pesky makeself generated files ...
899# They're shell scripts with the binary package tagged onto
900# the end of the archive. Loki utilized the format as does
901# many other game companies.
902#
903# Usage: unpack_makeself [file to unpack] [offset]
904# - If the file is not specified then unpack will utilize ${A}.
905# - If the offset is not specified then we will attempt to extract
906# the proper offset from the script itself.
907unpack_makeself() {
908 local src="$1"
909 local skip="$2"
910
911 if [ -z "${src}" ]
912 then
913 src="${DISTDIR}/${A}"
914 else
915 if [ -e "${DISTDIR}/${src}" ]
916 then
917 src="${DISTDIR}/${src}"
918 elif [ -e "${PWD}/${src}" ]
919 then
920 src="${PWD}/${src}"
921 elif [ -e "${src}" ]
922 then
923 src="${src}"
924 fi
925 fi
926 [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}"
927
928 local shrtsrc="`basename ${src}`"
929 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
930 if [ -z "${skip}" ]
931 then
932 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
933 local skip=0
934 case ${ver} in
935 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
936 skip=`grep -a ^skip= ${src} | cut -d= -f2`
937 ;;
938 2.0|2.0.1)
939 skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
940 ;;
941 2.1.1)
942 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
943 let skip="skip + 1"
944 ;;
945 2.1.2)
946 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
947 let skip="skip + 1"
948 ;;
949 2.1.3)
950 skip=`grep -a ^offset= ${src} | awk '{print $3}'`
951 let skip="skip + 1"
952 ;;
953 *)
954 eerror "I'm sorry, but I was unable to support the Makeself file."
955 eerror "The version I detected was '${ver}'."
956 eerror "Please file a bug about the file ${shrtsrc} at"
957 eerror "http://bugs.gentoo.org/ so that support can be added."
958 die "makeself version '${ver}' not supported"
959 ;;
960 esac
961 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
962 fi
963
964 # we do this because otherwise a failure in gzip will cause 0 bytes to be sent
965 # to tar which will make tar not extract anything and exit with 0
966 tail -n +${skip} ${src} | gzip -cd | tar -x --no-same-owner -f - 2>/dev/null
967 local pipestatus="${PIPESTATUS[*]}"
968 pipestatus="${pipestatus// }"
969 if [ "${pipestatus//0}" != "" ]
970 then
971 # maybe it isnt gzipped ... they usually are, but not always ...
972 tail -n +${skip} ${src} | tar -x --no-same-owner -f - \
973 || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})"
974 fi
975}
976
977# Display a license for user to accept.
978#
979# Usage: check_license [license]
980# - If the file is not specified then ${LICENSE} is used.
981check_license() {
982 local lic=$1
983 if [ -z "${lic}" ] ; then
984 lic="${PORTDIR}/licenses/${LICENSE}"
985 else
986 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
987 lic="${PORTDIR}/licenses/${src}"
988 elif [ -e "${PWD}/${src}" ] ; then
989 lic="${PWD}/${src}"
990 elif [ -e "${src}" ] ; then
991 lic="${src}"
992 fi
993 fi
994 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
995
996 # here is where we check for the licenses the user already
997 # accepted ... if we don't find a match, we make the user accept
998 local alic
999 for alic in ${ACCEPT_LICENSE} ; do
1000 [ "${alic}" == "*" ] && return 0
1001 [ "${alic}" == "${lic}" ] && return 0
1002 done
1003
1004 local licmsg="`mymktemp ${T}`"
1005 cat << EOF > ${licmsg}
1006**********************************************************
1007The following license outlines the terms of use of this
1008package. You MUST accept this license for installation to
1009continue. When you are done viewing, hit 'q'. If you
1010CTRL+C out of this, the install will not run!
1011**********************************************************
1012
1013EOF
1014 cat ${lic} >> ${licmsg}
1015 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1016 einfon "Do you accept the terms of this license? [yes/no] "
1017 read alic
1018 case ${alic} in
1019 yes|Yes|y|Y)
1020 return 0
1021 ;;
1022 *)
1023 echo;echo;echo
1024 eerror "You MUST accept the license to continue! Exiting!"
1025 die "Failed to accept license"
1026 ;;
1027 esac
1028}

Legend:
Removed from v.1.29  
changed lines
  Added in v.1.60

  ViewVC Help
Powered by ViewVC 1.1.20