嵌入式Linux集成构建环境介绍
1. 配置选项类型关键字
在配置过程中,选项类型由以下关键字之一表示:
-
bool
:选项有两个值,“y” 或 “n”。
-
tristate
:选项有三个值,“y”、“n” 和 “m”。
-
choice
:选项为列出的值之一。
-
int
:选项采用整数值。
类型关键字通常包含一个提示信息,即在配置菜单中显示的文本。也可以使用
prompt
关键字来指定提示信息。此外,还有一些“隐藏”选项,它们没有可显示的提示信息。在
Kconfig
文件顶部有一组选项不会显示在菜单中,因为没有指定提示信息,当在
xconfig
中选择“显示所有选项”时,就能看到这些选项。
配置条目中的其他关键字包括:
-
help
:用于指定帮助文本。
-
depends
:表示只有当该选项所依赖的其他选项被选中时,此选项才有效或可见。
-
select
:表示如果选择了此选项,则必然要开启其他某个选项。
在“System Type”菜单行上方有这样一行代码:
source “kernel/Kconfig.freezer”
source
关键字用于扩展配置菜单,以包含额外的模块化功能,这实际上类似于 C 语言中的
#include
。在主
Kconfig
文件中会分散着许多
source
行。配置语言实际上比这个简单示例所展示的要复杂得多,如需更多细节,可查看
linux/Documentation/kbuild/kconfig - language.txt
。
2. 集成构建环境的问题
嵌入式开发环境包含多个要素,如下所示:
- 交叉工具链
- 编辑器
- 编译器
- 链接器
- 调试器
- 库
- 引导加载程序
- Linux 内核
- 根文件系统
- 应用程序
要让所有这些组件协同工作并非易事,更不用说还存在许可问题。开源软件以各种不同许可条款发布,确保各种许可相互兼容非常重要。这些组件最终来自互联网的各个地方,但如何找到它们是个问题。
集成构建环境的优势在于能将所有组件整合到一处,有人已经完成了在网上查找这些组件并验证它们能否协同工作的任务。这些项目的共同特点是,完成配置过程后,它们会从互联网下载所需的源代码并构建指定的组件。这导致初始构建通常需要很长时间,后续修改则耗时较短,因为只需下载和重建少量代码。此外,它们都使用与内核相同的配置工具,并且有适用于 Eclipse 的插件。
3. Buildroot
Buildroot 可能是最简单的集成构建环境,它由一组 Makefile、脚本和补丁组成,可以构建嵌入式 Linux 系统的所有元素,或者其中任意组合。Buildroot 可以自动构建所需的交叉编译工具链、创建根文件系统、编译 Linux 内核映像以及为目标嵌入式系统构建引导加载程序,也可以独立执行这些步骤。
与内核不同,Buildroot 的
make help
不会列出它能构建的默认配置,而是有一个
make list - defconfigs
目标,并且确实有 BeagleBone 的默认配置。操作步骤如下:
1. 执行
make beaglebone_defconfig
。
2. 执行
make xconfig
。
Buildroot 提供了使用现有工具链而非从源代码构建新工具链的选项。在“Toolchain”类别中,选择
Custom toolchain
和
Pre - installed toolchain
,可以设置工具链路径(因为工具链已在
PATH
中),并将工具链前缀设置为
arm - unknown - linux - gnueabi
。
外部工具链的 GCC 版本很可能是 4.9.x,之前构建的内核版本是 3.8.13,但实际上 4.1.x 之前的版本大多不再受支持,选择这些版本会导致构建失败。所以,即使已经有 Linux 内核源代码树,若要使用 Buildroot,也必须选择它提供的内核之一。
Buildroot 配置的其余部分大多涉及选择要安装在目标设备上的软件包,由于大多数实用程序将由 Busybox 提供,所以这里无需选择太多。在菜单底部,可以选择生成哪种类型的文件系统映像以及是否使用压缩,还可以配置引导加载程序。完成配置后,保存配置并运行
make
,构建完成后,内核、引导加载程序和文件系统映像将出现在
output/images/
目录中。
4. Open Embedded
Open Embedded(简称 OE)可能是首个真正的集成构建环境,其原始实现(现称为 OpenEmbedded - Classic)已进行了大幅改进。该项目最初是由多个支持运行 Linux 的个人数字助理的项目合并而成,包括 OpenZaurus、Familiar Linux 和 OpenSIMpad。
当前的 OE 版本称为 OpenEmbedded - Core(简称 OE - Core),是与 Yocto 项目合并的结果。尽管 OE - Core 仍是一个活跃的项目,但大部分开发工作在 Yocto 项目的框架下进行,最新的文档也存放在那里。
需要注意的是,OE - Core 会占用大量磁盘空间,Yocto 项目建议至少需要 50GB 的可用空间,且这些空间必须在同一个分区。
OE - Core 基于用 Python 编写的构建工具 BitBake,其操作流程如下:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
ConfigFiles([配置文件]):::process -->|解析| BitBake(位烘焙):::process
Recipes([配方]):::process -->|解析| BitBake
BitBake -->|获取| SourceCode([源代码]):::process
BitBake -->|构建| Packages([软件包]):::process
BitBake -->|生成| FilesystemImages([文件系统映像]):::process
BitBake 现在是 Yocto 项目的一个子项目,OE - Core 本身是一组基础的配方、类和相关文件,旨在供许多不同的基于 OpenEmbedded 的系统共享。
安装 OE - Core 的步骤如下:
1. 确保安装了所有必需的软件包。在 CentOS 下安装时,所需的完整软件包列表如下:
- bzip2
- chrpath
- cpp
- diffstat
- diffutils
- gawk
- gcc
- gcc - c11
- git
- glibc - devel
- gzip
- make
- patch
- perl
- python
- SDL - devel
- tar
- texinfo
- unzip
- wget
- xterm
实际上,大多数软件包在最初安装 CentOS 时就已安装,若有缺失,可使用以下命令安装(需以 root 身份运行):
```bash
yum install texinfo chrpath SDL - devel
```
由于 CentOS 仓库中的 Python 版本对于 OE - Core 来说太旧,需要从 Python 网站下载并安装 Python3,具体安装说明可参考 README 文件。
-
从主目录执行以下命令安装 OE - Core:
bash git clone git://git.openembedded.org/openembedded - core oe - core cd oe - core git clone git://git.openembedded.org/bitbake bitbake git checkout pyro cd bitbake git checkout 1.34 cd..
可以发现 OE - core 比 Buildroot 大得多,大约为 123MB,而 Buildroot 仅为 17MB。 -
执行以下命令初始化构建环境:
bash source oe - init - build - env [build_dir]
通常,shell 每次执行命令或脚本时都会生成一个新进程,而source命令会使脚本在当前 shell 环境中执行。可选参数build_dir是oe - core/的子目录,用于存放构建过程中创建的所有文件,默认值为build/。此脚本会创建几个带有默认值的配置文件,创建并切换到build/目录,并向PATH环境变量添加一些条目。执行echo $PATH可以看到开头新增了三个条目。如果要经常使用 OE - Core,建议将这些条目添加到.bash_profile文件的PATH定义中,否则每次使用 OE - Core 时都需要运行oe - init - build - env脚本。 -
查看并配置
build/conf/local.conf文件。该文件为构建的映像提供通用配置,文件中有详细的注释说明每个变量。第一个变量是MACHINE,用于指定要构建映像的目标机器,所有可能的选项都以注释形式列出,包括几个 QEMU 目标和一些特定的硬件目标,默认值是qemux86,即运行在 QEMU(一个开源多平台模拟器)下的 32 位英特尔架构。
接下来指定了一些目录,默认值是TOPDIR(即build/目录)的子目录:-
DL_DIR:下载的源软件包存储的位置。 -
SSTATE_DIR:共享状态文件存储的位置,可加快后续构建速度。 -
TMPDIR:构建输出存储的位置。
可以使用
PACKAGE_CLASSES变量指定要使用的软件包管理格式,除非是为“debian 风格”的发行版构建,否则建议选择rpm。保存local.conf文件后,就可以构建交叉工具链和一组映像了。
5. OE - Core 提供了一组预定义的目标,可用于构建自定义映像。可以通过以下命令查看完整的映像目标列表:
bash ls../meta*/recipes*/images/*.bb
要构建core - image - minimal映像,只需执行:
bash bitbake core - image - minimal -
5. OE 元数据
在映像构建过程中,可以探索 OE 元数据。驱动 BitBake 的元数据由配方和配置文件组成,配方文件的扩展名为
.bb
,配置文件的扩展名为
.conf
,所有这些元数据都存放在
meta/
子目录中。尽管从
meta/
的目录结构不太容易看出,但配方分为四个层次结构类别:
-
Image
(映像):层次结构的顶层,映像配方定义了特定根文件系统映像中包含的内容,列出了组成映像的任务。例如
meta/recipes - core/images/core - image - minimal.bb
安装了一个任务
packagegroup - core - boot
,可能还包括
CORE_IMAGE_EXTRA_INSTALL
中定义的其他任务,并且继承了一个名为
core - image
的类,类文件的扩展名为
.bbclass
,存放在
meta/classes/
目录中。
-
Task
(任务):任务配方通常表示软件包的集合,许多任务配方的名称以
packagegroup - *
开头。例如
packagegroup - core - boot.bb
声称是“启动系统所需的最小软件包集合”,它继承了一个名为
packagegroup
的类。
-
Package
(软件包):软件包配方管理单个软件包的特定需求,通常在名称后面会附加版本号。例如
meta/recipes - core/sysvinit/sysvinit_2.88dsf.bb
会标识软件包在网络上的位置、许可条款、所需文件等信息。
-
Class
(类):类配方与其他配方是并列关系,而不是层次关系。它们用于提取可重用的通用配方元素,通过
inherit
命令实现重用。类最常见的用途是继承常用构建工具(如 GNU 自动工具)的函数或部分配方。例如
meta/classes/core - image.bbclass
又继承了
image.bbclass
。
6. 测试新映像
OE - Core 包含一个名为 QEMU(Quick EMUlator)的工具,它是一个开源项目,可模拟多种不同的机器架构。之前构建的映像是用于在 QEMU 下运行的 x86 架构,名为
qemux86
,要测试该映像,只需执行:
runqemu qemux86
不过,有人认为 Open Embedded 及其相关的 Yocto 项目过于庞大、复杂和晦涩,学习曲线比 Linux 本身还要陡峭。对于不熟悉 OE 的开发团队,可能需要至少几周时间才能达到中等熟练程度。而且很难看出如何修改
meta/
目录下的 4000 多个文件来对根文件系统映像进行有意义的更改,并且似乎没有图形化的配置工具。
7. Yocto 项目
Yocto 项目是 Linux 基金会的一个合作项目,目标是开发出有助于为嵌入式软件创建独立于底层架构的 Linux 发行版的工具和流程。该项目于 2010 年由 Linux 基金会宣布启动,并于 2011 年 3 月与 Open Embedded 合作创建了 OpenEmbedded - Core 项目。Yocto 对 OE - Core 的参考实现称为 Poky(发音为 PAH - kee,而非 POH - kee)。
Yocto 似乎比 OE - Core 更全面,其工作流程大致如下(简化示意):从需求分析开始,经过配置选择、下载源代码、构建组件、生成映像,最终得到可部署的嵌入式 Linux 发行版,各个环节相互关联、逐步推进。
Poky 构建系统有两种获取形式:作为 git 仓库或单个 Bzip 文件。可以在主目录下执行以下操作之一:
- 作为 git 仓库:
bash
git clone -b pyro git://git.yoctoproject.org/poky.git
git checkout pyro
- 作为 Bzip 文件:从 Yocto 项目下载页面下载
poky - pyro - 17.0.0.tar.bz2
并解压,为方便起见,将解压后的目录重命名为
poky
。
这次要为 BBB 构建映像,需要编辑
poky/build/local.conf
文件来更改目标机器。找到
#MACHINE ?= "beaglebone"
这一行,去掉开头的井号,然后保存文件。
构建映像的过程与 OE - Core 非常相似,首先需要初始化构建环境:
source oe - init - build - env
然后构建一个更复杂一些的映像:
bitbake core - image - full - cmdline
8. 使用 Yocto 进行应用开发
到目前为止,主要讨论了构建引导加载程序、内核、根文件系统和工具链,但应用开发可能才是主要目标。Yocto 项目包含一个软件开发工具包(SDK),旨在简化应用开发。
SDK 的主要特性包括:
- 包含编译器、调试器、QEMU 和其他杂项工具的交叉工具链。
- 库、头文件和符号。
- Eclipse 插件。
Yocto 为支持的每种架构都提供了单独的 SDK,这些 SDK 以非常大(约 200MB)的 shell 脚本形式分发。操作步骤如下:
1. 访问 Yocto 下载页面,导航到
releases/yocto/yocto - 2.3//toolchain
,如果工作站是 32 位的,选择
i686
;如果是 64 位的,选择
x86_64
。下载
poky - glibc - x86_64 - core - image - minimal - cortexa8hf - neon - toolchain - ext - 2.3.sh
文件,需要对该文件执行
chmod +x
命令以使其可执行。
2. SDK 的默认安装位置是
/opt/poky/2.3
,可以通过
-d
选项指定不同的安装位置。安装完成后,需要运行以下命令来设置环境:
bash
source environment - setup - cortexa8hf - neon - poky - linux - gnueabi
Yocto 的 Eclipse 插件仅适用于 Eclipse 的 Neon 版本(注意脚本文件名中的
neon
),其安装步骤与之前版本有所不同:
1. 访问 Eclipse 网站,下载“installer”压缩包。
2. 解压该压缩包。
3. 进入
eclipse - installer
目录。
4. 运行
eclipse - inst
。
5. 选择“Eclipse for C/C++ Developers”。
6. 指定安装文件夹。
7. 点击“Install”。
在安装 Yocto 插件之前,需要先安装几个 Eclipse 插件,步骤如下:
1. 从“Help”菜单中选择“Install New Software”。
2. 在“Work with”下拉菜单中选择“Neon — http://download.eclipse.org/releases/neon”。
3. 展开“Linux tools”。
4. 勾选以下两个条目:“C/C++ Remote (Over TCF/TE) Run/Debug Launcher” 和 “TM terminal”。
5. 展开“Mobile and Device Development”,并勾选以下选项:
- “C/C++ Remote (Over TCF/TE) Run/Debug Launcher”
- “Remote System Explorer User Actions”
- “TCF Remote System Explorer add - in”
综上所述,嵌入式 Linux 开发中的集成构建环境为开发者提供了便利,但不同的工具各有特点和挑战。Buildroot 简单易用,适合初学者快速搭建环境;Open Embedded 功能丰富但较为复杂,需要一定的学习成本;Yocto 项目则更加全面,在应用开发方面有较好的支持。开发者可以根据自己的需求和技术水平选择合适的工具。
嵌入式Linux集成构建环境介绍
9. 不同集成构建环境对比
为了更清晰地了解 Buildroot、Open Embedded(OE - Core)和 Yocto 项目这三种集成构建环境的特点,下面通过表格进行对比:
| 特性 | Buildroot | Open Embedded(OE - Core) | Yocto 项目 |
| — | — | — | — |
| 复杂度 | 相对简单,由一组 Makefile、脚本和补丁组成 | 较为复杂,涉及大量文件和配置 | 较为复杂,功能全面 |
| 磁盘空间占用 | 较小,约 17MB | 较大,约 123MB,且至少需 50GB 可用空间 | 较大,SDK 约 200MB |
| 构建速度 | 初始构建和修改后构建相对较快 | 初始构建慢,后续修改若涉及共享状态可能较快 | 初始构建慢,后续修改速度视情况而定 |
| 配置工具 | 有
make xconfig
等 | 无明显图形化配置工具 | 结合 SDK 和 Eclipse 有一定开发配置支持 |
| 功能全面性 | 可构建基本嵌入式 Linux 系统元素 | 功能较丰富,有大量预定义目标和元数据管理 | 非常全面,支持独立于底层架构的发行版创建及应用开发 |
| 学习曲线 | 较平缓,适合初学者 | 较陡峭,开发团队需数周达到中等熟练程度 | 较陡峭,但有 SDK 辅助应用开发 |
从表格可以看出,不同的集成构建环境在复杂度、磁盘空间占用、构建速度、配置工具、功能全面性和学习曲线等方面存在差异。开发者可以根据项目的规模、自身技术水平和具体需求来选择合适的构建环境。
10. 集成构建环境的应用场景分析
不同的集成构建环境适用于不同的应用场景,以下是具体分析:
-
Buildroot
-
小型项目
:对于资源有限、功能需求相对简单的小型嵌入式项目,Buildroot 简单的结构和快速的构建速度使其成为理想选择。例如,一些简单的传感器数据采集设备,只需要基本的内核、根文件系统和少量应用程序,使用 Buildroot 可以快速搭建开发环境。
-
初学者学习
:由于其易于理解和操作,非常适合初学者入门嵌入式 Linux 开发。初学者可以通过 Buildroot 快速熟悉嵌入式系统的构建流程,掌握基本的配置和编译技巧。
-
Open Embedded(OE - Core)
-
大型复杂项目
:对于功能丰富、涉及多种软件包和组件的大型嵌入式项目,OE - Core 的强大功能和丰富的预定义目标可以满足复杂的需求。例如,工业自动化设备、智能车载系统等,需要集成大量的驱动程序、库和应用程序,OE - Core 可以有效地管理和构建这些组件。
-
定制化开发
:OE - Core 的元数据管理机制允许开发者对系统进行深度定制,根据不同的硬件平台和应用需求灵活调整配置。对于需要定制化根文件系统和软件包的项目,OE - Core 提供了很大的灵活性。
-
Yocto 项目
-
跨平台开发
:Yocto 项目的目标是创建独立于底层架构的 Linux 发行版,非常适合跨平台开发。开发者可以使用 Yocto 为不同的硬件平台(如 ARM、x86 等)构建统一的开发环境,提高开发效率和代码的可移植性。
-
应用开发为主的项目
:Yocto 项目提供的软件开发工具包(SDK)和 Eclipse 插件,为应用开发提供了便利。对于以应用开发为主要目标的嵌入式项目,如智能终端应用开发、物联网应用开发等,Yocto 可以帮助开发者快速搭建开发环境,进行高效的应用开发和调试。
11. 集成构建环境的未来发展趋势
随着嵌入式系统应用的不断拓展和技术的不断进步,集成构建环境也呈现出一些未来发展趋势:
-
智能化和自动化
:未来的集成构建环境将更加智能化和自动化,能够自动检测系统需求、选择合适的组件和配置,减少开发者的手动干预。例如,根据硬件平台的特性自动选择最佳的编译器和优化选项,提高系统的性能和稳定性。
-
云集成
:与云计算技术的结合将成为趋势。开发者可以利用云端的强大计算资源进行大规模的构建和测试,提高开发效率。同时,云平台还可以提供软件包的共享和版本管理服务,方便团队协作开发。
-
生态系统整合
:集成构建环境将更加注重与其他开发工具和平台的整合,形成完整的开发生态系统。例如,与版本控制系统、持续集成/持续部署(CI/CD)工具的紧密集成,实现代码的快速迭代和自动化部署。
-
安全增强
:随着嵌入式系统安全问题的日益突出,集成构建环境将加强对安全的支持。例如,提供安全漏洞检测、加密算法集成等功能,确保嵌入式系统的安全性。
12. 总结与建议
在嵌入式 Linux 开发中,集成构建环境是提高开发效率和质量的重要工具。Buildroot、Open Embedded(OE - Core)和 Yocto 项目各有优缺点,开发者需要根据项目的具体需求和自身技术水平来选择合适的工具。
如果是初学者或者小型项目,建议优先考虑 Buildroot,它简单易用,可以帮助快速入门和搭建基本环境。对于大型复杂项目和需要深度定制的开发,Open Embedded(OE - Core)是一个不错的选择,但需要投入一定的时间和精力来学习和掌握。而对于跨平台开发和以应用开发为主的项目,Yocto 项目凭借其全面的功能和对应用开发的支持,将是更好的选择。
同时,开发者在使用集成构建环境时,要关注其未来发展趋势,不断学习和掌握新的技术和功能,以适应不断变化的嵌入式市场需求。在实际开发过程中,还可以结合不同工具的优势,灵活运用,提高开发效率和系统的质量。
以下是一个简单的流程图,展示了选择集成构建环境的基本思路:
graph TD
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
Start(开始):::process --> ProjectSize{项目规模大小}:::process
ProjectSize -- 小型 --> Experience{开发者经验}:::process
Experience -- 初学者 --> Buildroot(选择 Buildroot):::process
Experience -- 有经验 --> Consider{是否需定制}:::process
Consider -- 否 --> Buildroot
Consider -- 是 --> OE(选择 Open Embedded):::process
ProjectSize -- 大型 --> Function{功能需求复杂度}:::process
Function -- 复杂 --> OE
Function -- 一般 --> Yocto{是否跨平台或重应用开发}:::process
Yocto -- 是 --> YoctoProject(选择 Yocto 项目):::process
Yocto -- 否 --> OE
通过以上的分析和建议,希望能帮助开发者在嵌入式 Linux 开发中更好地选择和使用集成构建环境,提高开发效率和项目的成功率。
超级会员免费看
1万+

被折叠的 条评论
为什么被折叠?



