Yocto继承方面的澄清请求

14

我最近开始尝试构建基于Linux的嵌入式系统,这与我通常处理的嵌入式设备大相径庭,因为我在那里拥有 完全 的控制权。

作为其中一部分,我正在研究Yocto/bitbake/OpenEmbedded构建系统。

有一件事让我很难理解,那就是“层”概念,所以我正试图弄清楚层如何使用/影响其他层。

根据我目前的理解,.bb 配方文件使用 require 简单地包含另一个文件,类似于C语言的 #include "myheader.h",它通常会在本地查找。

在“上面”层中的 .bbappend 文件将自动包含基础文件,然后对其进行更改,类似于固有的 require

相比之下,inherit 关键字查找 .bbclass 类文件的方式与定位 .bb 文件的方式非常相似,并从它们那里继承所有详细信息(有点像 #include <stdio.h>,再次提醒,它通常会在系统区域(a)查找)。

因此,我的第一个问题是:我的理解正确吗?或者我太简单化了吗?

那么,我的第二个问题涉及使用 BBEXTENDS 与我目前的理解。如果我们已经能够通过使用 require 扩展配方,那么在 BBEXTENDS 变量中列出该等配方的目的是什么?


(a) 是的,我知道它们在头文件来自哪里方面都是完全依赖于实现的,我只是在谈论它们的共同用途。

1个回答

27
Yocto的学习曲线与其他构建系统不同,这就是为什么我能理解您的困惑。但请相信我,这是值得的。您的问题与BitBake相关,因此我建议使用BitBake用户手册。只需确保阅读的版本与您的poky版本相同。
1. requireincluderequire 类似于 include,可以与 C 和 C++ 中的 #include 进行比较,就像您所编写的一样。尽管通常都应该用它们来向某些配方(*.bb)添加某些扩展,这些扩展对于一些配方来说是共同的(简单地说-可以重用)。例如:路径定义,被几个配方使用的自定义任务等。共同的目的是使配方更清晰并将一些常量分离出来以便重用。
非常重要的一点——> includerequire之间的区别(来自BitBake手册):
引用:include 指令在找不到文件时不会产生错误。因此,如果预期所包含的文件存在,则建议使用 require 而不是 include。这样做可以确保在找不到文件时会产生错误。
结果:当您将一个文件包含到 *.bb 中并且它没有被找到时,BitBake 在解析此配方期间不会引发错误。如果您使用 require,则将引发错误。当所指定的文件必须存在(因为其中包含了处理所必需的重要变量/任务)时,应该使用require
2. *.bbappend 机制。

关于 *.bbappend - 它非常强大。通常情况下,你需要添加一些定制化的修改到其他层(位于原始配方所在层的上面)的配方中时,可以使用 *.bbappend(例如:你不是原始配方的维护者,或者这些修改仅在你的项目中使用,则应该放置在你的元层中)。但你也可以将配方 bbappend 到同一层中。BitBake 解析所有层后,“创建”输出并执行它。详见第BitBake 手册中的执行章节

  1. inherit

inherit 机制可用于继承 *.bbclass,其中定义了某些特定目的的常见任务,因此您无需自己编写它们,例如:当您的配方需要为相应地由 CMake(已定义了 CMakeLists.txt)或 Autotools(Makefile.am 等)构建的源提供输出时,您可以使用 inherit cmakeinherit autotools 将其应用于您的配方。 如果您使用带有 poky 的 Yocto 发行版,则 OpenEmbedded 提供的类的定义位于 /meta/classes/ 下。您可以检查它们,您将看到例如 autotools.bbclass 已经定义了(其中之一)任务:autotools_do_configure(),这样您就不需要从头编写它。 但是,您可以在自己的配方中重新定义它(只需提供该函数的自定义定义)。如果不能更改配方,则可以简单地创建一个 *.bbappend 文件,并编写您自己的函数 do_configure(),它将覆盖来自 *.bbclass 的函数。就像在 C++ 或 Java 等面向对象语言中一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接