generic-poky/meta/classes/update-alternatives.bbclass
Kevin Tian ad0e271a03 update-alternatives.bbclass: don't expand var when appending do_install
Or else absolute paths may be expanded which then breaks sstate signature
comparison.

I'm not sure whether pre/post funcs can be expanded or not. They are
invoked at image build or on the target, and thus need be expanded some
place. But if one recipe does use directories under TMP in its postinst
helpers, this would be an issue again.

Signed-off-by: Kevin Tian <kevin.tian@intel.com>
2010-11-21 18:17:24 +00:00

116 lines
4.1 KiB
Text

# 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're 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
#
# ALTENATIVE_PRIORITY and ALTERNATIVE_LINK are optional which have defautls
# 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
# parameter:
#
# ALTERNATIVE_LINKS - a list of symbol links for which you'd like to
# create alternatives, with space as delimiter, e.g:
#
# ALTERNATIVE_LINKS = "${bindir}/cmd1 ${sbindir}/cmd2 ..."
#
# ALTNERATIVE_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 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() {
if [ "${PN}" = "${BPN}" ] ; then
for link in ${ALTERNATIVE_LINKS}
do
mv ${D}${link} ${D}${link}.${PN}
done
fi
}
def update_alternatives_after_parse(d):
if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
doinstall = bb.data.getVar('do_install', d, 0)
doinstall += bb.data.getVar('update_alternatives_batch_doinstall', d, 0)
bb.data.setVar('do_install', doinstall, d)
return
if bb.data.getVar('ALTERNATIVE_NAME', d) == None:
raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_NAME" % bb.data.getVar('FILE', d)
if bb.data.getVar('ALTERNATIVE_PATH', d) == None:
raise bb.build.FuncFailed, "%s inherits update-alternatives but doesn't set ALTERNATIVE_PATH" % bb.data.getVar('FILE', d)
python __anonymous() {
update_alternatives_after_parse(d)
}
python populate_packages_prepend () {
pkg = bb.data.getVar('PN', d, 1)
bb.note('adding update-alternatives calls to postinst/postrm for %s' % pkg)
postinst = bb.data.getVar('pkg_postinst_%s' % pkg, d, 1) or bb.data.getVar('pkg_postinst', d, 1)
if not postinst:
postinst = '#!/bin/sh\n'
if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
postinst += bb.data.getVar('update_alternatives_batch_postinst', d, 1)
else:
postinst += bb.data.getVar('update_alternatives_postinst', d, 1)
bb.data.setVar('pkg_postinst_%s' % pkg, postinst, d)
postrm = bb.data.getVar('pkg_postrm_%s' % pkg, d, 1) or bb.data.getVar('pkg_postrm', d, 1)
if not postrm:
postrm = '#!/bin/sh\n'
if bb.data.getVar('ALTERNATIVE_LINKS', d) != None:
postrm += bb.data.getVar('update_alternatives_batch_postrm', d, 1)
else:
postrm += bb.data.getVar('update_alternatives_postrm', d, 1)
bb.data.setVar('pkg_postrm_%s' % pkg, postrm, d)
}