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

Diff of /eclass/eutils.eclass

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

Revision 1.9 Revision 1.33
1# Copyright 1999-2002 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.33 2003/06/12 18:21:23 vapier Exp $
4#
3# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
4# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.9 2002/12/01 15:48:27 azarah Exp $ 6#
5# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
6# have to implement themselves. 8# have to implement themselves.
7# 9#
8# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
9 11
10ECLASS=eutils 12ECLASS=eutils
11INHERITED="$INHERITED $ECLASS" 13INHERITED="$INHERITED $ECLASS"
12 14
13newdepend sys-devel/patch 15DEPEND="$DEPEND !bootstrap? ( sys-devel/patch )"
14 16
15DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
16 18
17# This function generate linker scripts in /usr/lib for dynamic 19# This function generate linker scripts in /usr/lib for dynamic
18# 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
34# 36#
35gen_usr_ldscript() { 37gen_usr_ldscript() {
36 38
37 # Just make sure it exists 39 # Just make sure it exists
38 dodir /usr/lib 40 dodir /usr/lib
39 41
40 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
41/* GNU ld script 43/* GNU ld script
42 Because Gentoo have critical dynamic libraries 44 Because Gentoo have critical dynamic libraries
43 in /lib, and the static versions in /usr/lib, we 45 in /lib, and the static versions in /usr/lib, we
44 need to have a "fake" dynamic lib in /usr/lib, 46 need to have a "fake" dynamic lib in /usr/lib,
68 return 0 70 return 0
69 fi 71 fi
70 72
71 # Get the length of $* 73 # Get the length of $*
72 str_length="$(echo -n "$*" | wc -m)" 74 str_length="$(echo -n "$*" | wc -m)"
73 75
74 while [ "$i" -lt "${str_length}" ] 76 while [ "$i" -lt "${str_length}" ]
75 do 77 do
76 echo -n "=" 78 echo -n "="
77 79
78 i=$((i + 1)) 80 i=$((i + 1))
79 done 81 done
80 82
81 echo 83 echo
82 84
92# 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,
93# and not the full path .. 95# and not the full path ..
94EPATCH_EXCLUDE="" 96EPATCH_EXCLUDE=""
95# Change the printed message for a single patch. 97# Change the printed message for a single patch.
96EPATCH_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"
97 104
98# 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
99# or two patches. 106# or two patches.
100# 107#
101# It should work with .bz2, .gz, .zip and plain text patches. 108# It should work with .bz2, .gz, .zip and plain text patches.
143 fi 150 fi
144 151
145 if [ -n "$1" -a -f "$1" ] 152 if [ -n "$1" -a -f "$1" ]
146 then 153 then
147 SINGLE_PATCH="yes" 154 SINGLE_PATCH="yes"
148 155
149 local EPATCH_SOURCE="$1" 156 local EPATCH_SOURCE="$1"
150 local EPATCH_SUFFIX="${1##*\.}" 157 local EPATCH_SUFFIX="${1##*\.}"
151 158
152 elif [ -n "$1" -a -d "$1" ] 159 elif [ -n "$1" -a -d "$1" ]
153 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
154 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 166 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
167 fi
155 else 168 else
156 if [ ! -d ${EPATCH_SOURCE} ] 169 if [ ! -d ${EPATCH_SOURCE} ]
157 then 170 then
171 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
172 then
173 EPATCH_SOURCE="$1"
174 fi
175
158 echo 176 echo
159 eerror "Cannot find \$EPATCH_SOURCE!" 177 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
178 eerror
179 eerror " ${EPATCH_SOURCE}"
160 echo 180 echo
161 die "Cannot find \$EPATCH_SOURCE!" 181 die "Cannot find \$EPATCH_SOURCE!"
162 fi 182 fi
163 183
164 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
165 fi 185 fi
166 186
167 case ${EPATCH_SUFFIX##*\.} in 187 case ${EPATCH_SUFFIX##*\.} in
168 bz2) 188 bz2)
192 # New ARCH dependant patch naming scheme... 212 # New ARCH dependant patch naming scheme...
193 # 213 #
194 # ???_arch_foo.patch 214 # ???_arch_foo.patch
195 # 215 #
196 if [ -f ${x} ] && \ 216 if [ -f ${x} ] && \
197 [ "${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" ])
198 then 219 then
199 local count=0 220 local count=0
200 local popts="${EPATCH_OPTS}" 221 local popts="${EPATCH_OPTS}"
201 222
202 if [ -n "${EPATCH_EXCLUDE}" ] 223 if [ -n "${EPATCH_EXCLUDE}" ]
204 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 225 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
205 then 226 then
206 continue 227 continue
207 fi 228 fi
208 fi 229 fi
209 230
210 if [ "${SINGLE_PATCH}" = "yes" ] 231 if [ "${SINGLE_PATCH}" = "yes" ]
211 then 232 then
212 if [ -n "${EPATCH_SINGLE_MSG}" ] 233 if [ -n "${EPATCH_SINGLE_MSG}" ]
213 then 234 then
214 einfo "${EPATCH_SINGLE_MSG}" 235 einfo "${EPATCH_SINGLE_MSG}"
234 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 255 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
235 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
236 else 257 else
237 PATCH_TARGET="${x}" 258 PATCH_TARGET="${x}"
238 fi 259 fi
239 260
240 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 261 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
241 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##*/}
242 263
243 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 264 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 266
246 if [ "${PATCH_SUFFIX}" != "patch" ] 267 if [ "${PATCH_SUFFIX}" != "patch" ]
247 then 268 then
252 #die "Could not extract patch!" 273 #die "Could not extract patch!"
253 count=5 274 count=5
254 break 275 break
255 fi 276 fi
256 fi 277 fi
257 278
258 if patch ${popts} --dry-run -f -p${count} < ${PATCH_TARGET} >> ${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
259 then 280 then
260 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 281 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
261 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
262 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
263 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 284 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
264 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 285 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
265 286
266 patch ${popts} -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 287 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
267 288
268 if [ "$?" -ne 0 ] 289 if [ "$?" -ne 0 ]
269 then 290 then
270 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 291 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
271 echo 292 echo
274 #die "Real world sux compared to the dreamworld!" 295 #die "Real world sux compared to the dreamworld!"
275 count=5 296 count=5
276 fi 297 fi
277 298
278 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 299 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
279 300
280 break 301 break
281 fi 302 fi
282 303
283 count=$((count + 1)) 304 count=$((count + 1))
284 done 305 done
309 then 330 then
310 einfo "Done with patching" 331 einfo "Done with patching"
311 fi 332 fi
312} 333}
313 334
335# This function return true if we are using the NPTL pthreads
336# implementation.
337#
338# <azarah@gentoo.org> (06 March 2003)
339#
340
341have_NPTL() {
342
343 cat > ${T}/test-nptl.c <<-"END"
344 #define _XOPEN_SOURCE
345 #include <unistd.h>
346 #include <stdio.h>
347
348 int main()
349 {
350 char buf[255];
351 char *str = buf;
352
353 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
354 if (NULL != str) {
355 printf("%s\n", str);
356 if (NULL != strstr(str, "NPTL"))
357 return 0;
358 }
359
360 return 1;
361 }
362 END
363
364 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
365 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
366 then
367 echo "yes"
368 einfon "Checking what PTHREADS implementation we have ... "
369 if ${T}/nptl
370 then
371 return 0
372 else
373 return 1
374 fi
375 else
376 echo "no"
377 fi
378
379 return 1
380}
381
382# This function check how many cpu's are present, and then set
383# -j in MAKEOPTS accordingly.
384#
385# Thanks to nall <nall@gentoo.org> for this.
386#
387get_number_of_jobs() {
388 local jobs=0
389
390 if [ ! -r /proc/cpuinfo ]
391 then
392 return 1
393 fi
394
395 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
396 if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
397 then
398 ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
399 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
400 ADMINPARAM="${ADMINPARAM/-j}"
401 fi
402
403 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
404
405 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
406 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ]
407 then
408 # these archs will always have "[Pp]rocessor"
409 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
410
411 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
412 then
413 # sparc always has "ncpus active"
414 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
415
416 elif [ "${ARCH}" = "alpha" ]
417 then
418 # alpha has "cpus active", but only when compiled with SMP
419 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
420 then
421 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
422 else
423 jobs=2
424 fi
425
426 elif [ "${ARCH}" = "ppc" ]
427 then
428 # ppc has "processor", but only when compiled with SMP
429 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
430 then
431 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
432 else
433 jobs=2
434 fi
435 else
436 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
437 die "Unknown ARCH -- ${ARCH}!"
438 fi
439
440 # Make sure the number is valid ...
441 if [ "${jobs}" -lt 1 ]
442 then
443 jobs=1
444 fi
445
446 if [ -n "${ADMINPARAM}" ]
447 then
448 if [ "${jobs}" -gt "${ADMINPARAM}" ]
449 then
450 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
451 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
452 else
453 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
454 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
455 fi
456 fi
457}
458
459# Simplify/standardize adding users to the system
460# vapier@gentoo.org
461#
462# enewuser(username, uid, shell, homedir, groups, extra options)
463#
464# Default values if you do not specify any:
465# username: REQUIRED !
466# uid: next available (see useradd(8))
467# note: pass -1 to get default behavior
468# shell: /bin/false
469# homedir: /dev/null
470# groups: none
471# extra: comment of 'added by portage for ${PN}'
472enewuser() {
473 # get the username
474 local euser="$1"; shift
475 if [ -z "${euser}" ] ; then
476 eerror "No username specified !"
477 die "Cannot call enewuser without a username"
478 fi
479 einfo "Adding user '${euser}' to your system ..."
480
481 # setup a file for testing usernames/groups
482 local tmpfile="`mktemp -p ${T}`"
483 touch ${tmpfile}
484 chown ${euser} ${tmpfile} >& /dev/null
485 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
486
487 # see if user already exists
488 if [ "${euser}" == "${realuser}" ] ; then
489 einfo "${euser} already exists on your system :)"
490 return 0
491 fi
492
493 # options to pass to useradd
494 local opts=""
495
496 # handle uid
497 local euid="$1"; shift
498 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then
499 if [ ${euid} -gt 0 ] ; then
500 opts="${opts} -u ${euid}"
501 else
502 eerror "Userid given but is not greater than 0 !"
503 die "${euid} is not a valid UID"
504 fi
505 else
506 euid="next available"
507 fi
508 einfo " - Userid: ${euid}"
509
510 # handle shell
511 local eshell="$1"; shift
512 if [ ! -z "${eshell}" ] ; then
513 if [ ! -e ${eshell} ] ; then
514 eerror "A shell was specified but it does not exist !"
515 die "${eshell} does not exist"
516 fi
517 else
518 eshell=/bin/false
519 fi
520 einfo " - Shell: ${eshell}"
521 opts="${opts} -s ${eshell}"
522
523 # handle homedir
524 local ehome="$1"; shift
525 if [ -z "${ehome}" ] ; then
526 ehome=/dev/null
527 fi
528 einfo " - Home: ${ehome}"
529 opts="${opts} -d ${ehome}"
530
531 # handle groups
532 local egroups="$1"; shift
533 if [ ! -z "${egroups}" ] ; then
534 local realgroup
535 local oldifs="${IFS}"
536 export IFS=","
537 for g in ${egroups} ; do
538 chgrp ${g} ${tmpfile} >& /dev/null
539 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
540 if [ "${g}" != "${realgroup}" ] ; then
541 eerror "You must add ${g} to the system first"
542 die "${g} is not a valid GID"
543 fi
544 done
545 export IFS="${oldifs}"
546 opts="${opts} -g ${egroups}"
547 else
548 egroups="(none)"
549 fi
550 einfo " - Groups: ${egroups}"
551
552 # handle extra and add the user
553 local eextra="$@"
554 local oldsandbox="${oldsandbox}"
555 export SANDBOX_ON="0"
556 if [ -z "${eextra}" ] ; then
557 useradd ${opts} ${euser} \
558 -c "added by portage for ${PN}" \
559 || die "enewuser failed"
560 else
561 einfo " - Extra: ${eextra}"
562 useradd ${opts} ${euser} ${eextra} \
563 || die "enewuser failed"
564 fi
565 export SANDBOX_ON="${oldsandbox}"
566
567 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then
568 einfo " - Creating ${ehome} in ${D}"
569 dodir ${ehome}
570 fperms ${euser} ${ehome}
571 fi
572}
573
574# Simplify/standardize adding groups to the system
575# vapier@gentoo.org
576#
577# enewgroup(group, gid)
578#
579# Default values if you do not specify any:
580# groupname: REQUIRED !
581# gid: next available (see groupadd(8))
582# extra: none
583enewgroup() {
584 # get the group
585 local egroup="$1"; shift
586 if [ -z "${egroup}" ] ; then
587 eerror "No group specified !"
588 die "Cannot call enewgroup without a group"
589 fi
590 einfo "Adding group '${egroup}' to your system ..."
591
592 # setup a file for testing groupname
593 local tmpfile="`mktemp -p ${T}`"
594 touch ${tmpfile}
595 chgrp ${egroup} ${tmpfile} >& /dev/null
596 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
597
598 # see if group already exists
599 if [ "${egroup}" == "${realgroup}" ] ; then
600 einfo "${egroup} already exists on your system :)"
601 return 0
602 fi
603
604 # options to pass to useradd
605 local opts=""
606
607 # handle gid
608 local egid="$1"; shift
609 if [ ! -z "${egid}" ] ; then
610 if [ ${egid} -gt 0 ] ; then
611 opts="${opts} -g ${egid}"
612 else
613 eerror "Groupid given but is not greater than 0 !"
614 die "${egid} is not a valid GID"
615 fi
616 else
617 egid="next available"
618 fi
619 einfo " - Groupid: ${egid}"
620
621 # handle extra
622 local eextra="$@"
623 opts="${opts} ${eextra}"
624
625 # add the group
626 local oldsandbox="${oldsandbox}"
627 export SANDBOX_ON="0"
628 groupadd ${opts} ${egroup} || die "enewgroup failed"
629 export SANDBOX_ON="${oldsandbox}"
630}
631
632# Simple script to replace 'dos2unix' binaries
633# vapier@gentoo.org
634#
635# edos2unix(file, <more files>...)
636edos2unix() {
637 for f in $@ ; do
638 cp ${f} ${T}/edos2unix
639 sed 's/\r$//' ${T}/edos2unix > ${f}
640 done
641}
642
643# new convinience patch wapper function to eventually replace epatch(), $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and /usr/bin/patch
644# Features:
645# - bulk patch handling similar to epatch()'s
646# - automatic patch level detection like epatch()'s
647# - semiautomatic patch uncompression like epatch()'s (may switch to using /usr/bin/file for extra power, instead of just looking at the filename)
648# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles manually instead
649# - is called from base_src_unpack to handle $PATCHES to avoid defining src_unpack(-) just to use xpatch
650
651# accepts zero or more parameters specifying patchfiles and/or patchdirs
652
653# known issues:
654# - only supports unified style patches (does anyone _really_ use anything else?)
655# - first file addressed in a patch can't have spaces in its name or in the path mentioned in the patchfile
656# (can be easily fixed to be: at least one file addressed in the patch must have no spaces...)
657xpatch() {
658
659 debug-print-function $FUNCNAME $*
660
661 local list=""
662 local list2=""
663 declare -i plevel
664
665 # parse patch sources
666 for x in $*; do
667 debug-print "$FUNCNAME: parsing parameter $x"
668 if [ -f "$x" ]; then
669 list="$list $x"
670 elif [ -d "$x" ]; then
671 # handles patchdirs like epatch() for now: no recursion.
672 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
673 # only patches with _$ARCH_ or _all_ in their filenames are applied.
674 for file in `ls -A $x`; do
675 debug-print "$FUNCNAME: parsing in subdir: file $file"
676 if [ -f "$x/$file" ] && [ "${file}" != "${file/_all_}" -o "${file}" != "${file/_$ARCH_}" ]; then
677 list2="$list2 $x/$file"
678 fi
679 done
680 list="`echo $list2 | sort` $list"
681 else
682 die "Couldn't find $x"
683 fi
684 done
685
686 debug-print "$FUNCNAME: final list of patches: $list"
687
688 for x in $list; do
689 debug-print "$FUNCNAME: processing $x"
690 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
691 case "`/usr/bin/file -b $x`" in
692 *gzip*) patchfile="${T}/current.patch"; ungzip -c "$x" > "${patchfile}";;
693 *bzip2*) patchfile="${T}/current.patch"; bunzip2 -c "$x" > "${patchfile}";;
694 *text*) patchfile="$x";;
695 *) die "Could not determine filetype of patch $x";;
696 esac
697 debug-print "$FUNCNAME: patchfile=$patchfile"
698
699 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
700 target="`/bin/grep '+++' $patchfile | /usr/bin/tail -1`"
701 debug-print "$FUNCNAME: raw target=$target"
702 # strip target down to the path/filename. NOTE doesn't support filenames/paths with spaces in them :-(
703 # remove leading +++
704 target="${target/+++ }"
705 # ugly, yes. i dunno why doesn't this work instead: target=${target%% *}
706 for foo in $target; do target="$foo"; break; done
707 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need to discard them as well
708 # to calculate the correct patchlevel.
709 while [ "$target" != "${target/\/\/}" ]; do
710 target="${target/\/\//\/}"
711 done
712 debug-print "$FUNCNAME: stripped target=$target"
713
714 # look for target
715 for basedir in "$S" "$WORKDIR" "`pwd`"; do
716 debug-print "$FUNCNAME: looking in basedir=$basedir"
717 cd "$basedir"
718
719 # try stripping leading directories
720 target2="$target"
721 plevel=0
722 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
723 while [ ! -f "$target2" ]; do
724 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
725 plevel=plevel+1
726 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
727 [ "$target2" == "${target2/\/}" ] && break
728 done
729 test -f "$target2" && break
730
731 # try stripping filename - needed to support patches creating new files
732 target2="${target%/*}"
733 plevel=0
734 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
735 while [ ! -d "$target2" ]; do
736 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
737 plevel=plevel+1
738 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
739 [ "$target2" == "${target2/\/}" ] && break
740 done
741 test -d "$target2" && break
742
743 done
744
745 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" || die "Could not determine patchlevel for $x"
746 debug-print "$FUNCNAME: determined plevel=$plevel"
747 # do the patching
748 ebegin "Applying patch ${x##*/}..."
749 /usr/bin/patch -p$plevel < "$patchfile" > /dev/null || die "Failed to apply patch $x"
750 eend $?
751
752 done
753
754}

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.33

  ViewVC Help
Powered by ViewVC 1.1.20