package.bbclass: add support for pkg_postinst_ontarget()

This function is a convenient and more readable shortcut for situations
when the postinst code always needs to run on target. All commands that
cannot be executed during cross-install and can only be run on target
should go into this function. They will only be executed on first boot
(if package was cross-installed) or immediately during package installation
on target.

Plain pkg_postinst() works as before: it is run during cross-install time,
it can contain a request to defer to first boot, and it is also run
during package installation on target.

Also fix the oeqa test for this functionality to use the new function
where appropriate.

(From OE-Core rev: 229f4e975fb6957f44b5c56735fd6d58564098d7)

Signed-off-by: Alexander Kanavin <alexander.kanavin@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin
2018-01-29 14:01:31 +02:00
committed by Richard Purdie
parent 32c500b8ea
commit 6ca669105f
2 changed files with 22 additions and 12 deletions

View File

@@ -35,14 +35,9 @@ pkg_postinst_${PN}-rootfs () {
# Depends on rootfs, delays until first boot, verifies that the rootfs file was
# written.
pkg_postinst_${PN}-delayed-a () {
pkg_postinst_ontarget_${PN}-delayed-a () {
set -e
if [ -n "$D" ]; then
echo "Delaying ${PN}-delayed-a until first boot"
exit 1
fi
if [ ! -e ${TESTDIR}/rootfs ]; then
echo "${PN}-delayed-a: ${TESTDIR}/rootfs not found"
exit 1
@@ -53,14 +48,9 @@ pkg_postinst_${PN}-delayed-a () {
# Depends on delayed-a, delays until first boot, verifies that the delayed-a file was
# written. This verifies the ordering between delayed postinsts.
pkg_postinst_${PN}-delayed-b () {
pkg_postinst_ontarget_${PN}-delayed-b () {
set -e
if [ -n "$D" ]; then
echo "Delaying ${PN}-delayed-b until first boot"
exit 1
fi
if [ ! -e ${TESTDIR}/delayed-a ]; then
echo "${PN}-delayed-b: ${TESTDIR}/delayed-a not found"
exit 1

View File

@@ -1320,6 +1320,25 @@ python emit_pkgdata() {
from glob import glob
import json
def process_postinst_on_target(pkg, mlprefix):
defer_fragment = """
if [ -n "$D" ]; then
$INTERCEPT_DIR/postinst_intercept delay_to_first_boot %s mlprefix=%s
exit 0
fi
""" % (pkg, mlprefix)
postinst = d.getVar('pkg_postinst_%s' % pkg)
postinst_ontarget = d.getVar('pkg_postinst_ontarget_%s' % pkg)
if postinst_ontarget:
bb.debug(1, 'adding deferred pkg_postinst_ontarget() to pkg_postinst() for %s' % pkg)
if not postinst:
postinst = '#!/bin/sh\n'
postinst += defer_fragment
postinst += postinst_ontarget
d.setVar('pkg_postinst_%s' % pkg, postinst)
def write_if_exists(f, pkg, var):
def encode(str):
import codecs
@@ -1415,6 +1434,7 @@ python emit_pkgdata() {
write_if_exists(sf, pkg, 'ALLOW_EMPTY')
write_if_exists(sf, pkg, 'FILES')
write_if_exists(sf, pkg, 'CONFFILES')
process_postinst_on_target(pkg, d.getVar("MLPREFIX"))
write_if_exists(sf, pkg, 'pkg_postinst')
write_if_exists(sf, pkg, 'pkg_postrm')
write_if_exists(sf, pkg, 'pkg_preinst')