@@ -29,26 +29,32 @@ python __anonymous() {
}
systemd_postinst() {
-if systemctl >/dev/null 2>/dev/null; then
- OPTS=""
-
- if [ -n "$D" ]; then
- OPTS="--root=$D"
+if [ -n "$D" ]; then
+ # Offline/cross-install: apply presets to the target rootfs.
+ # This handles multistrap, debootstrap, and similar tools that
+ # install packages outside of Yocto's normal image creation.
+ if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
+ if systemctl --root=$D preset ${SYSTEMD_SERVICE_ESCAPED} 2>/dev/null; then
+ :
+ elif systemctl >/dev/null 2>/dev/null; then
+ for service in ${SYSTEMD_SERVICE_ESCAPED}; do
+ systemctl --root=$D enable "$service" 2>/dev/null || true
+ done
+ fi
fi
-
+elif systemctl >/dev/null 2>/dev/null; then
+ # Online: running on the target system
if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
for service in ${SYSTEMD_SERVICE_ESCAPED}; do
- systemctl ${OPTS} enable "$service"
+ systemctl enable "$service"
done
fi
- if [ -z "$D" ]; then
- systemctl daemon-reload
- systemctl preset ${SYSTEMD_SERVICE_ESCAPED}
+ systemctl daemon-reload
+ systemctl preset ${SYSTEMD_SERVICE_ESCAPED}
- if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
- systemctl --no-block restart ${SYSTEMD_SERVICE_ESCAPED}
- fi
+ if [ "${SYSTEMD_AUTO_ENABLE}" = "enable" ]; then
+ systemctl --no-block restart ${SYSTEMD_SERVICE_ESCAPED}
fi
fi
}
When packages are installed outside of Yocto's normal image creation (e.g., using multistrap, debootstrap, or dpkg directly on a host), the postinst script fails to enable systemd services. The issue is that the entire enable logic is gated behind "if systemctl >/dev/null 2>/dev/null". In cross-install scenarios: - If systemctl is absent on the host: the check fails, script is skipped - If host systemctl is present: it cannot find target unit files Fix this by separating the offline ($D set) and online ($D unset) code paths into distinct branches. The previous code used a single OPTS variable to switch between "--root=$D" (offline) and "" (online) within one unified block. This variable is removed because the two scenarios now have dedicated branches with different logic: - Offline ($D set): Tries "systemctl --root=$D preset" first, which reads preset files from the target rootfs and creates symlinks without needing the host systemctl to understand the target's unit files. Falls back to "systemctl --root=$D enable" per service. - Online ($D unset): Same as before - enable, daemon-reload, preset, restart. No behavioral change for on-target installs. The OPTS variable is no longer needed because each branch now directly uses the appropriate systemctl invocation for its context, making the intent clearer and the offline path functional. Fixes [YOCTO #14118] Signed-off-by: Himani Ramesh Barde <HimaniRamesh.Barde@windriver.com> --- meta/classes-recipe/systemd.bbclass | 32 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-)