我最近开始尝试构建基于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>普通使用。
答案 0 :(得分:12)
Yocto的学习曲线与其他建筑系统不同,这就是我理解你的困惑的原因。但相信我,这是值得的。您的问题与BitBake有关,因此我建议使用BitBake User Manual。只需确保您阅读的版本与您的版本相同。
require
和include
。 require
与include
类似,可以与C和C ++中的#include
进行比较,就像您编写的那样。
虽然通常它们都应该用于添加一些食谱(* .bb)的扩展,这些扩展对于一些食谱来说很常见(简单来说 - 可以重复使用)。
例如:路径的定义,夫妇食谱使用的自定义任务。共同的目的是使配方更清洁并分离一些常量以便重复使用。
非常重要的事情 - &gt; include
和require
之间的差异(来自BitBake手册):
当找不到文件时,include指令不会产生错误。因此,建议如果您要包含的文件存在,则应使用require而不是include。这样做可确保在找不到文件时产生错误。
因此:当您将文件包含到* .bb且尚未找到时,BitBake将不在解析此配方时引发错误。
如果您使用require
,则会引发错误 。当指向文件必须存在时,您应该使用require,因为它包含必须处理的重要变量/任务。
*.bbappend
机制。在*.bbappend
的情况下 - 它非常强大。典型的用法是乳清,你可以通过*.bbappend
从其他层(位于原始配方所在的层上方)添加一些自定义修改,因为(例如):您不是原始配方的维护者或仅修改在您的项目中使用(然后它应该位于您的元层中)。但您也可以在同一层上bbappend
配方。 BitBake解析所有层,然后“创建”输出并执行它。更多内容见Execution from BitBake man章。
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语言中一样。