写在前面

《BitBake使用攻略》系列文章将从今天开始不定时的更新,主要讲解BitBake的背景,基本语法,功能及其命令等知识,旨在为即将从事Yocto项目和OpenEmbedded项目的同学做一些预备知识,由于本人能力有限,一些纰漏还望各位指出,话不多说,我们马上进入正题。


1. 什么是BitBake

BitBake就是比特烧烤,哈哈,皮一下。BitBake是一个开源的构建工具,通过提供必要的元数据,其能构建出从bootloader到应用层各种各样的软件包,可以将其对标GNU Make工具,而BitBake需要的菜谱文件就是GNU Make的CMakeList文件,当然了,也包括各种配置文件,引用官方的解释,BitBake的介绍如下:

Fundamentally, BitBake is a generic task execution engine that allows shell and Python tasks to be run efficiently and in parallel while working within complex inter-task dependency constraints. One of BitBake's main users, OpenEmbedded, takes this core and builds embedded Linux software stacks using a task-oriented approach.

BitBake如此强大,为何我们好像基本没有听说过呢?这是因为BitBake作为Yocto和OpenEmbedded项目的核心构建工具,主要服务于嵌入式工程的构建过程,上手不是特别简单,所以在一般领域不是特别出名,但这不代表他的功能逊色,相反,通过通过编写相应元数据文件和配置文件,你可以构建任何你想要的包。

BitBake有几个比较突出的特点:

  • BitBake是以任务为单位进行构建的,而这些任务通常是由菜谱文件(后缀为bb)、配置文件(后缀conf)以及类文件(后缀bbclass)所提供。
  • 通过添加一些变量,BitBake可以从本地,甚至是远程服务器获取要用到的源码或补丁等文件。
  • BitBake采用CS架构,这就提供了一种远程构建的可能。

大致介绍完BitBake后,你可能会觉得这玩意这么厉害是不是特别难学,其实还好,毕竟是一个工具性的软件,只要按着规则来基本没有太大的难度。接下来,我将从一个学习新工具或者新语言必学的项目HelloWorld来为大家介绍BitBake的基本用法。

2. BitBake的安装

首先,我们先要下载BitBake软件,大致有三种方式可以供我们获得BitBake:

  • 直接克隆OpenEmbedded维护的BitBake源码包。

  • 从你下载的Yocto或者OpenEmbedded项目代码中取出BitBake源码包。

  • 直接下载官方打包好的BitBake软件包,可以运行下面的命令:

    1. $ wget http://git.openembedded.org/bitbake/snapshot/bitbake-1.17.0.tar.gz
    2. $ tar zxpvf bitbake-1.17.0.tar.gz

我们使用推荐使用第一种方式,因为我们可以得到一个最稳定的版本,运行下面的命令:

  1. git clone git://git.openembedded.org/bitbake

运行完成后,你将获得BitBake的源码目录:

  1. cxy@ubuntu:~/Repository/BitBake/bitbake$ ls -al
  2. total 108
  3. drwxrwxr-x 9 cxy cxy 4096 Dec 21 23:12 .
  4. drwxrwxr-x 4 cxy cxy 4096 Dec 21 23:12 ..
  5. -rw-rw-r-- 1 cxy cxy 365 Dec 21 23:12 AUTHORS
  6. drwxrwxr-x 2 cxy cxy 4096 Dec 21 23:12 bin
  7. -rw-rw-r-- 1 cxy cxy 16501 Dec 21 23:12 ChangeLog
  8. drwxrwxr-x 2 cxy cxy 4096 Dec 21 23:12 classes
  9. drwxrwxr-x 2 cxy cxy 4096 Dec 21 23:12 conf
  10. drwxrwxr-x 4 cxy cxy 4096 Dec 21 23:12 contrib
  11. drwxrwxr-x 6 cxy cxy 4096 Dec 21 23:12 doc
  12. drwxrwxr-x 8 cxy cxy 4096 Dec 21 23:12 .git
  13. -rw-rw-r-- 1 cxy cxy 31 Dec 21 23:12 .gitattributes
  14. -rw-rw-r-- 1 cxy cxy 392 Dec 21 23:12 .gitignore
  15. drwxrwxr-x 13 cxy cxy 4096 Dec 21 23:24 lib
  16. -rw-rw-r-- 1 cxy cxy 1224 Dec 21 23:12 LICENSE
  17. -rw-rw-r-- 1 cxy cxy 15394 Dec 21 23:12 LICENSE.GPL-2.0-only
  18. -rw-rw-r-- 1 cxy cxy 1286 Dec 21 23:12 LICENSE.MIT
  19. -rw-rw-r-- 1 cxy cxy 229 Dec 21 23:12 MANIFEST.in
  20. -rw-rw-r-- 1 cxy cxy 1949 Dec 21 23:12 README
  21. -rw-rw-r-- 1 cxy cxy 43 Dec 21 23:12 toaster-requirements.txt
  22. -rw-rw-r-- 1 cxy cxy 2887 Dec 21 23:12 TODO

