Bitbake 服务文件组织
Bitbake service file organization
我创建并运行了一个服务。但是,我当前的 bitbake 文件使我的文件夹结构非常难看。为了让它工作,我必须将所有配置文件放在我的 src
文件夹中。我想要两个文件夹,src
和 configfiles
。
如果我的树如下
如何编辑我的 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.h
和 app/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
我创建并运行了一个服务。但是,我当前的 bitbake 文件使我的文件夹结构非常难看。为了让它工作,我必须将所有配置文件放在我的 src
文件夹中。我想要两个文件夹,src
和 configfiles
。
如果我的树如下
如何编辑我的 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.h
和 app/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