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

Diff of /eclass/eutils.eclass

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

Revision 1.76 Revision 1.94
1# Copyright 1999-2004 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.76 2004/01/26 23:40:07 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.94 2004/08/13 15:39:40 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.
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
144 local SINGLE_PATCH="no" 144 local SINGLE_PATCH="no"
145 local x="" 145 local x=""
146 146
147 if [ "$#" -gt 1 ] 147 if [ "$#" -gt 1 ]
148 then 148 then
149 eerror "Invalid arguments to epatch()" 149 local m=""
150 die "Invalid arguments to epatch()" 150 einfo "${#} patches to apply..."
151 for m in "$@" ; do
152 epatch "${m}"
153 done
154 return 0
151 fi 155 fi
152 156
153 if [ -n "$1" -a -f "$1" ] 157 if [ -n "$1" -a -f "$1" ]
154 then 158 then
155 SINGLE_PATCH="yes" 159 SINGLE_PATCH="yes"
258 else 262 else
259 PATCH_TARGET="${x}" 263 PATCH_TARGET="${x}"
260 fi 264 fi
261 265
262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 267 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 268
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 269 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 270 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267 271
268 if [ "${PATCH_SUFFIX}" != "patch" ] 272 if [ "${PATCH_SUFFIX}" != "patch" ]
275 count=5 279 count=5
276 break 280 break
277 fi 281 fi
278 fi 282 fi
279 283
280 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 284 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 then 285 then
282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 286 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 287 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 288 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 289 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 290 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287 291
288 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 292 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289 293
290 if [ "$?" -ne 0 ] 294 if [ "$?" -ne 0 ]
291 then 295 then
292 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 296 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293 echo 297 echo
422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 426 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 else 427 else
424 jobs=2 428 jobs=2
425 fi 429 fi
426 430
427 elif [ "${ARCH}" = "ppc" ] 431 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
428 then 432 then
429 # ppc has "processor", but only when compiled with SMP 433 # ppc has "processor", but only when compiled with SMP
430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 434 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 then 435 then
432 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))" 436 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 else 437 else
434 jobs=2 438 jobs=2
435 fi 439 fi
440 elif [ "${ARCH}" = "s390" ]
441 then
442 # s390 has "# processors : "
443 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
436 else 444 else
437 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))" 445 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 die "Unknown ARCH -- ${ARCH}!" 446 die "Unknown ARCH -- ${ARCH}!"
439 fi 447 fi
440 448
456 fi 464 fi
457 fi 465 fi
458} 466}
459 467
460# Cheap replacement for when debianutils (and thus mktemp) 468# Cheap replacement for when debianutils (and thus mktemp)
461# do not exist on the users system 469# does not exist on the users system
462# vapier@gentoo.org 470# vapier@gentoo.org
463# 471#
464# Takes just 1 parameter (the directory to create tmpfile in) 472# Takes just 1 parameter (the directory to create tmpfile in)
465mymktemp() { 473mymktemp() {
466 local topdir="$1" 474 local topdir="$1"
471 mktemp -p ${topdir} 479 mktemp -p ${topdir}
472 else 480 else
473 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 481 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474 touch ${tmp} 482 touch ${tmp}
475 echo ${tmp} 483 echo ${tmp}
484 fi
485}
486
487# Small wrapper for getent (Linux) and nidump (Mac OS X)
488# used in enewuser()/enewgroup()
489# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
490#
491# egetent(database, key)
492egetent() {
493 if [ "${ARCH}" == "macos" ] ; then
494 case "$2" in
495 *[!0-9]*) # Non numeric
496 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
497 ;;
498 *) # Numeric
499 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
500 ;;
501 esac
502 else
503 getent $1 $2
476 fi 504 fi
477} 505}
478 506
479# Simplify/standardize adding users to the system 507# Simplify/standardize adding users to the system
480# vapier@gentoo.org 508# vapier@gentoo.org
496 then 524 then
497 eerror "No username specified !" 525 eerror "No username specified !"
498 die "Cannot call enewuser without a username" 526 die "Cannot call enewuser without a username"
499 fi 527 fi
500 528
501 # setup a file for testing usernames/groups
502 local tmpfile="`mymktemp ${T}`"
503 chown ${euser} ${tmpfile} >& /dev/null
504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
505
506 # see if user already exists 529 # lets see if the username already exists
507 if [ "${euser}" == "${realuser}" ] 530 if [ "${euser}" == "`egetent passwd \"${euser}\" | cut -d: -f1`" ]
508 then 531 then
509 return 0 532 return 0
510 fi 533 fi
511 einfo "Adding user '${euser}' to your system ..." 534 einfo "Adding user '${euser}' to your system ..."
512 535
517 local euid="$1"; shift 540 local euid="$1"; shift
518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] 541 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then 542 then
520 if [ "${euid}" -gt 0 ] 543 if [ "${euid}" -gt 0 ]
521 then 544 then
522 opts="${opts} -u ${euid}" 545 if [ ! -z "`egetent passwd ${euid}`" ]
546 then
547 euid="next"
548 fi
523 else 549 else
524 eerror "Userid given but is not greater than 0 !" 550 eerror "Userid given but is not greater than 0 !"
525 die "${euid} is not a valid UID" 551 die "${euid} is not a valid UID"
526 fi 552 fi
527 else 553 else
528 euid="next available" 554 euid="next"
555 fi
556 if [ "${euid}" == "next" ]
557 then
558 local pwrange
559 if [ "${ARCH}" == "macos" ] ; then
560 pwrange="`jot 898 101`"
561 else
562 pwrange="`seq 101 999`"
529 fi 563 fi
564 for euid in ${pwrange} ; do
565 [ -z "`egetent passwd ${euid}`" ] && break
566 done
567 fi
568 opts="${opts} -u ${euid}"
530 einfo " - Userid: ${euid}" 569 einfo " - Userid: ${euid}"
531 570
532 # handle shell 571 # handle shell
533 local eshell="$1"; shift 572 local eshell="$1"; shift
534 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] 573 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
555 594
556 # handle groups 595 # handle groups
557 local egroups="$1"; shift 596 local egroups="$1"; shift
558 if [ ! -z "${egroups}" ] 597 if [ ! -z "${egroups}" ]
559 then 598 then
560 local realgroup=
561 local oldifs="${IFS}" 599 local oldifs="${IFS}"
562 export IFS="," 600 export IFS=","
563 for g in ${egroups} 601 for g in ${egroups}
564 do 602 do
565 chgrp ${g} ${tmpfile} >& /dev/null 603 if [ -z "`egetent group \"${g}\"`" ]
566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
567 if [ "${g}" != "${realgroup}" ]
568 then 604 then
569 eerror "You must add ${g} to the system first" 605 eerror "You must add group ${g} to the system first"
570 die "${g} is not a valid GID" 606 die "${g} is not a valid GID"
571 fi 607 fi
572 done 608 done
573 export IFS="${oldifs}" 609 export IFS="${oldifs}"
574 opts="${opts} -g ${egroups}" 610 opts="${opts} -g ${egroups}"
579 615
580 # handle extra and add the user 616 # handle extra and add the user
581 local eextra="$@" 617 local eextra="$@"
582 local oldsandbox="${SANDBOX_ON}" 618 local oldsandbox="${SANDBOX_ON}"
583 export SANDBOX_ON="0" 619 export SANDBOX_ON="0"
620 if [ "${ARCH}" == "macos" ];
621 then
622 ### Make the user
584 if [ -z "${eextra}" ] 623 if [ -z "${eextra}" ]
585 then 624 then
625 dscl . create /users/${euser} uid ${euid}
626 dscl . create /users/${euser} shell ${eshell}
627 dscl . create /users/${euser} home ${ehome}
628 dscl . create /users/${euser} realname "added by portage for ${PN}"
629 ### Add the user to the groups specified
630 for g in ${egroups}
631 do
632 dscl . merge /groups/${g} users ${euser}
633 done
634 else
635 einfo "Extra options are not supported on macos yet"
636 einfo "Please report the ebuild along with the info below"
637 einfo "eextra: ${eextra}"
638 die "Required function missing"
639 fi
640 else
641 if [ -z "${eextra}" ]
642 then
586 useradd ${opts} ${euser} \ 643 useradd ${opts} ${euser} \
587 -c "added by portage for ${PN}" \ 644 -c "added by portage for ${PN}" \
588 || die "enewuser failed" 645 || die "enewuser failed"
589 else 646 else
590 einfo " - Extra: ${eextra}" 647 einfo " - Extra: ${eextra}"
591 useradd ${opts} ${euser} ${eextra} \ 648 useradd ${opts} ${euser} ${eextra} \
592 || die "enewuser failed" 649 || die "enewuser failed"
650 fi
593 fi 651 fi
594 export SANDBOX_ON="${oldsandbox}" 652 export SANDBOX_ON="${oldsandbox}"
595 653
596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ] 654 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then 655 then
618 then 676 then
619 eerror "No group specified !" 677 eerror "No group specified !"
620 die "Cannot call enewgroup without a group" 678 die "Cannot call enewgroup without a group"
621 fi 679 fi
622 680
623 # setup a file for testing groupname
624 local tmpfile="`mymktemp ${T}`"
625 chgrp ${egroup} ${tmpfile} >& /dev/null
626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
627
628 # see if group already exists 681 # see if group already exists
629 if [ "${egroup}" == "${realgroup}" ] 682 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
630 then 683 then
631 return 0 684 return 0
632 fi 685 fi
633 einfo "Adding group '${egroup}' to your system ..." 686 einfo "Adding group '${egroup}' to your system ..."
634 687
639 local egid="$1"; shift 692 local egid="$1"; shift
640 if [ ! -z "${egid}" ] 693 if [ ! -z "${egid}" ]
641 then 694 then
642 if [ "${egid}" -gt 0 ] 695 if [ "${egid}" -gt 0 ]
643 then 696 then
697 if [ -z "`egetent group ${egid}`" ]
698 then
699 if [ "${ARCH}" == "macos" ] ; then
700 opts="${opts} ${egid}"
701 else
644 opts="${opts} -g ${egid}" 702 opts="${opts} -g ${egid}"
703 fi
704 else
705 egid="next available; requested gid taken"
706 fi
645 else 707 else
646 eerror "Groupid given but is not greater than 0 !" 708 eerror "Groupid given but is not greater than 0 !"
647 die "${egid} is not a valid GID" 709 die "${egid} is not a valid GID"
648 fi 710 fi
649 else 711 else
656 opts="${opts} ${eextra}" 718 opts="${opts} ${eextra}"
657 719
658 # add the group 720 # add the group
659 local oldsandbox="${SANDBOX_ON}" 721 local oldsandbox="${SANDBOX_ON}"
660 export SANDBOX_ON="0" 722 export SANDBOX_ON="0"
723 if [ "${ARCH}" == "macos" ];
724 then
725 if [ ! -z "${eextra}" ];
726 then
727 einfo "Extra options are not supported on macos yet"
728 einfo "Please report the ebuild along with the info below"
729 einfo "eextra: ${eextra}"
730 die "Required function missing"
731 fi
732
733 # If we need the next available
734 case ${egid} in
735 *[!0-9]*) # Non numeric
736 for egid in `jot 898 101`; do
737 [ -z "`egetent group ${egid}`" ] && break
738 done
739 esac
740 dscl . create /groups/${egroup} gid ${egid}
741 dscl . create /groups/${egroup} passwd '*'
742 else
661 groupadd ${opts} ${egroup} || die "enewgroup failed" 743 groupadd ${opts} ${egroup} || die "enewgroup failed"
744 fi
662 export SANDBOX_ON="${oldsandbox}" 745 export SANDBOX_ON="${oldsandbox}"
663} 746}
664 747
665# Simple script to replace 'dos2unix' binaries 748# Simple script to replace 'dos2unix' binaries
666# vapier@gentoo.org 749# vapier@gentoo.org
687# name: the name that will show up in the menu 770# name: the name that will show up in the menu
688# icon: give your little like a pretty little icon ... 771# icon: give your little like a pretty little icon ...
689# this can be relative (to /usr/share/pixmaps) or 772# this can be relative (to /usr/share/pixmaps) or
690# a full path to an icon 773# a full path to an icon
691# type: what kind of application is this ? for categories: 774# type: what kind of application is this ? for categories:
692# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html 775# http://www.freedesktop.org/standards/menu-spec/
693# path: if your app needs to startup in a specific dir 776# path: if your app needs to startup in a specific dir
694make_desktop_entry() { 777make_desktop_entry() {
695 [ -z "$1" ] && eerror "You must specify the executable" && return 1 778 [ -z "$1" ] && eerror "You must specify the executable" && return 1
696 779
697 local exec="${1}" 780 local exec="${1}"
698 local name="${2:-${PN}}" 781 local name="${2:-${PN}}"
699 local icon="${3:-${PN}.png}" 782 local icon="${3:-${PN}.png}"
700 local type="${4}" 783 local type="${4}"
784 local subdir="${6}"
701 local path="${5:-${GAMES_PREFIX}}" 785 local path="${5:-${GAMES_PREFIX}}"
702 if [ -z "${type}" ] 786 if [ -z "${type}" ]
703 then 787 then
704 case ${CATEGORY} in 788 case ${CATEGORY} in
705 "app-emulation") 789 "app-emulation")
706 type=Emulator 790 type=Emulator
791 subdir="Emulation"
707 ;; 792 ;;
708 "games-"*) 793 "games-"*)
709 type=Game 794 type=Game
795 subdir="Games"
710 ;; 796 ;;
711 "net-"*) 797 "net-"*)
712 type=Network; 798 type=Network
799 subdir="${type}"
713 ;; 800 ;;
714 *) 801 *)
715 type= 802 type=
803 subdir=
716 ;; 804 ;;
717 esac 805 esac
718 fi 806 fi
719 local desktop="${T}/${exec}.desktop" 807 local desktop="${T}/${exec}.desktop"
720 808
750 # done 838 # done
751 #fi 839 #fi
752 840
753 if [ -d "/usr/share/applnk" ] 841 if [ -d "/usr/share/applnk" ]
754 then 842 then
755 insinto /usr/share/applnk/${type} 843 insinto /usr/share/applnk/${subdir}
756 doins ${desktop} 844 doins ${desktop}
757 fi 845 fi
758 846
759 return 0 847 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} 848}
900 849
901# for internal use only (unpack_pdv and unpack_makeself) 850# for internal use only (unpack_pdv and unpack_makeself)
902find_unpackable_file() { 851find_unpackable_file() {
903 local src="$1" 852 local src="$1"
1071 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf - 1020 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
1072 ;; 1021 ;;
1073 gzip*) 1022 gzip*)
1074 tail -n +${skip} ${src} | tar --no-same-owner -xzf - 1023 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
1075 ;; 1024 ;;
1025 compress*)
1026 tail -n +${skip} ${src} | gunzip | tar --no-same-owner -xf -
1027 ;;
1076 *) 1028 *)
1029 eerror "Unknown filetype \"${filetype}\" ?"
1077 false 1030 false
1078 ;; 1031 ;;
1079 esac 1032 esac
1080 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1033 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1081} 1034}
1239# remember, you can only go forward in the cd chain, you can't go back. 1192# remember, you can only go forward in the cd chain, you can't go back.
1240cdrom_load_next_cd() { 1193cdrom_load_next_cd() {
1241 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1)) 1194 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1242 local var= 1195 local var=
1243 1196
1197 if [ ! -z "${CD_ROOT}" ] ; then
1198 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1199 return
1200 fi
1201
1244 unset CDROM_ROOT 1202 unset CDROM_ROOT
1245 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1203 var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1246 if [ -z "${!var}" ] ; then 1204 if [ -z "${!var}" ] ; then
1247 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1205 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1248 cdrom_locate_file_on_cd ${!var} 1206 cdrom_locate_file_on_cd ${!var}
1296 einfo "or hit CTRL+C to abort the emerge." 1254 einfo "or hit CTRL+C to abort the emerge."
1297 read 1255 read
1298 fi 1256 fi
1299 done 1257 done
1300} 1258}
1259
1260# Make sure that LINGUAS only contains languages that
1261# a package can support
1262#
1263# usage: strip-linguas <allow LINGUAS>
1264# strip-linguas -i <directories of .po files>
1265# strip-linguas -u <directories of .po files>
1266#
1267# The first form allows you to specify a list of LINGUAS.
1268# The -i builds a list of po files found in all the
1269# directories and uses the intersection of the lists.
1270# The -u builds a list of po files found in all the
1271# directories and uses the union of the lists.
1272strip-linguas() {
1273 local ls newls
1274 if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then
1275 local op="$1"; shift
1276 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1277 local d f
1278 for d in "$@" ; do
1279 if [ "${op}" == "-u" ] ; then
1280 newls="${ls}"
1281 else
1282 newls=""
1283 fi
1284 for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1285 if [ "${op}" == "-i" ] ; then
1286 [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}"
1287 else
1288 [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}"
1289 fi
1290 done
1291 ls="${newls}"
1292 done
1293 ls="${ls//.po}"
1294 else
1295 ls="$@"
1296 fi
1297
1298 ls=" ${ls} "
1299 newls=""
1300 for f in ${LINGUAS} ; do
1301 if [ "${ls/ ${f} /}" != "${ls}" ] ; then
1302 nl="${newls} ${f}"
1303 else
1304 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1305 fi
1306 done
1307 if [ -z "${newls}" ] ; then
1308 unset LINGUAS
1309 else
1310 export LINGUAS="${newls}"
1311 fi
1312}

Legend:
Removed from v.1.76  
changed lines
  Added in v.1.94

  ViewVC Help
Powered by ViewVC 1.1.20