/[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.85
1# Copyright 1999-2004 Gentoo Technologies, Inc. 1# Copyright 1999-2004 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.76 2004/01/26 23:40:07 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.85 2004/02/29 22:34:41 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
422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 else 423 else
424 jobs=2 424 jobs=2
425 fi 425 fi
426 426
427 elif [ "${ARCH}" = "ppc" ] 427 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
428 then 428 then
429 # ppc has "processor", but only when compiled with SMP 429 # ppc has "processor", but only when compiled with SMP
430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 then 431 then
432 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))" 432 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
456 fi 456 fi
457 fi 457 fi
458} 458}
459 459
460# Cheap replacement for when debianutils (and thus mktemp) 460# Cheap replacement for when debianutils (and thus mktemp)
461# do not exist on the users system 461# does not exist on the users system
462# vapier@gentoo.org 462# vapier@gentoo.org
463# 463#
464# Takes just 1 parameter (the directory to create tmpfile in) 464# Takes just 1 parameter (the directory to create tmpfile in)
465mymktemp() { 465mymktemp() {
466 local topdir="$1" 466 local topdir="$1"
496 then 496 then
497 eerror "No username specified !" 497 eerror "No username specified !"
498 die "Cannot call enewuser without a username" 498 die "Cannot call enewuser without a username"
499 fi 499 fi
500 500
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 501 # lets see if the username already exists
507 if [ "${euser}" == "${realuser}" ] 502 if [ "${euser}" == "`getent passwd \"${euser}\" | cut -d: -f1`" ]
508 then 503 then
509 return 0 504 return 0
510 fi 505 fi
511 einfo "Adding user '${euser}' to your system ..." 506 einfo "Adding user '${euser}' to your system ..."
512 507
517 local euid="$1"; shift 512 local euid="$1"; shift
518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] 513 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then 514 then
520 if [ "${euid}" -gt 0 ] 515 if [ "${euid}" -gt 0 ]
521 then 516 then
522 opts="${opts} -u ${euid}" 517 if [ ! -z "`getent passwd ${euid}`" ]
518 then
519 euid="next"
520 fi
523 else 521 else
524 eerror "Userid given but is not greater than 0 !" 522 eerror "Userid given but is not greater than 0 !"
525 die "${euid} is not a valid UID" 523 die "${euid} is not a valid UID"
526 fi 524 fi
527 else 525 else
528 euid="next available" 526 euid="next"
529 fi 527 fi
528 if [ "${euid}" == "next" ]
529 then
530 for euid in `seq 101 999` ; do
531 [ -z "`getent passwd ${euid}`" ] && break
532 done
533 fi
534 opts="${opts} -u ${euid}"
530 einfo " - Userid: ${euid}" 535 einfo " - Userid: ${euid}"
531 536
532 # handle shell 537 # handle shell
533 local eshell="$1"; shift 538 local eshell="$1"; shift
534 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] 539 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
555 560
556 # handle groups 561 # handle groups
557 local egroups="$1"; shift 562 local egroups="$1"; shift
558 if [ ! -z "${egroups}" ] 563 if [ ! -z "${egroups}" ]
559 then 564 then
560 local realgroup=
561 local oldifs="${IFS}" 565 local oldifs="${IFS}"
562 export IFS="," 566 export IFS=","
563 for g in ${egroups} 567 for g in ${egroups}
564 do 568 do
565 chgrp ${g} ${tmpfile} >& /dev/null 569 if [ -z "`getent group \"${g}\"`" ]
566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
567 if [ "${g}" != "${realgroup}" ]
568 then 570 then
569 eerror "You must add ${g} to the system first" 571 eerror "You must add group ${g} to the system first"
570 die "${g} is not a valid GID" 572 die "${g} is not a valid GID"
571 fi 573 fi
572 done 574 done
573 export IFS="${oldifs}" 575 export IFS="${oldifs}"
574 opts="${opts} -g ${egroups}" 576 opts="${opts} -g ${egroups}"
618 then 620 then
619 eerror "No group specified !" 621 eerror "No group specified !"
620 die "Cannot call enewgroup without a group" 622 die "Cannot call enewgroup without a group"
621 fi 623 fi
622 624
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 625 # see if group already exists
629 if [ "${egroup}" == "${realgroup}" ] 626 if [ "${egroup}" == "`getent group \"${egroup}\" | cut -d: -f1`" ]
630 then 627 then
631 return 0 628 return 0
632 fi 629 fi
633 einfo "Adding group '${egroup}' to your system ..." 630 einfo "Adding group '${egroup}' to your system ..."
634 631
639 local egid="$1"; shift 636 local egid="$1"; shift
640 if [ ! -z "${egid}" ] 637 if [ ! -z "${egid}" ]
641 then 638 then
642 if [ "${egid}" -gt 0 ] 639 if [ "${egid}" -gt 0 ]
643 then 640 then
641 if [ -z "`getent group ${egid}`" ]
642 then
644 opts="${opts} -g ${egid}" 643 opts="${opts} -g ${egid}"
644 else
645 egid="next available; requested gid taken"
646 fi
645 else 647 else
646 eerror "Groupid given but is not greater than 0 !" 648 eerror "Groupid given but is not greater than 0 !"
647 die "${egid} is not a valid GID" 649 die "${egid} is not a valid GID"
648 fi 650 fi
649 else 651 else
696 698
697 local exec="${1}" 699 local exec="${1}"
698 local name="${2:-${PN}}" 700 local name="${2:-${PN}}"
699 local icon="${3:-${PN}.png}" 701 local icon="${3:-${PN}.png}"
700 local type="${4}" 702 local type="${4}"
703 local subdir="${6}"
701 local path="${5:-${GAMES_PREFIX}}" 704 local path="${5:-${GAMES_PREFIX}}"
702 if [ -z "${type}" ] 705 if [ -z "${type}" ]
703 then 706 then
704 case ${CATEGORY} in 707 case ${CATEGORY} in
705 "app-emulation") 708 "app-emulation")
706 type=Emulator 709 type=Emulator
710 subdir="Games"
707 ;; 711 ;;
708 "games-"*) 712 "games-"*)
709 type=Game 713 type=Game
714 subdir="Games"
710 ;; 715 ;;
711 "net-"*) 716 "net-"*)
712 type=Network; 717 type=Network
718 subdir="${type}"
713 ;; 719 ;;
714 *) 720 *)
715 type= 721 type=
722 subdir=
716 ;; 723 ;;
717 esac 724 esac
718 fi 725 fi
719 local desktop="${T}/${exec}.desktop" 726 local desktop="${T}/${exec}.desktop"
720 727
750 # done 757 # done
751 #fi 758 #fi
752 759
753 if [ -d "/usr/share/applnk" ] 760 if [ -d "/usr/share/applnk" ]
754 then 761 then
755 insinto /usr/share/applnk/${type} 762 insinto /usr/share/applnk/${subdir}
756 doins ${desktop} 763 doins ${desktop}
757 fi 764 fi
758 765
759 return 0 766 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} 767}
900 768
901# for internal use only (unpack_pdv and unpack_makeself) 769# for internal use only (unpack_pdv and unpack_makeself)
902find_unpackable_file() { 770find_unpackable_file() {
903 local src="$1" 771 local src="$1"
1239# remember, you can only go forward in the cd chain, you can't go back. 1107# remember, you can only go forward in the cd chain, you can't go back.
1240cdrom_load_next_cd() { 1108cdrom_load_next_cd() {
1241 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1)) 1109 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1242 local var= 1110 local var=
1243 1111
1112 if [ ! -z "${CD_ROOT}" ] ; then
1113 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1114 return
1115 fi
1116
1244 unset CDROM_ROOT 1117 unset CDROM_ROOT
1245 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1118 var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1246 if [ -z "${!var}" ] ; then 1119 if [ -z "${!var}" ] ; then
1247 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1120 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1248 cdrom_locate_file_on_cd ${!var} 1121 cdrom_locate_file_on_cd ${!var}

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

  ViewVC Help
Powered by ViewVC 1.1.20