Yocto - 为什么我不能覆盖构建任务?

Yocto - Why can't I override the build task?

我正在玩我自己的 yocto layer/recipes 来弄清楚一切是如何协同工作的,我看到了一些与构建任务相关的非常令人困惑的行为。这是我名为 condtest 的测试食谱:

ICENSE = "GPLv2+ & LGPLv2+"

DISTRO = ""

do_print() {

     echo "print"
}

addtask print

do_fetch() {
    echo "fetch"
}

addtask fetch before build

do_build() {
    echo "build"
}
addtask build 



do_compile() {
    :
}
addtask compile

所以如果我 运行 bitbake -c fetch condtest 我看到“fetch”完全符合我的预期,所以这是有道理的。但是,当我 运行 bitbake -c build condtest 时,bitbake 不会回显“构建”,而是会开始获取和编译一堆包。更让我困惑的是,如果我将 -e 标志添加到这两个命令,它们的输出几乎相同,所以我不确定为什么 bitbake 似乎开始使用默认构建任务而不是开始构建完全不同的配方使用我在食谱中定义的覆盖构建任务。

构建其他包是因为存在构建时依赖性(fetch 任务不需要此类依赖性)。您的 build 任务内容不相关,依赖项存储在其他地方(参见 BitBake User Manual and section Build Dependencies for more information). You can generate graph of dependencies using the -g in bitbake invocation (see the official docs)。

如果要禁用默认依赖项,请选中 documentation for the variable INHIBIT_DEFAULT_DEPS

这不是你问题的一部分,但我在你的食谱中看到了这些小问题:

  • 您不必为标准任务添加 addtask。您可以在 documentation.
  • 中找到它们(连同文档)
  • 如果你想跳过任务并保留依赖列表,你可以使用do_compile[noexec] = "1"
  • DISTRO变量(即定义)属于全局配置

编辑:我没有回答为什么 build 没有回显,请参阅 Richard 的回答以获取解释。

基本 bbclass 文件 (meta/classes/base.bbclass) 设置:

do_build[noexec] = "1

这意味着函数的内容没有被执行,它只是依赖图的一个占位符任务。这就是为什么您永远看不到构建任务的输出。

如其他答案中所述,存在默认依赖项,这就是为什么在您尝试时执行其他配方和 运行“标准”任务,如 do_build。