要求澄清 Yocto 继承
Request for clarification on Yocto inheritance
我最近尝试构建 Linux-based 嵌入式系统,这与我通常 完全 控制一切的嵌入式系统大不相同。
作为其中的一部分,我正在研究 Yocto/bitbake/OpenEmbedded 构建系统。
有一件事我正在努力解决,那就是分层概念,所以我试图找出层 use/affect 其他层的方式。
据我目前的理解,.bb
配方文件使用 require
简单地包含另一个文件,类似于 C 的 #include "myheader.h"
, 通常 在当地看。
"upper" 层中的 .bbappend
文件将 auto-magically 包含基础文件然后对其进行更改,有点像固有的 require
.
相比之下,inherit
关键字查找 .bbclass
class 文件的方式与查找 .bb
文件的方式大致相同,并继承了所有细节从他们那里(有点像 #include <stdio.h>
, 通常, 在系统区域 (a) 中查找)。
所以我的问题的第一部分是:我的理解正确吗?还是我太简单了?
然后我的问题的第二部分涉及根据我目前的理解使用BBEXTENDS
。如果我们已经能够使用 require
扩展食谱,那么在 BBEXTENDS
变量中列出所述食谱的目的是什么?
(a) 是的,我知道它们两者 完全取决于 headers 来自,我只是简单的说说他们的普通使用。
Yocto 的学习曲线不同于其他构建系统,这就是为什么我理解您的困惑。但相信我,这是值得的。您的问题与 BitBake 有关,所以我推荐 BitBake User Manual。只需确保您阅读的版本与您的 poky 修订版相同。
require
和 include
.
require
类似于 include
并且可以与 C 和 C++ 中的 #include
进行比较,就像您编写的一样。
虽然通常它们都应该用于向配方 (*.bb) 添加一些扩展,这些扩展对于一定数量的配方是常见的(简单地说 - 可以重复使用)。
例如:路径的定义,几个食谱使用的自定义任务。共同的目的是使配方更干净并分离一些常量以供重复使用。
非常重要的事情 -> include
和 require
之间的区别(来自 BitBake 手册):
The include directive does not produce an error when the file cannot be found. Consequently, it is recommended that if the file you are including is expected to exist, you should use require instead of include. Doing so makes sure that an error is produced if the file cannot be found.
因此:当您将文件包含到 *.bb 中但尚未找到时,BitBake 将不会 在解析此配方时引发错误。
如果您使用 require
,将引发错误 。当指向的文件必须存在时,您应该使用 require,因为它包含必须处理的重要 variables/tasks。
*.bbappend
机制。
在 *.bbappend
的情况下 - 它非常强大。典型的用法是你从其他层(位于原始配方所在的层之上)通过 *.bbappend
向配方添加一些自定义修改,因为(例如):你不是原始配方的维护者,或者修改只是在您的项目中使用(那么它应该位于您的元层中)。但是你也可以bbappend
食谱在同一层。 BitBake 解析所有层,然后 'creates' 输出并执行它。更多内容在第 Execution from BitBake man.
章中
inherit
.
inherit
机制可用于继承*.bbclass
,其中定义了用于某些特定目的的常见任务,因此您无需自己编写它们,例如:您使用inherit cmake
或 inherit autotools
到您的配方,当它需要为由 CMake(并且您定义了 CMakeLists.txt 或 autotools(Makefile.am 等)相应构建的源提供输出时。
如果您使用带有 poky 的 Yocto 版本,OpenEmbedded 提供的 类 的定义位于 /meta/classes/ 下。
您可以检查它们,您会看到例如 autotools.bbclass
已经定义(以及其他)任务:autotools_do_configure()
因此您不需要从头开始编写它。
但是,您可以在配方中重新定义它(只需提供您自己对此函数的定义)。如果无法更改配方,那么您可以简单地创建一个 *.bbappend
文件并编写您自己的函数 do_configure()
,它将覆盖 *.bbclass
中的函数。就像 C++ 或 Java.
等 OO 语言一样
我最近尝试构建 Linux-based 嵌入式系统,这与我通常 完全 控制一切的嵌入式系统大不相同。
作为其中的一部分,我正在研究 Yocto/bitbake/OpenEmbedded 构建系统。
有一件事我正在努力解决,那就是分层概念,所以我试图找出层 use/affect 其他层的方式。
据我目前的理解,.bb
配方文件使用 require
简单地包含另一个文件,类似于 C 的 #include "myheader.h"
, 通常 在当地看。
"upper" 层中的 .bbappend
文件将 auto-magically 包含基础文件然后对其进行更改,有点像固有的 require
.
相比之下,inherit
关键字查找 .bbclass
class 文件的方式与查找 .bb
文件的方式大致相同,并继承了所有细节从他们那里(有点像 #include <stdio.h>
, 通常, 在系统区域 (a) 中查找)。
所以我的问题的第一部分是:我的理解正确吗?还是我太简单了?
然后我的问题的第二部分涉及根据我目前的理解使用BBEXTENDS
。如果我们已经能够使用 require
扩展食谱,那么在 BBEXTENDS
变量中列出所述食谱的目的是什么?
(a) 是的,我知道它们两者 完全取决于 headers 来自,我只是简单的说说他们的普通使用。
Yocto 的学习曲线不同于其他构建系统,这就是为什么我理解您的困惑。但相信我,这是值得的。您的问题与 BitBake 有关,所以我推荐 BitBake User Manual。只需确保您阅读的版本与您的 poky 修订版相同。
require
和include
.
require
类似于 include
并且可以与 C 和 C++ 中的 #include
进行比较,就像您编写的一样。
虽然通常它们都应该用于向配方 (*.bb) 添加一些扩展,这些扩展对于一定数量的配方是常见的(简单地说 - 可以重复使用)。
例如:路径的定义,几个食谱使用的自定义任务。共同的目的是使配方更干净并分离一些常量以供重复使用。
非常重要的事情 -> include
和 require
之间的区别(来自 BitBake 手册):
The include directive does not produce an error when the file cannot be found. Consequently, it is recommended that if the file you are including is expected to exist, you should use require instead of include. Doing so makes sure that an error is produced if the file cannot be found.
因此:当您将文件包含到 *.bb 中但尚未找到时,BitBake 将不会 在解析此配方时引发错误。
如果您使用 require
,将引发错误 。当指向的文件必须存在时,您应该使用 require,因为它包含必须处理的重要 variables/tasks。
*.bbappend
机制。
在 *.bbappend
的情况下 - 它非常强大。典型的用法是你从其他层(位于原始配方所在的层之上)通过 *.bbappend
向配方添加一些自定义修改,因为(例如):你不是原始配方的维护者,或者修改只是在您的项目中使用(那么它应该位于您的元层中)。但是你也可以bbappend
食谱在同一层。 BitBake 解析所有层,然后 'creates' 输出并执行它。更多内容在第 Execution from BitBake man.
inherit
.
inherit
机制可用于继承*.bbclass
,其中定义了用于某些特定目的的常见任务,因此您无需自己编写它们,例如:您使用inherit cmake
或 inherit autotools
到您的配方,当它需要为由 CMake(并且您定义了 CMakeLists.txt 或 autotools(Makefile.am 等)相应构建的源提供输出时。
如果您使用带有 poky 的 Yocto 版本,OpenEmbedded 提供的 类 的定义位于 /meta/classes/ 下。
您可以检查它们,您会看到例如 autotools.bbclass
已经定义(以及其他)任务:autotools_do_configure()
因此您不需要从头开始编写它。
但是,您可以在配方中重新定义它(只需提供您自己对此函数的定义)。如果无法更改配方,那么您可以简单地创建一个 *.bbappend
文件并编写您自己的函数 do_configure()
,它将覆盖 *.bbclass
中的函数。就像 C++ 或 Java.