如何在 yocto 中构建你好世界食谱
How to build hello world recipe in yocto
- C档
int main() {
printf("Hello, World!\n");
return 0;
}
- helloworld.bb
DESCRIPTION = "Recipe created by bitbake-layers"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://${BSPDIR}/poky/build-microchip/my_layer/recipes-example/helloworld/helloworld/helloworld.c"
S = "/home/user/my_dir/poky/build-microchip/conf"
do_compile() {
${CC} helloworld.c -o helloworld
}
do_install() {
install -d ${D}${bindir}
install -m 0755 helloworld ${D}${bindir}
}
- 运行 命令
bitbake helloworld
错误
do_compile() 块中的错误 helloworld.c 找不到文件
- 文件树
build-microchip/my_layer/recipes-examples/
└── helloworld
├── helloworld
│ └── helloworld.c
└── helloworld.bb
2 个目录,2 个文件
您可以将 .c 文件放在食谱的子文件夹中,例如
sources/poky/build-microchip/my_layer/recipes-example
└── helloworld
├── files
│ └── helloworld.c
└── helloworld.bb
并修改配方
SRC_URI = "file://helloworld.c"
当为食谱调用时,Bitbake
有一个默认文件夹列表,可以在其中查找文件,例如files
子目录。
这样菜谱是可移植的,你肯定能找到文件。
在 SRC_URI
.
中有绝对路径是相当不寻常的
对于位于 build-microchip/my_layer/recipes-examples/helloworld/
的名为 helloworld_0.1.bb
的食谱,默认情况下(并按顺序)在以下目录之一中查找 SRC_URI
内容 (FILESPATH
[1]) 为你的食谱:
build-microchip/my_layer/recipes-examples/helloworld/helloworld-0.1
build-microchip/my_layer/recipes-examples/helloworld/helloworld
build-microchip/my_layer/recipes-examples/helloworld/files
因此,您实际上不需要传递任何这些目录名称,Yocto 会自行找到它。您只需将路径 relative 传递给 SRC_URI
到上述路径之一。
如果你想使用食谱当前目录之外的文件,通常 externalsrc
class 必须被继承(这样做通常不是一个好主意)。除了在 bbappends 的情况下,您使用 FILESEXTRAPATHS_prepend := "${THISDIR}/<otherdir>"
将另一个路径添加到列表中,这将 ${THISDIR}/<otherdir>
放在上面列表的第一位。
请注意FILESOVERRIDES
[2]的内容可以再多一层“抽象”。如有疑问,请始终查看食谱 WORKDIR
中的 log.do_fetch,它会为您提供查找文件所遍历的所有路径以及遍历它们的顺序。
SRC_URI = "file://helloworld.c"
应该没问题。
我非常确定 S
没有设置为 Yocto 所期望的。 S
[3] 是 do_unpack
任务后 Yocto 的源目录。它是由 Yocto 设置的临时目录。它通常以 ${WORKDIR}
开头,这是给定配方的临时目录。仅在本地源的情况下,设置 S = "${WORKDIR}"
因为来自 SRC_URI
的本地文件(以 file://
开头的文件)被 fetcher 放入 ${WORKDIR}
中。默认设置为 ${WORKDIR}/<recipename-recipeversion>
.
do_compile
任务在 B
中运行,默认设置为 ${S}
,在配方中设置不正确。这就是找不到您的文件的原因。[4]
TL;DR:
SRC_URI = "file://helloworld.c"
S = "${WORKDIR}"
[1] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-FILESPATH
[2] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-FILESOVERRIDES
[3] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-S
[4]https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#ref-tasks-compile
- C档
int main() {
printf("Hello, World!\n");
return 0;
}
- helloworld.bb
DESCRIPTION = "Recipe created by bitbake-layers"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://${BSPDIR}/poky/build-microchip/my_layer/recipes-example/helloworld/helloworld/helloworld.c"
S = "/home/user/my_dir/poky/build-microchip/conf"
do_compile() {
${CC} helloworld.c -o helloworld
}
do_install() {
install -d ${D}${bindir}
install -m 0755 helloworld ${D}${bindir}
}
- 运行 命令
bitbake helloworld
错误 do_compile() 块中的错误 helloworld.c 找不到文件
- 文件树
build-microchip/my_layer/recipes-examples/
└── helloworld
├── helloworld
│ └── helloworld.c
└── helloworld.bb
2 个目录,2 个文件
您可以将 .c 文件放在食谱的子文件夹中,例如
sources/poky/build-microchip/my_layer/recipes-example
└── helloworld
├── files
│ └── helloworld.c
└── helloworld.bb
并修改配方
SRC_URI = "file://helloworld.c"
当为食谱调用时,Bitbake
有一个默认文件夹列表,可以在其中查找文件,例如files
子目录。
这样菜谱是可移植的,你肯定能找到文件。
在 SRC_URI
.
对于位于 build-microchip/my_layer/recipes-examples/helloworld/
的名为 helloworld_0.1.bb
的食谱,默认情况下(并按顺序)在以下目录之一中查找 SRC_URI
内容 (FILESPATH
[1]) 为你的食谱:
build-microchip/my_layer/recipes-examples/helloworld/helloworld-0.1
build-microchip/my_layer/recipes-examples/helloworld/helloworld
build-microchip/my_layer/recipes-examples/helloworld/files
因此,您实际上不需要传递任何这些目录名称,Yocto 会自行找到它。您只需将路径 relative 传递给 SRC_URI
到上述路径之一。
如果你想使用食谱当前目录之外的文件,通常 externalsrc
class 必须被继承(这样做通常不是一个好主意)。除了在 bbappends 的情况下,您使用 FILESEXTRAPATHS_prepend := "${THISDIR}/<otherdir>"
将另一个路径添加到列表中,这将 ${THISDIR}/<otherdir>
放在上面列表的第一位。
请注意FILESOVERRIDES
[2]的内容可以再多一层“抽象”。如有疑问,请始终查看食谱 WORKDIR
中的 log.do_fetch,它会为您提供查找文件所遍历的所有路径以及遍历它们的顺序。
SRC_URI = "file://helloworld.c"
应该没问题。
我非常确定 S
没有设置为 Yocto 所期望的。 S
[3] 是 do_unpack
任务后 Yocto 的源目录。它是由 Yocto 设置的临时目录。它通常以 ${WORKDIR}
开头,这是给定配方的临时目录。仅在本地源的情况下,设置 S = "${WORKDIR}"
因为来自 SRC_URI
的本地文件(以 file://
开头的文件)被 fetcher 放入 ${WORKDIR}
中。默认设置为 ${WORKDIR}/<recipename-recipeversion>
.
do_compile
任务在 B
中运行,默认设置为 ${S}
,在配方中设置不正确。这就是找不到您的文件的原因。[4]
TL;DR:
SRC_URI = "file://helloworld.c"
S = "${WORKDIR}"
[1] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-FILESPATH
[2] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-FILESOVERRIDES
[3] https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#var-S
[4]https://www.yoctoproject.org/docs/current/mega-manual/mega-manual.html#ref-tasks-compile