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

Contents of /eclass/alternatives.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.18 - (hide annotations) (download)
Sat Sep 21 01:03:42 2013 UTC (14 months ago) by ottxor
Branch: MAIN
CVS Tags: HEAD
Changes since 1.17: +10 -6 lines
added prefix support

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

  ViewVC Help
Powered by ViewVC 1.1.20