1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
DEPENDS_append = " systemd-systemctl-native"
systemd_unitdir = "${base_libdir}/systemd"
systemd_postinst() {
OPTS=""
if [ -n "$D" ]; then
OPTS="--root=$D"
fi
systemctl $OPTS enable ${SYSTEMD_SERVICE}
if [ -z "$D" ]; then
systemctl start ${SYSTEMD_SERVICE}
fi
}
systemd_prerm() {
if [ -z "$D" ]; then
systemctl stop ${SYSTEMD_SERVICE}
fi
}
systemd_postrm() {
systemctl disable ${SYSTEMD_SERVICE}
}
def systemd_after_parse(d):
def systemd_check_vars():
bpn = d.getVar('BPN', 1)
# not for native / only at parse time
if d.getVar('BB_WORKERCONTEXT', True) is None and \
bpn + "-native" != d.getVar('PN', 1) and \
bpn + "-cross" != d.getVar('PN', 1) and \
bpn + "-nativesdk" != d.getVar('PN', 1):
bb_filename = d.getVar('FILE')
packages = d.getVar('PACKAGES', 1)
# check SYSTEMD_PACKAGES
systemd_pkgs = d.getVar('SYSTEMD_PACKAGES', 1) or ""
if systemd_pkgs == "":
raise bb.build.FuncFailed, "\n\n%s inherits systemd but doesn't set SYSTEMD_PACKAGES" % bb_filename
for pkg_systemd in systemd_pkgs.split():
if pkg_systemd.find("-systemd") == -1:
if pkg_systemd != d.getVar('PN', 1):
raise bb.build.FuncFailed, \
"\n\n%s: %s in SYSTEMD_PACKAGES does not match <existing-package>-systemd or ${PN} (deprecated)" % \
(bb_filename, pkg_systemd)
else:
bb.warn("%s: it is recommended to set SYSTEMD_PACKAGES as <existing-package>-systemd" % bb_filename)
else:
pkg_systemd_base = pkg_systemd.replace('-systemd', '')
if pkg_systemd_base not in packages:
raise bb.build.FuncFailed, \
"\n\n%s: %s in SYSTEMD_PACKAGES does not match <existing-package>-systemd or ${PN} (deprecated)" % \
( bb_filename, pkg_systemd)
# check SYSTEMD_SERVICE
for pkg_systemd in systemd_pkgs.split():
service_pkg = 'SYSTEMD_SERVICE' + "_" + pkg_systemd
systemd_services = d.getVar(service_pkg, 1) or d.getVar('SYSTEMD_SERVICE', 1) or ""
if systemd_services == "":
raise bb.build.FuncFailed, "\n\n%s inherits systemd but doesn't set SYSTEMD_SERVICE / %s" % (bb_filename, service_pkg)
# prepend systemd-packages not already included
def systemd_create_package(pkg_systemd):
packages = d.getVar('PACKAGES', 1)
if not pkg_systemd in packages:
packages = "%s %s" % (pkg_systemd, packages)
d.setVar('PACKAGES', packages)
systemd_check_vars()
for pkg_systemd in d.getVar('SYSTEMD_PACKAGES', 1).split():
systemd_create_package(pkg_systemd)
python __anonymous() {
systemd_after_parse(d)
}
# automatically install all *.service and *.socket supplied in recipe's SRC_URI
do_install_append() {
install -d ${D}${systemd_unitdir}/system
for service in `find ${WORKDIR} -maxdepth 1 -name '*.service' -o -name '*.socket'` ; do
# ensure installing systemd-files only (e.g not avahi *.service)
if grep -q '\[Unit\]' $service ; then
install -m 644 $service ${D}${systemd_unitdir}/system
fi
done
}
python populate_packages_prepend () {
def systemd_generate_package_scripts(pkg):
bb.debug(1, 'adding systemd calls to postinst/postrm for %s' % pkg)
localdata = bb.data.createCopy(d)
overrides = bb.data.getVar("OVERRIDES", localdata, 1)
bb.data.setVar("OVERRIDES", "%s:%s" % (pkg, overrides), localdata)
bb.data.update_data(localdata)
"""
systemd postinst is appended here because pkg_postinst may require to
execute on the target. Not doing so may cause systemd postinst invoked
twice to cause unwanted warnings.
"""
postinst = bb.data.getVar('pkg_postinst', localdata, 1)
if not postinst:
postinst = '#!/bin/sh\n'
postinst += bb.data.getVar('systemd_postinst', localdata, 1)
bb.data.setVar('pkg_postinst_%s' % pkg, postinst, d)
prerm = bb.data.getVar('pkg_prerm', localdata, 1)
if not prerm:
prerm = '#!/bin/sh\n'
prerm += bb.data.getVar('systemd_prerm', localdata, 1)
bb.data.setVar('pkg_prerm_%s' % pkg, prerm, d)
postrm = bb.data.getVar('pkg_postrm', localdata, 1)
if not postrm:
postrm = '#!/bin/sh\n'
postrm += bb.data.getVar('systemd_postrm', localdata, 1)
bb.data.setVar('pkg_postrm_%s' % pkg, postrm, d)
rdepends = explode_deps(bb.data.getVar('RDEPENDS_' + pkg, d, 0) or bb.data.getVar('RDEPENDS', d, 0) or "")
rdepends.append("systemd")
bb.data.setVar('RDEPENDS_' + pkg, " " + " ".join(rdepends), d)
# run all modifications once when creating package
if os.path.exists('${D}'):
for pkg_systemd in d.getVar('SYSTEMD_PACKAGES', 1).split():
systemd_generate_package_scripts(pkg_systemd)
}
|