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>
116 lines
4.1 KiB
Text
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)
|
|
}
|