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

Diff of /eclass/eutils.eclass

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

Revision 1.280 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.280 2007/05/05 07:52:26 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
385 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 348 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
386 fi 349 fi
387 fi 350 fi
388} 351}
389 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:
390# Small wrapper for getent (Linux), nidump (Mac OS X), 361# Small wrapper for getent (Linux), nidump (Mac OS X),
391# and pw (FreeBSD) used in enewuser()/enewgroup() 362# and pw (FreeBSD) used in enewuser()/enewgroup()
392# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
393# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
394#
395# egetent(database, key)
396egetent() { 363egetent() {
397 case ${CHOST} in 364 case ${CHOST} in
398 *-darwin*) 365 *-darwin*)
399 case "$2" in 366 case "$2" in
400 *[!0-9]*) # Non numeric 367 *[!0-9]*) # Non numeric
424 getent "$1" "$2" 391 getent "$1" "$2"
425 ;; 392 ;;
426 esac 393 esac
427} 394}
428 395
429# Simplify/standardize adding users to the system 396# @FUNCTION: enewuser
430# vapier@gentoo.org 397# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
431# 398# @DESCRIPTION:
432# enewuser(username, uid, shell, homedir, groups, extra options) 399# Same as enewgroup, you are not required to understand how to properly add
433# 400# a user to the system. The only required parameter is the username.
434# Default values if you do not specify any: 401# Default uid is (pass -1 for this) next available, default shell is
435# username: REQUIRED ! 402# /bin/false, default homedir is /dev/null, there are no default groups,
436# uid: next available (see useradd(8)) 403# and default params sets the comment as 'added by portage for ${PN}'.
437# note: pass -1 to get default behavior
438# shell: /bin/false
439# homedir: /dev/null
440# groups: none
441# extra: comment of 'added by portage for ${PN}'
442enewuser() { 404enewuser() {
443 case ${EBUILD_PHASE} in 405 case ${EBUILD_PHASE} in
444 unpack|compile|test|install) 406 unpack|compile|test|install)
445 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."
446 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."
635 fi 597 fi
636 598
637 export SANDBOX_ON=${oldsandbox} 599 export SANDBOX_ON=${oldsandbox}
638} 600}
639 601
640# Simplify/standardize adding groups to the system 602# @FUNCTION: enewgroup
641# vapier@gentoo.org 603# @USAGE: <group> [gid]
642# 604# @DESCRIPTION:
643# enewgroup(group, gid) 605# This function does not require you to understand how to properly add a
644# 606# group to the system. Just give it a group name to add and enewgroup will
645# 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
646# groupname: REQUIRED ! 608# allocate the next available one.
647# gid: next available (see groupadd(8))
648# extra: none
649enewgroup() { 609enewgroup() {
650 case ${EBUILD_PHASE} in 610 case ${EBUILD_PHASE} in
651 unpack|compile|test|install) 611 unpack|compile|test|install)
652 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."
653 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."
749 ;; 709 ;;
750 esac 710 esac
751 export SANDBOX_ON="${oldsandbox}" 711 export SANDBOX_ON="${oldsandbox}"
752} 712}
753 713
754# Simple script to replace 'dos2unix' binaries 714# @FUNCTION: edos2unix
755# vapier@gentoo.org 715# @USAGE: <file> [more files ...]
756# 716# @DESCRIPTION:
757# 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.
758edos2unix() { 721edos2unix() {
759 echo "$@" | xargs sed -i 's/\r$//' 722 echo "$@" | xargs sed -i 's/\r$//'
760} 723}
761
762
763##############################################################
764# START: Handle .desktop files and menu entries #
765# maybe this should be separated into a new eclass some time #
766# lanius@gentoo.org #
767##############################################################
768 724
769# Make a desktop file ! 725# Make a desktop file !
770# Great for making those icons in kde/gnome startmenu ! 726# Great for making those icons in kde/gnome startmenu !
771# Amaze your friends ! Get the women ! Join today ! 727# Amaze your friends ! Get the women ! Join today !
772# 728#
776# name: the name that will show up in the menu 732# name: the name that will show up in the menu
777# icon: give your little like a pretty little icon ... 733# icon: give your little like a pretty little icon ...
778# this can be relative (to /usr/share/pixmaps) or 734# this can be relative (to /usr/share/pixmaps) or
779# a full path to an icon 735# a full path to an icon
780# type: what kind of application is this ? for categories: 736# type: what kind of application is this ? for categories:
781# http://www.freedesktop.org/Standards/desktop-entry-spec 737# http://standards.freedesktop.org/menu-spec/latest/apa.html
782# path: if your app needs to startup in a specific dir 738# path: if your app needs to startup in a specific dir
783make_desktop_entry() { 739make_desktop_entry() {
784 [[ -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
785 741
786 local exec=${1} 742 local exec=${1}
793 local catmaj=${CATEGORY%%-*} 749 local catmaj=${CATEGORY%%-*}
794 local catmin=${CATEGORY##*-} 750 local catmin=${CATEGORY##*-}
795 case ${catmaj} in 751 case ${catmaj} in
796 app) 752 app)
797 case ${catmin} in 753 case ${catmin} in
754 accessibility) type=Accessibility;;
798 admin) type=System;; 755 admin) type=System;;
756 antivirus) type=System;;
757 arch) type=Archiving;;
758 backup) type=Archiving;;
799 cdr) type=DiscBurning;; 759 cdr) type=DiscBurning;;
800 dicts) type=Dictionary;; 760 dicts) type=Dictionary;;
761 doc) type=Documentation;;
801 editors) type=TextEditor;; 762 editors) type=TextEditor;;
802 emacs) type=TextEditor;; 763 emacs) type=TextEditor;;
803 emulation) type=Emulator;; 764 emulation) type=Emulator;;
804 laptop) type=HardwareSettings;; 765 laptop) type=HardwareSettings;;
805 office) type=Office;; 766 office) type=Office;;
767 pda) type=PDA;;
806 vim) type=TextEditor;; 768 vim) type=TextEditor;;
807 xemacs) type=TextEditor;; 769 xemacs) type=TextEditor;;
808 *) type=;; 770 *) type=;;
809 esac 771 esac
810 ;; 772 ;;
816 games) 778 games)
817 case ${catmin} in 779 case ${catmin} in
818 action|fps) type=ActionGame;; 780 action|fps) type=ActionGame;;
819 arcade) type=ArcadeGame;; 781 arcade) type=ArcadeGame;;
820 board) type=BoardGame;; 782 board) type=BoardGame;;
783 emulation) type=Emulator;;
821 kids) type=KidsGame;; 784 kids) type=KidsGame;;
822 emulation) type=Emulator;;
823 puzzle) type=LogicGame;; 785 puzzle) type=LogicGame;;
786 roguelike) type=RolePlaying;;
824 rpg) type=RolePlaying;; 787 rpg) type=RolePlaying;;
825 roguelike) type=RolePlaying;;
826 simulation) type=Simulation;; 788 simulation) type=Simulation;;
827 sports) type=SportsGame;; 789 sports) type=SportsGame;;
828 strategy) type=StrategyGame;; 790 strategy) type=StrategyGame;;
829 *) type=;; 791 *) type=;;
830 esac 792 esac
831 type="Game;${type}" 793 type="Game;${type}"
794 ;;
795
796 gnome)
797 type="Gnome;GTK"
798 ;;
799
800 kde)
801 type="KDE;Qt"
832 ;; 802 ;;
833 803
834 mail) 804 mail)
835 type="Network;Email" 805 type="Network;Email"
836 ;; 806 ;;
862 type="Network;${type}" 832 type="Network;${type}"
863 ;; 833 ;;
864 834
865 sci) 835 sci)
866 case ${catmin} in 836 case ${catmin} in
867 astro*) type=Astronomy;; 837 astro*) type=Astronomy;;
868 bio*) type=Biology;; 838 bio*) type=Biology;;
869 calc*) type=Calculator;; 839 calc*) type=Calculator;;
870 chem*) type=Chemistry;; 840 chem*) type=Chemistry;;
841 elec*) type=Electronics;;
871 geo*) type=Geology;; 842 geo*) type=Geology;;
872 math*) type=Math;; 843 math*) type=Math;;
844 physics) type=Physics;;
845 visual*) type=DataVisualization;;
873 *) type=;; 846 *) type=;;
874 esac 847 esac
875 type="Science;${type}" 848 type="Science;${type}"
849 ;;
850
851 sys)
852 type="System"
876 ;; 853 ;;
877 854
878 www) 855 www)
879 case ${catmin} in 856 case ${catmin} in
880 client) type=WebBrowser;; 857 client) type=WebBrowser;;
897 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 874 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
898 875
899 cat <<-EOF > "${desktop}" 876 cat <<-EOF > "${desktop}"
900 [Desktop Entry] 877 [Desktop Entry]
901 Encoding=UTF-8 878 Encoding=UTF-8
902 Version=0.9.2 879 Version=1.0
903 Name=${name} 880 Name=${name}
904 Type=Application 881 Type=Application
905 Comment=${DESCRIPTION} 882 Comment=${DESCRIPTION}
906 Exec=${exec} 883 Exec=${exec}
907 TryExec=${exec%% *} 884 TryExec=${exec%% *}
908 Path=${path} 885 Path=${path}
909 Icon=${icon} 886 Icon=${icon}
910 Categories=Application;${type}; 887 Categories=${type};
911 EOF 888 EOF
912 889
913 ( 890 (
914 # wrap the env here so that the 'insinto' call 891 # wrap the env here so that the 'insinto' call
915 # doesn't corrupt the env of the caller 892 # doesn't corrupt the env of the caller
916 insinto /usr/share/applications 893 insinto /usr/share/applications
917 doins "${desktop}" 894 doins "${desktop}"
918 ) 895 )
919} 896}
920 897
921 898# @FUNCTION: validate_desktop_entries
899# @USAGE: [directories]
900# @MAINTAINER:
901# Carsten Lohrke <carlo@gentoo.org>
902# @DESCRIPTION:
922# Validate desktop entries using desktop-file-utils 903# Validate desktop entries using desktop-file-utils
923# Carsten Lohrke <carlo@gentoo.org>
924#
925# Usage: validate_desktop_entries [directory ...]
926
927validate_desktop_entries() { 904validate_desktop_entries() {
928 if [[ -x /usr/bin/desktop-file-validate ]] ; then 905 if [[ -x /usr/bin/desktop-file-validate ]] ; then
929 einfo "Checking desktop entry validity" 906 einfo "Checking desktop entry validity"
930 local directories="" 907 local directories=""
931 for d in /usr/share/applications $@ ; do 908 for d in /usr/share/applications $@ ; do
944 else 921 else
945 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo." 922 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
946 fi 923 fi
947} 924}
948 925
949 926# @FUNCTION: make_session_desktop
950# Make a GDM/KDM Session file 927# @USAGE: <title> <command>
951# 928# @DESCRIPTION:
952# make_session_desktop(<title>, <command>) 929# Make a GDM/KDM Session file. The title is the file to execute to start the
953# title: File to execute to start the Window Manager 930# Window Manager. The command is the name of the Window Manager.
954# command: Name of the Window Manager
955
956make_session_desktop() { 931make_session_desktop() {
957 [[ -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
958 [[ -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
959 934
960 local title=$1 935 local title=$1
977 insinto /usr/share/xsessions 952 insinto /usr/share/xsessions
978 doins "${desktop}" 953 doins "${desktop}"
979 ) 954 )
980} 955}
981 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).
982domenu() { 962domenu() {
983 ( 963 (
984 # wrap the env here so that the 'insinto' call 964 # wrap the env here so that the 'insinto' call
985 # doesn't corrupt the env of the caller 965 # doesn't corrupt the env of the caller
986 local i j ret=0 966 local i j ret=0
997 fi 977 fi
998 done 978 done
999 exit ${ret} 979 exit ${ret}
1000 ) 980 )
1001} 981}
982
983# @FUNCTION: newmenu
984# @USAGE: <menu> <newname>
985# @DESCRIPTION:
986# Like all other new* functions, install the specified menu as newname.
1002newmenu() { 987newmenu() {
1003 ( 988 (
1004 # wrap the env here so that the 'insinto' call 989 # wrap the env here so that the 'insinto' call
1005 # doesn't corrupt the env of the caller 990 # doesn't corrupt the env of the caller
1006 insinto /usr/share/applications 991 insinto /usr/share/applications
1007 newins "$@" 992 newins "$@"
1008 ) 993 )
1009} 994}
1010 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.
1011doicon() { 1001doicon() {
1012 ( 1002 (
1013 # wrap the env here so that the 'insinto' call 1003 # wrap the env here so that the 'insinto' call
1014 # doesn't corrupt the env of the caller 1004 # doesn't corrupt the env of the caller
1015 local i j ret 1005 local i j ret
1026 fi 1016 fi
1027 done 1017 done
1028 exit ${ret} 1018 exit ${ret}
1029 ) 1019 )
1030} 1020}
1021
1022# @FUNCTION: newicon
1023# @USAGE: <icon> <newname>
1024# @DESCRIPTION:
1025# Like all other new* functions, install the specified icon as newname.
1031newicon() { 1026newicon() {
1032 ( 1027 (
1033 # wrap the env here so that the 'insinto' call 1028 # wrap the env here so that the 'insinto' call
1034 # doesn't corrupt the env of the caller 1029 # doesn't corrupt the env of the caller
1035 insinto /usr/share/pixmaps 1030 insinto /usr/share/pixmaps
1036 newins "$@" 1031 newins "$@"
1037 ) 1032 )
1038} 1033}
1039
1040##############################################################
1041# END: Handle .desktop files and menu entries #
1042##############################################################
1043
1044 1034
1045# for internal use only (unpack_pdv and unpack_makeself) 1035# for internal use only (unpack_pdv and unpack_makeself)
1046find_unpackable_file() { 1036find_unpackable_file() {
1047 local src=$1 1037 local src=$1
1048 if [[ -z ${src} ]] ; then 1038 if [[ -z ${src} ]] ; then
1058 fi 1048 fi
1059 [[ ! -e ${src} ]] && return 1 1049 [[ ! -e ${src} ]] && return 1
1060 echo "${src}" 1050 echo "${src}"
1061} 1051}
1062 1052
1053# @FUNCTION: unpack_pdv
1054# @USAGE: <file to unpack> <size of off_t>
1055# @DESCRIPTION:
1063# Unpack those pesky pdv generated files ... 1056# Unpack those pesky pdv generated files ...
1064# They're self-unpacking programs with the binary package stuffed in 1057# They're self-unpacking programs with the binary package stuffed in
1065# 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
1066# 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.
1067# 1060#
1068# Usage: unpack_pdv [file to unpack] [size of off_t]
1069# - 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
1070# information out of the binary executable myself. basically you pass in 1062# information out of the binary executable myself. Basically you pass in
1071# 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#
1072# archive. one way to determine this is by running the following commands: 1066# One way to determine this is by running the following commands:
1073# strings <pdv archive> | grep lseek 1067# strings <pdv archive> | grep lseek
1074# strace -elseek <pdv archive> 1068# strace -elseek <pdv archive>
1075# 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
1076# 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
1077# parameter. here is an example: 1071# parameter. Here is an example:
1078# root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek 1072# vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1079# lseek 1073# lseek
1080# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin 1074# vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1081# lseek(3, -4, SEEK_END) = 2981250 1075# lseek(3, -4, SEEK_END) = 2981250
1082# 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.
1083unpack_pdv() { 1077unpack_pdv() {
1084 local src=$(find_unpackable_file "$1") 1078 local src=$(find_unpackable_file "$1")
1085 local sizeoff_t=$2 1079 local sizeoff_t=$2
1086 1080
1087 [[ -z ${src} ]] && die "Could not locate source for '$1'" 1081 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1149 true 1143 true
1150 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" 1144 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1151 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" 1145 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1152} 1146}
1153 1147
1148# @FUNCTION: unpack_makeself
1149# @USAGE: [file to unpack] [offset] [tail|dd]
1150# @DESCRIPTION:
1154# Unpack those pesky makeself generated files ... 1151# Unpack those pesky makeself generated files ...
1155# They're shell scripts with the binary package tagged onto 1152# They're shell scripts with the binary package tagged onto
1156# the end of the archive. Loki utilized the format as does 1153# the end of the archive. Loki utilized the format as does
1157# many other game companies. 1154# many other game companies.
1158# 1155#
1159# Usage: unpack_makeself [file to unpack] [offset] [tail|dd] 1156# If the file is not specified, then ${A} is used. If the
1160# - If the file is not specified then unpack will utilize ${A}.
1161# - If the offset is not specified then we will attempt to extract 1157# offset is not specified then we will attempt to extract
1162# the proper offset from the script itself. 1158# the proper offset from the script itself.
1163unpack_makeself() { 1159unpack_makeself() {
1164 local src_input=${1:-${A}} 1160 local src_input=${1:-${A}}
1165 local src=$(find_unpackable_file "${src_input}") 1161 local src=$(find_unpackable_file "${src_input}")
1166 local skip=$2 1162 local skip=$2
1167 local exe=$3 1163 local exe=$3
1237 ;; 1233 ;;
1238 esac 1234 esac
1239 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" 1235 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1240} 1236}
1241 1237
1238# @FUNCTION: check_license
1239# @USAGE: [license]
1240# @DESCRIPTION:
1242# Display a license for user to accept. 1241# Display a license for user to accept. If no license is
1243#
1244# Usage: check_license [license]
1245# - If the file is not specified then ${LICENSE} is used. 1242# specified, then ${LICENSE} is used.
1246check_license() { 1243check_license() {
1247 local lic=$1 1244 local lic=$1
1248 if [ -z "${lic}" ] ; then 1245 if [ -z "${lic}" ] ; then
1249 lic="${PORTDIR}/licenses/${LICENSE}" 1246 lic="${PORTDIR}/licenses/${LICENSE}"
1250 else 1247 else
1296 die "Failed to accept license" 1293 die "Failed to accept license"
1297 ;; 1294 ;;
1298 esac 1295 esac
1299} 1296}
1300 1297
1298# @FUNCTION: cdrom_get_cds
1299# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1300# @DESCRIPTION:
1301# 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
1302# the whole 'non-interactive' policy, but damnit I want CD support ! 1302# the whole 'non-interactive' policy, but damnit I want CD support !
1303# 1303#
1304# with these cdrom functions we handle all the user interaction and 1304# With these cdrom functions we handle all the user interaction and
1305# 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()
1306# 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
1307# found at CDROM_ROOT. 1307# found at CDROM_ROOT.
1308# 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#
1309# 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',
1310# 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
1311# the appropriate CDROM_NAME variable before calling cdrom_get_cds(). 1315# the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1312# - 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
1313# - CDROM_NAME_1="install cd" - for when you want more than 1 cd 1317# also use the CDROM_NAME_SET bash array.
1314# CDROM_NAME_2="data cd" 1318#
1315# - CDROM_NAME_SET=( "install cd" "data cd" ) - short hand for CDROM_NAME_#
1316#
1317# 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.
1318#
1319# Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1320# - this will attempt to locate a cd based upon a file that is on
1321# the cd ... the more files you give this function, the more cds
1322# the cdrom functions will handle
1323cdrom_get_cds() { 1320cdrom_get_cds() {
1324 # 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
1325 # the # of files they gave us 1322 # the # of files they gave us
1326 local cdcnt=0 1323 local cdcnt=0
1327 local f= 1324 local f=
1413 export CDROM_SET="" 1410 export CDROM_SET=""
1414 export CDROM_CURRENT_CD=0 1411 export CDROM_CURRENT_CD=0
1415 cdrom_load_next_cd 1412 cdrom_load_next_cd
1416} 1413}
1417 1414
1418# this is only used when you need access to more than one cd. 1415# @FUNCTION: cdrom_load_next_cd
1419# when you have finished using the first cd, just call this function. 1416# @DESCRIPTION:
1420# 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
1421# 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.
1422cdrom_load_next_cd() { 1423cdrom_load_next_cd() {
1423 local var 1424 local var
1424 ((++CDROM_CURRENT_CD)) 1425 ((++CDROM_CURRENT_CD))
1425 1426
1426 unset CDROM_ROOT 1427 unset CDROM_ROOT
1458 local dir=$(dirname ${cdset[${i}]}) 1459 local dir=$(dirname ${cdset[${i}]})
1459 local file=$(basename ${cdset[${i}]}) 1460 local file=$(basename ${cdset[${i}]})
1460 1461
1461 local point= node= fs= foo= 1462 local point= node= fs= foo=
1462 while read point node fs foo ; do 1463 while read point node fs foo ; do
1463 [[ " cd9660 iso9660 " != *" ${fs} "* ]] && \ 1464 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1464 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \ 1465 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1465 && continue 1466 && continue
1466 point=${point//\040/ } 1467 point=${point//\040/ }
1467 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue 1468 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1468 export CDROM_ROOT=${point} 1469 export CDROM_ROOT=${point}
1552 [[ -n ${nols} ]] \ 1553 [[ -n ${nols} ]] \
1553 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols} 1554 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols}
1554 export LINGUAS=${newls:1} 1555 export LINGUAS=${newls:1}
1555} 1556}
1556 1557
1557# moved from kernel.eclass since they are generally useful outside of 1558# @FUNCTION: set_arch_to_kernel
1558# kernel.eclass -iggy (20041002) 1559# @DESCRIPTION:
1559
1560# the following functions are useful in kernel module ebuilds, etc.
1561# for an example see ivtv or drbd ebuilds
1562
1563# set's ARCH to match what the kernel expects 1560# Set the env ARCH to match what the kernel expects.
1564set_arch_to_kernel() { 1561set_arch_to_kernel() {
1565 i=10 1562 i=10
1566 while ((i--)) ; do 1563 while ((i--)) ; do
1567 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass" 1564 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1568 done 1565 done
1575 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!
1576 *) export ARCH="${ARCH}";; 1573 *) export ARCH="${ARCH}";;
1577 esac 1574 esac
1578} 1575}
1579 1576
1580# 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.
1581set_arch_to_portage() { 1580set_arch_to_portage() {
1582 i=10 1581 i=10
1583 while ((i--)) ; do 1582 while ((i--)) ; do
1584 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass" 1583 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1585 done 1584 done
1586 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}" 1585 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1587} 1586}
1588 1587
1589# Jeremy Huddleston <eradicator@gentoo.org>: 1588# @FUNCTION: preserve_old_lib
1590# preserve_old_lib /path/to/libblah.so.0 1589# @USAGE: <libs to preserve> [more libs]
1591# preserve_old_lib_notify /path/to/libblah.so.0 1590# @DESCRIPTION:
1592#
1593# 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.
1594# 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
1595# 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
1596# 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
1597# 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
1598# 1596# preserve_old_lib_notify function.
1599# pkg_preinst() {
1600# ...
1601# preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1602# ...
1603# }
1604#
1605# pkg_postinst() {
1606# ...
1607# preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1608# ...
1609# }
1610
1611preserve_old_lib() { 1597preserve_old_lib() {
1612 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then 1598 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1613 eerror "preserve_old_lib() must be called from pkg_preinst() only" 1599 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1614 die "Invalid preserve_old_lib() usage" 1600 die "Invalid preserve_old_lib() usage"
1615 fi 1601 fi
1623 cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed" 1609 cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1624 touch "${D}"/${lib} 1610 touch "${D}"/${lib}
1625 done 1611 done
1626} 1612}
1627 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.
1628preserve_old_lib_notify() { 1618preserve_old_lib_notify() {
1629 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then 1619 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1630 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"
1631 die "Invalid preserve_old_lib_notify() usage" 1621 die "Invalid preserve_old_lib_notify() usage"
1632 fi 1622 fi
1645 fi 1635 fi
1646 ewarn " # revdep-rebuild --library ${lib##*/}" 1636 ewarn " # revdep-rebuild --library ${lib##*/}"
1647 done 1637 done
1648} 1638}
1649 1639
1650# Hack for people to figure out if a package was built with 1640# @FUNCTION: built_with_use
1651# certain USE flags
1652#
1653# 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>
1654# ex: built_with_use xchat gtk2 1642# @DESCRIPTION:
1655# 1643# A temporary hack until portage properly supports DEPENDing on USE
1656# Flags: -a all USE flags should be utilized 1644# flags being enabled in packages. This will check to see if the specified
1657# -o at least one USE flag should be utilized 1645# DEPEND atom was built with the specified list of USE flags. The
1658# --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
1659# --hidden USE flag we're checking is hidden expanded so it isnt in IUSE 1647# not actually support the defined USE flags (aka listed in IUSE).
1660# Note: the default flag is '-a' 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.
1661built_with_use() { 1658built_with_use() {
1662 local hidden="no" 1659 local hidden="no"
1663 if [[ $1 == "--hidden" ]] ; then 1660 if [[ $1 == "--hidden" ]] ; then
1664 hidden="yes" 1661 hidden="yes"
1665 shift 1662 shift
1726 shift 1723 shift
1727 done 1724 done
1728 [[ ${opt} = "-a" ]] 1725 [[ ${opt} = "-a" ]]
1729} 1726}
1730 1727
1728# @DESCRIPTION: epunt_cxx
1729# @USAGE: [dir to scan]
1730# @DESCRIPTION:
1731# Many configure scripts wrongly bail when a C++ compiler 1731# Many configure scripts wrongly bail when a C++ compiler could not be
1732# could not be detected. #73450 1732# detected. If dir is not specified, then it defaults to ${S}.
1733#
1734# http://bugs.gentoo.org/73450
1733epunt_cxx() { 1735epunt_cxx() {
1734 local dir=$1 1736 local dir=$1
1735 [[ -z ${dir} ]] && dir=${S} 1737 [[ -z ${dir} ]] && dir=${S}
1736 ebegin "Removing useless C++ checks" 1738 ebegin "Removing useless C++ checks"
1737 local f 1739 local f
1739 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
1740 done 1742 done
1741 eend 0 1743 eend 0
1742} 1744}
1743 1745
1744# make a wrapper script ... 1746# @FUNCTION: make_wrapper
1745# NOTE: this was originally games_make_wrapper, but I noticed other places where 1747# @USAGE: <wrapper> <target> <chdir> [libpaths] [installpath]
1746# this could be used, so I have moved it here and made it not games-specific 1748# @DESCRIPTION:
1747# -- wolf31o2 1749# Create a shell wrapper script named wrapper in installpath
1748# $1 == wrapper name 1750# (defaults to the bindir) to execute target (default of wrapper) by
1749# $2 == binary to run 1751# first optionally setting LD_LIBRARY_PATH to the colon-delimited
1750# $3 == directory to chdir before running binary 1752# libpaths followed by optionally changing directory to chdir.
1751# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1752# $5 == path for wrapper
1753make_wrapper() { 1753make_wrapper() {
1754 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5 1754 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1755 local tmpwrapper=$(emktemp) 1755 local tmpwrapper=$(emktemp)
1756 # 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
1757 # things as $bin ... "./someprog --args" 1757 # things as $bin ... "./someprog --args"
1767fi 1767fi
1768exec ${bin} "\$@" 1768exec ${bin} "\$@"
1769EOF 1769EOF
1770 chmod go+rx "${tmpwrapper}" 1770 chmod go+rx "${tmpwrapper}"
1771 if [[ -n ${path} ]] ; then 1771 if [[ -n ${path} ]] ; then
1772 (
1772 exeinto "${path}" 1773 exeinto "${path}"
1773 newexe "${tmpwrapper}" "${wrapper}" 1774 newexe "${tmpwrapper}" "${wrapper}"
1775 ) || die
1774 else 1776 else
1775 newbin "${tmpwrapper}" "${wrapper}" 1777 newbin "${tmpwrapper}" "${wrapper}" || die
1776 fi 1778 fi
1777} 1779}

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

  ViewVC Help
Powered by ViewVC 1.1.20