前言

智能家居、智能汽车、智能手机、智能电视、智能恒温器、智能电灯、智能手表、智能洗衣机、智能烘干机、智能冰箱以及智能篮球。欢迎来到智能万物的勇敢新世界。

在日常生活中,我们触及和交互的几乎所有东西中都有嵌入式计算机,它的剧增,使得嵌入式系统工程和嵌入式软件开发受到了瞩目。嵌入式系统隐藏在其用户的直接视线之外,它们缺少那些带有浮华用户界面的网络应用所具有的吸引力,也缺少那些带有动画和逼真图像的计算机游戏所具有的酷酷的感觉。毫不奇怪的是,计算机科学专业的学生和软件开发者几乎不会把嵌入式软件工程当成他们的第一职业选择。然而,“智能万物革命”和物联网正在推动人们对那些能够桥接硬件和软件世界的专业人士的需求。那些使用电路原理图语言和编程语言的专家将受到雇主的追捧。

对于爆炸式增多的嵌入式应用来说,Linux已经成为第一选择。对于这种选择,有很多恰当的理由。我们将在接下来的章节中详细阐述这些理由。经历了作为服务于各种行业的嵌入式软件开发者的旅程,我通过艰辛的方式学习了嵌入式系统的Linux。对几乎任何编程语言来说,都不缺少优秀的开发工具。绝大部分用于Linux的库和应用都会由于它们的工具化而被简单原生地构建。使用内核自有的构建系统,即使从头开始构建Linux内核几乎也是一件轻而易举的事。然而,当需要把所有的东西整合进可启动的系统时,选择就很少了。

通过提供一套全面的、以OpenEmbedded构建系统为中心的集成化工具,Yocto项目弥补了这种鸿沟。在大约几个小时内实现从源代码到可启动的系统——我希望在我开始使用嵌入式Linux的时候会有这样的奢侈。

本书定位

集成多个不同的必要步骤来从头创建完全可用的Linux操作系统栈的构建系统是相当复杂的。本书专注于构建系统本身以及如何有效使用它来构建定制的Linux发行版。本书不是关于嵌入式Linux的教程。虽然第6章解释了Linux系统架构的基础(因为该信息对于理解构建系统如何组合多个不同的组件成为可运行的系统是必要的),但是就嵌入式Linux本身而言,不会深入它的细节。如果你是嵌入式Linux开发新手,那么强烈推荐Christopher Hallinan的好书《Embedded Linux Primer》,该书与本书是同一系列丛书(Prentice Hall开源软件开发系列)。

在本书中,你将会学习OpenEmbedded构建系统如何工作、如何编写菜谱(recipe)来构建你自己的软件组件、如何使用和创建Yocto项目板支持包(Board Support Package,BSP)来支持不同的硬件平台以及如何调试构建失败。你还将学习如何为应用开发构建软件开发包,以及如何为了无缝的往返开发(round-trip development)而把这些开发包和流行的Eclipse集成开发环境(Integrated Development Environment,IDE)集成起来。

本书读者

本书面向那些具有Linux实践知识的软件开发者和程序员。假设你熟悉Linux命令行,可以使用典型的工具(例如Make和C/C++编译器)在Linux系统上构建程序,还可以阅读和理解基本的shell脚本。

构建系统是完全用Python编写的。即使你不是Python专家也可以使用它,并理解它如何工作,但是具备一些核心的Python知识一定是有利的。

本书内容

第1章对采用嵌入式系统的Linux进行简要介绍,为嵌入式Linux的形势和创建定制嵌入式发行版的挑战的概览奠定了基础。

第2章通过用构建系统启动Linux操作系统栈的首次构建来介绍Yocto项目,同时也给出了Yocto项目系列和Yocto项目历史的概览。

第3章解释了构建系统的基础、工作流和架构。

第4章解析了BitBake——处于OpenEmbedded构建系统核心的构建引擎。其中解释了菜谱(recipe)的元数据(metadata)概念、类、配置文件及其语法。BitBake方式的“Hello World”项目说明了构建工作流。通过提供的信息,你会获得用于理解所提供的菜谱和编写自己的菜谱的必要知识。

第5章介绍了可用于对构建问题进行故障排除的工具和机制,并且提供了如何有效使用这些工具的实用建议。

第6章提供了Linux操作系统栈的基础,并解释了不同组件是如何分层的。另外还讨论了内核空间和用户空间的概念以及应用程序如何通过由标准C库提供的系统调用来和Linux内核交互。

第7章细致讲解了如何使用Yocto项目创建定制化的Linux发行版。它以构建系统可用的Linux发行版蓝图以及如何定制它们的简要介绍作为开始。然后演示了如何使用构建系统工具完全从头创建Linux发行版。读完本章以后,你将知道如何构建自己的操作系统镜像。

第8章解释了BitBake菜谱以及如何编写它们来用构建系统构建自己的软件包。这一章提供了你可以尝试的各种真实世界的菜谱例子。

第9章仔细研究了用OpenEmbedded构建系统来构建Linux内核的细节,解释了构建系统工具如何与内核的构建环境交互以设置内核配置和应用补丁。本章以关于构建系统如何处理树外(out-of-tree)内核模块以及合并构建设备树和构建过程的讨论结束。

第10章介绍了构建系统如何支持针对不同硬件的构建——也就是说,为不同CPU架构和系统构建。在介绍了Yocto项目板支持包的概念以后,本章细致讲解了如何使用板支持包构建项目。然后研究了Yocto项目板支持包的内部原理,并用实际的例子来解释如何构建自己的板支持包,你可以将这个例子使用在真实硬件上。本章以为不同硬件配置创建可启动介质镜像结束。

第11章描述了Yocto项目对开发应用的支持,这些应用被用在通过构建系统创建的Linux操作系统栈上。其中提供了关于如何构建那些包含用于往返应用开发的全部必需工具的应用开发工具集(Application Development Toolkit,ADT)的实际操作指南。示例说明了如何通过命令行工具和Eclipse集成开发环境来将应用开发工具集用于应用开发。指南会一步步教你如何远程运行和调试真实硬件目标上的应用。

第12章讨论了对于开源许可合规性的要求以及Yocto项目提供的那些有助于满足要求的工具。

第13章介绍了帮助你把Yocto项目扩展到团队的一些工具。Toaster是基于Web的图形用户界面,它可用于创建能从Web浏览器远程控制的构建系统。构建历史是提供追踪和审计能力的工具。使用源镜像,你可以共享源包来避免重复的下载,并为产品交付控制源版本。最后但并非最不重要的是,Autobuilder为自动化构建、质量保证和发布过程提供了开箱即用的持续构建和集成框架。掌握了本章的知识后,你可以为Yocto项目有效地设置团队环境。

附录包括流行的开源许可,以及以字母排序的构建系统元数据层和机器的参考。

动手操作经验

本书的撰写目的是提供Yocto项目的实际动手操作经验。如果依照并且尝试了相关示例,那么你会收获良多。它们中的大部分可以依赖运行最新Linux发行版的基于x86的工作站来轻松完成(详细的需求会在第2章提供)。为了获得更好的经验,要利用流行的开发板,例如BeagleBone、MinnowBoard Max或者Wandboard。BeagleBone是优秀的低成本的实验平台。另外两个板提供更好的性能,也让你获得关于多核系统的经验。

分析代码并且尝试理解本书的代码。遵循步骤,然后通过改变设置、应用你自己的配置等来完成自己的设计。这是最好的学习方式,并且我可以告诉你,这也相当有趣。让你自己的第一个Linux发行版工作在你选择的一个硬件上是很棒的体验。