Bitbake 服务文件组织

Bitbake service file organization

我创建并运行了一个服务。但是,我当前的 bitbake 文件使我的文件夹结构非常难看。为了让它工作,我必须将所有配置文件放在我的 src 文件夹中。我想要两个文件夹,srcconfigfiles。 如果我的树如下

如何编辑我的 bb 文件以拉入我的 src 目录和我的 configfiles

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://src"

S = "${WORKDIR}/src"
CF = "${WORKDIR}/configfiles"

inherit systemd autotools
SYSTEMD_SERVICE_${PN} = "helloworld.service"
do_install_append () {
echo "look at this PN ${PN}"
echo "look at this D ${D}"
echo "look at this S ${S}"
echo "look at this CF ${CF}"
    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${CF}/helloworld.service ${D}${systemd_system_unitdir}
    sed -i -e 's,@BINDIR@,${bindir},g' ${D}${systemd_system_unitdir}/helloworld.service
}

更新一: 我添加了一个 CF 变量。使用 bitbake -e helloworld > log.txt 我可以回显变量的值并注意到我们没有指向配置文件。

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://src"

S = "${WORKDIR}/src"
CF = "${WORKDIR}/configfiles"

inherit systemd autotools
SYSTEMD_SERVICE_${PN} = "helloworld.service"
do_install_append () {
echo "look at this PN ${PN}"
echo "look at this D ${D}"
echo "look at this S ${S}"
echo "look at this CF ${CF}"
    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${CF}/helloworld.service ${D}${systemd_system_unitdir}
    sed -i -e 's,@BINDIR@,${bindir},g' ${D}${systemd_system_unitdir}/helloworld.service
}

Bitbake 仍然找不到我的 makefile。

更新 2: 给出的解决方案有效,但我还有一个问题。 我的 makefile 非常基础:

ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = foreign

SUBDIRS = app

CFLAGS = -Wall -pedantic
include_HEADERS = helloworld.h

bin_PROGRAMS = helloworld
helloworld_SOURCES = helloworld.c

我想按文件夹分隔我的文件。我希望我的主应用程序位于文件夹 /src/app 中。我编辑了我的 makefile 以指向 app/helloworld.happ/helloworld.c 但是这找不到文件。我更新的 bb 文件如下

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

FILESEXTRAPATHS:prepend := "${THISDIR}/files/src:${THISDIR}/files/src/app:${THISDIR}/files/services:"

SRC_URI = "file://src \
       file://src/app \
       "

SRC_URI += "file://helloworld.service \
    file://autogen.sh \
    file://configure.ac \
    file://Makefile.am"

S = "${WORKDIR}/src"

inherit systemd autotools
SYSTEMD_SERVICE_${PN} = "helloworld.service"
do_install_append () {
    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${WORKDIR}/helloworld.service ${D}${systemd_system_unitdir}
    sed -i -e 's,@BINDIR@,${bindir},g' ${D}${systemd_system_unitdir}/helloworld.service
}

我知道 makefile 应该与代码一起打包,这在创建较大的应用程序时不起作用。

你需要让 bitbake 知道在哪里寻找文件,听起来你想将 Makefile 保存在一个单独的目录中,但在大多数情况下 Makefile 应该与源文件一起,请随意尝试, 这个概念仍然和下面解释的一样。

无论哪种方式,您的目录结构都应如下所示:

recipes-core/
  helloworld/
    helloworld_0.1.bb
    files/
      configfiles/
        helloworld.service
      src/
        autogen.sh
        configure.ac
        helloworld.c
        helloworld.h
        Makefile.am

为了让 bitbake 知道在哪里提取文件,您可以使用 FILESESXTRAPATHS 变量 [1]:

FILESEXTRAPATHS:prepend := "${THISDIR}/files/src:${THISDIR}/files/configfiles:"

此时 bitbake 知道从哪里提取文件,但不知道要提取哪些文件,为此您使用 SRC_URI 变量(特别是 file:// fetcher)[2 ]:

SRC_URI += "file://helloworld.service \
    file://autogen.sh \
    file://configure.ac \
    file://helloworld.c \
    file://helloworld.h \
    file://Makefile.am"

这假定您的 Makefile 将尝试在同一目录中查找文件。

你的其余部分没问题,不再需要 CF 变量,你只需要更改安装服务文件的位置,因为 SRC_URI[1] 会将它拉到${WORKDIR}:

install -m 0644 ${WORKDIR}/helloworld.service ${D}${systemd_system_unitdir}

[1] https://docs.yoctoproject.org/singleindex.html#term-FILESEXTRAPATHS

[2] https://docs.yoctoproject.org/bitbake/singleindex.html#term-SRC_URI