为了可以在任意位置使用bitbake的命令,我们需要将bin目录添加到PATH环境变量中,例如,我可以执行如下命令:

  1. $ export PATH=/home/cxy/Repository/BitBake/bitbake/bin:$PATH

这时,尝试运行一下你的bitbake,看看是否能正确输出版本号:

  1. cxy@ubuntu:~/Repository/BitBake/bitbake$ bitbake --version
  2. BitBake Build Tool Core version 1.53.0

到此,你的BitBake环境已经准备好啦!

3. 使用BitBake构建一个HelloWorld工程

我们最后要到达的效果是使用BitBake工具输出HelloWorld的字样,你可能会觉得这一部分简单,实际上是我想使用官网的一个案例带你去学习BitBake的构建逻辑,同时也提供了一个我们今后学习BitBake使用的工程。

我们先新建一个hello工程,并进入到这个目录下:

  1. $ mkdir hello
  2. $ cd hello

这时,我们不禁在想,在这一个空空的目录下怎么去输出HelloWorld呢,你不妨现在试着运行一下构建工具看看会发生什么,运行命令:

  1. $ bitbake

可以发现(有点版本可能不会输出),输出信息里提示BBPATH变量未设置,这个变量是干嘛的呢,它是BitBake构建过程中最核心的变量,用于指定bb文件以及conf文件的存储位置,而bb文件中又定义了构建任务,所以在干所有事之前我们要先定义BBPATH变量,将其指定为我们的工程目录,例如:

  1. $ BBPATH="/home/cxy/Repository/BitBake/hello/"
  2. $ export BBPATH

随后,我们重新使用bitbake命令编译一下工程,这时你会发现系统提示找不到conf/bitbake.conf,而这个文件是bitbake运行时第一个要找到文件,其记录了许多bitbake很重要的全局变量,因此我们创建它:

  1. $ mkdir conf
  2. $ cd conf/
  3. $ touch bitbake.conf

并在bitbake.conf中添加如下内容:

  1. TMPDIR = "${TOPDIR}/tmp"
  2. CACHE = "${TMPDIR}/cache"
  3. STAMP = "${TMPDIR}/stamps"
  4. T = "${TMPDIR}/work"
  5. B = "${TMPDIR}"

我们对上面的变量分别做一个简单的介绍:

  • TMPDIR:用于存放构建生成的文件,类似于输出目录,其中TOPDIR由系统自动赋值为工程目录路径。
  • CACHE:指定存放缓存文件的地方,通过这些文件,bitbake可以在重新构建时省去很多工作。
  • STAMP:戳记文件存放目录。
  • T:存放临时文件,如log文件。
  • B:bitbake在这个目录下进行构建工作。

再次运行bitbake命令你会发现这次又提示缺少classes/base.bbclass文件,这个文件是一个类文件。在BitBake中,类文件会提供菜谱共有的内容,而base.bbclass是所有菜谱文件(bb文件)的公共基类,是必须提供的,因此我们创建这个文件:

  1. $ mkdir classes
  2. $ cd classes/
  3. $ touch base.bbclass

同时,添加如下内容到这个文件中:

  1. addtask build

