meta-app-framework: start agl-compositor in a systemd user session 75/26975/4
authorArnaud Ferraris <arnaud.ferraris@collabora.com>
Tue, 7 Dec 2021 17:31:45 +0000 (18:31 +0100)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Fri, 17 Dec 2021 21:15:26 +0000 (21:15 +0000)
`weston-init` installs a system service for starting the compositor. As
we want it to run as a user service, this patch replaces this package
with `agl-compositor-init`. This involves:
- resetting RDEPENDS from `weston-ini-conf` so it doesn't pull in
  `weston-init` anymore
- making `agl-compositor-init` RCONFLICT with `weston-init` as it's
  still a RRECOMMENDS to `weston`

`agl-compositor-init` installs a systemd user service and socket, and
ensures agl-compositor is automatically started with the user session,
so the compositor is automatically started on boot. It also adds a
config fragment for the `agl-session@agl-driver` service (instance of
`agl-session` for user `agl-driver`) for properly configuring the TTY to
use for display.

Bug-AGL: SPEC-4161
Signed-off-by: Arnaud Ferraris <arnaud.ferraris@collabora.com>
Change-Id: Ifb10a206cfa97c147283bc78c46f7f09209a9591
Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/26975
Tested-by: Jenkins Job builder account
ci-image-build: Jenkins Job builder account
Reviewed-by: Scott Murray <scott.murray@konsulko.com>
Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
ci-image-boot-test: Jenkins Job builder account

meta-app-framework/recipes-graphics/wayland/agl-compositor-init.bbappend [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.conf [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.service.in [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.socket [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/agl-compositor-init_agl-app-fw.inc [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/weston-ini-conf.bbappend [new file with mode: 0644]
meta-app-framework/recipes-graphics/wayland/weston-ini-conf_agl-app-fw.inc [new file with mode: 0644]

diff --git a/meta-app-framework/recipes-graphics/wayland/agl-compositor-init.bbappend b/meta-app-framework/recipes-graphics/wayland/agl-compositor-init.bbappend
new file mode 100644 (file)
index 0000000..70cbaab
--- /dev/null
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agl-app-fw', 'agl-compositor-init_agl-app-fw.inc', '', d)}
diff --git a/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.conf b/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.conf
new file mode 100644 (file)
index 0000000..66778a9
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+ConditionPathExists=/dev/tty7
+
+[Service]
+Environment=XDG_SESSION_TYPE=wayland
+TTYPath=/dev/tty7
+TTYReset=yes
+TTYVHangup=yes
+TTYVTDisallocate=yes
+UtmpIdentifier=tty7
+UtmpMode=user
diff --git a/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.service.in b/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.service.in
new file mode 100644 (file)
index 0000000..2d01951
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# Weston must be built with systemd support, and your weston.ini must load
+# the plugin systemd-notify.so.
+
+[Unit]
+Description=agl-compositor, a Wayland compositor, as a systemd user service
+Documentation=https://docs.automotivelinux.org/en/master/#5_Component_Documentation/1_agl-compositor/
+
+# Activate using a systemd socket
+Requires=agl-compositor.socket
+After=agl-compositor.socket
+
+# Since we are part of the agl session, make sure we are started before
+# it is complete.
+Before=agl-session.target
+
+[Service]
+Type=notify
+ExecStart=/usr/bin/agl-compositor @AGL_COMPOSITOR_ARGS@
+
+TimeoutStartSec=60
+WatchdogSec=20
+
+StandardOutput=journal
+StandardError=journal
+
+[Install]
+WantedBy=agl-session.target
diff --git a/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.socket b/meta-app-framework/recipes-graphics/wayland/agl-compositor-init/agl-compositor.socket
new file mode 100644 (file)
index 0000000..ef9769f
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Weston must be built with systemd support, and your weston.ini must load
+# the plugin systemd-notify.so.
+
+[Unit]
+Description=agl-compositor, a Wayland compositor, as a systemd user service
+Documentation=https://docs.automotivelinux.org/en/master/#5_Component_Documentation/1_agl-compositor/
+
+[Socket]
+ListenStream=%t/wayland-0
diff --git a/meta-app-framework/recipes-graphics/wayland/agl-compositor-init_agl-app-fw.inc b/meta-app-framework/recipes-graphics/wayland/agl-compositor-init_agl-app-fw.inc
new file mode 100644 (file)
index 0000000..eef88a6
--- /dev/null
@@ -0,0 +1,46 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/agl-compositor-init:"
+
+SRC_URI = " \
+    file://agl-compositor.conf \
+    file://agl-compositor.service.in \
+    file://agl-compositor.socket \
+    "
+
+# Reset systemd services list
+SYSTEMD_SERVICE:${PN} = ""
+
+do_install() {
+    # Process ".in" files
+    files=agl-compositor.service.in
+    for f in ${files}; do
+        g=${f%.in}
+        if [ "${f}" != "${g}" ]; then
+            sed -e "s,@AGL_COMPOSITOR_ARGS@,${AGL_COMPOSITOR_ARGS},g" \
+                ${WORKDIR}/${f} > ${WORKDIR}/${g}
+        fi
+    done
+
+    install -d ${D}${systemd_system_unitdir}/agl-session@agl-driver.service.d
+    install -m 0644 ${WORKDIR}/agl-compositor.conf \
+        ${D}${systemd_system_unitdir}/agl-session@agl-driver.service.d/agl-compositor.conf
+
+    install -D -p -m0644 ${WORKDIR}/agl-compositor.service ${D}${systemd_user_unitdir}/agl-compositor.service
+    install -D -p -m0644 ${WORKDIR}/agl-compositor.socket ${D}${systemd_user_unitdir}/agl-compositor.socket
+
+    # Enable the compositor as part of the user session
+    install -d ${D}${systemd_user_unitdir}/agl-session.target.wants
+    ln -s ../agl-compositor.service ${D}${systemd_user_unitdir}/agl-session.target.wants/agl-compositor.service
+}
+
+FILES:${PN} = "\
+    ${systemd_system_unitdir} \
+    ${systemd_user_unitdir} \
+"
+
+RDEPENDS:${PN} = " \
+    agl-compositor \
+    agl-session \
+    weston-ini-conf \
+"
+
+RCONFLICTS:${PN} = "weston-init"
diff --git a/meta-app-framework/recipes-graphics/wayland/weston-ini-conf.bbappend b/meta-app-framework/recipes-graphics/wayland/weston-ini-conf.bbappend
new file mode 100644 (file)
index 0000000..699275f
--- /dev/null
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agl-app-fw', 'weston-ini-conf_agl-app-fw.inc', '', d)}
diff --git a/meta-app-framework/recipes-graphics/wayland/weston-ini-conf_agl-app-fw.inc b/meta-app-framework/recipes-graphics/wayland/weston-ini-conf_agl-app-fw.inc
new file mode 100644 (file)
index 0000000..25213a9
--- /dev/null
@@ -0,0 +1,3 @@
+RDEPENDS:${PN} = ""
+RDEPENDS:${PN}-landscape = ""
+RDEPENDS:${PN}-landscape-inverted = ""