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

Diff of /eclass/eutils.eclass

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

Revision 1.157 Revision 1.173
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2005 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.157 2005/03/07 17:45:07 carlo Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.173 2005/05/24 03:17:19 vapier Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 8# have to implement themselves.
14INHERITED="$INHERITED $ECLASS" 14INHERITED="$INHERITED $ECLASS"
15 15
16DEPEND="!bootstrap? ( sys-devel/patch )" 16DEPEND="!bootstrap? ( sys-devel/patch )"
17 17
18DESCRIPTION="Based on the ${ECLASS} eclass" 18DESCRIPTION="Based on the ${ECLASS} eclass"
19
20# ecpu_check
21# Usage:
22#
23# ecpu_check array_of_cpu_flags
24#
25# array_of_cpu_flags - An array of cpu flags to check against USE flags
26#
27# Checks user USE related cpu flags against /proc/cpuinfo. If user enables a
28# cpu flag that is not supported in their processor flags, it will warn the
29# user if CROSSCOMPILE is not set to 1 ( because cross compile users are
30# obviously using different cpu flags than their own cpu ). Examples:
31#
32# CPU_FLAGS=(mmx mmx2 sse sse2)
33# ecpu_check CPU_FLAGS
34# Chris White <chriswhite@gentoo.org> (03 Feb 2005)
35
36ecpu_check() {
37 # Think about changing below to: if [ "${CROSSCOMPILE}" -ne 1 -a -e "/proc/cpuinfo" ]
38 # and dropping the else if you do not plan on adding anything to that
39 # empty block ....
40 # PS: also try to add some quoting, and consider rather using ${foo} than $foo ...
41 if [ "${CROSSCOMPILE}" != "1" -a -e "/proc/cpuinfo" ]
42 then
43 CPU_FLAGS=${1}
44 USER_CPU=`grep "flags" /proc/cpuinfo`
45
46 for flags in `seq 1 ${#CPU_FLAGS[@]}`
47 do
48 if has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && ! has ${CPU_FLAGS[${flags} - 1]} ${USE}
49 then
50 ewarn "Your system is ${CPU_FLAGS[${flags} - 1]} capable but you don't have it enabled!"
51 ewarn "You might be cross compiling (in this case set CROSSCOMPILE to 1 to disable this warning."
52 fi
53
54 if ! has ${CPU_FLAGS[${flags} - 1]} ${USER_CPU} && has ${CPU_FLAGS[${flags} -1]} ${USE}
55 then
56 ewarn "You have ${CPU_FLAGS[${flags} - 1]} support enabled but your processor doesn't"
57 ewarn "Seem to support it! You might be cross compiling or do not have /proc filesystem"
58 ewarn "enabled. If either is the case, set CROSSCOMPILE to 1 to disable this warning."
59 fi
60 done
61 fi
62}
63 19
64# Wait for the supplied number of seconds. If no argument is supplied, defaults 20# Wait for the supplied number of seconds. If no argument is supplied, defaults
65# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not 21# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
66# outputting to a terminal, don't wait. For compatability purposes, the argument 22# outputting to a terminal, don't wait. For compatability purposes, the argument
67# must be an integer greater than zero. 23# must be an integer greater than zero.
109gen_usr_ldscript() { 65gen_usr_ldscript() {
110 local libdir="$(get_libdir)" 66 local libdir="$(get_libdir)"
111 # Just make sure it exists 67 # Just make sure it exists
112 dodir /usr/${libdir} 68 dodir /usr/${libdir}
113 69
70 for lib in "${@}" ; do
114 cat > "${D}/usr/${libdir}/${1}" << END_LDSCRIPT 71 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
115/* GNU ld script 72 /* GNU ld script
116 Because Gentoo have critical dynamic libraries 73 Since Gentoo has critical dynamic libraries
117 in /lib, and the static versions in /usr/lib, we 74 in /lib, and the static versions in /usr/lib,
118 need to have a "fake" dynamic lib in /usr/lib, 75 we need to have a "fake" dynamic lib in /usr/lib,
119 otherwise we run into linking problems. 76 otherwise we run into linking problems.
120 See bug #4411 on http://bugs.gentoo.org/ for 77
121 more info. */ 78 See bug http://bugs.gentoo.org/4411 for more info.
79 */
122GROUP ( /${libdir}/${1} ) 80 GROUP ( /${libdir}/${lib} )
123END_LDSCRIPT 81 END_LDSCRIPT
124 fperms a+x "/usr/${libdir}/${1}" 82 fperms a+x "/usr/${libdir}/${lib}"
83 done
125} 84}
126 85
127# Simple function to draw a line consisting of '=' the same length as $* 86# Simple function to draw a line consisting of '=' the same length as $*
87# - only to be used by epatch()
128# 88#
129# <azarah@gentoo.org> (11 Nov 2002) 89# <azarah@gentoo.org> (11 Nov 2002)
130# 90#
131draw_line() { 91draw_line() {
132 local i=0 92 local i=0
158EPATCH_SOURCE="${WORKDIR}/patch" 118EPATCH_SOURCE="${WORKDIR}/patch"
159# Default extension for patches 119# Default extension for patches
160EPATCH_SUFFIX="patch.bz2" 120EPATCH_SUFFIX="patch.bz2"
161# Default options for patch 121# Default options for patch
162# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 122# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
163EPATCH_OPTS="-g0" 123# Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
124EPATCH_OPTS="-g0 --no-backup-if-mismatch"
164# List of patches not to apply. Not this is only file names, 125# List of patches not to apply. Not this is only file names,
165# and not the full path .. 126# and not the full path ..
166EPATCH_EXCLUDE="" 127EPATCH_EXCLUDE=""
167# Change the printed message for a single patch. 128# Change the printed message for a single patch.
168EPATCH_SINGLE_MSG="" 129EPATCH_SINGLE_MSG=""
130# Change the printed message for multiple patches.
131EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
169# Force applying bulk patches even if not following the style: 132# Force applying bulk patches even if not following the style:
170# 133#
171# ??_${ARCH}_foo.${EPATCH_SUFFIX} 134# ??_${ARCH}_foo.${EPATCH_SUFFIX}
172# 135#
173EPATCH_FORCE="no" 136EPATCH_FORCE="no"
214 local x="" 177 local x=""
215 178
216 if [ "$#" -gt 1 ] 179 if [ "$#" -gt 1 ]
217 then 180 then
218 local m="" 181 local m=""
219 einfo "${#} patches to apply ..."
220 for m in "$@" ; do 182 for m in "$@" ; do
221 epatch "${m}" 183 epatch "${m}"
222 done 184 done
223 return 0 185 return 0
224 fi 186 fi
278 ;; 240 ;;
279 esac 241 esac
280 242
281 if [ "${SINGLE_PATCH}" = "no" ] 243 if [ "${SINGLE_PATCH}" = "no" ]
282 then 244 then
283 einfo "Applying various patches (bugfixes/updates) ..." 245 einfo "${EPATCH_MULTI_MSG}"
284 fi 246 fi
285 for x in ${EPATCH_SOURCE} 247 for x in ${EPATCH_SOURCE}
286 do 248 do
287 # New ARCH dependant patch naming scheme ... 249 # New ARCH dependant patch naming scheme ...
288 # 250 #
386 fi 348 fi
387 349
388 if [ "${count}" -eq 5 ] 350 if [ "${count}" -eq 5 ]
389 then 351 then
390 echo 352 echo
391 eerror "Failed Patch: ${patchname}!" 353 eerror "Failed Patch: ${patchname} !"
354 eerror " ( ${PATCH_TARGET} )"
392 eerror 355 eerror
393 eerror "Include in your bugreport the contents of:" 356 eerror "Include in your bugreport the contents of:"
394 eerror 357 eerror
395 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}" 358 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
396 echo 359 echo
404 done 367 done
405 if [ "${SINGLE_PATCH}" = "no" ] 368 if [ "${SINGLE_PATCH}" = "no" ]
406 then 369 then
407 einfo "Done with patching" 370 einfo "Done with patching"
408 fi 371 fi
409}
410
411# This function return true if we are using the NPTL pthreads
412# implementation.
413#
414# <azarah@gentoo.org> (06 March 2003)
415#
416have_NPTL() {
417 cat > ${T}/test-nptl.c <<-"END"
418 #define _XOPEN_SOURCE
419 #include <unistd.h>
420 #include <stdio.h>
421
422 int main()
423 {
424 char buf[255];
425 char *str = buf;
426
427 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
428 if (NULL != str) {
429 printf("%s\n", str);
430 if (NULL != strstr(str, "NPTL"))
431 return 0;
432 }
433
434 return 1;
435 }
436 END
437
438 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ..."
439 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
440 then
441 echo "yes"
442 einfon "Checking what PTHREADS implementation we have ..."
443 if ${T}/nptl
444 then
445 return 0
446 else
447 return 1
448 fi
449 else
450 echo "no"
451 fi
452
453 return 1
454} 372}
455 373
456# This function check how many cpu's are present, and then set 374# This function check how many cpu's are present, and then set
457# -j in MAKEOPTS accordingly. 375# -j in MAKEOPTS accordingly.
458# 376#
912# a full path to an icon 830# a full path to an icon
913# type: what kind of application is this ? for categories: 831# type: what kind of application is this ? for categories:
914# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec 832# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec
915# path: if your app needs to startup in a specific dir 833# path: if your app needs to startup in a specific dir
916make_desktop_entry() { 834make_desktop_entry() {
917 [ -z "$1" ] && eerror "make_desktop_entry: You must specify the executable" && return 1 835 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
918 836
919 local exec="${1}" 837 local exec=${1}
920 local name="${2:-${PN}}" 838 local name=${2:-${PN}}
921 local icon="${3:-${PN}.png}" 839 local icon=${3:-${PN}.png}
922 local type="${4}" 840 local type=${4}
923 local subdir="${6}" 841 local path=${5}
924 local path="${5:-${GAMES_BINDIR}}" 842
925 if [ -z "${type}" ] 843 if [[ -z ${type} ]] ; then
926 then 844 local catmaj=${CATEGORY%%-*}
927 case ${CATEGORY} in 845 local catmin=${CATEGORY##*-}
928 "app-emulation") 846 case ${catmaj} in
929 type=Emulator 847 app)
930 subdir="Emulation" 848 case ${catmin} in
849 admin) type=System;;
850 cdr) type=DiscBurning;;
851 dicts) type=Dictionary;;
852 editors) type=TextEditor;;
853 emacs) type=TextEditor;;
854 emulation) type=Emulator;;
855 laptop) type=HardwareSettings;;
856 office) type=Office;;
857 vim) type=TextEditor;;
858 xemacs) type=TextEditor;;
859 *) type=;;
860 esac
931 ;; 861 ;;
932 "games-"*) 862
933 type=Game 863 dev)
934 subdir="Games" 864 type="Development"
935 ;; 865 ;;
936 "net-"*) 866
937 type=Network 867 games)
938 subdir="${type}" 868 [[ -z ${path} ]] && path=${GAMES_BINDIR}
869
870 case ${catmin} in
871 action) type=ActionGame;;
872 arcade) type=ArcadeGame;;
873 board) type=BoardGame;;
874 kid) type=KidsGame;;
875 emulation) type=Emulator;;
876 puzzle) type=LogicGame;;
877 rpg) type=RolePlaying;;
878 roguelike) type=RolePlaying;;
879 simulation) type=Simulation;;
880 sports) type=SportsGame;;
881 strategy) type=StrategyGame;;
882 *) type=;;
883 esac
884 type="Game;${type}"
939 ;; 885 ;;
886
887 mail)
888 type="Network;Email"
889 ;;
890
891 media)
892 case ${catmin} in
893 gfx) type=Graphics;;
894 radio) type=Tuner;;
895 sound) type=Audio;;
896 tv) type=TV;;
897 video) type=Video;;
898 *) type=;;
899 esac
900 type="AudioVideo;${type}"
901 ;;
902
903 net)
904 case ${catmin} in
905 dialup) type=Dialup;;
906 ftp) type=FileTransfer;;
907 im) type=InstantMessaging;;
908 irc) type=IRCClient;;
909 mail) type=Email;;
910 news) type=News;;
911 nntp) type=News;;
912 p2p) type=FileTransfer;;
913 *) type=;;
914 esac
915 type="Network;${type}"
916 ;;
917
918 sci)
919 case ${catmin} in
920 astro*) type=Astronomoy;;
921 bio*) type=Biology;;
922 calc*) type=Calculator;;
923 chem*) type=Chemistry;;
924 geo*) type=Geology;;
925 math*) type=Math;;
926 *) type=;;
927 esac
928 type="Science;${type}"
929 ;;
930
931 www)
932 case ${catmin} in
933 client) type=WebBrowser;;
934 *) type=;;
935 esac
936 type="Network"
937 ;;
938
940 *) 939 *)
941 type= 940 type=
942 subdir=
943 ;; 941 ;;
944 esac 942 esac
945 fi 943 fi
944
946 local desktop="${T}/${exec%% *}-${P}.desktop" 945 local desktop=${T}/${exec%% *}-${P}.desktop
947 946
948echo "[Desktop Entry] 947echo "[Desktop Entry]
949Encoding=UTF-8 948Encoding=UTF-8
950Version=0.9.2 949Version=0.9.2
951Name=${name} 950Name=${name}
967# make_desktop_entry(<title>, <command>) 966# make_desktop_entry(<title>, <command>)
968# title: File to execute to start the Window Manager 967# title: File to execute to start the Window Manager
969# command: Name of the Window Manager 968# command: Name of the Window Manager
970 969
971make_session_desktop() { 970make_session_desktop() {
972
973 [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1 971 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
974 [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1 972 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
975 973
976 local title="${1}" 974 local title=$1
977 local command="${2}" 975 local command=$2
978 local desktop="${T}/${wm}.desktop" 976 local desktop=${T}/${wm}.desktop
979 977
980echo "[Desktop Entry] 978echo "[Desktop Entry]
981Encoding=UTF-8 979Encoding=UTF-8
982Name=${title} 980Name=${title}
983Comment=This session logs you into ${title} 981Comment=This session logs you into ${title}
985TryExec=${command} 983TryExec=${command}
986Type=Application" > "${desktop}" 984Type=Application" > "${desktop}"
987 985
988 insinto /usr/share/xsessions 986 insinto /usr/share/xsessions
989 doins "${desktop}" 987 doins "${desktop}"
990
991 return 0
992} 988}
993 989
994domenu() { 990domenu() {
995 local i 991 local i j
996 local j
997 insinto /usr/share/applications 992 insinto /usr/share/applications
998 for i in ${@} 993 for i in "$@" ; do
999 do
1000 if [ -f "${i}" ]; 994 if [[ -f ${i} ]] ; then
1001 then
1002 doins ${i} 995 doins "${i}"
1003 elif [ -d "${i}" ]; 996 elif [[ -d ${i} ]] ; then
1004 then
1005 for j in ${i}/*.desktop 997 for j in "${i}"/*.desktop ; do
1006 do
1007 doins ${j} 998 doins "${j}"
1008 done 999 done
1009 fi 1000 fi
1010 done 1001 done
1011} 1002}
1003newmenu() {
1004 insinto /usr/share/applications
1005 newins "$1" "$2"
1006}
1012 1007
1013doicon() { 1008doicon() {
1014 local i 1009 local i j
1015 local j
1016 insinto /usr/share/pixmaps 1010 insinto /usr/share/pixmaps
1017 for i in ${@} 1011 for i in "$@" ; do
1018 do
1019 if [ -f "${i}" ]; 1012 if [[ -f ${i} ]] ; then
1020 then
1021 doins ${i} 1013 doins "${i}"
1022 elif [ -d "${i}" ]; 1014 elif [[ -d ${i} ]] ; then
1023 then
1024 for j in ${i}/*.png 1015 for j in "${i}"/*.png ; do
1025 do
1026 doins ${j} 1016 doins "${j}"
1027 done 1017 done
1028 fi 1018 fi
1029 done 1019 done
1020}
1021newicon() {
1022 insinto /usr/share/pixmaps
1023 newins "$1" "$2"
1030} 1024}
1031 1025
1032############################################################## 1026##############################################################
1033# END: Handle .desktop files and menu entries # 1027# END: Handle .desktop files and menu entries #
1034############################################################## 1028##############################################################
1435 local mline="" 1429 local mline=""
1436 local showedmsg=0 1430 local showedmsg=0
1437 1431
1438 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do 1432 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1439 [[ -d ${mline}/${dir} ]] || continue 1433 [[ -d ${mline}/${dir} ]] || continue
1440 [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \ 1434 [[ ! -z $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] \
1441 && export CDROM_ROOT=${mline} 1435 && export CDROM_ROOT=${mline}
1442 done 1436 done
1443 1437
1444 if [[ -z ${CDROM_ROOT} ]] ; then 1438 if [[ -z ${CDROM_ROOT} ]] ; then
1445 echo 1439 echo
1513 else 1507 else
1514 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA" 1508 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1515 fi 1509 fi
1516 done 1510 done
1517 if [[ -z ${newls} ]] ; then 1511 if [[ -z ${newls} ]] ; then
1518 unset LINGUAS 1512 export LINGUAS=""
1519 else 1513 else
1520 export LINGUAS=${newls:1} 1514 export LINGUAS=${newls:1}
1521 fi 1515 fi
1522} 1516}
1523 1517
1655dopamd() { 1649dopamd() {
1656 [[ -z $1 ]] && die "dopamd requires at least one argument" 1650 [[ -z $1 ]] && die "dopamd requires at least one argument"
1657 1651
1658 use pam || return 0 1652 use pam || return 0
1659 1653
1660 insinto /etc/pam.d 1654 INSDESTTREE=/etc/pam.d \
1661 # these are the default doins options, but be explicit just in case
1662 insopts -m 0644 -o root -g root
1663 doins "$@" || die "failed to install $@" 1655 doins "$@" || die "failed to install $@"
1664} 1656}
1665# newpamd <old name> <new name> 1657# newpamd <old name> <new name>
1666# 1658#
1667# Install pam file <old name> as <new name> in /etc/pam.d 1659# Install pam file <old name> as <new name> in /etc/pam.d
1668newpamd() { 1660newpamd() {
1669 [[ $# -ne 2 ]] && die "newpamd requires two arguements" 1661 [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1670 1662
1671 use pam || return 0 1663 use pam || return 0
1672 1664
1673 insinto /etc/pam.d 1665 INSDESTTREE=/etc/pam.d \
1674 # these are the default doins options, but be explicit just in case
1675 insopts -m 0644 -o root -g root
1676 newins "$1" "$2" || die "failed to install $1 as $2" 1666 newins "$1" "$2" || die "failed to install $1 as $2"
1677} 1667}
1668
1669# make a wrapper script ...
1670# NOTE: this was originally games_make_wrapper, but I noticed other places where
1671# this could be used, so I have moved it here and made it not games-specific
1672# -- wolf31o2
1673# $1 == wrapper name
1674# $2 == binary to run
1675# $3 == directory to chdir before running binary
1676# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1677# $5 == path for wrapper
1678make_wrapper() {
1679 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1680 local tmpwrapper=$(emktemp)
1681 cat << EOF > "${tmpwrapper}"
1682#!/bin/sh
1683cd "${chdir}"
1684export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1685exec ${bin} "\$@"
1686EOF
1687 chmod go+rx "${tmpwrapper}"
1688 if [ -n "${5}" ]
1689 then
1690 exeinto ${5}
1691 newexe "${tmpwrapper}" "${wrapper}"
1692 else
1693 newbin "${tmpwrapper}" "${wrapper}"
1694 fi
1695}

Legend:
Removed from v.1.157  
changed lines
  Added in v.1.173

  ViewVC Help
Powered by ViewVC 1.1.20