这句代码表示继承该类的菜谱必须执行do_build任务,这时候你再运行一下就会发现bitbake没有报错,而是提示没有事情可做,也就是没有提供任务。因此,接下来我们提供一个菜谱文件去指定一些可供bitbake执行的任务。另外为了维护目录的整洁性,我们使用bitbake中层的概念(每个层之间菜谱是独立的,大的工程中都有好多层,用于分离不同种类的文件)。我们新建层meta-mylayer,同时每个层需要又一个配置文件conf/layer.conf

  1. $ mkdir meta-mylayer
  2. $ cd meta-mylayer/
  3. $ mkdir conf
  4. $ cd conf/
  5. $ touch layer.conf

在这个配置文件中,我们需要为其填充一些配置项,内容如下:

  1. BBPATH .= ":${LAYERDIR}"
  2. BBFILES += "${LAYERDIR}/*.bb"
  3. BBFILE_COLLECTIONS += "mylayer"
  4. BBFILE_PATTERN_mylayer := "^${LAYERDIR}/"

在这个文件中,我们先设置了BBPATH变量,.=表示的是追加,所以我们将LAYERDIR(这个变量会被自动设定为当前层的根路径)内容追加到BBPATH中,表示在这个路径下也可以找到BB文件。而BBFILES是一个正则表达式,使用这个规则可以匹配到我们的菜谱文件。另外,最后的两个变量我们暂时先不说,以后具体讲到菜谱文件再聊,或者你可以参考一下官方的解释:BBFILE_COLLECTIONS , BBFILE_PATTERN

之后,我们还需要编写我们的第一个菜谱文件,去告诉BitBake我们要做些什么,在meta-mylayer目录下新建一个菜谱文件printhello.bb,内容如下:

  1. DESCRIPTION = "Prints Hello World"
  2. PN = 'printhello'
  3. PV = '1'
  4. python do_build() {
  5. bb.plain("********************");
  6. bb.plain("* *");
  7. bb.plain("* Hello, World! *");
  8. bb.plain("* *");
  9. bb.plain("********************");
  10. }

在这个文件中,我们定义了三个变量,分别表示描述信息,菜谱名称以及菜谱的版本号。另外我们还定义了一个任务do_build(任务名称以do_开头),内容是使用bb.plain函数打印若干字符串。由于所有BB文件都要继承基类base.bbclass,因此这个BB文件也就必须要执行do_build任务了(参考上面所讲)。

此时,你再次回到根目录下运行bitbake printhello命令(表示我们要构建printhello.bb菜谱),你会发现BitBake似乎并没有找到这个菜谱,这是因为我们还需要一个变量去将新建的层包含到我们的工程中,而这个变量需要定义到conf/bblayers.conf文件中,我们新建conf/bblayers.conf文件,内容如下:

  1. BBLAYERS ?= " \
  2. /home/cxy/Repository/BitBake/hello/meta-mylayer \
  3. "

其中,BBLAYERS变量指定了我们要使用的层的绝对路径(你需要把你的层路径替换掉我的)。

现在你检查一下自己的目录是否和我一样:

  1. cxy@ubuntu:~/Repository/BitBake/hello$ tree -L 3 .
  2. .
  3. ├── classes
  4.    └── base.bbclass
  5. ├── conf
  6.    ├── bblayers.conf
  7.    └── bitbake.conf
  8. └── meta-mylayer
  9. ├── conf
  10.    └── layer.conf
  11. └── printhello.bb
  12. 4 directories, 5 files

如果没有文件和内容没有问题,运行bitbake printhello命令,你将获得如下内容:

恭喜你,到此你已经成功的完成了你的BitBake初次旅行,让我们给自己庆祝一下吧!!!

后续

虽然我们只是输出了一些无用信息,但是我们已经掌握了BitBake最核心的运行逻辑,也对其使用的文件有了一个较为直观的感受。在之后的时间里,我们将继续学习相应的语法知识,命令用法以及怎样使用它完成一个复杂的工程构建任务。当然啦,也希望大家能多多支持一下博主,码字不易,还望一键三连,如果想请博主喝杯茶也可以,右下角可以打赏哦,再次谢谢大家能看到这个地方。


