Search code examples
linuxembedded-linuxyoctosystemdopenembedded

Yocto do_package: Didn't find service unit specified in SYSTEMD_SERVICE_


Description

I want to install a service into my image, but it is failing with following errors

ERROR: mypackage-git-r0 do_package: Didn't find service unit 'mypackage.service', specified in SYSTEMD_SERVICE_mypackage. 
ERROR: Logfile of failure stored in: <build-location>/poky/build/tmp/work/cortexa53-poky-linux/mypackage/git-r0/temp/log.do_package.7924
ERROR: Task (<layer-location>/meta-mypackage-oe/recipes-mypackage/mypackage/mypackage_git.bb:do_package) failed with exit code '1'

Recipe

Python sources are cloned from git, now I want to create a service to run at boot. Here is the recipe

SUMMARY = " "
DESCRIPTION = " "
HOMEPAGE = " todo "
LICENSE = "CLOSED"
SRC_URI += "<URL>"

SRC_URI += "file://mypackage.service"

SRCREV   = "<srcrev>"
S        = "${WORKDIR}/git"


inherit setuptools3 systemd

RDEPENDS_${PN} = " \
    ${PYTHON_PN}-pyserial \
    ${PYTHON_PN}-pyusb \
    ${PYTHON_PN}-terminal \
"
SYSTEMD_PACKAGES = "${PN}"

do_install_append () {
    install -d ${D}${system_unitdir}
    install -m 0755 ${WORKDIR}/mypackage.service ${D}{system_unitdir}
}

SYSTEMD_SERVICE_${PN} = "mypackage.service"

FILES_${PN} += "${system_unitdir}/mypackage.service"

Recipe structure

recipes-mypackage/mypackage/
├── mypackage
│   └── mypackage.service
└── mypackage_git.bb

1 directory, 2 files

Service file

NOTE: mypackage has feature to run as daemon using -d option

[Unit]
Description=mypackage service

[Service]
Type=simple
ExecStart=/usr/bin/mypackage -d

[Install]
WantedBy=multi-user.target

Build configurations

Image recipe inherits core-image-base and contains

IMAGE_FEATURES += "package-management"
PACKAGE_CLASSES ?= "rpm deb package_deb"
DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager += "systemd"
inherit extrausers

local.conf contents

MACHINE = "raspberrypi3-64"
ENABLE_UART = "1"
RPI_USE_U_BOOT = "1"
GPU_FREQ = "250"

I might have messed up a lot of things in the recipe, so need some pointer to clean up the recipe as well as resolve the issue.

Thanks.


Solution

  • Replace system_unitdir by systemd_system_unitdir.

    SYSTEMD_PACKAGES already contains ${PN} so you can ignore it, same for FILES_${PN} += "${systemd_system_unitdir}/mypackage.service" as if systemd.bbclass finds your unit, it'll be added to the appropriate FILES_ automatically.

    c.f. https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/classes/systemd.bbclass#n4 https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/classes/systemd.bbclass#n109 https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/classes/systemd.bbclass#n148

    And for completeness, thanks to @Jussi Kukkonen for the comment, missing $ sign before {systemd_system_unitdir}.