按:Buildroot是一套自动化构建Linux系统的超级编译工具链,本节目标是深度打造buildroot构建系统。buildroot构建系统开发,需要对软件包配置、Buildroot工作原理、代码风格、相关文档需要相当的了解,开启我们的探索之旅。

❉ 添加软件包到Buildroot

Buildroot有复杂的软件包管理框架。Buildroot将要构建的每个软件组件都具有自己的构建系统。提供多种知名的构建系统:手写的Makefile或Shell脚本,自动工具,Meson,CMake等编译工具。Buildroot支持多种知名的构建系统。

buildroot 选择SYSTEMD_cmake-package


图-X Buildroot多种知名的构建系统

如何将新软件包(应用程序)集成到Buildroot中。 它还显示了如何集成现有软件包,这是解决问题或调整其配置所必需的。一般软件包需要具有以下目录结构:

buildroot.git/package/ffmpeg$ ls
Config.in  ffmpeg.hash  ffmpeg.mk

❉❉ Config.in文件

对于目标上使用的软件包,创建一个名为Config.in的文件。该文件将包含与我们的libfoo软件相关的选项说明,这些选项说明将在配置工具中使用和显示。Config.in文件的语法与内核Kconfig文件的语法相同。有关此语法的文档,请访问http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt

作为特定于Buildroot的约定,属性的顺序如下:
● 选项的类型:布尔值,字符串…,并提示
● 如果需要,默认值
● 对目标的任何依赖都取决于形式
● 对工具链的任何依赖都取决于形式
● 对其他软件包的任何依赖都取决于形式
● 选择形式的任何依赖性
● 帮助关键字和帮助文本。

程序包的依赖关系
buildroot 使用kconfig系统的depends on和 select语法解决程序包依赖问题。使用select和depends解决依赖的代码实例。

config BR2_PACKAGE_RRDTOOL
        bool "rrdtool"
        depends on BR2_USE_WCHAR
        select BR2_PACKAGE_FREETYPE
        select BR2_PACKAGE_ZLIB
        help
          RRDtool is the OpenSource industry standard, high performance
          data logging and graphing system for time series data.

          http://oss.oetiker.ch/rrdtool/

comment "rrdtool needs a toolchain w/ wchar"
        depends on !BR2_USE_WCHAR

工具链选项的依赖关系
许多软件包取决于工具链的某些选项:C库的选择,C ++支持,线程支持,RPC支持,wchar支持或动态库支持。必须使用Config.in文件中的适当的depends语句来表达这些依赖关系。一言难尽,请看文档:https://buildroot.org/downloads/manual/manual.html#_config_files

❉❉ 基于CMake的程序包的基础结构

cmake-package示例

LIBFOO_VERSION = 1.0
LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz
LIBFOO_SITE = http://www.foosoftware.org/download
LIBFOO_INSTALL_STAGING = YES
LIBFOO_INSTALL_TARGET = NO
LIBFOO_CONF_OPTS = -DBUILD_DEMOS=ON
LIBFOO_DEPENDENCIES = libglib2 host-pkgconf

$(eval $(cmake-package))

cmake-package参考
CMake软件包基础结构的主要宏是cmake-package。 它类似于通用包宏。 还可以通过host-cmake-package宏使用目标软件包和主机软件包。就像通用基础结构一样,CMake基础结构通过在调用cmake-package宏之前定义多个变量来工作。首先,通用基础架构中存在的所有程序包元数据信息变量也存在于CMake基础架构中:LIBFOO_VERSION,LIBFOO_SOURCE,LIBFOO_PATCH,LIBFOO_SITE,LIBFOO_SUBDIR,LIBFOO_DEPENDENCIES,LIBFOO_INSTALL_STAGING,LIBFOO_INSTALL_TARGET。

还可以定义一些特定于CMake基础结构的其他变量。 它们中的许多仅在非常特定的情况下才有用,因此典型的软件包将仅使用其中的一些。

❉ Buildroot如何工作

如上所述,Buildroot基本上是一组Makefile,可以使用正确的选项下载,配置和编译软件。它还包括各种软件包的补丁-主要是交叉编译工具链(gcc,binutils和uClibc)中涉及的软件包。

每个软件包基本上只有一个Makefile,并且以.mk扩展名命名。 Makefile分为许多不同的部分。

● toolchain /目录包含Buildroot的交叉编译工具链和关联文件:binutils,gcc,gdb,kernel-headers和uClibc。
● arch /目录包含Buildroot支持的所有处理器体系结构的定义。
● package /目录包含Buildroot可以编译的所有用户空间工具和库的Makefile和相关文件。
● linux /目录包含Linux内核的Makefile和相关文件。
● boot /目录包含Buildroot支持的Bootloader的Makefile和相关文件。
● system /目录包含对系统集成的支持,例如目标文件系统框架和初始化系统的选择。
● fs /目录包含与目标根文件系统映像的生成相关的软件的Makefile和相关文件。

每个目录至少包含2个文件:
● something.mk是用于下载,配置,编译和安装软件包的Makefile。
● Config.in是配置工具描述文件的一部分。它描述了与软件包有关的选项。

主Makefile执行以下步骤(一旦完成配置):
● 在输出目录中创建所有输出目录:staging,target,build等。
● 生成工具链目标。当使用内部工具链时,这意味着生成交叉编译工具链。
● 生成TARGETS变量中列出的所有目标。

❉ 代码风格

总体而言,这些编码样式规则可以帮助您在Buildroot中添加新文件或重构现有文件。如果您稍微修改一些现有文件,那么重要的是保持整个文件的一致性。代码风格对个人来说是束缚,对团队来说是效率武器,请给与适当的重视。

❉ Buildroot文档

该文档使用asciidoc格式。有关asciidoc语法的更多详细信息,请参见http://www.methods.co.nz/asciidoc/userguide.html。

❉ 参考文献

https://buildroot.org/downloads/manual/manual.html# https://bootlin.com/doc/training/buildroot/buildroot-slides.pdf