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

Diff of /eclass/eutils.eclass

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

Revision 1.373 Revision 1.390
1# Copyright 1999-2011 Gentoo Foundation 1# Copyright 1999-2012 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.373 2011/12/16 23:38:41 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.390 2012/04/16 14:40:16 vapier Exp $
4 4
5# @ECLASS: eutils.eclass 5# @ECLASS: eutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# base-system@gentoo.org 7# base-system@gentoo.org
8# @BLURB: many extra (but common) functions that are used in ebuilds 8# @BLURB: many extra (but common) functions that are used in ebuilds
16# different from the overall eclass! 16# different from the overall eclass!
17 17
18if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then 18if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then
19___ECLASS_ONCE_EUTILS="recur -_+^+_- spank" 19___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
20 20
21inherit multilib portability user 21inherit multilib user
22 22
23DESCRIPTION="Based on the ${ECLASS} eclass" 23DESCRIPTION="Based on the ${ECLASS} eclass"
24 24
25if has "${EAPI:-0}" 0 1 2; then 25if has "${EAPI:-0}" 0 1 2; then
26 26
135 # copy of "i" rather than the caller's copy. The __estack_xxx 135 # copy of "i" rather than the caller's copy. The __estack_xxx
136 # garbage is preferable to using $1/$2 everywhere as that is a 136 # garbage is preferable to using $1/$2 everywhere as that is a
137 # bit harder to read. 137 # bit harder to read.
138 local __estack_name="__ESTACK_$1__" ; shift 138 local __estack_name="__ESTACK_$1__" ; shift
139 local __estack_retvar=$1 ; shift 139 local __estack_retvar=$1 ; shift
140 eval local __estack_i=\${#${__estack_name}[@]} 140 eval local __estack_i=\${#${__estack_name}\[@\]}
141 # Don't warn -- let the caller interpret this as a failure 141 # Don't warn -- let the caller interpret this as a failure
142 # or as normal behavior (akin to `shift`) 142 # or as normal behavior (akin to `shift`)
143 [[ $(( --__estack_i )) -eq -1 ]] && return 1 143 [[ $(( --__estack_i )) -eq -1 ]] && return 1
144 144
145 if [[ -n ${__estack_retvar} ]] ; then 145 if [[ -n ${__estack_retvar} ]] ; then
146 eval ${__estack_retvar}=\"\${${__estack_name}[${__estack_i}]}\" 146 eval ${__estack_retvar}=\"\${${__estack_name}\[${__estack_i}\]}\"
147 fi 147 fi
148 eval unset ${__estack_name}[${__estack_i}] 148 eval unset ${__estack_name}\[${__estack_i}\]
149} 149}
150 150
151# @FUNCTION: eshopts_push 151# @FUNCTION: eshopts_push
152# @USAGE: [options to `set` or `shopt`] 152# @USAGE: [options to `set` or `shopt`]
153# @DESCRIPTION: 153# @DESCRIPTION:
160# rather than `set` as there are some options only available via that. 160# rather than `set` as there are some options only available via that.
161# 161#
162# A common example is to disable shell globbing so that special meaning/care 162# A common example is to disable shell globbing so that special meaning/care
163# may be used with variables/arguments to custom functions. That would be: 163# may be used with variables/arguments to custom functions. That would be:
164# @CODE 164# @CODE
165# eshopts_push -o noglob 165# eshopts_push -s noglob
166# for x in ${foo} ; do 166# for x in ${foo} ; do
167# if ...some check... ; then 167# if ...some check... ; then
168# eshopts_pop 168# eshopts_pop
169# return 0 169# return 0
170# fi 170# fi
171# done 171# done
172# eshopts_pop 172# eshopts_pop
173# @CODE 173# @CODE
174eshopts_push() { 174eshopts_push() {
175 # have to assume __ESHOPTS_SAVE__ isn't screwed with
176 # as a `declare -a` here will reset its value
177 if [[ $1 == -[su] ]] ; then 175 if [[ $1 == -[su] ]] ; then
178 estack_push eshopts "$(shopt -p)" 176 estack_push eshopts "$(shopt -p)"
179 [[ $# -eq 0 ]] && return 0 177 [[ $# -eq 0 ]] && return 0
180 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*" 178 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
181 else 179 else
214# @FUNCTION: eumask_pop 212# @FUNCTION: eumask_pop
215# @USAGE: 213# @USAGE:
216# @DESCRIPTION: 214# @DESCRIPTION:
217# Restore the previous umask state. 215# Restore the previous umask state.
218eumask_pop() { 216eumask_pop() {
217 [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options"
219 local s 218 local s
220 estack_pop eumask s || die "${FUNCNAME}: unbalanced push" 219 estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
221 umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}" 220 umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
222} 221}
223 222
441 eqawarn " In the future this will cause a failure." 440 eqawarn " In the future this will cause a failure."
442 eqawarn "${rel_paths}" 441 eqawarn "${rel_paths}"
443 fi 442 fi
444 443
445 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/ 444 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
445 local patch_cmd
446 while [[ ${count} -lt 5 ]] ; do 446 while [[ ${count} -lt 5 ]] ; do
447 patch_cmd="${BASH_ALIASES[patch]:-patch} -p${count} ${EPATCH_OPTS}"
448
447 # Generate some useful debug info ... 449 # Generate some useful debug info ...
448 ( 450 (
449 _epatch_draw_line "***** ${patchname} *****" 451 _epatch_draw_line "***** ${patchname} *****"
450 echo 452 echo
451 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 453 echo "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'"
452 echo 454 echo
453 _epatch_draw_line "***** ${patchname} *****" 455 _epatch_draw_line "***** ${patchname} *****"
454 patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}" 2>&1 456 ${patch_cmd} --dry-run -f < "${PATCH_TARGET}" 2>&1
455 ret=$? 457 ret=$?
456 echo 458 echo
457 echo "patch program exited with status ${ret}" 459 echo "patch program exited with status ${ret}"
458 exit ${ret} 460 exit ${ret}
459 ) >> "${STDERR_TARGET}" 461 ) >> "${STDERR_TARGET}"
463 _epatch_draw_line "***** ${patchname} *****" 465 _epatch_draw_line "***** ${patchname} *****"
464 echo 466 echo
465 echo "ACTUALLY APPLYING ${patchname} ..." 467 echo "ACTUALLY APPLYING ${patchname} ..."
466 echo 468 echo
467 _epatch_draw_line "***** ${patchname} *****" 469 _epatch_draw_line "***** ${patchname} *****"
468 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1 470 ${patch_cmd} < "${PATCH_TARGET}" 2>&1
469 ret=$? 471 ret=$?
470 echo 472 echo
471 echo "patch program exited with status ${ret}" 473 echo "patch program exited with status ${ret}"
472 exit ${ret} 474 exit ${ret}
473 ) >> "${STDERR_TARGET}" 475 ) >> "${STDERR_TARGET}"
500 eerror " ${STDERR_TARGET}" 502 eerror " ${STDERR_TARGET}"
501 echo 503 echo
502 die "Failed Patch: ${patchname}!" 504 die "Failed Patch: ${patchname}!"
503 fi 505 fi
504 506
505 # if everything worked, delete the patch log 507 # if everything worked, delete the full debug patch log
506 rm -f "${STDERR_TARGET}" 508 rm -f "${STDERR_TARGET}"
509
510 # then log away the exact stuff for people to review later
511 cat <<-EOF >> "${T}/epatch.log"
512 PATCH: ${x}
513 CMD: ${patch_cmd}
514 PWD: ${PWD}
515
516 EOF
507 eend 0 517 eend 0
508 done 518 done
509 519
510 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 520 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
511 : # everything worked 521 : # everything worked
515# @USAGE: 525# @USAGE:
516# @DESCRIPTION: 526# @DESCRIPTION:
517# Applies user-provided patches to the source tree. The patches are 527# Applies user-provided patches to the source tree. The patches are
518# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first 528# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first
519# of these three directories to exist will be the one to use, ignoring 529# of these three directories to exist will be the one to use, ignoring
520# any more general directories which might exist as well. 530# any more general directories which might exist as well. They must end
531# in ".patch" to be applied.
521# 532#
522# User patches are intended for quick testing of patches without ebuild 533# User patches are intended for quick testing of patches without ebuild
523# modifications, as well as for permanent customizations a user might 534# modifications, as well as for permanent customizations a user might
524# desire. Obviously, there can be no official support for arbitrarily 535# desire. Obviously, there can be no official support for arbitrarily
525# patched ebuilds. So whenever a build log in a bug report mentions that 536# patched ebuilds. So whenever a build log in a bug report mentions that
539# autotool input files as well. 550# autotool input files as well.
540epatch_user() { 551epatch_user() {
541 [[ $# -ne 0 ]] && die "epatch_user takes no options" 552 [[ $# -ne 0 ]] && die "epatch_user takes no options"
542 553
543 # Allow multiple calls to this function; ignore all but the first 554 # Allow multiple calls to this function; ignore all but the first
544 local applied="${T}/epatch_user.applied" 555 local applied="${T}/epatch_user.log"
545 [[ -e ${applied} ]] && return 2 556 [[ -e ${applied} ]] && return 2
546 557
547 # don't clobber any EPATCH vars that the parent might want 558 # don't clobber any EPATCH vars that the parent might want
548 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 559 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
549 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 560 for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}; do
550 EPATCH_SOURCE=${base}/${CTARGET}/${check} 561 EPATCH_SOURCE=${base}/${CTARGET}/${check}
551 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check} 562 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
552 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check} 563 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
553 if [[ -d ${EPATCH_SOURCE} ]] ; then 564 if [[ -d ${EPATCH_SOURCE} ]] ; then
554 EPATCH_SOURCE=${EPATCH_SOURCE} \ 565 EPATCH_SOURCE=${EPATCH_SOURCE} \
609edos2unix() { 620edos2unix() {
610 [[ $# -eq 0 ]] && return 0 621 [[ $# -eq 0 ]] && return 0
611 sed -i 's/\r$//' -- "$@" || die 622 sed -i 's/\r$//' -- "$@" || die
612} 623}
613 624
614# Make a desktop file ! 625# @FUNCTION: make_desktop_entry
615# Great for making those icons in kde/gnome startmenu !
616# Amaze your friends ! Get the women ! Join today !
617#
618# make_desktop_entry(<command>, [name], [icon], [type], [fields]) 626# @USAGE: make_desktop_entry(<command>, [name], [icon], [type], [fields])
627# @DESCRIPTION:
628# Make a .desktop file.
619# 629#
630# @CODE
620# binary: what command does the app run with ? 631# binary: what command does the app run with ?
621# name: the name that will show up in the menu 632# name: the name that will show up in the menu
622# icon: give your little like a pretty little icon ... 633# icon: give your little like a pretty little icon ...
623# this can be relative (to /usr/share/pixmaps) or 634# this can be relative (to /usr/share/pixmaps) or
624# a full path to an icon 635# a full path to an icon
625# type: what kind of application is this ? for categories: 636# type: what kind of application is this?
637# for categories:
626# http://standards.freedesktop.org/menu-spec/latest/apa.html 638# http://standards.freedesktop.org/menu-spec/latest/apa.html
639# if unset, function tries to guess from package's category
627# fields: extra fields to append to the desktop file; a printf string 640# fields: extra fields to append to the desktop file; a printf string
641# @CODE
628make_desktop_entry() { 642make_desktop_entry() {
629 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable" 643 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
630 644
631 local exec=${1} 645 local exec=${1}
632 local name=${2:-${PN}} 646 local name=${2:-${PN}}
638 local catmaj=${CATEGORY%%-*} 652 local catmaj=${CATEGORY%%-*}
639 local catmin=${CATEGORY##*-} 653 local catmin=${CATEGORY##*-}
640 case ${catmaj} in 654 case ${catmaj} in
641 app) 655 app)
642 case ${catmin} in 656 case ${catmin} in
643 accessibility) type=Accessibility;; 657 accessibility) type="Utility;Accessibility";;
644 admin) type=System;; 658 admin) type=System;;
645 antivirus) type=System;; 659 antivirus) type=System;;
646 arch) type=Archiving;; 660 arch) type="Utility;Archiving";;
647 backup) type=Archiving;; 661 backup) type="Utility;Archiving";;
648 cdr) type=DiscBurning;; 662 cdr) type="AudioVideo;DiscBurning";;
649 dicts) type=Dictionary;; 663 dicts) type="Office;Dictionary";;
650 doc) type=Documentation;; 664 doc) type=Documentation;;
651 editors) type=TextEditor;; 665 editors) type="Utility;TextEditor";;
652 emacs) type=TextEditor;; 666 emacs) type="Development;TextEditor";;
653 emulation) type=Emulator;; 667 emulation) type="System;Emulator";;
654 laptop) type=HardwareSettings;; 668 laptop) type="Settings;HardwareSettings";;
655 office) type=Office;; 669 office) type=Office;;
656 pda) type=PDA;; 670 pda) type="Office;PDA";;
657 vim) type=TextEditor;; 671 vim) type="Development;TextEditor";;
658 xemacs) type=TextEditor;; 672 xemacs) type="Development;TextEditor";;
659 esac 673 esac
660 ;; 674 ;;
661 675
662 dev) 676 dev)
663 type="Development" 677 type="Development"
939 # wrap the env here so that the 'insinto' call 953 # wrap the env here so that the 'insinto' call
940 # doesn't corrupt the env of the caller 954 # doesn't corrupt the env of the caller
941 insinto /usr/share/pixmaps 955 insinto /usr/share/pixmaps
942 newins "$@" 956 newins "$@"
943 ) 957 )
944}
945
946# for internal use only (unpack_pdv and unpack_makeself)
947find_unpackable_file() {
948 local src=$1
949 if [[ -z ${src} ]] ; then
950 src=${DISTDIR}/${A}
951 else
952 if [[ -e ${DISTDIR}/${src} ]] ; then
953 src=${DISTDIR}/${src}
954 elif [[ -e ${PWD}/${src} ]] ; then
955 src=${PWD}/${src}
956 elif [[ -e ${src} ]] ; then
957 src=${src}
958 fi
959 fi
960 [[ ! -e ${src} ]] && return 1
961 echo "${src}"
962}
963
964# @FUNCTION: unpack_pdv
965# @USAGE: <file to unpack> <size of off_t>
966# @DESCRIPTION:
967# Unpack those pesky pdv generated files ...
968# They're self-unpacking programs with the binary package stuffed in
969# the middle of the archive. Valve seems to use it a lot ... too bad
970# it seems to like to segfault a lot :(. So lets take it apart ourselves.
971#
972# You have to specify the off_t size ... I have no idea how to extract that
973# information out of the binary executable myself. Basically you pass in
974# the size of the off_t type (in bytes) on the machine that built the pdv
975# archive.
976#
977# One way to determine this is by running the following commands:
978#
979# @CODE
980# strings <pdv archive> | grep lseek
981# strace -elseek <pdv archive>
982# @CODE
983#
984# Basically look for the first lseek command (we do the strings/grep because
985# sometimes the function call is _llseek or something) and steal the 2nd
986# parameter. Here is an example:
987#
988# @CODE
989# vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
990# lseek
991# vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
992# lseek(3, -4, SEEK_END) = 2981250
993# @CODE
994#
995# Thus we would pass in the value of '4' as the second parameter.
996unpack_pdv() {
997 local src=$(find_unpackable_file "$1")
998 local sizeoff_t=$2
999
1000 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1001 [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1002
1003 local shrtsrc=$(basename "${src}")
1004 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1005 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1006 local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1007
1008 # grab metadata for debug reasons
1009 local metafile=$(emktemp)
1010 tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1011
1012 # rip out the final file name from the metadata
1013 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1014 datafile=$(basename "${datafile}")
1015
1016 # now lets uncompress/untar the file if need be
1017 local tmpfile=$(emktemp)
1018 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1019
1020 local iscompressed=$(file -b "${tmpfile}")
1021 if [[ ${iscompressed:0:8} == "compress" ]] ; then
1022 iscompressed=1
1023 mv ${tmpfile}{,.Z}
1024 gunzip ${tmpfile}
1025 else
1026 iscompressed=0
1027 fi
1028 local istar=$(file -b "${tmpfile}")
1029 if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1030 istar=1
1031 else
1032 istar=0
1033 fi
1034
1035 #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1036 #dd if=${src} ibs=${metaskip} count=1 \
1037 # | dd ibs=${tailskip} skip=1 \
1038 # | gzip -dc \
1039 # > ${datafile}
1040 if [ ${iscompressed} -eq 1 ] ; then
1041 if [ ${istar} -eq 1 ] ; then
1042 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1043 | head -c $((${metaskip}-${tailskip})) \
1044 | tar -xzf -
1045 else
1046 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1047 | head -c $((${metaskip}-${tailskip})) \
1048 | gzip -dc \
1049 > ${datafile}
1050 fi
1051 else
1052 if [ ${istar} -eq 1 ] ; then
1053 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1054 | head -c $((${metaskip}-${tailskip})) \
1055 | tar --no-same-owner -xf -
1056 else
1057 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1058 | head -c $((${metaskip}-${tailskip})) \
1059 > ${datafile}
1060 fi
1061 fi
1062 true
1063 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1064 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1065}
1066
1067# @FUNCTION: unpack_makeself
1068# @USAGE: [file to unpack] [offset] [tail|dd]
1069# @DESCRIPTION:
1070# Unpack those pesky makeself generated files ...
1071# They're shell scripts with the binary package tagged onto
1072# the end of the archive. Loki utilized the format as does
1073# many other game companies.
1074#
1075# If the file is not specified, then ${A} is used. If the
1076# offset is not specified then we will attempt to extract
1077# the proper offset from the script itself.
1078unpack_makeself() {
1079 local src_input=${1:-${A}}
1080 local src=$(find_unpackable_file "${src_input}")
1081 local skip=$2
1082 local exe=$3
1083
1084 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1085
1086 local shrtsrc=$(basename "${src}")
1087 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1088 if [[ -z ${skip} ]] ; then
1089 local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
1090 local skip=0
1091 exe=tail
1092 case ${ver} in
1093 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1094 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1095 ;;
1096 2.0|2.0.1)
1097 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1098 ;;
1099 2.1.1)
1100 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1101 (( skip++ ))
1102 ;;
1103 2.1.2)
1104 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1105 (( skip++ ))
1106 ;;
1107 2.1.3)
1108 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1109 (( skip++ ))
1110 ;;
1111 2.1.4|2.1.5)
1112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1113 skip=$(head -n ${skip} "${src}" | wc -c)
1114 exe="dd"
1115 ;;
1116 *)
1117 eerror "I'm sorry, but I was unable to support the Makeself file."
1118 eerror "The version I detected was '${ver}'."
1119 eerror "Please file a bug about the file ${shrtsrc} at"
1120 eerror "http://bugs.gentoo.org/ so that support can be added."
1121 die "makeself version '${ver}' not supported"
1122 ;;
1123 esac
1124 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1125 fi
1126 case ${exe} in
1127 tail) exe="tail -n +${skip} '${src}'";;
1128 dd) exe="dd ibs=${skip} skip=1 if='${src}'";;
1129 *) die "makeself cant handle exe '${exe}'"
1130 esac
1131
1132 # lets grab the first few bytes of the file to figure out what kind of archive it is
1133 local filetype tmpfile=$(emktemp)
1134 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1135 filetype=$(file -b "${tmpfile}") || die
1136 case ${filetype} in
1137 *tar\ archive*)
1138 eval ${exe} | tar --no-same-owner -xf -
1139 ;;
1140 bzip2*)
1141 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1142 ;;
1143 gzip*)
1144 eval ${exe} | tar --no-same-owner -xzf -
1145 ;;
1146 compress*)
1147 eval ${exe} | gunzip | tar --no-same-owner -xf -
1148 ;;
1149 *)
1150 eerror "Unknown filetype \"${filetype}\" ?"
1151 false
1152 ;;
1153 esac
1154 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1155}
1156
1157# @FUNCTION: cdrom_get_cds
1158# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1159# @DESCRIPTION:
1160# Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1161# the whole 'non-interactive' policy, but damnit I want CD support !
1162#
1163# With these cdrom functions we handle all the user interaction and
1164# standardize everything. All you have to do is call cdrom_get_cds()
1165# and when the function returns, you can assume that the cd has been
1166# found at CDROM_ROOT.
1167#
1168# The function will attempt to locate a cd based upon a file that is on
1169# the cd. The more files you give this function, the more cds
1170# the cdrom functions will handle.
1171#
1172# Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1173# etc... If you want to give the cds better names, then just export
1174# the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1175# Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1176# also use the CDROM_NAME_SET bash array.
1177#
1178# For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1179cdrom_get_cds() {
1180 # first we figure out how many cds we're dealing with by
1181 # the # of files they gave us
1182 local cdcnt=0
1183 local f=
1184 for f in "$@" ; do
1185 ((++cdcnt))
1186 export CDROM_CHECK_${cdcnt}="$f"
1187 done
1188 export CDROM_TOTAL_CDS=${cdcnt}
1189 export CDROM_CURRENT_CD=1
1190
1191 # now we see if the user gave use CD_ROOT ...
1192 # if they did, let's just believe them that it's correct
1193 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1194 local var=
1195 cdcnt=0
1196 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1197 ((++cdcnt))
1198 var="CD_ROOT_${cdcnt}"
1199 [[ -z ${!var} ]] && var="CD_ROOT"
1200 if [[ -z ${!var} ]] ; then
1201 eerror "You must either use just the CD_ROOT"
1202 eerror "or specify ALL the CD_ROOT_X variables."
1203 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1204 die "could not locate CD_ROOT_${cdcnt}"
1205 fi
1206 done
1207 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1208 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1209 export CDROM_SET=-1
1210 for f in ${CDROM_CHECK_1//:/ } ; do
1211 ((++CDROM_SET))
1212 [[ -e ${CDROM_ROOT}/${f} ]] && break
1213 done
1214 export CDROM_MATCH=${f}
1215 return
1216 fi
1217
1218 # User didn't help us out so lets make sure they know they can
1219 # simplify the whole process ...
1220 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1221 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1222 echo
1223 einfo "If you do not have the CD, but have the data files"
1224 einfo "mounted somewhere on your filesystem, just export"
1225 einfo "the variable CD_ROOT so that it points to the"
1226 einfo "directory containing the files."
1227 echo
1228 einfo "For example:"
1229 einfo "export CD_ROOT=/mnt/cdrom"
1230 echo
1231 else
1232 if [[ -n ${CDROM_NAME_SET} ]] ; then
1233 # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1234 cdcnt=0
1235 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1236 ((++cdcnt))
1237 export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1238 done
1239 fi
1240
1241 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1242 cdcnt=0
1243 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1244 ((++cdcnt))
1245 var="CDROM_NAME_${cdcnt}"
1246 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1247 done
1248 echo
1249 einfo "If you do not have the CDs, but have the data files"
1250 einfo "mounted somewhere on your filesystem, just export"
1251 einfo "the following variables so they point to the right place:"
1252 einfon ""
1253 cdcnt=0
1254 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1255 ((++cdcnt))
1256 echo -n " CD_ROOT_${cdcnt}"
1257 done
1258 echo
1259 einfo "Or, if you have all the files in the same place, or"
1260 einfo "you only have one cdrom, you can export CD_ROOT"
1261 einfo "and that place will be used as the same data source"
1262 einfo "for all the CDs."
1263 echo
1264 einfo "For example:"
1265 einfo "export CD_ROOT_1=/mnt/cdrom"
1266 echo
1267 fi
1268
1269 export CDROM_SET=""
1270 export CDROM_CURRENT_CD=0
1271 cdrom_load_next_cd
1272}
1273
1274# @FUNCTION: cdrom_load_next_cd
1275# @DESCRIPTION:
1276# Some packages are so big they come on multiple CDs. When you're done reading
1277# files off a CD and want access to the next one, just call this function.
1278# Again, all the messy details of user interaction are taken care of for you.
1279# Once this returns, just read the variable CDROM_ROOT for the location of the
1280# mounted CD. Note that you can only go forward in the CD list, so make sure
1281# you only call this function when you're done using the current CD.
1282cdrom_load_next_cd() {
1283 local var
1284 ((++CDROM_CURRENT_CD))
1285
1286 unset CDROM_ROOT
1287 var=CD_ROOT_${CDROM_CURRENT_CD}
1288 [[ -z ${!var} ]] && var="CD_ROOT"
1289 if [[ -z ${!var} ]] ; then
1290 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1291 _cdrom_locate_file_on_cd ${!var}
1292 else
1293 export CDROM_ROOT=${!var}
1294 fi
1295
1296 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1297}
1298
1299# this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1300# functions. this should *never* be called from an ebuild.
1301# all it does is try to locate a give file on a cd ... if the cd isn't
1302# found, then a message asking for the user to insert the cdrom will be
1303# displayed and we'll hang out here until:
1304# (1) the file is found on a mounted cdrom
1305# (2) the user hits CTRL+C
1306_cdrom_locate_file_on_cd() {
1307 local mline=""
1308 local showedmsg=0 showjolietmsg=0
1309
1310 while [[ -z ${CDROM_ROOT} ]] ; do
1311 local i=0
1312 local -a cdset=(${*//:/ })
1313 if [[ -n ${CDROM_SET} ]] ; then
1314 cdset=(${cdset[${CDROM_SET}]})
1315 fi
1316
1317 while [[ -n ${cdset[${i}]} ]] ; do
1318 local dir=$(dirname ${cdset[${i}]})
1319 local file=$(basename ${cdset[${i}]})
1320
1321 local point= node= fs= foo=
1322 while read point node fs foo ; do
1323 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1324 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1325 && continue
1326 point=${point//\040/ }
1327 [[ ! -d ${point}/${dir} ]] && continue
1328 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1329 export CDROM_ROOT=${point}
1330 export CDROM_SET=${i}
1331 export CDROM_MATCH=${cdset[${i}]}
1332 return
1333 done <<< "$(get_mounts)"
1334
1335 ((++i))
1336 done
1337
1338 echo
1339 if [[ ${showedmsg} -eq 0 ]] ; then
1340 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1341 if [[ -z ${CDROM_NAME} ]] ; then
1342 einfo "Please insert+mount the cdrom for ${PN} now !"
1343 else
1344 einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1345 fi
1346 else
1347 if [[ -z ${CDROM_NAME_1} ]] ; then
1348 einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1349 else
1350 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1351 einfo "Please insert+mount the ${!var} cdrom now !"
1352 fi
1353 fi
1354 showedmsg=1
1355 fi
1356 einfo "Press return to scan for the cd again"
1357 einfo "or hit CTRL+C to abort the emerge."
1358 echo
1359 if [[ ${showjolietmsg} -eq 0 ]] ; then
1360 showjolietmsg=1
1361 else
1362 ewarn "If you are having trouble with the detection"
1363 ewarn "of your CD, it is possible that you do not have"
1364 ewarn "Joliet support enabled in your kernel. Please"
1365 ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1366 ebeep 5
1367 fi
1368 read || die "something is screwed with your system"
1369 done
1370} 958}
1371 959
1372# @FUNCTION: strip-linguas 960# @FUNCTION: strip-linguas
1373# @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>] 961# @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1374# @DESCRIPTION: 962# @DESCRIPTION:
1412 else 1000 else
1413 nols="${nols} ${f}" 1001 nols="${nols} ${f}"
1414 fi 1002 fi
1415 done 1003 done
1416 [[ -n ${nols} ]] \ 1004 [[ -n ${nols} ]] \
1417 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols} 1005 && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1418 export LINGUAS=${newls:1} 1006 export LINGUAS=${newls:1}
1419} 1007}
1420 1008
1421# @FUNCTION: preserve_old_lib 1009# @FUNCTION: preserve_old_lib
1422# @USAGE: <libs to preserve> [more libs] 1010# @USAGE: <libs to preserve> [more libs]
1692# @DESCRIPTION: 1280# @DESCRIPTION:
1693# If USE flag is set, echo [true output][true suffix] (defaults to "yes"), 1281# If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1694# otherwise echo [false output][false suffix] (defaults to "no"). 1282# otherwise echo [false output][false suffix] (defaults to "no").
1695usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963 1283usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1696 1284
1285# @FUNCTION: makeopts_jobs
1286# @USAGE: [${MAKEOPTS}]
1287# @DESCRIPTION:
1288# Searches the arguments (defaults to ${MAKEOPTS}) and extracts the jobs number
1289# specified therein. i.e. if the user has MAKEOPTS=-j9, this will show "9".
1290# We can't return the number as bash normalizes it to [0, 255]. If the flags
1291# haven't specified a -j flag, then "1" is shown as that is the default `make`
1292# uses. Useful for running non-make tools in parallel too.
1293makeopts_jobs() {
1294 [[ $# -eq 0 ]] && set -- ${MAKEOPTS}
1295 local x jobs
1296 for x ; do [[ ${x} == -j* ]] && jobs=${x#-j} ; done
1297 echo ${jobs:-1}
1298}
1299
1697check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; } 1300check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1698 1301
1699fi 1302fi

Legend:
Removed from v.1.373  
changed lines
  Added in v.1.390

  ViewVC Help
Powered by ViewVC 1.1.20