summaryrefslogtreecommitdiffstats
path: root/meta/classes/update-alternatives.bbclass
diff options
context:
space:
mode:
authorKevin Tian <kevin.tian@intel.com>2010-09-25 06:54:44 (GMT)
committerRichard Purdie <rpurdie@linux.intel.com>2010-09-29 15:42:15 (GMT)
commit22cbcd964fceb43c89142be77db8950425b4303e (patch)
tree34879ea75a7e06fddd6c174820ec3f715d72abdf /meta/classes/update-alternatives.bbclass
parent5f289ac80f81681f1d31e8637ceeeb5217aa40ca (diff)
downloadpoky-22cbcd964fceb43c89142be77db8950425b4303e.tar.gz
update-alternative.bbclass: add batch alternatives support
With new batch ability, we can use below simple 2 lines for multiple alternatives updates: ALTERNATIVE_LINKS = "${bindir}/cmd1 {sbindir}/cmd2 ..." ALTERNATIVE_PRIORITY = "100" Then for each command "/path/cmd" listed in ALTERNATIVE_LINKS, below is done automatically: ${D}/path/cmd is renamed to ${D}/path/cmd.{PN} a new alternative named 'cmd' is created which: links /path/cmd to /path/cmd.{PN} with priority specified in ALTERNATIVE_PRIORITY This way the recipe with multiple alternatives could be simplified a lot. There are still some cases where above assumptions may break, but I expect more recipes should benefit from this simple enhancement Fix [BUGID #257] Signed-off-by: Kevin Tian <kevin.tian@intel.com>
Diffstat (limited to 'meta/classes/update-alternatives.bbclass')
-rw-r--r--meta/classes/update-alternatives.bbclass83
1 files changed, 81 insertions, 2 deletions
diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
index ddbf4c1..fdb4214 100644
--- a/meta/classes/update-alternatives.bbclass
+++ b/meta/classes/update-alternatives.bbclass
@@ -1,3 +1,41 @@
1# This class is used to help the alternatives system which is useful when
2# multiple sources provide same command. You can use update-alternatives
3# command directly in your recipe, but in most cases this class simplifies
4# that job.
5#
6# There're two basic modes supported: 'single update' and 'batch update'
7#
8# 'single update' is used for a single alternative command, and you're
9# expected to provide at least below keywords:
10#
11# ALTERNATIVE_NAME - the name that the alternative is registered
12# ALTERNATIVE_PATH - the path of installed alternative
13#
14# ALTENATIVE_PRIORITY and ALTERNATIVE_LINK are optional which have defautls
15# in this class.
16#
17# 'batch update' is used if you have multiple alternatives to be updated.
18# Unlike 'single update', 'batch update' in most times only require two
19# parameter:
20#
21# ALTERNATIVE_LINKS - a list of symbol links for which you'd like to
22# create alternatives, with space as delimiter, e.g:
23#
24# ALTERNATIVE_LINKS = "${bindir}/cmd1 ${sbindir}/cmd2 ..."
25#
26# ALTNERATIVE_PRIORITY - optional, applies to all
27#
28# To simplify the design, this class has the assumption that for a name
29# listed in ALTERNATIVE_LINKS, say /path/cmd:
30#
31# the name of the alternative would be: cmd
32# the path of installed alternative would be: /path/cmd.${PN}
33# ${D}/path/cmd will be renamed to ${D}/path/cmd.{PN} automatically
34# priority will be the same from ALTERNATIVE_PRIORITY
35#
36# If above assumption breaks your requirement, then you still need to use
37# your own update-alternatives command directly.
38
1# defaults 39# defaults
2ALTERNATIVE_PRIORITY = "10" 40ALTERNATIVE_PRIORITY = "10"
3ALTERNATIVE_LINK = "${bindir}/${ALTERNATIVE_NAME}" 41ALTERNATIVE_LINK = "${bindir}/${ALTERNATIVE_NAME}"
@@ -10,7 +48,42 @@ update_alternatives_postrm() {
10update-alternatives --remove ${ALTERNATIVE_NAME} ${ALTERNATIVE_PATH} 48update-alternatives --remove ${ALTERNATIVE_NAME} ${ALTERNATIVE_PATH}
11} 49}
12 50
51# for batch alternatives, we use a simple approach to require only one parameter
52# with the rest info deduced implicitly
53update_alternatives_batch_postinst() {
54for link in ${ALTERNATIVE_LINKS}
55do
56 name=`basename ${link}`
57 path=${link}.${PN}
58 update-alternatives --install ${link} ${name} ${path} ${ALTERNATIVE_PRIORITY}
59done
60}
61
62update_alternatives_batch_postrm() {
63for link in ${ALTERNATIVE_LINKS}
64do
65 name=`basename ${link}`
66 path=${link}.${PN}
67 update-alternatives --remove ${name} $path
68done
69}
70
71update_alternatives_batch_doinstall() {
72if [ "${PN}" = "${BPN}" ] ; then
73 for link in ${ALTERNATIVE_LINKS}
74 do
75 mv ${D}${link} ${D}${link}.${PN}
76 done
77fi
78}
79
13def update_alternatives_after_parse(d): 80def update_alternatives_after_parse(d):
81 if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
82 doinstall = bb.data.getVar('do_install', d, 1)
83 doinstall += bb.data.getVar('update_alternatives_batch_doinstall', d, 1)
84 bb.data.setVar('do_install', doinstall, d)
85 return
86
14 if bb.data.getVar('ALTERNATIVE_NAME', d) == None: 87 if bb.data.getVar('ALTERNATIVE_NAME', d) == None:
15 raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_NAME" % bb.data.getVar('FILE', d) 88 raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_NAME" % bb.data.getVar('FILE', d)
16 if bb.data.getVar('ALTERNATIVE_PATH', d) == None: 89 if bb.data.getVar('ALTERNATIVE_PATH', d) == None:
@@ -26,11 +99,17 @@ python populate_packages_prepend () {
26 postinst = bb.data.getVar('pkg_postinst_%s' % pkg, d, 1) or bb.data.getVar('pkg_postinst', d, 1) 99 postinst = bb.data.getVar('pkg_postinst_%s' % pkg, d, 1) or bb.data.getVar('pkg_postinst', d, 1)
27 if not postinst: 100 if not postinst:
28 postinst = '#!/bin/sh\n' 101 postinst = '#!/bin/sh\n'
29 postinst += bb.data.getVar('update_alternatives_postinst', d, 1) 102 if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
103 postinst += bb.data.getVar('update_alternatives_batch_postinst', d, 1)
104 else:
105 postinst += bb.data.getVar('update_alternatives_postinst', d, 1)
30 bb.data.setVar('pkg_postinst_%s' % pkg, postinst, d) 106 bb.data.setVar('pkg_postinst_%s' % pkg, postinst, d)
31 postrm = bb.data.getVar('pkg_postrm_%s' % pkg, d, 1) or bb.data.getVar('pkg_postrm', d, 1) 107 postrm = bb.data.getVar('pkg_postrm_%s' % pkg, d, 1) or bb.data.getVar('pkg_postrm', d, 1)
32 if not postrm: 108 if not postrm:
33 postrm = '#!/bin/sh\n' 109 postrm = '#!/bin/sh\n'
34 postrm += bb.data.getVar('update_alternatives_postrm', d, 1) 110 if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
111 postrm += bb.data.getVar('update_alternatives_batch_postrm', d, 1)
112 else:
113 postrm += bb.data.getVar('update_alternatives_postrm', d, 1)
35 bb.data.setVar('pkg_postrm_%s' % pkg, postrm, d) 114 bb.data.setVar('pkg_postrm_%s' % pkg, postrm, d)
36} 115}