summaryrefslogtreecommitdiff
path: root/meta/classes/update-alternatives.bbclass
blob: 7b0518d848fae1b5d65483ad1f9faac9d8ccaf17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# This class is used to help the alternatives system which is useful when
# multiple sources provide same command. You can use update-alternatives
# command directly in your recipe, but in most cases this class simplifies
# that job.
#
# There are two basic modes supported: 'single update' and 'batch update'
#
# 'single update' is used for a single alternative command, and you're
# expected to provide at least below keywords:
#
#     ALTERNATIVE_NAME - the name that the alternative is registered
#     ALTERNATIVE_PATH - the path of installed alternative
#
# ALTERNATIVE_PRIORITY and ALTERNATIVE_LINK are optional which have defaults
# in this class.
#
# 'batch update' is used if you have multiple alternatives to be updated.
# Unlike 'single update', 'batch update' in most times only require two
# parameters:
#
#     ALTERNATIVE_LINKS - a list of symbolic links for which you'd like to
#                         create alternatives, with space as delimiter, e.g:
#
#         ALTERNATIVE_LINKS = "${bindir}/cmd1 ${sbindir}/cmd2 ..."
#
#     ALTERNATIVE_PRIORITY - optional, applies to all
#
# To simplify the design, this class has the assumption that for a name
# listed in ALTERNATIVE_LINKS, say /path/cmd:
#
#     the name of the alternative would be: cmd
#     the path of installed alternative would be: /path/cmd.${PN}
#     ${D}/path/cmd will be renamed to ${D}/path/cmd.{PN} automatically
#     priority will be the same from ALTERNATIVE_PRIORITY
#
# If above assumption breaks your requirement, then you still need to use
# your own update-alternatives command directly.

# defaults
ALTERNATIVE_PRIORITY = "10"
ALTERNATIVE_LINK = "${bindir}/${ALTERNATIVE_NAME}"

update_alternatives_postinst() {
update-alternatives --install ${ALTERNATIVE_LINK} ${ALTERNATIVE_NAME} ${ALTERNATIVE_PATH} ${ALTERNATIVE_PRIORITY}
}

update_alternatives_postrm() {
update-alternatives --remove ${ALTERNATIVE_NAME} ${ALTERNATIVE_PATH}
}

# for batch alternatives, we use a simple approach to require only one parameter
# with the rest of the info deduced implicitly
update_alternatives_batch_postinst() {
for link in ${ALTERNATIVE_LINKS}
do
	name=`basename ${link}`
	path=${link}.${PN}
	update-alternatives --install ${link} ${name} ${path} ${ALTERNATIVE_PRIORITY}
done
}

update_alternatives_batch_postrm() {
for link in ${ALTERNATIVE_LINKS}
do
	name=`basename ${link}`
	path=${link}.${PN}
	update-alternatives --remove ${name} $path
done
}

update_alternatives_batch_doinstall() {
	for link in ${ALTERNATIVE_LINKS}
	do
		mv ${D}${link} ${D}${link}.${PN}
	done
}

def update_alternatives_after_parse(d):
    if bb.data.inherits_class('native', d) or bb.data.inherits_class('nativesdk', d):
        return

    if d.getVar('ALTERNATIVE_LINKS') != None:
        doinstall = d.getVar('do_install', 0)
        doinstall += d.getVar('update_alternatives_batch_doinstall', 0)
        d.setVar('do_install', doinstall)
        return

    if d.getVar('ALTERNATIVE_NAME') == None:
        raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_NAME" % d.getVar('FILE')
    if d.getVar('ALTERNATIVE_PATH') == None:
        raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_PATH" % d.getVar('FILE')

python __anonymous() {
    update_alternatives_after_parse(d)
}

python populate_packages_prepend () {
	pkg = d.getVar('PN', True)
	bb.note('adding update-alternatives calls to postinst/postrm for %s' % pkg)
	postinst = d.getVar('pkg_postinst_%s' % pkg, True) or d.getVar('pkg_postinst', True)
	if not postinst:
		postinst = '#!/bin/sh\n'
	if d.getVar('ALTERNATIVE_LINKS') != None:
		postinst += d.getVar('update_alternatives_batch_postinst', True)
	else:
		postinst += d.getVar('update_alternatives_postinst', True)
	d.setVar('pkg_postinst_%s' % pkg, postinst)
	postrm = d.getVar('pkg_postrm_%s' % pkg, True) or d.getVar('pkg_postrm', True)
	if not postrm:
		postrm = '#!/bin/sh\n'
	if d.getVar('ALTERNATIVE_LINKS') != None:
		postrm += d.getVar('update_alternatives_batch_postrm', True)
	else:
		postrm += d.getVar('update_alternatives_postrm', True)
	d.setVar('pkg_postrm_%s' % pkg, postrm)
}