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

Diff of /eclass/eutils.eclass

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

Revision 1.329 Revision 1.363
1# Copyright 1999-2009 Gentoo Foundation 1# Copyright 1999-2011 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.329 2010/01/28 22:00:12 betelgeuse Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.363 2011/09/12 20:44:01 mgorny 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
49 sleep 1 49 sleep 1
50 done 50 done
51 fi 51 fi
52} 52}
53 53
54else
55
56ebeep() {
57 ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
58}
59
60epause() {
61 ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
62}
63
64fi
65
66# @FUNCTION: eqawarn
67# @USAGE: [message]
68# @DESCRIPTION:
69# Proxy to ewarn for package managers that don't provide eqawarn and use the PM
70# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
71# profile.
72if ! declare -F eqawarn >/dev/null ; then
73 eqawarn() {
74 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
75 }
54fi 76fi
55 77
56# @FUNCTION: ecvs_clean 78# @FUNCTION: ecvs_clean
57# @USAGE: [list of dirs] 79# @USAGE: [list of dirs]
58# @DESCRIPTION: 80# @DESCRIPTION:
73 [[ -z $* ]] && set -- . 95 [[ -z $* ]] && set -- .
74 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 96 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
75} 97}
76 98
77# @FUNCTION: eshopts_push 99# @FUNCTION: eshopts_push
78# @USAGE: [options to `set`] 100# @USAGE: [options to `set` or `shopt`]
79# @DESCRIPTION: 101# @DESCRIPTION:
80# Often times code will want to enable a shell option to change code behavior. 102# Often times code will want to enable a shell option to change code behavior.
81# Since changing shell options can easily break other pieces of code (which 103# Since changing shell options can easily break other pieces of code (which
82# assume the default state), eshopts_push is used to (1) push the current shell 104# assume the default state), eshopts_push is used to (1) push the current shell
83# options onto a stack and (2) pass the specified arguments to set. 105# options onto a stack and (2) pass the specified arguments to set.
106#
107# If the first argument is '-s' or '-u', we assume you want to call `shopt`
108# rather than `set` as there are some options only available via that.
84# 109#
85# A common example is to disable shell globbing so that special meaning/care 110# A common example is to disable shell globbing so that special meaning/care
86# may be used with variables/arguments to custom functions. That would be: 111# may be used with variables/arguments to custom functions. That would be:
87# @CODE 112# @CODE
88# eshopts_push -o noglob 113# eshopts_push -o noglob
96# @CODE 121# @CODE
97eshopts_push() { 122eshopts_push() {
98 # have to assume __ESHOPTS_SAVE__ isn't screwed with 123 # have to assume __ESHOPTS_SAVE__ isn't screwed with
99 # as a `declare -a` here will reset its value 124 # as a `declare -a` here will reset its value
100 local i=${#__ESHOPTS_SAVE__[@]} 125 local i=${#__ESHOPTS_SAVE__[@]}
126 if [[ $1 == -[su] ]] ; then
101 __ESHOPTS_SAVE__[$i]=$- 127 __ESHOPTS_SAVE__[$i]=$(shopt -p)
102 [[ $# -eq 0 ]] && return 0 128 [[ $# -eq 0 ]] && return 0
129 shopt "$@" || die "eshopts_push: bad options to shopt: $*"
130 else
131 __ESHOPTS_SAVE__[$i]=$-
132 [[ $# -eq 0 ]] && return 0
103 set "$@" || die "eshopts_push: bad options to set: $*" 133 set "$@" || die "eshopts_push: bad options to set: $*"
134 fi
104} 135}
105 136
106# @FUNCTION: eshopts_pop 137# @FUNCTION: eshopts_pop
107# @USAGE: 138# @USAGE:
108# @DESCRIPTION: 139# @DESCRIPTION:
112 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 143 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
113 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 144 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
114 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair" 145 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
115 local s=${__ESHOPTS_SAVE__[$i]} 146 local s=${__ESHOPTS_SAVE__[$i]}
116 unset __ESHOPTS_SAVE__[$i] 147 unset __ESHOPTS_SAVE__[$i]
148 if [[ ${s} == "shopt -"* ]] ; then
149 eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}"
150 else
117 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 151 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-"
118 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}" 152 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
153 fi
119} 154}
120 155
121# @VARIABLE: EPATCH_SOURCE 156# @VARIABLE: EPATCH_SOURCE
122# @DESCRIPTION: 157# @DESCRIPTION:
123# Default directory to search for patches. 158# Default directory to search for patches.
166# If you do not specify any options, then epatch will default to the directory 201# If you do not specify any options, then epatch will default to the directory
167# specified by EPATCH_SOURCE. 202# specified by EPATCH_SOURCE.
168# 203#
169# When processing directories, epatch will apply all patches that match: 204# When processing directories, epatch will apply all patches that match:
170# @CODE 205# @CODE
171# ${EPATCH_FORCE} == "yes" 206# if ${EPATCH_FORCE} != "yes"
172# ??_${ARCH}_foo.${EPATCH_SUFFIX} 207# ??_${ARCH}_foo.${EPATCH_SUFFIX}
173# else 208# else
174# *.${EPATCH_SUFFIX} 209# *.${EPATCH_SUFFIX}
175# @CODE 210# @CODE
176# The leading ?? are typically numbers used to force consistent patch ordering. 211# The leading ?? are typically numbers used to force consistent patch ordering.
215 local EPATCH_SUFFIX=$1 250 local EPATCH_SUFFIX=$1
216 251
217 elif [[ -d $1 ]] ; then 252 elif [[ -d $1 ]] ; then
218 # Some people like to make dirs of patches w/out suffixes (vim) 253 # Some people like to make dirs of patches w/out suffixes (vim)
219 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"} 254 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
255
256 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
257 # Re-use EPATCH_SOURCE as a search dir
258 epatch "${EPATCH_SOURCE}/$1"
259 return $?
220 260
221 else 261 else
222 # sanity check ... if it isn't a dir or file, wtf man ? 262 # sanity check ... if it isn't a dir or file, wtf man ?
223 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1 263 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
224 echo 264 echo
255 # ???_arch_foo.patch 295 # ???_arch_foo.patch
256 # Else, skip this input altogether 296 # Else, skip this input altogether
257 local a=${patchname#*_} # strip the ???_ 297 local a=${patchname#*_} # strip the ???_
258 a=${a%%_*} # strip the _foo.patch 298 a=${a%%_*} # strip the _foo.patch
259 if ! [[ ${SINGLE_PATCH} == "yes" || \ 299 if ! [[ ${SINGLE_PATCH} == "yes" || \
260 ${EPATCH_FORCE} == "yes" || \ 300 ${EPATCH_FORCE} == "yes" || \
261 ${a} == all || \ 301 ${a} == all || \
262 ${a} == ${ARCH} ]] 302 ${a} == ${ARCH} ]]
263 then 303 then
264 continue 304 continue
265 fi 305 fi
266 306
267 # Let people filter things dynamically 307 # Let people filter things dynamically
324 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }') 364 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
325 if [[ -n ${abs_paths} ]] ; then 365 if [[ -n ${abs_paths} ]] ; then
326 count=1 366 count=1
327 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}" 367 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
328 fi 368 fi
369 # Similar reason, but with relative paths.
370 local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}")
371 if [[ -n ${rel_paths} ]] ; then
372 eqawarn "QA Notice: Your patch uses relative paths '../'."
373 eqawarn " In the future this will cause a failure."
374 eqawarn "${rel_paths}"
375 fi
329 376
330 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/ 377 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
331 while [[ ${count} -lt 5 ]] ; do 378 while [[ ${count} -lt 5 ]] ; do
332 # Generate some useful debug info ... 379 # Generate some useful debug info ...
333 ( 380 (
334 _epatch_draw_line "***** ${patchname} *****" 381 _epatch_draw_line "***** ${patchname} *****"
335 echo 382 echo
336 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 383 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
337 echo 384 echo
338 _epatch_draw_line "***** ${patchname} *****" 385 _epatch_draw_line "***** ${patchname} *****"
386 patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}" 2>&1
387 ret=$?
388 echo
389 echo "patch program exited with status ${ret}"
390 exit ${ret}
339 ) >> "${STDERR_TARGET}" 391 ) >> "${STDERR_TARGET}"
340 392
341 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then 393 if [ $? -eq 0 ] ; then
342 ( 394 (
343 _epatch_draw_line "***** ${patchname} *****" 395 _epatch_draw_line "***** ${patchname} *****"
344 echo 396 echo
345 echo "ACTUALLY APPLYING ${patchname} ..." 397 echo "ACTUALLY APPLYING ${patchname} ..."
346 echo 398 echo
347 _epatch_draw_line "***** ${patchname} *****" 399 _epatch_draw_line "***** ${patchname} *****"
348 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1 400 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
401 ret=$?
402 echo
403 echo "patch program exited with status ${ret}"
404 exit ${ret}
349 ) >> "${STDERR_TARGET}" 405 ) >> "${STDERR_TARGET}"
350 406
351 if [ $? -ne 0 ] ; then 407 if [ $? -ne 0 ] ; then
352 echo 408 echo
353 eerror "A dry-run of patch command succeeded, but actually" 409 eerror "A dry-run of patch command succeeded, but actually"
384 done 440 done
385 441
386 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 442 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
387 : # everything worked 443 : # everything worked
388} 444}
445
446# @FUNCTION: epatch_user
447# @USAGE:
448# @DESCRIPTION:
449# Applies user-provided patches to the source tree. The patches are
450# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first
451# of these three directories to exist will be the one to use, ignoring
452# any more general directories which might exist as well.
453#
454# User patches are intended for quick testing of patches without ebuild
455# modifications, as well as for permanent customizations a user might
456# desire. Obviously, there can be no official support for arbitrarily
457# patched ebuilds. So whenever a build log in a bug report mentions that
458# user patches were applied, the user should be asked to reproduce the
459# problem without these.
460#
461# Not all ebuilds do call this function, so placing patches in the
462# stated directory might or might not work, depending on the package and
463# the eclasses it inherits and uses. It is safe to call the function
464# repeatedly, so it is always possible to add a call at the ebuild
465# level. The first call is the time when the patches will be
466# applied.
467#
468# Ideally, this function should be called after gentoo-specific patches
469# have been applied, so that their code can be modified as well, but
470# before calls to e.g. eautoreconf, as the user patches might affect
471# autotool input files as well.
389epatch_user() { 472epatch_user() {
390 [[ $# -ne 0 ]] && die "epatch_user takes no options" 473 [[ $# -ne 0 ]] && die "epatch_user takes no options"
474
475 # Allow multiple calls to this function; ignore all but the first
476 local applied="${T}/epatch_user.applied"
477 [[ -e ${applied} ]] && return 2
391 478
392 # don't clobber any EPATCH vars that the parent might want 479 # don't clobber any EPATCH vars that the parent might want
393 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 480 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
394 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 481 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
395 EPATCH_SOURCE=${base}/${CTARGET}/${check} 482 EPATCH_SOURCE=${base}/${CTARGET}/${check}
399 EPATCH_SOURCE=${EPATCH_SOURCE} \ 486 EPATCH_SOURCE=${EPATCH_SOURCE} \
400 EPATCH_SUFFIX="patch" \ 487 EPATCH_SUFFIX="patch" \
401 EPATCH_FORCE="yes" \ 488 EPATCH_FORCE="yes" \
402 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \ 489 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
403 epatch 490 epatch
404 break 491 echo "${EPATCH_SOURCE}" > "${applied}"
492 return 0
405 fi 493 fi
406 done 494 done
495 echo "none" > "${applied}"
496 return 1
407} 497}
408 498
409# @FUNCTION: emktemp 499# @FUNCTION: emktemp
410# @USAGE: [temp dir] 500# @USAGE: [temp dir]
411# @DESCRIPTION: 501# @DESCRIPTION:
455egetent() { 545egetent() {
456 case ${CHOST} in 546 case ${CHOST} in
457 *-darwin[678]) 547 *-darwin[678])
458 case "$2" in 548 case "$2" in
459 *[!0-9]*) # Non numeric 549 *[!0-9]*) # Non numeric
460 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 550 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
461 ;; 551 ;;
462 *) # Numeric 552 *) # Numeric
463 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 553 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
464 ;; 554 ;;
465 esac 555 esac
683 fi 773 fi
684 ;; 774 ;;
685 775
686 *) 776 *)
687 if [[ -z $@ ]] ; then 777 if [[ -z $@ ]] ; then
688 useradd ${opts} \ 778 useradd -r ${opts} \
689 -c "added by portage for ${PN}" \ 779 -c "added by portage for ${PN}" \
690 ${euser} \ 780 ${euser} \
691 || die "enewuser failed" 781 || die "enewuser failed"
692 else 782 else
693 einfo " - Extra: $@" 783 einfo " - Extra: $@"
694 useradd ${opts} "$@" \ 784 useradd -r ${opts} "$@" \
695 ${euser} \ 785 ${euser} \
696 || die "enewuser failed" 786 || die "enewuser failed"
697 fi 787 fi
698 ;; 788 ;;
699 esac 789 esac
812 esac 902 esac
813 groupadd -g ${egid} ${egroup} || die "enewgroup failed" 903 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
814 ;; 904 ;;
815 905
816 *) 906 *)
907 # We specify -r so that we get a GID in the system range from login.defs
817 groupadd ${opts} ${egroup} || die "enewgroup failed" 908 groupadd -r ${opts} ${egroup} || die "enewgroup failed"
818 ;; 909 ;;
819 esac 910 esac
820 export SANDBOX_ON="${oldsandbox}" 911 export SANDBOX_ON="${oldsandbox}"
821} 912}
822 913
833 924
834# Make a desktop file ! 925# Make a desktop file !
835# Great for making those icons in kde/gnome startmenu ! 926# Great for making those icons in kde/gnome startmenu !
836# Amaze your friends ! Get the women ! Join today ! 927# Amaze your friends ! Get the women ! Join today !
837# 928#
838# make_desktop_entry(<command>, [name], [icon], [type], [path]) 929# make_desktop_entry(<command>, [name], [icon], [type], [fields])
839# 930#
840# binary: what command does the app run with ? 931# binary: what command does the app run with ?
841# name: the name that will show up in the menu 932# name: the name that will show up in the menu
842# icon: give your little like a pretty little icon ... 933# icon: give your little like a pretty little icon ...
843# this can be relative (to /usr/share/pixmaps) or 934# this can be relative (to /usr/share/pixmaps) or
844# a full path to an icon 935# a full path to an icon
845# type: what kind of application is this ? for categories: 936# type: what kind of application is this ? for categories:
846# http://standards.freedesktop.org/menu-spec/latest/apa.html 937# http://standards.freedesktop.org/menu-spec/latest/apa.html
847# path: if your app needs to startup in a specific dir 938# fields: extra fields to append to the desktop file; a printf string
848make_desktop_entry() { 939make_desktop_entry() {
849 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1 940 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
850 941
851 local exec=${1} 942 local exec=${1}
852 local name=${2:-${PN}} 943 local name=${2:-${PN}}
853 local icon=${3:-${PN}} 944 local icon=${3:-${PN}}
854 local type=${4} 945 local type=${4}
855 local path=${5} 946 local fields=${5}
856 947
857 if [[ -z ${type} ]] ; then 948 if [[ -z ${type} ]] ; then
858 local catmaj=${CATEGORY%%-*} 949 local catmaj=${CATEGORY%%-*}
859 local catmin=${CATEGORY##*-} 950 local catmin=${CATEGORY##*-}
860 case ${catmaj} in 951 case ${catmaj} in
861 app) 952 app)
862 case ${catmin} in 953 case ${catmin} in
863 accessibility) type=Accessibility;; 954 accessibility) type=Accessibility;;
864 admin) type=System;; 955 admin) type=System;;
865 antivirus) type=System;; 956 antivirus) type=System;;
866 arch) type=Archiving;; 957 arch) type=Archiving;;
867 backup) type=Archiving;; 958 backup) type=Archiving;;
868 cdr) type=DiscBurning;; 959 cdr) type=DiscBurning;;
869 dicts) type=Dictionary;; 960 dicts) type=Dictionary;;
870 doc) type=Documentation;; 961 doc) type=Documentation;;
871 editors) type=TextEditor;; 962 editors) type=TextEditor;;
872 emacs) type=TextEditor;; 963 emacs) type=TextEditor;;
873 emulation) type=Emulator;; 964 emulation) type=Emulator;;
874 laptop) type=HardwareSettings;; 965 laptop) type=HardwareSettings;;
875 office) type=Office;; 966 office) type=Office;;
876 pda) type=PDA;; 967 pda) type=PDA;;
877 vim) type=TextEditor;; 968 vim) type=TextEditor;;
878 xemacs) type=TextEditor;; 969 xemacs) type=TextEditor;;
879 *) type=;;
880 esac 970 esac
881 ;; 971 ;;
882 972
883 dev) 973 dev)
884 type="Development" 974 type="Development"
885 ;; 975 ;;
886 976
887 games) 977 games)
888 case ${catmin} in 978 case ${catmin} in
889 action|fps) type=ActionGame;; 979 action|fps) type=ActionGame;;
890 arcade) type=ArcadeGame;; 980 arcade) type=ArcadeGame;;
891 board) type=BoardGame;; 981 board) type=BoardGame;;
892 emulation) type=Emulator;; 982 emulation) type=Emulator;;
893 kids) type=KidsGame;; 983 kids) type=KidsGame;;
894 puzzle) type=LogicGame;; 984 puzzle) type=LogicGame;;
895 roguelike) type=RolePlaying;; 985 roguelike) type=RolePlaying;;
896 rpg) type=RolePlaying;; 986 rpg) type=RolePlaying;;
897 simulation) type=Simulation;; 987 simulation) type=Simulation;;
898 sports) type=SportsGame;; 988 sports) type=SportsGame;;
899 strategy) type=StrategyGame;; 989 strategy) type=StrategyGame;;
900 *) type=;;
901 esac 990 esac
902 type="Game;${type}" 991 type="Game;${type}"
903 ;; 992 ;;
904 993
905 gnome) 994 gnome)
914 type="Network;Email" 1003 type="Network;Email"
915 ;; 1004 ;;
916 1005
917 media) 1006 media)
918 case ${catmin} in 1007 case ${catmin} in
1008 gfx)
919 gfx) type=Graphics;; 1009 type=Graphics
1010 ;;
1011 *)
1012 case ${catmin} in
920 radio) type=Tuner;; 1013 radio) type=Tuner;;
921 sound) type=Audio;; 1014 sound) type=Audio;;
922 tv) type=TV;; 1015 tv) type=TV;;
923 video) type=Video;; 1016 video) type=Video;;
924 *) type=;; 1017 esac
1018 type="AudioVideo;${type}"
1019 ;;
925 esac 1020 esac
926 type="AudioVideo;${type}"
927 ;; 1021 ;;
928 1022
929 net) 1023 net)
930 case ${catmin} in 1024 case ${catmin} in
931 dialup) type=Dialup;; 1025 dialup) type=Dialup;;
932 ftp) type=FileTransfer;; 1026 ftp) type=FileTransfer;;
933 im) type=InstantMessaging;; 1027 im) type=InstantMessaging;;
934 irc) type=IRCClient;; 1028 irc) type=IRCClient;;
935 mail) type=Email;; 1029 mail) type=Email;;
936 news) type=News;; 1030 news) type=News;;
937 nntp) type=News;; 1031 nntp) type=News;;
938 p2p) type=FileTransfer;; 1032 p2p) type=FileTransfer;;
939 *) type=;; 1033 voip) type=Telephony;;
940 esac 1034 esac
941 type="Network;${type}" 1035 type="Network;${type}"
942 ;; 1036 ;;
943 1037
944 sci) 1038 sci)
945 case ${catmin} in 1039 case ${catmin} in
946 astro*) type=Astronomy;; 1040 astro*) type=Astronomy;;
947 bio*) type=Biology;; 1041 bio*) type=Biology;;
948 calc*) type=Calculator;; 1042 calc*) type=Calculator;;
949 chem*) type=Chemistry;; 1043 chem*) type=Chemistry;;
950 elec*) type=Electronics;; 1044 elec*) type=Electronics;;
951 geo*) type=Geology;; 1045 geo*) type=Geology;;
952 math*) type=Math;; 1046 math*) type=Math;;
953 physics) type=Physics;; 1047 physics) type=Physics;;
954 visual*) type=DataVisualization;; 1048 visual*) type=DataVisualization;;
955 *) type=;;
956 esac 1049 esac
957 type="Science;${type}" 1050 type="Education;Science;${type}"
958 ;; 1051 ;;
959 1052
960 sys) 1053 sys)
961 type="System" 1054 type="System"
962 ;; 1055 ;;
963 1056
964 www) 1057 www)
965 case ${catmin} in 1058 case ${catmin} in
966 client) type=WebBrowser;; 1059 client) type=WebBrowser;;
967 *) type=;;
968 esac 1060 esac
969 type="Network" 1061 type="Network;${type}"
970 ;; 1062 ;;
971 1063
972 *) 1064 *)
973 type= 1065 type=
974 ;; 1066 ;;
979 else 1071 else
980 local desktop_name="${PN}-${SLOT}" 1072 local desktop_name="${PN}-${SLOT}"
981 fi 1073 fi
982 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop" 1074 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
983 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 1075 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
1076
1077 # Don't append another ";" when a valid category value is provided.
1078 type=${type%;}${type:+;}
1079
1080 eshopts_push -s extglob
1081 if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
1082 ewarn "As described in the Icon Theme Specification, icon file extensions are not"
1083 ewarn "allowed in .desktop files if the value is not an absolute path."
1084 icon=${icon%.@(xpm|png|svg)}
1085 fi
1086 eshopts_pop
984 1087
985 cat <<-EOF > "${desktop}" 1088 cat <<-EOF > "${desktop}"
986 [Desktop Entry] 1089 [Desktop Entry]
987 Name=${name} 1090 Name=${name}
988 Type=Application 1091 Type=Application
989 Comment=${DESCRIPTION} 1092 Comment=${DESCRIPTION}
990 Exec=${exec} 1093 Exec=${exec}
991 TryExec=${exec%% *} 1094 TryExec=${exec%% *}
992 Icon=${icon} 1095 Icon=${icon}
993 Categories=${type}; 1096 Categories=${type}
994 EOF 1097 EOF
995 1098
996 [[ ${path} ]] && echo "Path=${path}" >> "${desktop}" 1099 if [[ ${fields:-=} != *=* ]] ; then
1100 # 5th arg used to be value to Path=
1101 ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"
1102 fields="Path=${fields}"
1103 fi
1104 [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"
997 1105
998 ( 1106 (
999 # wrap the env here so that the 'insinto' call 1107 # wrap the env here so that the 'insinto' call
1000 # doesn't corrupt the env of the caller 1108 # doesn't corrupt the env of the caller
1001 insinto /usr/share/applications 1109 insinto /usr/share/applications
1002 doins "${desktop}" 1110 doins "${desktop}"
1003 ) 1111 ) || die "installing desktop file failed"
1004} 1112}
1005 1113
1006# @FUNCTION: validate_desktop_entries 1114# @FUNCTION: validate_desktop_entries
1007# @USAGE: [directories] 1115# @USAGE: [directories]
1008# @MAINTAINER: 1116# @MAINTAINER:
1287 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'" 1395 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1288 1396
1289 local shrtsrc=$(basename "${src}") 1397 local shrtsrc=$(basename "${src}")
1290 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1398 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1291 if [[ -z ${skip} ]] ; then 1399 if [[ -z ${skip} ]] ; then
1292 local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}') 1400 local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
1293 local skip=0 1401 local skip=0
1294 exe=tail 1402 exe=tail
1295 case ${ver} in 1403 case ${ver} in
1296 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1404 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1297 skip=$(grep -a ^skip= "${src}" | cut -d= -f2) 1405 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1299 2.0|2.0.1) 1407 2.0|2.0.1)
1300 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-) 1408 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1301 ;; 1409 ;;
1302 2.1.1) 1410 2.1.1)
1303 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-) 1411 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1304 let skip="skip + 1" 1412 (( skip++ ))
1305 ;; 1413 ;;
1306 2.1.2) 1414 2.1.2)
1307 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1) 1415 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1308 let skip="skip + 1" 1416 (( skip++ ))
1309 ;; 1417 ;;
1310 2.1.3) 1418 2.1.3)
1311 skip=`grep -a ^offset= "${src}" | awk '{print $3}'` 1419 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1312 let skip="skip + 1" 1420 (( skip++ ))
1313 ;; 1421 ;;
1314 2.1.4|2.1.5) 1422 2.1.4|2.1.5)
1315 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) 1423 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1316 skip=$(head -n ${skip} "${src}" | wc -c) 1424 skip=$(head -n ${skip} "${src}" | wc -c)
1317 exe="dd" 1425 exe="dd"
1326 esac 1434 esac
1327 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" 1435 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1328 fi 1436 fi
1329 case ${exe} in 1437 case ${exe} in
1330 tail) exe="tail -n +${skip} '${src}'";; 1438 tail) exe="tail -n +${skip} '${src}'";;
1331 dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";; 1439 dd) exe="dd ibs=${skip} skip=1 if='${src}'";;
1332 *) die "makeself cant handle exe '${exe}'" 1440 *) die "makeself cant handle exe '${exe}'"
1333 esac 1441 esac
1334 1442
1335 # lets grab the first few bytes of the file to figure out what kind of archive it is 1443 # lets grab the first few bytes of the file to figure out what kind of archive it is
1336 local tmpfile=$(emktemp) 1444 local filetype tmpfile=$(emktemp)
1337 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}" 1445 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1338 local filetype=$(file -b "${tmpfile}") 1446 filetype=$(file -b "${tmpfile}") || die
1339 case ${filetype} in 1447 case ${filetype} in
1340 *tar\ archive*) 1448 *tar\ archive*)
1341 eval ${exe} | tar --no-same-owner -xf - 1449 eval ${exe} | tar --no-same-owner -xf -
1342 ;; 1450 ;;
1343 bzip2*) 1451 bzip2*)
1469 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}} 1577 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1470 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1578 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1471 export CDROM_SET=-1 1579 export CDROM_SET=-1
1472 for f in ${CDROM_CHECK_1//:/ } ; do 1580 for f in ${CDROM_CHECK_1//:/ } ; do
1473 ((++CDROM_SET)) 1581 ((++CDROM_SET))
1474 [[ -e ${CD_ROOT}/${f} ]] && break 1582 [[ -e ${CDROM_ROOT}/${f} ]] && break
1475 done 1583 done
1476 export CDROM_MATCH=${f} 1584 export CDROM_MATCH=${f}
1477 return 1585 return
1478 fi 1586 fi
1479 1587
1653 else 1761 else
1654 newls="" 1762 newls=""
1655 fi 1763 fi
1656 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do 1764 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1657 if [[ ${op} == "-i" ]] ; then 1765 if [[ ${op} == "-i" ]] ; then
1658 hasq ${f} ${ls} && newls="${newls} ${f}" 1766 has ${f} ${ls} && newls="${newls} ${f}"
1659 else 1767 else
1660 hasq ${f} ${ls} || newls="${newls} ${f}" 1768 has ${f} ${ls} || newls="${newls} ${f}"
1661 fi 1769 fi
1662 done 1770 done
1663 ls=${newls} 1771 ls=${newls}
1664 done 1772 done
1665 else 1773 else
1667 fi 1775 fi
1668 1776
1669 nols="" 1777 nols=""
1670 newls="" 1778 newls=""
1671 for f in ${LINGUAS} ; do 1779 for f in ${LINGUAS} ; do
1672 if hasq ${f} ${ls} ; then 1780 if has ${f} ${ls} ; then
1673 newls="${newls} ${f}" 1781 newls="${newls} ${f}"
1674 else 1782 else
1675 nols="${nols} ${f}" 1783 nols="${nols} ${f}"
1676 fi 1784 fi
1677 done 1785 done
1732 ewarn "the libraries are not being removed. You need to run revdep-rebuild" 1840 ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1733 ewarn "in order to remove these old dependencies. If you do not have this" 1841 ewarn "in order to remove these old dependencies. If you do not have this"
1734 ewarn "helper program, simply emerge the 'gentoolkit' package." 1842 ewarn "helper program, simply emerge the 'gentoolkit' package."
1735 ewarn 1843 ewarn
1736 fi 1844 fi
1845 # temp hack for #348634 #357225
1846 [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1737 ewarn " # revdep-rebuild --library ${lib##*/}" 1847 ewarn " # revdep-rebuild --library '${lib}'"
1738 done 1848 done
1739 if [[ ${notice} -eq 1 ]] ; then 1849 if [[ ${notice} -eq 1 ]] ; then
1740 ewarn 1850 ewarn
1741 ewarn "Once you've finished running revdep-rebuild, it should be safe to" 1851 ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1742 ewarn "delete the old libraries. Here is a copy & paste for the lazy:" 1852 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1888 else 1998 else
1889 newbin "${tmpwrapper}" "${wrapper}" || die 1999 newbin "${tmpwrapper}" "${wrapper}" || die
1890 fi 2000 fi
1891} 2001}
1892 2002
1893# @FUNCTION: prepalldocs 2003# @FUNCTION: path_exists
1894# @USAGE: 2004# @USAGE: [-a|-o] <paths>
1895# @DESCRIPTION: 2005# @DESCRIPTION:
1896# Compress files in /usr/share/doc which are not already 2006# Check if the specified paths exist. Works for all types of paths
1897# compressed, excluding /usr/share/doc/${PF}/html. 2007# (files/dirs/etc...). The -a and -o flags control the requirements
1898# Uses the ecompressdir to do the compression. 2008# of the paths. They correspond to "and" and "or" logic. So the -a
1899# 2009-02-18 by betelgeuse: 2009# flag means all the paths must exist while the -o flag means at least
1900# Commented because ecompressdir is even more internal to 2010# one of the paths must exist. The default behavior is "and". If no
1901# Portage than prepalldocs (it's not even mentioned in man 5 2011# paths are specified, then the return value is "false".
1902# ebuild). Please submit a better version for review to gentoo-dev 2012path_exists() {
1903# if you want prepalldocs here. 2013 local opt=$1
1904#prepalldocs() { 2014 [[ ${opt} == -[ao] ]] && shift || opt="-a"
1905# if [[ -n $1 ]] ; then
1906# ewarn "prepalldocs: invalid usage; takes no arguments"
1907# fi
1908 2015
1909# cd "${D}" 2016 # no paths -> return false
1910# [[ -d usr/share/doc ]] || return 0 2017 # same behavior as: [[ -e "" ]]
2018 [[ $# -eq 0 ]] && return 1
1911 2019
1912# find usr/share/doc -exec gzip {} + 2020 local p r=0
1913# ecompressdir --ignore /usr/share/doc/${PF}/html 2021 for p in "$@" ; do
1914# ecompressdir --queue /usr/share/doc 2022 [[ -e ${p} ]]
1915#} 2023 : $(( r += $? ))
2024 done
2025
2026 case ${opt} in
2027 -a) return $(( r != 0 )) ;;
2028 -o) return $(( r == $# )) ;;
2029 esac
2030}

Legend:
Removed from v.1.329  
changed lines
  Added in v.1.363

  ViewVC Help
Powered by ViewVC 1.1.20