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

Contents of /eclass/alternatives.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (show annotations) (download)
Wed Nov 24 06:49:41 2010 UTC (4 years ago) by ulm
Branch: MAIN
Changes since 1.15: +3 -1 lines
Add @DEFAULT_UNSET tags to variables to suppress warnings in eclass-manpages.

1 # Copyright 1999-2008 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/alternatives.eclass,v 1.15 2008/09/10 08:10:31 pva Exp $
4
5 # @ECLASS: alternatives.eclass
6 # @MAINTAINER:
7 #
8 # Original author : Alastair Tse <liquidx@gentoo.org> (03 Oct 2003)
9 # @BLURB: Creates symlink to the latest version of multiple slotted packages.
10 # @DESCRIPTION:
11 # When a package is SLOT'ed, very often we need to have a symlink to the
12 # latest version. However, depending on the order the user has merged them,
13 # more often than not, the symlink maybe clobbered by the older versions.
14 #
15 # This eclass provides a convenience function that needs to be given a
16 # list of alternatives (descending order of recent-ness) and the symlink.
17 # It will choose the latest version it can find installed and create
18 # the desired symlink.
19 #
20 # There are two ways to use this eclass. First is by declaring two variables
21 # $SOURCE and $ALTERNATIVES where $SOURCE is the symlink to be created and
22 # $ALTERNATIVES is a list of alternatives. Second way is the use the function
23 # alternatives_makesym() like the example below.
24 # @EXAMPLE:
25 # pkg_postinst() {
26 # alternatives_makesym "/usr/bin/python" "/usr/bin/python2.3" "/usr/bin/python2.2"
27 # }
28 #
29 # The above example will create a symlink at /usr/bin/python to either
30 # /usr/bin/python2.3 or /usr/bin/python2.2. It will choose python2.3 over
31 # python2.2 if both exist.
32 #
33 # Alternatively, you can use this function:
34 #
35 # pkg_postinst() {
36 # alternatives_auto_makesym "/usr/bin/python" "/usr/bin/python[0-9].[0-9]"
37 # }
38 #
39 # This will use bash pathname expansion to fill a list of alternatives it can
40 # link to. It is probably more robust against version upgrades. You should
41 # consider using this unless you are want to do something special.
42
43 # @ECLASS-VARIABLE: SOURCE
44 # @DEFAULT_UNSET
45 # @DESCRIPTION:
46 # The symlink to be created
47
48 # @ECLASS-VARIABLE: ALTERNATIVES
49 # @DEFAULT_UNSET
50 # @DESCRIPTION:
51 # The list of alternatives
52
53 # @FUNCTION: alternatives_auto_makesym
54 # @DESCRIPTION:
55 # automatic deduction based on a symlink and a regex mask
56 alternatives_auto_makesym() {
57 local SYMLINK REGEX ALT myregex
58 SYMLINK=$1
59 REGEX=$2
60 if [ "${REGEX:0:1}" != "/" ]
61 then
62 #not an absolute path:
63 #inherit the root directory of our main link path for our regex search
64 myregex="${SYMLINK%/*}/${REGEX}"
65 else
66 myregex=${REGEX}
67 fi
68
69 # sort a space delimited string by converting it to a multiline list
70 # and then run sort -r over it.
71 # make sure we use ${ROOT} because otherwise stage-building will break
72 ALT="$(for i in $(echo ${ROOT}${myregex}); do echo ${i#${ROOT}}; done | sort -r)"
73 alternatives_makesym ${SYMLINK} ${ALT}
74 }
75
76 alternatives_makesym() {
77 local ALTERNATIVES=""
78 local SYMLINK=""
79 local alt pref
80
81 # usage: alternatives_makesym <resulting symlink> [alternative targets..]
82 SYMLINK=$1
83 # this trick removes the trailing / from ${ROOT}
84 pref=$(echo ${ROOT} | sed 's:/$::')
85 shift
86 ALTERNATIVES=$@
87
88 # step through given alternatives from first to last
89 # and if one exists, link it and finish.
90
91 for alt in ${ALTERNATIVES}; do
92 if [ -f "${pref}${alt}" ]; then
93 #are files in same directory?
94 if [ "${alt%/*}" = "${SYMLINK%/*}" ]
95 then
96 #yes; strip leading dirname from alt to create relative symlink
97 einfo "Linking ${alt} to ${pref}${SYMLINK} (relative)"
98 ln -sf ${alt##*/} ${pref}${SYMLINK}
99 else
100 #no; keep absolute path
101 einfo "Linking ${alt} to ${pref}${SYMLINK} (absolute)"
102 ln -sf ${pref}${alt} ${pref}${SYMLINK}
103 fi
104 break
105 fi
106 done
107
108 # report any errors
109 if [ ! -L ${pref}${SYMLINK} ]; then
110 ewarn "Unable to establish ${pref}${SYMLINK} symlink"
111 else
112 # we need to check for either the target being in relative path form
113 # or absolute path form
114 if [ ! -f "`dirname ${pref}${SYMLINK}`/`readlink ${pref}${SYMLINK}`" -a \
115 ! -f "`readlink ${pref}${SYMLINK}`" ]; then
116 ewarn "Removing dead symlink ${pref}${SYMLINK}"
117 rm -f ${pref}${SYMLINK}
118 fi
119 fi
120 }
121
122 # @FUNCTION: alernatives-pkg_postinst
123 # @DESCRIPTION:
124 # The alternatives pkg_postinst, this function will be exported
125 alternatives_pkg_postinst() {
126 if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
127 alternatives_makesym ${SOURCE} ${ALTERNATIVES}
128 fi
129 }
130
131 # @FUNCTION: alternatives_pkg_postrm
132 # @DESCRIPTION:
133 # The alternatives pkg_postrm, this function will be exported
134 alternatives_pkg_postrm() {
135 if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
136 alternatives_makesym ${SOURCE} ${ALTERNATIVES}
137 fi
138 }
139
140 EXPORT_FUNCTIONS pkg_postinst pkg_postrm

  ViewVC Help
Powered by ViewVC 1.1.20