xref: /OK3568_Linux_fs/yocto/poky/meta/classes/update-rc.d.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunUPDATERCPN ?= "${PN}"
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunDEPENDS:append:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', ' update-rc.d initscripts', '', d)}"
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunUPDATERCD = "update-rc.d"
6*4882a593SmuzhiyunUPDATERCD:class-cross = ""
7*4882a593SmuzhiyunUPDATERCD:class-native = ""
8*4882a593SmuzhiyunUPDATERCD:class-nativesdk = ""
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunINITSCRIPT_PARAMS ?= "defaults"
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunINIT_D_DIR = "${sysconfdir}/init.d"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyundef use_updatercd(d):
15*4882a593Smuzhiyun    # If the distro supports both sysvinit and systemd, and the current recipe
16*4882a593Smuzhiyun    # supports systemd, only call update-rc.d on rootfs creation or if systemd
17*4882a593Smuzhiyun    # is not running. That's because systemctl enable/disable will already call
18*4882a593Smuzhiyun    # update-rc.d if it detects initscripts.
19*4882a593Smuzhiyun    if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d) and bb.data.inherits_class('systemd', d):
20*4882a593Smuzhiyun        return '[ -n "$D" -o ! -d /run/systemd/system ]'
21*4882a593Smuzhiyun    return 'true'
22*4882a593Smuzhiyun
23*4882a593SmuzhiyunPACKAGE_WRITE_DEPS += "update-rc.d-native"
24*4882a593Smuzhiyun
25*4882a593Smuzhiyunupdatercd_postinst() {
26*4882a593Smuzhiyunif ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then
27*4882a593Smuzhiyun	if [ -n "$D" ]; then
28*4882a593Smuzhiyun		OPT="-r $D"
29*4882a593Smuzhiyun	else
30*4882a593Smuzhiyun		OPT="-s"
31*4882a593Smuzhiyun	fi
32*4882a593Smuzhiyun	update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS}
33*4882a593Smuzhiyunfi
34*4882a593Smuzhiyun}
35*4882a593Smuzhiyun
36*4882a593Smuzhiyunupdatercd_prerm() {
37*4882a593Smuzhiyunif ${@use_updatercd(d)} && [ -z "$D" -a -x "${INIT_D_DIR}/${INITSCRIPT_NAME}" ]; then
38*4882a593Smuzhiyun	${INIT_D_DIR}/${INITSCRIPT_NAME} stop || :
39*4882a593Smuzhiyunfi
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun
42*4882a593Smuzhiyunupdatercd_postrm() {
43*4882a593Smuzhiyunif ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then
44*4882a593Smuzhiyun	if [ -n "$D" ]; then
45*4882a593Smuzhiyun		OPT="-f -r $D"
46*4882a593Smuzhiyun	else
47*4882a593Smuzhiyun		OPT="-f"
48*4882a593Smuzhiyun	fi
49*4882a593Smuzhiyun	update-rc.d $OPT ${INITSCRIPT_NAME} remove
50*4882a593Smuzhiyunfi
51*4882a593Smuzhiyun}
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun
54*4882a593Smuzhiyundef update_rc_after_parse(d):
55*4882a593Smuzhiyun    if d.getVar('INITSCRIPT_PACKAGES', False) == None:
56*4882a593Smuzhiyun        if d.getVar('INITSCRIPT_NAME', False) == None:
57*4882a593Smuzhiyun            bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_NAME" % d.getVar('FILE', False))
58*4882a593Smuzhiyun        if d.getVar('INITSCRIPT_PARAMS', False) == None:
59*4882a593Smuzhiyun            bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_PARAMS" % d.getVar('FILE', False))
60*4882a593Smuzhiyun
61*4882a593Smuzhiyunpython __anonymous() {
62*4882a593Smuzhiyun    update_rc_after_parse(d)
63*4882a593Smuzhiyun}
64*4882a593Smuzhiyun
65*4882a593SmuzhiyunPACKAGESPLITFUNCS:prepend = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'populate_packages_updatercd ', '', d)}"
66*4882a593SmuzhiyunPACKAGESPLITFUNCS:remove:class-nativesdk = "populate_packages_updatercd "
67*4882a593Smuzhiyun
68*4882a593Smuzhiyunpopulate_packages_updatercd[vardeps] += "updatercd_prerm updatercd_postrm updatercd_postinst"
69*4882a593Smuzhiyunpopulate_packages_updatercd[vardepsexclude] += "OVERRIDES"
70*4882a593Smuzhiyun
71*4882a593Smuzhiyunpython populate_packages_updatercd () {
72*4882a593Smuzhiyun    def update_rcd_auto_depend(pkg):
73*4882a593Smuzhiyun        import subprocess
74*4882a593Smuzhiyun        import os
75*4882a593Smuzhiyun        path = d.expand("${D}${INIT_D_DIR}/${INITSCRIPT_NAME}")
76*4882a593Smuzhiyun        if not os.path.exists(path):
77*4882a593Smuzhiyun            return
78*4882a593Smuzhiyun        statement = "grep -q -w '/etc/init.d/functions' %s" % path
79*4882a593Smuzhiyun        if subprocess.call(statement, shell=True) == 0:
80*4882a593Smuzhiyun            mlprefix = d.getVar('MLPREFIX') or ""
81*4882a593Smuzhiyun            d.appendVar('RDEPENDS:' + pkg, ' %sinitd-functions' % (mlprefix))
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun    def update_rcd_package(pkg):
84*4882a593Smuzhiyun        bb.debug(1, 'adding update-rc.d calls to postinst/prerm/postrm for %s' % pkg)
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun        localdata = bb.data.createCopy(d)
87*4882a593Smuzhiyun        overrides = localdata.getVar("OVERRIDES")
88*4882a593Smuzhiyun        localdata.setVar("OVERRIDES", "%s:%s" % (pkg, overrides))
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun        update_rcd_auto_depend(pkg)
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun        postinst = d.getVar('pkg_postinst:%s' % pkg)
93*4882a593Smuzhiyun        if not postinst:
94*4882a593Smuzhiyun            postinst = '#!/bin/sh\n'
95*4882a593Smuzhiyun        postinst += localdata.getVar('updatercd_postinst')
96*4882a593Smuzhiyun        d.setVar('pkg_postinst:%s' % pkg, postinst)
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun        prerm = d.getVar('pkg_prerm:%s' % pkg)
99*4882a593Smuzhiyun        if not prerm:
100*4882a593Smuzhiyun            prerm = '#!/bin/sh\n'
101*4882a593Smuzhiyun        prerm += localdata.getVar('updatercd_prerm')
102*4882a593Smuzhiyun        d.setVar('pkg_prerm:%s' % pkg, prerm)
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun        postrm = d.getVar('pkg_postrm:%s' % pkg)
105*4882a593Smuzhiyun        if not postrm:
106*4882a593Smuzhiyun                postrm = '#!/bin/sh\n'
107*4882a593Smuzhiyun        postrm += localdata.getVar('updatercd_postrm')
108*4882a593Smuzhiyun        d.setVar('pkg_postrm:%s' % pkg, postrm)
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun        d.appendVar('RRECOMMENDS:' + pkg, " ${MLPREFIX}${UPDATERCD}")
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun    # Check that this class isn't being inhibited (generally, by
113*4882a593Smuzhiyun    # systemd.bbclass) before doing any work.
114*4882a593Smuzhiyun    if not d.getVar("INHIBIT_UPDATERCD_BBCLASS"):
115*4882a593Smuzhiyun        pkgs = d.getVar('INITSCRIPT_PACKAGES')
116*4882a593Smuzhiyun        if pkgs == None:
117*4882a593Smuzhiyun            pkgs = d.getVar('UPDATERCPN')
118*4882a593Smuzhiyun            packages = (d.getVar('PACKAGES') or "").split()
119*4882a593Smuzhiyun            if not pkgs in packages and packages != []:
120*4882a593Smuzhiyun                pkgs = packages[0]
121*4882a593Smuzhiyun        for pkg in pkgs.split():
122*4882a593Smuzhiyun            update_rcd_package(pkg)
123*4882a593Smuzhiyun}
124