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

Diff of /eclass/eutils.eclass

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

Revision 1.26 Revision 1.41
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.26 2003/03/06 20:35:26 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.41 2003/07/14 04:47:17 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="$DEPEND !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
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
94# List of patches not to apply. Not this is only file names, 94# List of patches not to apply. Not this is only file names,
95# and not the full path .. 95# and not the full path ..
96EPATCH_EXCLUDE="" 96EPATCH_EXCLUDE=""
97# Change the printed message for a single patch. 97# Change the printed message for a single patch.
98EPATCH_SINGLE_MSG="" 98EPATCH_SINGLE_MSG=""
99# Force applying bulk patches even if not following the style:
100#
101# ??_${ARCH}_foo.${EPATCH_SUFFIX}
102#
103EPATCH_FORCE="no"
99 104
100# This function is for bulk patching, or in theory for just one 105# This function is for bulk patching, or in theory for just one
101# or two patches. 106# or two patches.
102# 107#
103# It should work with .bz2, .gz, .zip and plain text patches. 108# It should work with .bz2, .gz, .zip and plain text patches.
145 fi 150 fi
146 151
147 if [ -n "$1" -a -f "$1" ] 152 if [ -n "$1" -a -f "$1" ]
148 then 153 then
149 SINGLE_PATCH="yes" 154 SINGLE_PATCH="yes"
150 155
151 local EPATCH_SOURCE="$1" 156 local EPATCH_SOURCE="$1"
152 local EPATCH_SUFFIX="${1##*\.}" 157 local EPATCH_SUFFIX="${1##*\.}"
153 158
154 elif [ -n "$1" -a -d "$1" ] 159 elif [ -n "$1" -a -d "$1" ]
155 then 160 then
161 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
162 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
163 then
164 local EPATCH_SOURCE="$1/*"
165 else
156 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 166 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
167 fi
157 else 168 else
158 if [ ! -d ${EPATCH_SOURCE} ] 169 if [ ! -d ${EPATCH_SOURCE} ]
159 then 170 then
160 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 171 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
161 then 172 then
167 eerror 178 eerror
168 eerror " ${EPATCH_SOURCE}" 179 eerror " ${EPATCH_SOURCE}"
169 echo 180 echo
170 die "Cannot find \$EPATCH_SOURCE!" 181 die "Cannot find \$EPATCH_SOURCE!"
171 fi 182 fi
172 183
173 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
174 fi 185 fi
175 186
176 case ${EPATCH_SUFFIX##*\.} in 187 case ${EPATCH_SUFFIX##*\.} in
177 bz2) 188 bz2)
201 # New ARCH dependant patch naming scheme... 212 # New ARCH dependant patch naming scheme...
202 # 213 #
203 # ???_arch_foo.patch 214 # ???_arch_foo.patch
204 # 215 #
205 if [ -f ${x} ] && \ 216 if [ -f ${x} ] && \
206 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 217 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
218 [ "${EPATCH_FORCE}" = "yes" ])
207 then 219 then
208 local count=0 220 local count=0
209 local popts="${EPATCH_OPTS}" 221 local popts="${EPATCH_OPTS}"
210 222
211 if [ -n "${EPATCH_EXCLUDE}" ] 223 if [ -n "${EPATCH_EXCLUDE}" ]
213 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 225 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
214 then 226 then
215 continue 227 continue
216 fi 228 fi
217 fi 229 fi
218 230
219 if [ "${SINGLE_PATCH}" = "yes" ] 231 if [ "${SINGLE_PATCH}" = "yes" ]
220 then 232 then
221 if [ -n "${EPATCH_SINGLE_MSG}" ] 233 if [ -n "${EPATCH_SINGLE_MSG}" ]
222 then 234 then
223 einfo "${EPATCH_SINGLE_MSG}" 235 einfo "${EPATCH_SINGLE_MSG}"
243 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 255 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 else 257 else
246 PATCH_TARGET="${x}" 258 PATCH_TARGET="${x}"
247 fi 259 fi
248 260
249 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 261 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
250 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 262 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
251 263
252 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 264 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
254 266
255 if [ "${PATCH_SUFFIX}" != "patch" ] 267 if [ "${PATCH_SUFFIX}" != "patch" ]
256 then 268 then
261 #die "Could not extract patch!" 273 #die "Could not extract patch!"
262 count=5 274 count=5
263 break 275 break
264 fi 276 fi
265 fi 277 fi
266 278
267 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 279 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
268 then 280 then
269 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 281 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
270 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
271 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 #die "Real world sux compared to the dreamworld!" 295 #die "Real world sux compared to the dreamworld!"
284 count=5 296 count=5
285 fi 297 fi
286 298
287 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 299 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
288 300
289 break 301 break
290 fi 302 fi
291 303
292 count=$((count + 1)) 304 count=$((count + 1))
293 done 305 done
387 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`" 399 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
388 ADMINPARAM="${ADMINPARAM/-j}" 400 ADMINPARAM="${ADMINPARAM/-j}"
389 fi 401 fi
390 402
391 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" 403 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
392 404
393 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ 405 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
394 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] 406 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ]
395 then 407 then
396 # these archs will always have "[Pp]rocessor" 408 # these archs will always have "[Pp]rocessor"
397 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" 409 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
398 410
399 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 411 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
400 then 412 then
401 # sparc always has "ncpus active" 413 # sparc always has "ncpus active"
402 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 414 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
403 415
404 elif [ "${ARCH}" = "alpha" ] 416 elif [ "${ARCH}" = "alpha" ]
405 then 417 then
406 # alpha has "cpus active", but only when compiled with SMP 418 # alpha has "cpus active", but only when compiled with SMP
407 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ] 419 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
408 then 420 then
409 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 421 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
410 else 422 else
411 jobs=2 423 jobs=2
412 fi 424 fi
413 425
414 elif [ "${ARCH}" = "ppc" ] 426 elif [ "${ARCH}" = "ppc" ]
415 then 427 then
416 # ppc has "processor", but only when compiled with SMP 428 # ppc has "processor", but only when compiled with SMP
417 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 429 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
418 then 430 then
428 # Make sure the number is valid ... 440 # Make sure the number is valid ...
429 if [ "${jobs}" -lt 1 ] 441 if [ "${jobs}" -lt 1 ]
430 then 442 then
431 jobs=1 443 jobs=1
432 fi 444 fi
433 445
434 if [ -n "${ADMINPARAM}" ] 446 if [ -n "${ADMINPARAM}" ]
435 then 447 then
436 if [ "${jobs}" -gt "${ADMINPARAM}" ] 448 if [ "${jobs}" -gt "${ADMINPARAM}" ]
437 then 449 then
438 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..." 450 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
450# enewuser(username, uid, shell, homedir, groups, extra options) 462# enewuser(username, uid, shell, homedir, groups, extra options)
451# 463#
452# Default values if you do not specify any: 464# Default values if you do not specify any:
453# username: REQUIRED ! 465# username: REQUIRED !
454# uid: next available (see useradd(8)) 466# uid: next available (see useradd(8))
467# note: pass -1 to get default behavior
455# shell: /bin/false 468# shell: /bin/false
456# homedir: /dev/null 469# homedir: /dev/null
457# groups: none 470# groups: none
458# extra: comment of 'added by portage for ${PN}' 471# extra: comment of 'added by portage for ${PN}'
459enewuser() { 472enewuser() {
480 # options to pass to useradd 493 # options to pass to useradd
481 local opts="" 494 local opts=""
482 495
483 # handle uid 496 # handle uid
484 local euid="$1"; shift 497 local euid="$1"; shift
485 if [ ! -z "${euid}" ] ; then 498 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then
486 if [ ${euid} -gt 0 ] ; then 499 if [ ${euid} -gt 0 ] ; then
487 opts="${opts} -u ${euid}" 500 opts="${opts} -u ${euid}"
488 else 501 else
489 eerror "Userid given but is not greater than 0 !" 502 eerror "Userid given but is not greater than 0 !"
490 die "${euid} is not a valid UID" 503 die "${euid} is not a valid UID"
536 fi 549 fi
537 einfo " - Groups: ${egroups}" 550 einfo " - Groups: ${egroups}"
538 551
539 # handle extra and add the user 552 # handle extra and add the user
540 local eextra="$@" 553 local eextra="$@"
541 local oldsandbox="${oldsandbox}" 554 local oldsandbox=${SANDBOX_ON}
542 export SANDBOX_ON="0" 555 export SANDBOX_ON="0"
543 if [ -z "${eextra}" ] ; then 556 if [ -z "${eextra}" ] ; then
544 useradd ${opts} ${euser} \ 557 useradd ${opts} ${euser} \
545 -c "added by portage for ${PN}" \ 558 -c "added by portage for ${PN}" \
546 || die "enewuser failed" 559 || die "enewuser failed"
547 else 560 else
548 einfo " - Extra: ${eextra}" 561 einfo " - Extra: ${eextra}"
549 useradd ${opts} ${euser} ${eextra} \ 562 useradd ${opts} ${euser} ${eextra} \
550 || die "enewuser failed" 563 || die "enewuser failed"
551 fi 564 fi
552 export SANDBOX_ON="${oldsandbox}" 565 export SANDBOX_ON="${oldsandbox}"
553 566
554 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 567 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then
555 einfo " - Creating ${ehome} in ${D}" 568 einfo " - Creating ${ehome} in ${D}"
556 dodir ${ehome} 569 dodir ${ehome}
557 fperms ${euser} ${ehome} 570 fowners ${euser} ${ehome}
571 fperms 755 ${ehome}
558 fi 572 fi
559} 573}
560 574
561# Simplify/standardize adding groups to the system 575# Simplify/standardize adding groups to the system
562# vapier@gentoo.org 576# vapier@gentoo.org
608 # handle extra 622 # handle extra
609 local eextra="$@" 623 local eextra="$@"
610 opts="${opts} ${eextra}" 624 opts="${opts} ${eextra}"
611 625
612 # add the group 626 # add the group
613 local oldsandbox="${oldsandbox}" 627 local oldsandbox=${SANDBOX_ON}
614 export SANDBOX_ON="0" 628 export SANDBOX_ON="0"
615 groupadd ${opts} ${egroup} || die "enewgroup failed" 629 groupadd ${opts} ${egroup} || die "enewgroup failed"
616 export SANDBOX_ON="${oldsandbox}" 630 export SANDBOX_ON="${oldsandbox}"
617} 631}
618 632
620# vapier@gentoo.org 634# vapier@gentoo.org
621# 635#
622# edos2unix(file, <more files>...) 636# edos2unix(file, <more files>...)
623edos2unix() { 637edos2unix() {
624 for f in $@ ; do 638 for f in $@ ; do
625 cp ${f} ${T}/ 639 cp ${f} ${T}/edos2unix
626 sed 's/\r$//' ${T}/${f} > ${f} 640 sed 's/\r$//' ${T}/edos2unix > ${f}
627 done 641 done
628} 642}
643
644# Make a desktop file !
645# Great for making those icons in kde/gnome startmenu !
646# Amaze your friends ! Get the women ! Join today !
647# gnome2 /usr/share/applications
648# gnome1 /usr/share/gnome/apps/
649# KDE ${KDEDIR}/share/applnk /usr/share/applnk
650#
651# make_desktop_entry(<binary>, [name], [icon], [type], [path])
652#
653# binary: what binary does the app run with ?
654# name: the name that will show up in the menu
655# icon: give your little like a pretty little icon ...
656# this can be relative (to /usr/share/pixmaps) or
657# a full path to an icon
658# type: what kind of application is this ? for categories:
659# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
660# path: if your app needs to startup in a specific dir
661make_desktop_entry() {
662 [ -z "$1" ] && eerror "You must specify the executable" && return 1
663
664 local exec=${1}
665 local name=${2:-${PN}}
666 local icon=${3:-${PN}.png}
667 local type=${4}
668 local path=${5:-${GAMES_PREFIX}}
669 if [ -z "${type}" ] ; then
670 case ${CATEGORY} in
671 app-emulation) type=Emulator ;;
672 app-games) type=Game ;;
673 *) type="" ;;
674 esac
675 fi
676 local desktop=${T}/${exec}.desktop
677
678echo "[Desktop Entry]
679Encoding=UTF-8
680Version=0.9.2
681Name=${name}
682Type=Application
683Comment=${DESCRIPTION}
684Exec=${exec}
685Path=${path}
686Icon=${icon}
687Categories=Application;${type};" > ${desktop}
688
689 if [ -d /usr/share/applications ] ; then
690 insinto /usr/share/applications
691 doins ${desktop}
692 fi
693
694 #if [ -d /usr/share/gnome/apps ] ; then
695 # insinto /usr/share/gnome/apps/Games
696 # doins ${desktop}
697 #fi
698
699 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ] ; then
700 # for ver in /usr/kde/* ; do
701 # insinto ${ver}/share/applnk/Games
702 # doins ${desktop}
703 # done
704 #fi
705
706 if [ -d /usr/share/applnk ] ; then
707 insinto /usr/share/applnk/${type}
708 doins ${desktop}
709 fi
710
711 return 0
712}
713
714# new convenience patch wrapper function to eventually replace epatch(),
715# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
716# /usr/bin/patch
717# Features:
718# - bulk patch handling similar to epatch()'s
719# - automatic patch level detection like epatch()'s
720# - automatic patch uncompression like epatch()'s
721# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
722# manually instead
723# - once I decide it's production-ready, it'll be called from base_src_unpack
724# to handle $PATCHES to avoid defining src_unpack just to use xpatch
725
726# accepts zero or more parameters specifying patchfiles and/or patchdirs
727
728# known issues:
729# - only supports unified style patches (does anyone _really_ use anything
730# else?)
731# - because it doesn't use --dry-run there is a risk of it failing
732# to find the files to patch, ie detect the patchlevel, properly. It doesn't use
733# any of the backup heuristics that patch employs to discover a filename.
734# however, this isn't dangerous because if it works for the developer who's
735# writing the ebuild, it'll always work for the users, and if it doesn't,
736# then we'll fix it :-)
737# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
738xpatch() {
739
740 debug-print-function $FUNCNAME $*
741
742 local list=""
743 local list2=""
744 declare -i plevel
745
746 # parse patch sources
747 for x in $*; do
748 debug-print "$FUNCNAME: parsing parameter $x"
749 if [ -f "$x" ]; then
750 list="$list $x"
751 elif [ -d "$x" ]; then
752 # handles patchdirs like epatch() for now: no recursion.
753 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
754 # only patches with _$ARCH_ or _all_ in their filenames are applied.
755 for file in `ls -A $x`; do
756 debug-print "$FUNCNAME: parsing in subdir: file $file"
757 if [ -f "$x/$file" ] && [ "${file}" != "${file/_all_}" -o "${file}" != "${file/_$ARCH_}" ]; then
758 list2="$list2 $x/$file"
759 fi
760 done
761 list="`echo $list2 | sort` $list"
762 else
763 die "Couldn't find $x"
764 fi
765 done
766
767 debug-print "$FUNCNAME: final list of patches: $list"
768
769 for x in $list; do
770 debug-print "$FUNCNAME: processing $x"
771 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
772 case "`/usr/bin/file -b $x`" in
773 *gzip*) patchfile="${T}/current.patch"; ungzip -c "$x" > "${patchfile}";;
774 *bzip2*) patchfile="${T}/current.patch"; bunzip2 -c "$x" > "${patchfile}";;
775 *text*) patchfile="$x";;
776 *) die "Could not determine filetype of patch $x";;
777 esac
778 debug-print "$FUNCNAME: patchfile=$patchfile"
779
780 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
781 target="`/bin/grep -m 1 '^+++ ' $patchfile`"
782 debug-print "$FUNCNAME: raw target=$target"
783 # strip target down to the path/filename, remove leading +++
784 target="${target/+++ }"; target="${target%% *}"
785 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
786 # to discard them as well to calculate the correct patchlevel.
787 target="${target//\/\//\/}"
788 debug-print "$FUNCNAME: stripped target=$target"
789
790 # look for target
791 for basedir in "$S" "$WORKDIR" "${PWD}"; do
792 debug-print "$FUNCNAME: looking in basedir=$basedir"
793 cd "$basedir"
794
795 # try stripping leading directories
796 target2="$target"
797 plevel=0
798 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
799 while [ ! -f "$target2" ]; do
800 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
801 plevel=plevel+1
802 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
803 [ "$target2" == "${target2/\/}" ] && break
804 done
805 test -f "$target2" && break
806
807 # try stripping filename - needed to support patches creating new files
808 target2="${target%/*}"
809 plevel=0
810 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
811 while [ ! -d "$target2" ]; do
812 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
813 plevel=plevel+1
814 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
815 [ "$target2" == "${target2/\/}" ] && break
816 done
817 test -d "$target2" && break
818
819 done
820
821 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" || die "Could not determine patchlevel for $x"
822 debug-print "$FUNCNAME: determined plevel=$plevel"
823 # do the patching
824 ebegin "Applying patch ${x##*/}..."
825 /usr/bin/patch -p$plevel < "$patchfile" > /dev/null || die "Failed to apply patch $x"
826 eend $?
827
828 done
829
830}
831
832# Unpack those pesky makeself generated files ...
833# They're shell scripts with the binary package tagged onto
834# the end of the archive. Loki utilized the format as does
835# many other game companies.
836#
837# Usage: unpack_makeself [file to unpack] [offset]
838# - If the file is not specified then unpack will utilize ${A}.
839# - If the offset is not specified then we will attempt to extract
840# the proper offset from the script itself.
841unpack_makeself() {
842 local src=$1
843 local skip=$2
844
845 [ -z "${src}" ] && src=${A}
846 [ -e ./${src} ] \
847 && src=${PWD}/${src} \
848 || src=${DISTDIR}/${src}
849 local shrtsrc=`basename ${src}`
850 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
851 if [ -z "${skip}" ] ; then
852 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
853 local skip=0
854 case ${ver} in
855 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
856 skip=`grep -a ^skip= ${src} | cut -d= -f2`
857 ;;
858 2.0|2.0.1)
859 skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
860 ;;
861 2.1.1)
862 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
863 let skip="skip + 1"
864 ;;
865 *)
866 eerror "I'm sorry, but I was unable to support the Makeself file."
867 eerror "The version I detected was '${ver}'."
868 eerror "Please file a bug about the file ${shrtsrc} at"
869 eerror "http://bugs.gentoo.org/ so that support can be added."
870 die "makeself version '${ver}' not supported"
871 ;;
872 esac
873 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
874 fi
875
876 # we do this because otherwise a failure in gzip will cause 0 bytes to be sent
877 # to tar which will make tar not extract anything and exit with 0
878 local out="`tail +${skip} ${src} | gzip -cd | tar -x --no-same-owner -v -f -`"
879 [ -z "${out}" ] && die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})"
880}

Legend:
Removed from v.1.26  
changed lines
  Added in v.1.41

  ViewVC Help
Powered by ViewVC 1.1.20