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

Contents of /eclass/alternatives.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations) (download)
Wed Nov 24 06:49:41 2010 UTC (3 years, 9 months 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 pva 1.15 # Copyright 1999-2008 Gentoo Foundation
2 liquidx 1.1 # Distributed under the terms of the GNU General Public License v2
3 ulm 1.16 # $Header: /var/cvsroot/gentoo-x86/eclass/alternatives.eclass,v 1.15 2008/09/10 08:10:31 pva Exp $
4 liquidx 1.1
5 pva 1.15 # @ECLASS: alternatives.eclass
6     # @MAINTAINER:
7 swegener 1.12 #
8 pva 1.15 # 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 ulm 1.16 # @DEFAULT_UNSET
45 pva 1.15 # @DESCRIPTION:
46     # The symlink to be created
47    
48     # @ECLASS-VARIABLE: ALTERNATIVES
49 ulm 1.16 # @DEFAULT_UNSET
50 pva 1.15 # @DESCRIPTION:
51     # The list of alternatives
52 liquidx 1.1
53 pva 1.15 # @FUNCTION: alternatives_auto_makesym
54     # @DESCRIPTION:
55 liquidx 1.1 # automatic deduction based on a symlink and a regex mask
56     alternatives_auto_makesym() {
57 liquidx 1.6 local SYMLINK REGEX ALT myregex
58     SYMLINK=$1
59 liquidx 1.1 REGEX=$2
60 swegener 1.12 if [ "${REGEX:0:1}" != "/" ]
61 liquidx 1.6 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 liquidx 1.1 else
66 liquidx 1.6 myregex=${REGEX}
67     fi
68 liquidx 1.8
69 liquidx 1.6 # sort a space delimited string by converting it to a multiline list
70     # and then run sort -r over it.
71 liquidx 1.8 # 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 liquidx 1.6 alternatives_makesym ${SYMLINK} ${ALT}
74 liquidx 1.1 }
75    
76     alternatives_makesym() {
77     local ALTERNATIVES=""
78 liquidx 1.6 local SYMLINK=""
79     local alt pref
80 swegener 1.12
81 liquidx 1.1 # usage: alternatives_makesym <resulting symlink> [alternative targets..]
82 liquidx 1.6 SYMLINK=$1
83 liquidx 1.8 # this trick removes the trailing / from ${ROOT}
84     pref=$(echo ${ROOT} | sed 's:/$::')
85 liquidx 1.1 shift
86     ALTERNATIVES=$@
87    
88     # step through given alternatives from first to last
89     # and if one exists, link it and finish.
90 swegener 1.12
91 liquidx 1.1 for alt in ${ALTERNATIVES}; do
92 liquidx 1.6 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 liquidx 1.8 einfo "Linking ${alt} to ${pref}${SYMLINK} (relative)"
98 liquidx 1.7 ln -sf ${alt##*/} ${pref}${SYMLINK}
99 liquidx 1.6 else
100     #no; keep absolute path
101 liquidx 1.8 einfo "Linking ${alt} to ${pref}${SYMLINK} (absolute)"
102 liquidx 1.7 ln -sf ${pref}${alt} ${pref}${SYMLINK}
103 liquidx 1.1 fi
104     break
105     fi
106     done
107 swegener 1.12
108 liquidx 1.1 # report any errors
109 liquidx 1.6 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 ulm 1.14 ewarn "Removing dead symlink ${pref}${SYMLINK}"
117     rm -f ${pref}${SYMLINK}
118 liquidx 1.6 fi
119 swegener 1.12 fi
120     }
121 liquidx 1.1
122 pva 1.15 # @FUNCTION: alernatives-pkg_postinst
123     # @DESCRIPTION:
124     # The alternatives pkg_postinst, this function will be exported
125 liquidx 1.1 alternatives_pkg_postinst() {
126     if [ -n "${ALTERNATIVES}" -a -n "${SOURCE}" ]; then
127     alternatives_makesym ${SOURCE} ${ALTERNATIVES}
128 swegener 1.12 fi
129 liquidx 1.1 }
130    
131 pva 1.15 # @FUNCTION: alternatives_pkg_postrm
132     # @DESCRIPTION:
133     # The alternatives pkg_postrm, this function will be exported
134 liquidx 1.1 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