我是chegxy,欢迎关注!!!

BitBake使用攻略--从HelloWorld讲起的更多相关文章

  1. BitBake使用攻略--BitBake的语法知识一

    目录 写在前面 1. BitBake中的赋值 1.1 直接赋值 1.2 间接赋值 1.3 追加与前加赋值 1.4 Override风格的赋值语法 1.5 标志赋值 1.6 内联函数赋值 1.7 其他一 ...

  2. VSCode插件开发全攻略(八)代码片段、设置、自定义欢迎页

    更多文章请戳VSCode插件开发全攻略系列目录导航. 代码片段 代码片段,也叫snippets,相信大家都不陌生,就是输入一个很简单的单词然后一回车带出来很多代码.平时大家也可以直接在vscode中创 ...

  3. VSCode插件开发全攻略(二)HelloWord

    更多文章请戳VSCode插件开发全攻略系列目录导航. 写着前面 学习一门新的语言或者生态首先肯定是从HelloWord开始. 您可以直接克隆我放在GitHub上vscode-plugin-demo 的 ...

  4. 【JAVA EE企业级开发四步走完全攻略】

    本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...

  5. linux内核升级图文攻略(转)

    一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置 ...

  6. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  7. JAVA EE企业级开发四步走完全攻略 [转]

    http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...

  8. 拿nodejs快速搭建简单Oauth认证和restful API server攻略

    拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最 ...

  9. Nazo解密游戏攻略

    啊,终于腾出时间来玩这个游戏了,顺手写一下攻略吧…… 第0关:http://cafebabe.cc/nazo/ 第一关:第一关很简单 点一下就好了 http://cafebabe.cc/nazo/le ...

随机推荐

  1. Orika - 类复制工具

    Orika 前言 类复制工具有很多,比较常用的有 mapstruct.Spring BeanUtils.Apache BeanUtils.dozer 等,目前我所在的项目组中使用的是 mapstruc ...

  2. 我在组内的Java问题排查分享

    前言 最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~ 线上问题处理流程 直接放PPT截图吧,现在看来依然不过时 问 ...

  3. C++ 编译错误记录

    C++ _ZSt28__throw_bad_array_new_lengthv1 编译错误 出现场景:类似代码 vector<vector<int>> grid = {{1, ...

  4. UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥+轮廓线 dp)

    题面传送门 本来说要找道轮廓线 \(dp\) 的题目刷刷来着的?然后就找到了这道题. 然鹅这个题给我最大的启发反而不在轮廓线 \(dp\),而在于让我新学会了一个玩意儿叫做 Min-Max 容斥. M ...

  5. 【机器学习与R语言】5-规则学习算法

    目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...

  6. 毕业设计之zabbix集合

    lnmp环境请查看https://www.cnblogs.com/betterquan/p/12285956.html 但是!!!注意php的编译: https://www.zabbix.com/do ...

  7. R语言因子排序

    画图的时候,排序是个很重要的技巧,比如有时候会看下基因组每条染色体上的SNP的标记数量,这个时候直接做条形图是一种比较直观的方法,下面我们结合实际例子来看下: 在R环境下之际构建一个数据框,一列染色体 ...

  8. 分布式服务治理框架Dubbo的前世今生及应用实战

    Dubbo的出现背景 Dubbo从开源到现在,已经出现了接近10年时间,在国内各大企业被广泛应用. 它到底有什么魔力值得大家去追捧呢?本篇文章给大家做一个详细的说明. 大规模服务化对于服务治理的要求 ...

  9. 如何在 ASP.NET Core 中构建轻量级服务

    在 ASP.NET Core 中处理 Web 应用程序时,我们可能经常希望构建轻量级服务,也就是没有模板或控制器类的服务. 轻量级服务可以降低资源消耗,而且能够提高性能.我们可以在 Startup 或 ...

  10. 从for循环到机器码

    def p(*x): print(x) p(type(range), dir(range)) r = range(2); i = iter(r) try: p(next(i)); p(next(i)) ...