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

Diff of /eclass/eutils.eclass

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

Revision 1.272 Revision 1.284
1# Copyright 1999-2006 Gentoo Foundation 1# Copyright 1999-2007 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.272 2007/01/31 04:40:31 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.284 2007/06/21 04:44:45 vapier Exp $
4# 4
5# This eclass is for general purpose functions that most ebuilds 5# @ECLASS: eutils.eclass
6# have to implement themselves. 6# @MAINTAINER:
7# 7# base-system@gentoo.org
8# NB: If you add anything, please comment it! 8# @BLURB: many extra (but common) functions that are used in ebuilds
9# 9# @DESCRIPTION:
10# Maintainer: see each individual function, base-system@gentoo.org as default 10# The eutils eclass contains a suite of functions that complement
11# the ones that ebuild.sh already contain. The idea is that the functions
12# are not required in all ebuilds but enough utilize them to have a common
13# home rather than having multiple ebuilds implementing the same thing.
14#
15# Due to the nature of this eclass, some functions may have maintainers
16# different from the overall eclass!
11 17
12inherit multilib portability 18inherit multilib portability
13 19
14DESCRIPTION="Based on the ${ECLASS} eclass" 20DESCRIPTION="Based on the ${ECLASS} eclass"
15 21
16# Wait for the supplied number of seconds. If no argument is supplied, defaults 22# @FUNCTION: epause
17# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not 23# @USAGE: [seconds]
18# outputting to a terminal, don't wait. For compatability purposes, the argument 24# @DESCRIPTION:
19# must be an integer greater than zero. 25# Sleep for the specified number of seconds (default of 5 seconds). Useful when
20# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004) 26# printing a message the user should probably be reading and often used in
27# conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
28# don't wait at all.
21epause() { 29epause() {
22 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5} 30 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
23} 31}
24 32
25# Beep the specified number of times (defaults to five). If our output 33# @FUNCTION: ebeep
26# is not a terminal, don't beep. If the EBEEP_IGNORE env var is set, 34# @USAGE: [number of beeps]
35# @DESCRIPTION:
36# Issue the specified number of beeps (default of 5 beeps). Useful when
37# printing a message the user should probably be reading and often used in
38# conjunction with the epause function. If the EBEEP_IGNORE env var is set,
27# don't beep. 39# don't beep at all.
28# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
29ebeep() { 40ebeep() {
30 local n 41 local n
31 if [[ -z ${EBEEP_IGNORE} ]] ; then 42 if [[ -z ${EBEEP_IGNORE} ]] ; then
32 for ((n=1 ; n <= ${1:-5} ; n++)) ; do 43 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
33 echo -ne "\a" 44 echo -ne "\a"
35 echo -ne "\a" 46 echo -ne "\a"
36 sleep 1 47 sleep 1
37 done 48 done
38 fi 49 fi
39} 50}
40
41# This function generate linker scripts in /usr/lib for dynamic
42# libs in /lib. This is to fix linking problems when you have
43# the .so in /lib, and the .a in /usr/lib. What happens is that
44# in some cases when linking dynamic, the .a in /usr/lib is used
45# instead of the .so in /lib due to gcc/libtool tweaking ld's
46# library search path. This cause many builds to fail.
47# See bug #4411 for more info.
48#
49# To use, simply call:
50#
51# gen_usr_ldscript libfoo.so
52#
53# Note that you should in general use the unversioned name of
54# the library, as ldconfig should usually update it correctly
55# to point to the latest version of the library present.
56#
57# <azarah@gentoo.org> (26 Oct 2002)
58#
59gen_usr_ldscript() {
60 if [[ $(type -t _tc_gen_usr_ldscript) == "function" ]] ; then
61 _tc_gen_usr_ldscript "$@"
62 return $?
63 fi
64
65 ewarn "QA Notice: Please upgrade your ebuild to use toolchain-funcs"
66 ewarn "QA Notice: rather than gen_usr_ldscript() from eutils"
67
68 local lib libdir=$(get_libdir)
69 # Just make sure it exists
70 dodir /usr/${libdir}
71
72 for lib in "${@}" ; do
73 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
74 /* GNU ld script
75 Since Gentoo has critical dynamic libraries
76 in /lib, and the static versions in /usr/lib,
77 we need to have a "fake" dynamic lib in /usr/lib,
78 otherwise we run into linking problems.
79
80 See bug http://bugs.gentoo.org/4411 for more info.
81 */
82 GROUP ( /${libdir}/${lib} )
83 END_LDSCRIPT
84 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
85 done
86}
87
88 51
89# Default directory where patches are located 52# Default directory where patches are located
90EPATCH_SOURCE="${WORKDIR}/patch" 53EPATCH_SOURCE="${WORKDIR}/patch"
91# Default extension for patches 54# Default extension for patches
92EPATCH_SUFFIX="patch.bz2" 55EPATCH_SUFFIX="patch.bz2"
350 then 313 then
351 einfo "Done with patching" 314 einfo "Done with patching"
352 fi 315 fi
353} 316}
354 317
318# @FUNCTION: emktemp
319# @USAGE: [temp dir]
320# @DESCRIPTION:
355# Cheap replacement for when debianutils (and thus mktemp) 321# Cheap replacement for when debianutils (and thus mktemp)
356# does not exist on the users system 322# does not exist on the users system.
357# vapier@gentoo.org
358#
359# Takes just 1 optional parameter (the directory to create tmpfile in)
360emktemp() { 323emktemp() {
361 local exe="touch" 324 local exe="touch"
362 [[ $1 == -d ]] && exe="mkdir" && shift 325 [[ $1 == -d ]] && exe="mkdir" && shift
363 local topdir=$1 326 local topdir=$1
364 327
366 [[ -z ${T} ]] \ 329 [[ -z ${T} ]] \
367 && topdir="/tmp" \ 330 && topdir="/tmp" \
368 || topdir=${T} 331 || topdir=${T}
369 fi 332 fi
370 333
371 if [[ -z $(type -p mktemp) ]] ; then 334 if ! type -P mktemp > /dev/null ; then
335 # system lacks `mktemp` so we have to fake it
372 local tmp=/ 336 local tmp=/
373 while [[ -e ${tmp} ]] ; do 337 while [[ -e ${tmp} ]] ; do
374 tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM} 338 tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
375 done 339 done
376 ${exe} "${tmp}" || ${exe} -p "${tmp}" 340 ${exe} "${tmp}" || ${exe} -p "${tmp}"
377 echo "${tmp}" 341 echo "${tmp}"
378 else 342 else
343 # the args here will give slightly wierd names on BSD,
344 # but should produce a usable file on all userlands
379 if [[ ${exe} == "touch" ]] ; then 345 if [[ ${exe} == "touch" ]] ; then
380 [[ ${USERLAND} == "GNU" ]] \
381 && mktemp -p "${topdir}" \
382 || TMPDIR="${topdir}" mktemp -t tmp 346 TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX
383 else 347 else
384 [[ ${USERLAND} == "GNU" ]] \
385 && mktemp -d "${topdir}" \
386 || TMPDIR="${topdir}" mktemp -dt tmp 348 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
387 fi
388 fi 349 fi
350 fi
389} 351}
390 352
353# @FUNCTION: egetent
354# @USAGE: <database> <key>
355# @MAINTAINER:
356# base-system@gentoo.org (Linux)
357# Joe Jezak <josejx@gmail.com> (OS X)
358# usata@gentoo.org (OS X)
359# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
360# @DESCRIPTION:
391# Small wrapper for getent (Linux), nidump (Mac OS X), 361# Small wrapper for getent (Linux), nidump (Mac OS X),
392# and pw (FreeBSD) used in enewuser()/enewgroup() 362# and pw (FreeBSD) used in enewuser()/enewgroup()
393# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
394# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
395#
396# egetent(database, key)
397egetent() { 363egetent() {
398 case ${CHOST} in 364 case ${CHOST} in
399 *-darwin*) 365 *-darwin*)
400 case "$2" in 366 case "$2" in
401 *[!0-9]*) # Non numeric 367 *[!0-9]*) # Non numeric
425 getent "$1" "$2" 391 getent "$1" "$2"
426 ;; 392 ;;
427 esac 393 esac
428} 394}
429 395
430# Simplify/standardize adding users to the system 396# @FUNCTION: enewuser
431# vapier@gentoo.org 397# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
432# 398# @DESCRIPTION:
433# enewuser(username, uid, shell, homedir, groups, extra options) 399# Same as enewgroup, you are not required to understand how to properly add
434# 400# a user to the system. The only required parameter is the username.
435# Default values if you do not specify any: 401# Default uid is (pass -1 for this) next available, default shell is
436# username: REQUIRED ! 402# /bin/false, default homedir is /dev/null, there are no default groups,
437# uid: next available (see useradd(8)) 403# and default params sets the comment as 'added by portage for ${PN}'.
438# note: pass -1 to get default behavior
439# shell: /bin/false
440# homedir: /dev/null
441# groups: none
442# extra: comment of 'added by portage for ${PN}'
443enewuser() { 404enewuser() {
444 case ${EBUILD_PHASE} in 405 case ${EBUILD_PHASE} in
445 unpack|compile|test|install) 406 unpack|compile|test|install)
446 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function." 407 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
447 eerror "Package fails at QA and at life. Please file a bug." 408 eerror "Package fails at QA and at life. Please file a bug."
636 fi 597 fi
637 598
638 export SANDBOX_ON=${oldsandbox} 599 export SANDBOX_ON=${oldsandbox}
639} 600}
640 601
641# Simplify/standardize adding groups to the system 602# @FUNCTION: enewgroup
642# vapier@gentoo.org 603# @USAGE: <group> [gid]
643# 604# @DESCRIPTION:
644# enewgroup(group, gid) 605# This function does not require you to understand how to properly add a
645# 606# group to the system. Just give it a group name to add and enewgroup will
646# Default values if you do not specify any: 607# do the rest. You may specify the gid for the group or allow the group to
647# groupname: REQUIRED ! 608# allocate the next available one.
648# gid: next available (see groupadd(8))
649# extra: none
650enewgroup() { 609enewgroup() {
651 case ${EBUILD_PHASE} in 610 case ${EBUILD_PHASE} in
652 unpack|compile|test|install) 611 unpack|compile|test|install)
653 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function." 612 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
654 eerror "Package fails at QA and at life. Please file a bug." 613 eerror "Package fails at QA and at life. Please file a bug."
750 ;; 709 ;;
751 esac 710 esac
752 export SANDBOX_ON="${oldsandbox}" 711 export SANDBOX_ON="${oldsandbox}"
753} 712}
754 713
755# Simple script to replace 'dos2unix' binaries 714# @FUNCTION: edos2unix
756# vapier@gentoo.org 715# @USAGE: <file> [more files ...]
757# 716# @DESCRIPTION:
758# edos2unix(file, <more files> ...) 717# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
718# to remove all of these text utilities from DEPEND variables because this
719# is a script based solution. Just give it a list of files to convert and
720# they will all be changed from the DOS CRLF format to the UNIX LF format.
759edos2unix() { 721edos2unix() {
760 echo "$@" | xargs sed -i 's/\r$//' 722 echo "$@" | xargs sed -i 's/\r$//'
761} 723}
762
763
764##############################################################
765# START: Handle .desktop files and menu entries #
766# maybe this should be separated into a new eclass some time #
767# lanius@gentoo.org #
768##############################################################
769 724
770# Make a desktop file ! 725# Make a desktop file !
771# Great for making those icons in kde/gnome startmenu ! 726# Great for making those icons in kde/gnome startmenu !
772# Amaze your friends ! Get the women ! Join today ! 727# Amaze your friends ! Get the women ! Join today !
773# 728#
777# name: the name that will show up in the menu 732# name: the name that will show up in the menu
778# icon: give your little like a pretty little icon ... 733# icon: give your little like a pretty little icon ...
779# this can be relative (to /usr/share/pixmaps) or 734# this can be relative (to /usr/share/pixmaps) or
780# a full path to an icon 735# a full path to an icon
781# type: what kind of application is this ? for categories: 736# type: what kind of application is this ? for categories:
782# http://www.freedesktop.org/Standards/desktop-entry-spec 737# http://standards.freedesktop.org/menu-spec/latest/apa.html
783# path: if your app needs to startup in a specific dir 738# path: if your app needs to startup in a specific dir
784make_desktop_entry() { 739make_desktop_entry() {
785 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1 740 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
786 741
787 local exec=${1} 742 local exec=${1}
794 local catmaj=${CATEGORY%%-*} 749 local catmaj=${CATEGORY%%-*}
795 local catmin=${CATEGORY##*-} 750 local catmin=${CATEGORY##*-}
796 case ${catmaj} in 751 case ${catmaj} in
797 app) 752 app)
798 case ${catmin} in 753 case ${catmin} in
754 accessibility) type=Accessibility;;
799 admin) type=System;; 755 admin) type=System;;
756 antivirus) type=System;;
757 arch) type=Archiving;;
758 backup) type=Archiving;;
800 cdr) type=DiscBurning;; 759 cdr) type=DiscBurning;;
801 dicts) type=Dictionary;; 760 dicts) type=Dictionary;;
761 doc) type=Documentation;;
802 editors) type=TextEditor;; 762 editors) type=TextEditor;;
803 emacs) type=TextEditor;; 763 emacs) type=TextEditor;;
804 emulation) type=Emulator;; 764 emulation) type=Emulator;;
805 laptop) type=HardwareSettings;; 765 laptop) type=HardwareSettings;;
806 office) type=Office;; 766 office) type=Office;;
767 pda) type=PDA;;
807 vim) type=TextEditor;; 768 vim) type=TextEditor;;
808 xemacs) type=TextEditor;; 769 xemacs) type=TextEditor;;
809 *) type=;; 770 *) type=;;
810 esac 771 esac
811 ;; 772 ;;
817 games) 778 games)
818 case ${catmin} in 779 case ${catmin} in
819 action|fps) type=ActionGame;; 780 action|fps) type=ActionGame;;
820 arcade) type=ArcadeGame;; 781 arcade) type=ArcadeGame;;
821 board) type=BoardGame;; 782 board) type=BoardGame;;
783 emulation) type=Emulator;;
822 kids) type=KidsGame;; 784 kids) type=KidsGame;;
823 emulation) type=Emulator;;
824 puzzle) type=LogicGame;; 785 puzzle) type=LogicGame;;
786 roguelike) type=RolePlaying;;
825 rpg) type=RolePlaying;; 787 rpg) type=RolePlaying;;
826 roguelike) type=RolePlaying;;
827 simulation) type=Simulation;; 788 simulation) type=Simulation;;
828 sports) type=SportsGame;; 789 sports) type=SportsGame;;
829 strategy) type=StrategyGame;; 790 strategy) type=StrategyGame;;
830 *) type=;; 791 *) type=;;
831 esac 792 esac
832 type="Game;${type}" 793 type="Game;${type}"
794 ;;
795
796 gnome)
797 type="Gnome;GTK"
798 ;;
799
800 kde)
801 type="KDE;Qt"
833 ;; 802 ;;
834 803
835 mail) 804 mail)
836 type="Network;Email" 805 type="Network;Email"
837 ;; 806 ;;
863 type="Network;${type}" 832 type="Network;${type}"
864 ;; 833 ;;
865 834
866 sci) 835 sci)
867 case ${catmin} in 836 case ${catmin} in
868 astro*) type=Astronomy;; 837 astro*) type=Astronomy;;
869 bio*) type=Biology;; 838 bio*) type=Biology;;
870 calc*) type=Calculator;; 839 calc*) type=Calculator;;
871 chem*) type=Chemistry;; 840 chem*) type=Chemistry;;
841 elec*) type=Electronics;;
872 geo*) type=Geology;; 842 geo*) type=Geology;;
873 math*) type=Math;; 843 math*) type=Math;;
844 physics) type=Physics;;
845 visual*) type=DataVisualization;;
874 *) type=;; 846 *) type=;;
875 esac 847 esac
876 type="Science;${type}" 848 type="Science;${type}"
849 ;;
850
851 sys)
852 type="System"
877 ;; 853 ;;
878 854
879 www) 855 www)
880 case ${catmin} in 856 case ${catmin} in
881 client) type=WebBrowser;; 857 client) type=WebBrowser;;
898 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 874 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
899 875
900 cat <<-EOF > "${desktop}" 876 cat <<-EOF > "${desktop}"
901 [Desktop Entry] 877 [Desktop Entry]
902 Encoding=UTF-8 878 Encoding=UTF-8
903 Version=0.9.2 879 Version=1.0
904 Name=${name} 880 Name=${name}
905 Type=Application 881 Type=Application
906 Comment=${DESCRIPTION} 882 Comment=${DESCRIPTION}
907 Exec=${exec} 883 Exec=${exec}
908 TryExec=${exec%% *} 884 TryExec=${exec%% *}
909 Path=${path} 885 Path=${path}
910 Icon=${icon} 886 Icon=${icon}
911 Categories=Application;${type}; 887 Categories=${type};
912 EOF 888 EOF
913 889
914 ( 890 (
915 # wrap the env here so that the 'insinto' call 891 # wrap the env here so that the 'insinto' call
916 # doesn't corrupt the env of the caller 892 # doesn't corrupt the env of the caller
917 insinto /usr/share/applications 893 insinto /usr/share/applications
918 doins "${desktop}" 894 doins "${desktop}"
919 ) 895 )
920} 896}
921 897
922# Make a GDM/KDM Session file 898# @FUNCTION: validate_desktop_entries
923# 899# @USAGE: [directories]
924# make_session_desktop(<title>, <command>) 900# @MAINTAINER:
925# title: File to execute to start the Window Manager 901# Carsten Lohrke <carlo@gentoo.org>
926# command: Name of the Window Manager 902# @DESCRIPTION:
903# Validate desktop entries using desktop-file-utils
904validate_desktop_entries() {
905 if [[ -x /usr/bin/desktop-file-validate ]] ; then
906 einfo "Checking desktop entry validity"
907 local directories=""
908 for d in /usr/share/applications $@ ; do
909 [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
910 done
911 if [[ -n ${directories} ]] ; then
912 for FILE in $(find ${directories} -name "*\.desktop" \
913 -not -path '*.hidden*' | sort -u 2>/dev/null)
914 do
915 local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
916 sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
917 [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
918 done
919 fi
920 echo ""
921 else
922 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
923 fi
924}
927 925
926# @FUNCTION: make_session_desktop
927# @USAGE: <title> <command>
928# @DESCRIPTION:
929# Make a GDM/KDM Session file. The title is the file to execute to start the
930# Window Manager. The command is the name of the Window Manager.
928make_session_desktop() { 931make_session_desktop() {
929 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1 932 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
930 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1 933 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
931 934
932 local title=$1 935 local title=$1
949 insinto /usr/share/xsessions 952 insinto /usr/share/xsessions
950 doins "${desktop}" 953 doins "${desktop}"
951 ) 954 )
952} 955}
953 956
957# @FUNCTION: domenu
958# @USAGE: <menus>
959# @DESCRIPTION:
960# Install the list of .desktop menu files into the appropriate directory
961# (/usr/share/applications).
954domenu() { 962domenu() {
955 ( 963 (
956 # wrap the env here so that the 'insinto' call 964 # wrap the env here so that the 'insinto' call
957 # doesn't corrupt the env of the caller 965 # doesn't corrupt the env of the caller
958 local i j ret=0 966 local i j ret=0
969 fi 977 fi
970 done 978 done
971 exit ${ret} 979 exit ${ret}
972 ) 980 )
973} 981}
982
983# @FUNCTION: newmenu
984# @USAGE: <menu> <newname>
985# @DESCRIPTION:
986# Like all other new* functions, install the specified menu as newname.
974newmenu() { 987newmenu() {
975 ( 988 (
976 # wrap the env here so that the 'insinto' call 989 # wrap the env here so that the 'insinto' call
977 # doesn't corrupt the env of the caller 990 # doesn't corrupt the env of the caller
978 insinto /usr/share/applications 991 insinto /usr/share/applications
979 newins "$@" 992 newins "$@"
980 ) 993 )
981} 994}
982 995
996# @FUNCTION: doicon
997# @USAGE: <list of icons>
998# @DESCRIPTION:
999# Install the list of icons into the icon directory (/usr/share/pixmaps).
1000# This is useful in conjunction with creating desktop/menu files.
983doicon() { 1001doicon() {
984 ( 1002 (
985 # wrap the env here so that the 'insinto' call 1003 # wrap the env here so that the 'insinto' call
986 # doesn't corrupt the env of the caller 1004 # doesn't corrupt the env of the caller
987 local i j ret 1005 local i j ret
998 fi 1016 fi
999 done 1017 done
1000 exit ${ret} 1018 exit ${ret}
1001 ) 1019 )
1002} 1020}
1021
1022# @FUNCTION: newicon
1023# @USAGE: <icon> <newname>
1024# @DESCRIPTION:
1025# Like all other new* functions, install the specified icon as newname.
1003newicon() { 1026newicon() {
1004 ( 1027 (
1005 # wrap the env here so that the 'insinto' call 1028 # wrap the env here so that the 'insinto' call
1006 # doesn't corrupt the env of the caller 1029 # doesn't corrupt the env of the caller
1007 insinto /usr/share/pixmaps 1030 insinto /usr/share/pixmaps
1008 newins "$@" 1031 newins "$@"
1009 ) 1032 )
1010} 1033}
1011
1012##############################################################
1013# END: Handle .desktop files and menu entries #
1014##############################################################
1015
1016 1034
1017# for internal use only (unpack_pdv and unpack_makeself) 1035# for internal use only (unpack_pdv and unpack_makeself)
1018find_unpackable_file() { 1036find_unpackable_file() {
1019 local src=$1 1037 local src=$1
1020 if [[ -z ${src} ]] ; then 1038 if [[ -z ${src} ]] ; then
1030 fi 1048 fi
1031 [[ ! -e ${src} ]] && return 1 1049 [[ ! -e ${src} ]] && return 1
1032 echo "${src}" 1050 echo "${src}"
1033} 1051}
1034 1052
1053# @FUNCTION: unpack_pdv
1054# @USAGE: <file to unpack> <size of off_t>
1055# @DESCRIPTION:
1035# Unpack those pesky pdv generated files ... 1056# Unpack those pesky pdv generated files ...
1036# They're self-unpacking programs with the binary package stuffed in 1057# They're self-unpacking programs with the binary package stuffed in
1037# the middle of the archive. Valve seems to use it a lot ... too bad 1058# the middle of the archive. Valve seems to use it a lot ... too bad
1038# it seems to like to segfault a lot :(. So lets take it apart ourselves. 1059# it seems to like to segfault a lot :(. So lets take it apart ourselves.
1039# 1060#
1040# Usage: unpack_pdv [file to unpack] [size of off_t]
1041# - you have to specify the off_t size ... i have no idea how to extract that 1061# You have to specify the off_t size ... I have no idea how to extract that
1042# information out of the binary executable myself. basically you pass in 1062# information out of the binary executable myself. Basically you pass in
1043# the size of the off_t type (in bytes) on the machine that built the pdv 1063# the size of the off_t type (in bytes) on the machine that built the pdv
1064# archive.
1065#
1044# archive. one way to determine this is by running the following commands: 1066# One way to determine this is by running the following commands:
1045# strings <pdv archive> | grep lseek 1067# strings <pdv archive> | grep lseek
1046# strace -elseek <pdv archive> 1068# strace -elseek <pdv archive>
1047# basically look for the first lseek command (we do the strings/grep because 1069# Basically look for the first lseek command (we do the strings/grep because
1048# sometimes the function call is _llseek or something) and steal the 2nd 1070# sometimes the function call is _llseek or something) and steal the 2nd
1049# parameter. here is an example: 1071# parameter. Here is an example:
1050# root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek 1072# vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1051# lseek 1073# lseek
1052# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin 1074# vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1053# lseek(3, -4, SEEK_END) = 2981250 1075# lseek(3, -4, SEEK_END) = 2981250
1054# thus we would pass in the value of '4' as the second parameter. 1076# Thus we would pass in the value of '4' as the second parameter.
1055unpack_pdv() { 1077unpack_pdv() {
1056 local src=$(find_unpackable_file "$1") 1078 local src=$(find_unpackable_file "$1")
1057 local sizeoff_t=$2 1079 local sizeoff_t=$2
1058 1080
1059 [[ -z ${src} ]] && die "Could not locate source for '$1'" 1081 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1121 true 1143 true
1122 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" 1144 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1123 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" 1145 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1124} 1146}
1125 1147
1148# @FUNCTION: unpack_makeself
1149# @USAGE: [file to unpack] [offset] [tail|dd]
1150# @DESCRIPTION:
1126# Unpack those pesky makeself generated files ... 1151# Unpack those pesky makeself generated files ...
1127# They're shell scripts with the binary package tagged onto 1152# They're shell scripts with the binary package tagged onto
1128# the end of the archive. Loki utilized the format as does 1153# the end of the archive. Loki utilized the format as does
1129# many other game companies. 1154# many other game companies.
1130# 1155#
1131# Usage: unpack_makeself [file to unpack] [offset] [tail|dd] 1156# If the file is not specified, then ${A} is used. If the
1132# - If the file is not specified then unpack will utilize ${A}.
1133# - If the offset is not specified then we will attempt to extract 1157# offset is not specified then we will attempt to extract
1134# the proper offset from the script itself. 1158# the proper offset from the script itself.
1135unpack_makeself() { 1159unpack_makeself() {
1136 local src_input=${1:-${A}} 1160 local src_input=${1:-${A}}
1137 local src=$(find_unpackable_file "${src_input}") 1161 local src=$(find_unpackable_file "${src_input}")
1138 local skip=$2 1162 local skip=$2
1139 local exe=$3 1163 local exe=$3
1209 ;; 1233 ;;
1210 esac 1234 esac
1211 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1235 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1212} 1236}
1213 1237
1238# @FUNCTION: check_license
1239# @USAGE: [license]
1240# @DESCRIPTION:
1214# Display a license for user to accept. 1241# Display a license for user to accept. If no license is
1215#
1216# Usage: check_license [license]
1217# - If the file is not specified then ${LICENSE} is used. 1242# specified, then ${LICENSE} is used.
1218check_license() { 1243check_license() {
1219 local lic=$1 1244 local lic=$1
1220 if [ -z "${lic}" ] ; then 1245 if [ -z "${lic}" ] ; then
1221 lic="${PORTDIR}/licenses/${LICENSE}" 1246 lic="${PORTDIR}/licenses/${LICENSE}"
1222 else 1247 else
1268 die "Failed to accept license" 1293 die "Failed to accept license"
1269 ;; 1294 ;;
1270 esac 1295 esac
1271} 1296}
1272 1297
1298# @FUNCTION: cdrom_get_cds
1299# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1300# @DESCRIPTION:
1273# Aquire cd(s) for those lovely cd-based emerges. Yes, this violates 1301# Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1274# the whole 'non-interactive' policy, but damnit I want CD support ! 1302# the whole 'non-interactive' policy, but damnit I want CD support !
1275# 1303#
1276# with these cdrom functions we handle all the user interaction and 1304# With these cdrom functions we handle all the user interaction and
1277# standardize everything. all you have to do is call cdrom_get_cds() 1305# standardize everything. All you have to do is call cdrom_get_cds()
1278# and when the function returns, you can assume that the cd has been 1306# and when the function returns, you can assume that the cd has been
1279# found at CDROM_ROOT. 1307# found at CDROM_ROOT.
1280# 1308#
1309# The function will attempt to locate a cd based upon a file that is on
1310# the cd. The more files you give this function, the more cds
1311# the cdrom functions will handle.
1312#
1281# normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2', 1313# Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1282# etc... if you want to give the cds better names, then just export 1314# etc... If you want to give the cds better names, then just export
1283# the appropriate CDROM_NAME variable before calling cdrom_get_cds(). 1315# the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1284# - CDROM_NAME="fooie cd" - for when you only want 1 cd 1316# Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1285# - CDROM_NAME_1="install cd" - for when you want more than 1 cd 1317# also use the CDROM_NAME_SET bash array.
1286# CDROM_NAME_2="data cd" 1318#
1287# - CDROM_NAME_SET=( "install cd" "data cd" ) - short hand for CDROM_NAME_#
1288#
1289# for those multi cd ebuilds, see the cdrom_load_next_cd() below. 1319# For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1290#
1291# Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1292# - this will attempt to locate a cd based upon a file that is on
1293# the cd ... the more files you give this function, the more cds
1294# the cdrom functions will handle
1295cdrom_get_cds() { 1320cdrom_get_cds() {
1296 # first we figure out how many cds we're dealing with by 1321 # first we figure out how many cds we're dealing with by
1297 # the # of files they gave us 1322 # the # of files they gave us
1298 local cdcnt=0 1323 local cdcnt=0
1299 local f= 1324 local f=
1385 export CDROM_SET="" 1410 export CDROM_SET=""
1386 export CDROM_CURRENT_CD=0 1411 export CDROM_CURRENT_CD=0
1387 cdrom_load_next_cd 1412 cdrom_load_next_cd
1388} 1413}
1389 1414
1390# this is only used when you need access to more than one cd. 1415# @FUNCTION: cdrom_load_next_cd
1391# when you have finished using the first cd, just call this function. 1416# @DESCRIPTION:
1392# when it returns, CDROM_ROOT will be pointing to the second cd. 1417# Some packages are so big they come on multiple CDs. When you're done reading
1393# remember, you can only go forward in the cd chain, you can't go back. 1418# files off a CD and want access to the next one, just call this function.
1419# Again, all the messy details of user interaction are taken care of for you.
1420# Once this returns, just read the variable CDROM_ROOT for the location of the
1421# mounted CD. Note that you can only go forward in the CD list, so make sure
1422# you only call this function when you're done using the current CD.
1394cdrom_load_next_cd() { 1423cdrom_load_next_cd() {
1395 local var 1424 local var
1396 ((++CDROM_CURRENT_CD)) 1425 ((++CDROM_CURRENT_CD))
1397 1426
1398 unset CDROM_ROOT 1427 unset CDROM_ROOT
1430 local dir=$(dirname ${cdset[${i}]}) 1459 local dir=$(dirname ${cdset[${i}]})
1431 local file=$(basename ${cdset[${i}]}) 1460 local file=$(basename ${cdset[${i}]})
1432 1461
1433 local point= node= fs= foo= 1462 local point= node= fs= foo=
1434 while read point node fs foo ; do 1463 while read point node fs foo ; do
1435 [[ " cd9660 iso9660 " != *" ${fs} "* ]] && \ 1464 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1436 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \ 1465 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1437 && continue 1466 && continue
1438 point=${point//\040/ } 1467 point=${point//\040/ }
1439 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue 1468 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1440 export CDROM_ROOT=${point} 1469 export CDROM_ROOT=${point}
1524 [[ -n ${nols} ]] \ 1553 [[ -n ${nols} ]] \
1525 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols} 1554 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols}
1526 export LINGUAS=${newls:1} 1555 export LINGUAS=${newls:1}
1527} 1556}
1528 1557
1529# moved from kernel.eclass since they are generally useful outside of 1558# @FUNCTION: set_arch_to_kernel
1530# kernel.eclass -iggy (20041002) 1559# @DESCRIPTION:
1531
1532# the following functions are useful in kernel module ebuilds, etc.
1533# for an example see ivtv or drbd ebuilds
1534
1535# set's ARCH to match what the kernel expects 1560# Set the env ARCH to match what the kernel expects.
1536set_arch_to_kernel() { 1561set_arch_to_kernel() {
1537 i=10 1562 i=10
1538 while ((i--)) ; do 1563 while ((i--)) ; do
1539 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass" 1564 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1540 done 1565 done
1547 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one! 1572 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1548 *) export ARCH="${ARCH}";; 1573 *) export ARCH="${ARCH}";;
1549 esac 1574 esac
1550} 1575}
1551 1576
1552# set's ARCH back to what portage expects 1577# @FUNCTION: set_arch_to_portage
1578# @DESCRIPTION:
1579# Set the env ARCH to match what portage expects.
1553set_arch_to_portage() { 1580set_arch_to_portage() {
1554 i=10 1581 i=10
1555 while ((i--)) ; do 1582 while ((i--)) ; do
1556 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass" 1583 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1557 done 1584 done
1558 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}" 1585 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1559} 1586}
1560 1587
1561# Jeremy Huddleston <eradicator@gentoo.org>: 1588# @FUNCTION: preserve_old_lib
1562# preserve_old_lib /path/to/libblah.so.0 1589# @USAGE: <libs to preserve> [more libs]
1563# preserve_old_lib_notify /path/to/libblah.so.0 1590# @DESCRIPTION:
1564#
1565# These functions are useful when a lib in your package changes --library. Such 1591# These functions are useful when a lib in your package changes ABI SONAME.
1566# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0 1592# An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1567# would break packages that link against it. Most people get around this 1593# would break packages that link against it. Most people get around this
1568# by using the portage SLOT mechanism, but that is not always a relevant 1594# by using the portage SLOT mechanism, but that is not always a relevant
1569# solution, so instead you can add the following to your ebuilds: 1595# solution, so instead you can call this from pkg_preinst. See also the
1570# 1596# preserve_old_lib_notify function.
1571# pkg_preinst() {
1572# ...
1573# preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1574# ...
1575# }
1576#
1577# pkg_postinst() {
1578# ...
1579# preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1580# ...
1581# }
1582
1583preserve_old_lib() { 1597preserve_old_lib() {
1584 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then 1598 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1585 eerror "preserve_old_lib() must be called from pkg_preinst() only" 1599 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1586# die "Invalid preserve_old_lib() usage" 1600 die "Invalid preserve_old_lib() usage"
1587 fi 1601 fi
1588 [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]" 1602 [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1589 1603
1590 local lib dir 1604 local lib dir
1591 for lib in "$@" ; do 1605 for lib in "$@" ; do
1595 cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed" 1609 cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1596 touch "${D}"/${lib} 1610 touch "${D}"/${lib}
1597 done 1611 done
1598} 1612}
1599 1613
1614# @FUNCTION: preserve_old_lib_notify
1615# @USAGE: <libs to notify> [more libs]
1616# @DESCRIPTION:
1617# Spit helpful messages about the libraries preserved by preserve_old_lib.
1600preserve_old_lib_notify() { 1618preserve_old_lib_notify() {
1601 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then 1619 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1602 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only" 1620 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1603# die "Invalid preserve_old_lib_notify() usage" 1621 die "Invalid preserve_old_lib_notify() usage"
1604 fi 1622 fi
1605 1623
1606 local lib notice=0 1624 local lib notice=0
1607 for lib in "$@" ; do 1625 for lib in "$@" ; do
1608 [[ -e ${ROOT}/${lib} ]] || continue 1626 [[ -e ${ROOT}/${lib} ]] || continue
1617 fi 1635 fi
1618 ewarn " # revdep-rebuild --library ${lib##*/}" 1636 ewarn " # revdep-rebuild --library ${lib##*/}"
1619 done 1637 done
1620} 1638}
1621 1639
1622# Hack for people to figure out if a package was built with 1640# @FUNCTION: built_with_use
1623# certain USE flags
1624#
1625# Usage: built_with_use [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1641# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1626# ex: built_with_use xchat gtk2 1642# @DESCRIPTION:
1627# 1643# A temporary hack until portage properly supports DEPENDing on USE
1628# Flags: -a all USE flags should be utilized 1644# flags being enabled in packages. This will check to see if the specified
1629# -o at least one USE flag should be utilized 1645# DEPEND atom was built with the specified list of USE flags. The
1630# --missing peform the specified action if the flag is not in IUSE (true/false/die) 1646# --missing option controls the behavior if called on a package that does
1631# Note: the default flag is '-a' 1647# not actually support the defined USE flags (aka listed in IUSE).
1648# The default is to abort (call die). The -a and -o flags control
1649# the requirements of the USE flags. They correspond to "and" and "or"
1650# logic. So the -a flag means all listed USE flags must be enabled
1651# while the -o flag means at least one of the listed fIUSE flags must be
1652# enabled. The --hidden option is really for internal use only as it
1653# means the USE flag we're checking is hidden expanded, so it won't be found
1654# in IUSE like normal USE flags.
1655#
1656# Remember that this function isn't terribly intelligent so order of optional
1657# flags matter.
1632built_with_use() { 1658built_with_use() {
1659 local hidden="no"
1660 if [[ $1 == "--hidden" ]] ; then
1661 hidden="yes"
1662 shift
1663 fi
1664
1633 local missing_action="die" 1665 local missing_action="die"
1634 if [[ $1 == "--missing" ]] ; then 1666 if [[ $1 == "--missing" ]] ; then
1635 missing_action=$2 1667 missing_action=$2
1636 shift ; shift 1668 shift ; shift
1637 case ${missing_action} in 1669 case ${missing_action} in
1648 shift 1680 shift
1649 1681
1650 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE 1682 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1651 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE 1683 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1652 1684
1653 # if the USE file doesnt exist, assume the $PKG is either 1685 # if the IUSE file doesn't exist, the read will error out, we need to handle
1654 # injected or package.provided 1686 # this gracefully
1687 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1688 case ${missing_action} in
1689 true) return 0;;
1690 false) return 1;;
1655 [[ ! -e ${USEFILE} ]] && die "Unable to determine what USE flags $PKG was built with" 1691 die) die "Unable to determine what USE flags $PKG was built with";;
1692 esac
1693 fi
1656 1694
1695 if [[ ${hidden} == "no" ]] ; then
1657 local IUSE_BUILT=$(<${IUSEFILE}) 1696 local IUSE_BUILT=$(<${IUSEFILE})
1658 # Don't check USE_EXPAND #147237 1697 # Don't check USE_EXPAND #147237
1659 local expand 1698 local expand
1660 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do 1699 for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1661 if [[ $1 == ${expand}_* ]] ; then 1700 if [[ $1 == ${expand}_* ]] ; then
1662 expand="" 1701 expand=""
1663 break 1702 break
1664 fi 1703 fi
1665 done 1704 done
1666 if [[ -n ${expand} ]] ; then 1705 if [[ -n ${expand} ]] ; then
1667 if ! has $1 ${IUSE_BUILT} ; then 1706 if ! has $1 ${IUSE_BUILT} ; then
1668 case ${missing_action} in 1707 case ${missing_action} in
1669 true) return 0;; 1708 true) return 0;;
1670 false) return 1;; 1709 false) return 1;;
1671 die) die "$PKG does not actually support the $1 USE flag!";; 1710 die) die "$PKG does not actually support the $1 USE flag!";;
1672 esac 1711 esac
1712 fi
1673 fi 1713 fi
1674 fi 1714 fi
1675 1715
1676 local USE_BUILT=$(<${USEFILE}) 1716 local USE_BUILT=$(<${USEFILE})
1677 while [[ $# -gt 0 ]] ; do 1717 while [[ $# -gt 0 ]] ; do
1683 shift 1723 shift
1684 done 1724 done
1685 [[ ${opt} = "-a" ]] 1725 [[ ${opt} = "-a" ]]
1686} 1726}
1687 1727
1728# @DESCRIPTION: epunt_cxx
1729# @USAGE: [dir to scan]
1730# @DESCRIPTION:
1688# Many configure scripts wrongly bail when a C++ compiler 1731# Many configure scripts wrongly bail when a C++ compiler could not be
1689# could not be detected. #73450 1732# detected. If dir is not specified, then it defaults to ${S}.
1733#
1734# http://bugs.gentoo.org/73450
1690epunt_cxx() { 1735epunt_cxx() {
1691 local dir=$1 1736 local dir=$1
1692 [[ -z ${dir} ]] && dir=${S} 1737 [[ -z ${dir} ]] && dir=${S}
1693 ebegin "Removing useless C++ checks" 1738 ebegin "Removing useless C++ checks"
1694 local f 1739 local f
1696 patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null 1741 patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1697 done 1742 done
1698 eend 0 1743 eend 0
1699} 1744}
1700 1745
1701# make a wrapper script ... 1746# @FUNCTION: make_wrapper
1702# NOTE: this was originally games_make_wrapper, but I noticed other places where 1747# @USAGE: <wrapper> <target> <chdir> [libpaths] [installpath]
1703# this could be used, so I have moved it here and made it not games-specific 1748# @DESCRIPTION:
1704# -- wolf31o2 1749# Create a shell wrapper script named wrapper in installpath
1705# $1 == wrapper name 1750# (defaults to the bindir) to execute target (default of wrapper) by
1706# $2 == binary to run 1751# first optionally setting LD_LIBRARY_PATH to the colon-delimited
1707# $3 == directory to chdir before running binary 1752# libpaths followed by optionally changing directory to chdir.
1708# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1709# $5 == path for wrapper
1710make_wrapper() { 1753make_wrapper() {
1711 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5 1754 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1712 local tmpwrapper=$(emktemp) 1755 local tmpwrapper=$(emktemp)
1713 # We don't want to quote ${bin} so that people can pass complex 1756 # We don't want to quote ${bin} so that people can pass complex
1714 # things as $bin ... "./someprog --args" 1757 # things as $bin ... "./someprog --args"
1724fi 1767fi
1725exec ${bin} "\$@" 1768exec ${bin} "\$@"
1726EOF 1769EOF
1727 chmod go+rx "${tmpwrapper}" 1770 chmod go+rx "${tmpwrapper}"
1728 if [[ -n ${path} ]] ; then 1771 if [[ -n ${path} ]] ; then
1772 (
1729 exeinto "${path}" 1773 exeinto "${path}"
1730 newexe "${tmpwrapper}" "${wrapper}" 1774 newexe "${tmpwrapper}" "${wrapper}"
1775 ) || die
1731 else 1776 else
1732 newbin "${tmpwrapper}" "${wrapper}" 1777 newbin "${tmpwrapper}" "${wrapper}" || die
1733 fi 1778 fi
1734} 1779}

Legend:
Removed from v.1.272  
changed lines
  Added in v.1.284

  ViewVC Help
Powered by ViewVC 1.1.20