Yocto Project开发(四):BitBake构建引擎

从根本上说,BitBake是一个通用的任务执行引擎,它允许shellPython任务在复杂的任务间依赖性约束中工作时高效并行地运行。从概念上讲,Bitbake是类似Make的构建引擎,但是又有着显著的差异:

  • BitBake根据提供的构建任务的元数据执行任务。
  • BitBake包括一个fetcher库,用于从各种位置获取源代码,例如本地文件,源代码控制系统或网站。
  • 要构建的每个单元的指令(例如一个软件)称为“菜谱”文件,并包含有关该单元的所有信息(依赖项,源文件位置,校验和,描述等)。
  • 允许shellPython任务在复杂的依赖性约束中工作时高效并行地运行。

历史和目标

BitBake最初是OpenEmbedded项目的一部分。它的灵感来自Gentoo Linux发行版使用的Portage包管理系统。2004年12月7日,OpenEmbedded项目团队成员Chris Larson将项目分为两个截然不同的部分:

  • BitBake:一个通用任务执行器
  • OpenEmbedded:BitBake使用的元数据集

BitBakeOpenEmbedded项目的主要基础,该项目被用作诸如Yocto项目之类的Linux项目的构建工具 。在BitBake之前,没有任何其他构建工具能够充分满足有抱负的嵌入式Linux发行版的需求。传统桌面Linux发行版使用的所有构建系统都缺乏重要的功能,并且在嵌入式领域中普遍存在的基于Buildroot的临时系统都不具备可扩展性或可维护性。BitBake的一些重要原始目标是:

  • 处理交叉编译。
  • 处理包间依赖关系。
  • 支持在给定包中运行任意数量的任务,包括但不限于获取上游源,解压缩,打补丁,配置等等。
  • 支持多个构建和目标操作系统(例如Cygwin,BSD等)。
  • 是自包含的,而不是紧密集成到构建机器的根文件系统中。
  • 易于使用BitBake在多个项目之间进行协作以进行构建。
  • 提供继承机制以在许多包之间共享公共元数据。
  • 处理基本配方的变体(例如native,sdkmultilib)。
  • 将元数据拆分为图层,并允许图层增强或覆盖其他图层。

概念

BitBake是一个用Python语言编写的程序。在最高级别,BitBake解释元数据,决定运行所需的任务,并执行这些任务。与GNU Make类似,BitBake控制着软件的构建方式。GNU Make通过“makefile”实现其控制,而BitBake使用“Recipes”。

菜谱

BitBake Recipes,由文件扩展名.bb表示,是最基本的元数据文件。这些菜谱文件为BitBake提供以下内容:

  • 有关包的描述性信息(作者,主页,许可证等)
  • 菜谱的版本
  • 现有依赖项(构建和运行时依赖项)
  • 源代码所在的位置以及如何获取它
  • 源代码是否需要任何补丁,在何处找到它们以及如何应用它们
  • 如何配置和编译源代码
  • 在目标机器上安装包或创建的包的位置

配置文件

配置文件由.conf扩展表示 ,定义了管理项目构建过程的各种配置变量。这些文件分为几个区域,用于定义计算机配置选项,分发配置选项,编译器调整选项,常规通用配置选项和用户配置选项。主配置文件是示例bitbake.conf文件,它位于BitBake源树conf目录中。

.bbclass扩展名表示的类文件 包含在元数据文件之间共享的有用信息。BitBake源代码树目前附带一个名为的类元数据文件base.bbclass。您可以在classes目录中找到此文件 。该base.bbclass类文件很特殊,因为它总是自动包含在所有配方和类中。此类包含标准基本任务的定义,例如提取,解包,配置(默认为空),编译(运行任何Makefile),安装(默认为空)和打包(默认为空)。这些任务经常被项目开发过程中添加的其他类覆盖或扩展。

图层

图层允许您将不同类型的自定义设置相互隔离。虽然您可能会发现在处理单个项目时将所有内容保留在一个层中很有吸引力,但是组织元数据越模块化,就越容易应对未来的更改。

追加文件

附加文件,这些文件具有 .bbappend文件扩展名,扩展或覆盖现有配方文件中的信息。

BitBake希望每个附加文件都有一个相应的配方文件。此外,附加文件和相应的配方文件必须使用相同的根文件名。文件名只能在使用的文件类型后缀(例如formfactor_0.0.bbformfactor_0.0.bbappend)中有所不同。
命名附加文件时,可以使用“%”通配符来匹配配方名称。例如,假设你有一个名为如下的追加文件:

     busybox_1.21%。bbappend

该追加文件将匹配任何版本的配方。因此,append文件将匹配以下配方名称: busybox_1.21.x.bb

     busybox_1.21.1.bb
     busybox_1.21.2.bb
     busybox_1.21.3.bb

在最常见的情况下,您可以将追加文件命名为busybox_%.bbappend完全独立于版本。

BitBake命令

bitbake命令是BitBake工具的主要接口。可以查看命令帮助:

$ cd poky/ 
$ source oe-init-build-env
$ bitbake -h

下面是一些示例:

针对单个菜谱执行任务

以下命令在foo_1.0.bb菜谱文件上运行构建任务,这是默认任务:

     $ bitbake -b foo_1.0.bb

以下命令在foo.bb菜谱文件上运行clean任务 :

   $ bitbake -b foo.bb -c clean

对一组菜谱文件执行任务

bitbake命令在不使用“--buildfile”“-b”时仅接受“PROVIDES”。你不能提供任何其他东西。默认情况下,配方文件通常“提供”其“包名”,如以下示例所示:

     $ bitbake foo

下一个示例“提供”包名称,并使用“-c”选项告诉BitBake只执行do_clean任务:

     $ bitbake -c clean foo

执行任务和菜谱组合列表

指定多个目标时,BitBake命令行支持为各个目标指定不同的任务。

     $ bitbake myfirstrecipe:do_taskA mysecondrecipe:do_taskB

生成依赖图

BitBake能够使用dot语法生成依赖图。您可以使用Graphviz中的dot工具 将这些图形转换为图像 。
以下是创建依赖关系图的两个示例。第二个示例省略了常见的依赖:

     $ bitbake -g foo
     $ bitbake -g -I virtual/kernel -I eglibc foo

你可能感兴趣的:(Yocto)