请求澄清Yocto继承

时间:2016-05-18 01:37:32

标签: yocto bitbake openembedded

我最近开始尝试构建基于Linux的嵌入式系统,这与我通常的嵌入式内容相去甚远,我对控制了所有内容。

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

我正在努力解决一件事,那就是分层概念,所以我试图弄清楚层使用/影响其他层的方式。

根据我的理解,.bb配方文件使用require来简单地包含另一个文件,类似于C #include "myheader.h"通常在本地查找。< / p>

“上层”图层中的.bbappend文件会自动神奇地包含基本文件,然后对其进行更改,排序为固有require

相比之下,inherit关键字查找.bbclass类文件的方式与查找.bb文件的方式大致相同,并继承了它们的所有detials(有点像#include <stdio.h>一般在系统区(a)中查找。

所以问题的第一部分是:我的理解是否正确?还是我太简单了?

我的问题的第二部分涉及根据我目前的理解使用BBEXTENDS。如果我们已经能够使用require扩展配方,那么在BBEXTENDS变量中列出所述配方的目的是什么?

(a)是的,我知道他们两个完全依赖于标题的来源实现,我只是在谈论他们的< em>普通使用。

1 个答案:

答案 0 :(得分:12)

Yocto的学习曲线与其他建筑系统不同,这就是我理解你的困惑的原因。但相信我,这是值得的。您的问题与BitBake有关,因此我建议使用BitBake User Manual。只需确保您阅读的版本与您的版本相同。

1。 requireinclude

requireinclude类似,可以与C和C ++中的#include进行比较,就像您编写的那样。 虽然通常它们都应该用于添加一些食谱(* .bb)的扩展,这些扩展对于一些食谱来说很常见(简单来说 - 可以重复使用)。 例如:路径的定义,夫妇食谱使用的自定义任务。共同的目的是使配方更清洁并分离一些常量以便重复使用。

非常重要的事情 - &gt; includerequire之间的差异(来自BitBake手册):

  

当找不到文件时,include指令不会产生错误。因此,建议如果您要包含的文件存在,则应使用require而不是include。这样做可确保在找不到文件时产生错误。

因此:当您将文件包含到* .bb且尚未找到时,BitBake将在解析此配方时引发错误。 如果您使用require,则会引发错误 。当指向文件必须存在时,您应该使用require,因为它包含必须处理的重要变量/任务。

2。 *.bbappend机制。

*.bbappend的情况下 - 它非常强大。典型的用法是乳清,你可以通过*.bbappend从其他层(位于原始配方所在的层上方)添加一些自定义修改,因为(例如):您不是原始配方的维护者或仅修改在您的项目中使用(然后它应该位于您的元层中)。但您也可以在同一层上bbappend配方。 BitBake解析所有层,然后“创建”输出并执行它。更多内容见Execution from BitBake man章。

3。 inherit

inherit机制可用于继承*.bbclass,其中定义了某些特定目的的常见任务,因此您无需自己编写它们,例如:您使用{{1}当你需要为CMake(你已经定义了CMakeLists.txt)或autotools(Makefile.am等)相应构建的源提供输出时,或者inhert cmake到你的配方。 OpenEmbedded提供的类的定义位于/ meta / classes /下,如果您使用Yocto发布的poky。 您可以检查它们,您会看到例如inherit autotools已定义(以及其他)任务:autotools.bbclass,因此您无需从头开始编写它。 但是,您可以在配方中重新定义它(仅提供您自己的此功能定义)。如果无法更改配方,则只需创建autotools_do_configure()文件并编写自己的函数*.bbappend,该函数将覆盖do_configure()中的函数。就像在C ++或Java等OO语言中一样。