aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/classes/systemd.bbclass
blob: e13f09dc3e9fce14c4e55213bc8c5573bb1b4c9f (plain)
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)
}