如何在 yocto 中构建你好世界食谱

How to build hello world recipe in yocto

  1. C档

    int main() {
    printf("Hello, World!\n");
    return 0;
    } 
  1. 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}
} 
  1. 运行 命令

bitbake helloworld

错误 do_compile() 块中的错误 helloworld.c 找不到文件

  1. 文件树
    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]) 为你的食谱:

  1. build-microchip/my_layer/recipes-examples/helloworld/helloworld-0.1
  2. build-microchip/my_layer/recipes-examples/helloworld/helloworld
  3. 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