2013-02-07 22:54:13 +00:00
|
|
|
UPDATERCPN ?= "${PN}"
|
|
|
|
|
2015-07-26 08:05:43 +00:00
|
|
|
DEPENDS_append_class-target = " update-rc.d-native update-rc.d"
|
2014-06-06 16:57:34 +00:00
|
|
|
VIRTUAL-RUNTIME_initscripts ?= "initscripts"
|
|
|
|
DEPENDS_append_class-target = " ${VIRTUAL-RUNTIME_initscripts}"
|
2013-02-07 22:54:13 +00:00
|
|
|
UPDATERCD = "update-rc.d"
|
2014-02-12 12:11:34 +00:00
|
|
|
UPDATERCD_class-cross = ""
|
2013-02-07 22:54:13 +00:00
|
|
|
UPDATERCD_class-native = ""
|
|
|
|
UPDATERCD_class-nativesdk = ""
|
|
|
|
|
|
|
|
INITSCRIPT_PARAMS ?= "defaults"
|
|
|
|
|
|
|
|
INIT_D_DIR = "${sysconfdir}/init.d"
|
|
|
|
|
2013-10-30 00:57:11 +00:00
|
|
|
updatercd_preinst() {
|
|
|
|
if [ -z "$D" -a -f "${INIT_D_DIR}/${INITSCRIPT_NAME}" ]; then
|
|
|
|
${INIT_D_DIR}/${INITSCRIPT_NAME} stop
|
|
|
|
fi
|
2013-10-03 21:42:00 +00:00
|
|
|
if type update-rc.d >/dev/null 2>/dev/null; then
|
2013-10-16 13:07:51 +00:00
|
|
|
if [ -n "$D" ]; then
|
2013-10-03 21:42:00 +00:00
|
|
|
OPT="-f -r $D"
|
|
|
|
else
|
|
|
|
OPT="-f"
|
|
|
|
fi
|
|
|
|
update-rc.d $OPT ${INITSCRIPT_NAME} remove
|
|
|
|
fi
|
2013-10-30 00:57:11 +00:00
|
|
|
}
|
2013-10-03 21:42:00 +00:00
|
|
|
|
2013-10-30 00:57:11 +00:00
|
|
|
updatercd_postinst() {
|
2013-03-28 14:28:41 +00:00
|
|
|
if type update-rc.d >/dev/null 2>/dev/null; then
|
2013-10-30 00:57:11 +00:00
|
|
|
if [ -n "$D" ]; then
|
|
|
|
OPT="-r $D"
|
|
|
|
else
|
|
|
|
OPT="-s"
|
|
|
|
fi
|
2013-03-05 11:57:00 +00:00
|
|
|
update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS}
|
|
|
|
fi
|
2013-02-07 22:54:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
updatercd_prerm() {
|
2013-10-30 00:57:11 +00:00
|
|
|
if [ -z "$D" ]; then
|
2013-02-07 22:54:13 +00:00
|
|
|
${INIT_D_DIR}/${INITSCRIPT_NAME} stop
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
updatercd_postrm() {
|
2013-03-28 14:28:41 +00:00
|
|
|
if type update-rc.d >/dev/null 2>/dev/null; then
|
2013-10-30 00:57:11 +00:00
|
|
|
if [ -n "$D" ]; then
|
2015-02-17 02:08:14 +00:00
|
|
|
OPT="-f -r $D"
|
2013-10-30 00:57:11 +00:00
|
|
|
else
|
2015-02-17 02:08:14 +00:00
|
|
|
OPT="-f"
|
2013-10-30 00:57:11 +00:00
|
|
|
fi
|
2013-03-05 11:57:00 +00:00
|
|
|
update-rc.d $OPT ${INITSCRIPT_NAME} remove
|
2013-02-07 22:54:13 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def update_rc_after_parse(d):
|
2015-06-18 14:14:16 +00:00
|
|
|
if d.getVar('INITSCRIPT_PACKAGES', False) == None:
|
|
|
|
if d.getVar('INITSCRIPT_NAME', False) == None:
|
|
|
|
raise bb.build.FuncFailed("%s inherits update-rc.d but doesn't set INITSCRIPT_NAME" % d.getVar('FILE', False))
|
|
|
|
if d.getVar('INITSCRIPT_PARAMS', False) == None:
|
|
|
|
raise bb.build.FuncFailed("%s inherits update-rc.d but doesn't set INITSCRIPT_PARAMS" % d.getVar('FILE', False))
|
2013-02-07 22:54:13 +00:00
|
|
|
|
|
|
|
python __anonymous() {
|
|
|
|
update_rc_after_parse(d)
|
|
|
|
}
|
|
|
|
|
|
|
|
PACKAGESPLITFUNCS_prepend = "populate_packages_updatercd "
|
2014-06-06 00:09:02 +00:00
|
|
|
PACKAGESPLITFUNCS_remove_class-nativesdk = "populate_packages_updatercd "
|
2013-02-07 22:54:13 +00:00
|
|
|
|
2013-10-30 00:57:11 +00:00
|
|
|
populate_packages_updatercd[vardeps] += "updatercd_prerm updatercd_postrm updatercd_preinst updatercd_postinst"
|
2014-09-23 19:00:31 +00:00
|
|
|
populate_packages_updatercd[vardepsexclude] += "OVERRIDES"
|
2013-10-04 11:29:08 +00:00
|
|
|
|
2013-02-07 22:54:13 +00:00
|
|
|
python populate_packages_updatercd () {
|
2014-01-23 12:12:35 +00:00
|
|
|
def update_rcd_auto_depend(pkg):
|
|
|
|
import subprocess
|
|
|
|
import os
|
|
|
|
path = d.expand("${D}${INIT_D_DIR}/${INITSCRIPT_NAME}")
|
|
|
|
if not os.path.exists(path):
|
|
|
|
return
|
|
|
|
statement = "grep -q -w '/etc/init.d/functions' %s" % path
|
|
|
|
if subprocess.call(statement, shell=True) == 0:
|
2014-05-09 00:39:22 +00:00
|
|
|
mlprefix = d.getVar('MLPREFIX', True) or ""
|
|
|
|
d.appendVar('RDEPENDS_' + pkg, ' %sinitscripts-functions' % (mlprefix))
|
2014-01-23 12:12:35 +00:00
|
|
|
|
2013-02-07 22:54:13 +00:00
|
|
|
def update_rcd_package(pkg):
|
2013-10-30 00:57:11 +00:00
|
|
|
bb.debug(1, 'adding update-rc.d calls to preinst/postinst/prerm/postrm for %s' % pkg)
|
2013-04-10 10:21:33 +00:00
|
|
|
|
|
|
|
localdata = bb.data.createCopy(d)
|
|
|
|
overrides = localdata.getVar("OVERRIDES", True)
|
|
|
|
localdata.setVar("OVERRIDES", "%s:%s" % (pkg, overrides))
|
|
|
|
bb.data.update_data(localdata)
|
|
|
|
|
2014-01-23 12:12:35 +00:00
|
|
|
update_rcd_auto_depend(pkg)
|
|
|
|
|
2013-10-30 00:57:11 +00:00
|
|
|
preinst = d.getVar('pkg_preinst_%s' % pkg, True)
|
|
|
|
if not preinst:
|
|
|
|
preinst = '#!/bin/sh\n'
|
|
|
|
preinst += localdata.getVar('updatercd_preinst', True)
|
|
|
|
d.setVar('pkg_preinst_%s' % pkg, preinst)
|
|
|
|
|
2013-02-03 22:10:21 +00:00
|
|
|
postinst = d.getVar('pkg_postinst_%s' % pkg, True)
|
2013-02-07 22:54:13 +00:00
|
|
|
if not postinst:
|
|
|
|
postinst = '#!/bin/sh\n'
|
2013-04-10 10:21:33 +00:00
|
|
|
postinst += localdata.getVar('updatercd_postinst', True)
|
2013-02-07 22:54:13 +00:00
|
|
|
d.setVar('pkg_postinst_%s' % pkg, postinst)
|
|
|
|
|
2013-02-03 22:10:21 +00:00
|
|
|
prerm = d.getVar('pkg_prerm_%s' % pkg, True)
|
2013-02-07 22:54:13 +00:00
|
|
|
if not prerm:
|
|
|
|
prerm = '#!/bin/sh\n'
|
2013-04-10 10:21:33 +00:00
|
|
|
prerm += localdata.getVar('updatercd_prerm', True)
|
2013-02-07 22:54:13 +00:00
|
|
|
d.setVar('pkg_prerm_%s' % pkg, prerm)
|
|
|
|
|
2013-02-03 22:10:21 +00:00
|
|
|
postrm = d.getVar('pkg_postrm_%s' % pkg, True)
|
2013-02-07 22:54:13 +00:00
|
|
|
if not postrm:
|
|
|
|
postrm = '#!/bin/sh\n'
|
2013-04-10 10:21:33 +00:00
|
|
|
postrm += localdata.getVar('updatercd_postrm', True)
|
2013-02-07 22:54:13 +00:00
|
|
|
d.setVar('pkg_postrm_%s' % pkg, postrm)
|
|
|
|
|
2015-06-10 03:15:37 +00:00
|
|
|
d.appendVar('RRECOMMENDS_' + pkg, " ${MLPREFIX}${UPDATERCD}")
|
2015-05-27 16:28:12 +00:00
|
|
|
|
2013-03-06 15:11:54 +00:00
|
|
|
# Check that this class isn't being inhibited (generally, by
|
|
|
|
# systemd.bbclass) before doing any work.
|
update-rc.d: fix logic in populate_packages_updatercd
The 'and' logic for the check is wrong. To make things clear, please
see the example below.
Say that we have a recipe A, which has a sysv-init style init script named
initA and no corresponding service file. The recipe inherits update-rc.d,
but it doesn't inherit systemd.bbclass. The DISTRO_FEATURES has 'systemd'
inside it, but it doesn't have 'sysvinit'. Now if we build an image, with
the 'and' logic in the check, the symlinks for initA would not be installed
into /etc/rc?.d directory.
This is incorrect. Because there's no corresponding service. The symlinks
in /etc/rc?.d/ should be created so that the service would be correctly
started at boot time.
The logic should really be 'or' in the check. This is actually what the code
was when it was originally written.
Several different situations are listed below to prove the correctness of the
'or' logic.
If 'sysvinit' is in DISTRO_FEATURES, the initA script would always be installed
with corresponding preisnt/postinst generated and added.
If 'sysvinit' is not in DISTRO_FEATURES, we have three situations.
1) A has initA and A.service.
In such situation, systemd.bbclass would set INHIBIT_UPDATERCD_BBCLASS,
so no preinst/postinst about update-rc.d would be added and the symlinks
for initA would not be created.
2) A has initA, and the functionality of initA is not implemented internally
in systemd.
In such situation, symlinks for initA would be installed.
3) A has initA, and the functionality of initA is implemented internally in
systemd or in some other recipe.
Examples for such situation are alsa-state and keymaps in OE.
In such situation, we need to set INHIBIT_UPDATERCD_BBCLASS in the recipe
so that there would be no preinst/postinst scripts about update-rc.d added.
(From OE-Core rev: 6272c81509bbdb5d602056ceaa6f2c02bbf47a41)
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2014-09-03 07:09:01 +00:00
|
|
|
if bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d) or \
|
2013-03-06 15:11:54 +00:00
|
|
|
not d.getVar("INHIBIT_UPDATERCD_BBCLASS", True):
|
2013-02-08 22:43:16 +00:00
|
|
|
pkgs = d.getVar('INITSCRIPT_PACKAGES', True)
|
|
|
|
if pkgs == None:
|
|
|
|
pkgs = d.getVar('UPDATERCPN', True)
|
|
|
|
packages = (d.getVar('PACKAGES', True) or "").split()
|
|
|
|
if not pkgs in packages and packages != []:
|
|
|
|
pkgs = packages[0]
|
|
|
|
for pkg in pkgs.split():
|
|
|
|
update_rcd_package(pkg)
|
2013-02-07 22:54:13 +00:00
|
|
|
}
|