diff mbox series

[v2,2/3] dbus: use the systemd class to handle the unit files

Message ID 20250804195427.153551-2-ross.burton@arm.com
State New
Headers show
Series [v2,1/3] dbus: glib is only used in the test suite | expand

Commit Message

Ross Burton Aug. 4, 2025, 7:54 p.m. UTC
Originally, the dbus recipe couldn't use the systemd class because there
was a circular dependency between systemd and dbus.

However, since systemd v209 in 2014[1] systemd hasn't needed libdbus, as
it has it's own implementation of the client library. DBus does not use
the systemd libraries, so there is no circular dependency.

The dbus build was already was installing the service and socket files,
so we are installing them again. Remove the installation of the units.

Manually mask dbus-1.service by simply creating a symlink, instead of
depending on systemctl and using an postinstall script.

Signed-off-by: Ross Burton <ross.burton@arm.com>

[1] dbus: 718db96199 ("core: convert PID 1 to libsystemd-bus")
---
 meta/recipes-core/dbus/dbus_1.16.2.bb | 30 ++++++---------------------
 1 file changed, 6 insertions(+), 24 deletions(-)

Comments

Mathieu Dubois-Briand Aug. 5, 2025, 8:58 a.m. UTC | #1
On Mon Aug 4, 2025 at 9:54 PM CEST, Ross Burton via lists.openembedded.org wrote:
> Originally, the dbus recipe couldn't use the systemd class because there
> was a circular dependency between systemd and dbus.
>
> However, since systemd v209 in 2014[1] systemd hasn't needed libdbus, as
> it has it's own implementation of the client library. DBus does not use
> the systemd libraries, so there is no circular dependency.
>
> The dbus build was already was installing the service and socket files,
> so we are installing them again. Remove the installation of the units.
>
> Manually mask dbus-1.service by simply creating a symlink, instead of
> depending on systemctl and using an postinstall script.
>
> Signed-off-by: Ross Burton <ross.burton@arm.com>
>
> [1] dbus: 718db96199 ("core: convert PID 1 to libsystemd-bus")
> ---

Hi Ross,

I suspect this patch is the source of this error:

ERROR: dbus-1.16.2-r0 do_install: Execution of '/srv/pokybuild/yocto-worker/musl-qemux86-64/build/build/tmp/work/core2-64-poky-linux-musl/dbus/1.16.2/temp/run.do_install.976229' failed with exit code 1
...
| ln: failed to create symbolic link '/srv/pokybuild/yocto-worker/musl-qemux86-64/build/build/tmp/work/core2-64-poky-linux-musl/dbus/1.16.2/image/lib/systemd/system/dbus-1.service': No such file or directory

https://autobuilder.yoctoproject.org/valkyrie/#/builders/3/builds/2216
https://autobuilder.yoctoproject.org/valkyrie/#/builders/2/builds/2177
https://autobuilder.yoctoproject.org/valkyrie/#/builders/11/builds/2139

Can you have a look, please?
diff mbox series

Patch

diff --git a/meta/recipes-core/dbus/dbus_1.16.2.bb b/meta/recipes-core/dbus/dbus_1.16.2.bb
index 1876ea8a944..9f2c500e1fc 100644
--- a/meta/recipes-core/dbus/dbus_1.16.2.bb
+++ b/meta/recipes-core/dbus/dbus_1.16.2.bb
@@ -46,16 +46,11 @@  DEPENDS = "expat virtual/libintl"
 RDEPENDS:${PN} += "${PN}-common ${PN}-tools"
 RDEPENDS:${PN}:class-native = ""
 
-inherit useradd update-rc.d
+inherit systemd useradd update-rc.d
 
 INITSCRIPT_NAME = "dbus-1"
 INITSCRIPT_PARAMS = "start 02 5 3 2 . stop 20 0 1 6 ."
 
-python __anonymous() {
-    if not bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
-        d.setVar("INHIBIT_UPDATERCD_BBCLASS", "1")
-}
-
 PACKAGES =+ "${PN}-lib ${PN}-common ${PN}-tools"
 
 USERADD_PACKAGES = "dbus-common"
@@ -103,16 +98,7 @@  FILES:${PN}-dev += "${libdir}/dbus-1.0/include ${bindir}/dbus-test-tool ${datadi
 
 RDEPENDS:${PN}-ptest += "bash make dbus"
 
-PACKAGE_WRITE_DEPS += "${@bb.utils.contains('DISTRO_FEATURES','systemd sysvinit','systemd-systemctl-native','',d)}"
 pkg_postinst:dbus() {
-	# If both systemd and sysvinit are enabled, mask the dbus-1 init script
-        if ${@bb.utils.contains('DISTRO_FEATURES','systemd sysvinit','true','false',d)}; then
-		if [ -n "$D" ]; then
-			OPTS="--root=$D"
-		fi
-		systemctl $OPTS mask dbus-1.service
-	fi
-
 	if [ -z "$D" ] && [ -e /etc/init.d/populate-volatile.sh ] ; then
 		/etc/init.d/populate-volatile.sh update
 	fi
@@ -134,22 +120,18 @@  do_install:append:class-target() {
 		install -d ${D}${sysconfdir}/init.d
 		sed 's:@bindir@:${bindir}:' < ${UNPACKDIR}/dbus-1.init > ${S}/dbus-1.init.sh
 		install -m 0755 ${S}/dbus-1.init.sh ${D}${sysconfdir}/init.d/dbus-1
+
 		install -d ${D}${sysconfdir}/default/volatiles
 		echo "d messagebus messagebus 0755 /run/dbus none" \
 		     > ${D}${sysconfdir}/default/volatiles/99_dbus
 	fi
 
-	if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
-		for i in dbus.target.wants sockets.target.wants multi-user.target.wants; do \
-			install -d ${D}${systemd_system_unitdir}/$i; done
-		install -m 0644 ${B}/bus/dbus.service ${B}/bus/dbus.socket ${D}${systemd_system_unitdir}/
-		ln -fs ../dbus.socket ${D}${systemd_system_unitdir}/dbus.target.wants/dbus.socket
-		ln -fs ../dbus.socket ${D}${systemd_system_unitdir}/sockets.target.wants/dbus.socket
-		ln -fs ../dbus.service ${D}${systemd_system_unitdir}/multi-user.target.wants/dbus.service
-	fi
+	# symlink dbus-1.service to /dev/null to "mask" the service, This ensures
+	# that if systemd and sysv init systems are both enabled, systemd doesn't
+	# start two system buses (one from init.d/dbus-1, one from dbus.service).
+	ln -s /dev/null ${D}${systemd_system_unitdir}/dbus-1.service
 
 	mkdir -p ${D}${localstatedir}/lib/dbus
-
 	chown messagebus:messagebus ${D}${localstatedir}/lib/dbus
 
 	if [ "${@bb.utils.contains('PACKAGECONFIG', 'traditional-activation', '1', '0', d)}" = "1" ]