0%

Buildroot使用指南

Buildroot工具的使用指南,包括系统构建、交叉编译、定制化配置等内容。

在使用Buildroot构建嵌入式Linux系统时,BR2_EXTERNAL是一个重要的机制,它允许用户将自定义的配置、包(packages)、板级支持包(board support packages,简称BSPs)、以及其他构建脚本和文件集成到Buildroot构建过程中,而不必直接修改Buildroot的主树。这种机制非常有用,因为它使得维护自定义修改和跟踪Buildroot官方更新变得更加容易。

使用BR2_EXTERNAL的优势

  • 模块化:允许将自定义内容和Buildroot主树分开,便于管理。
  • 易于维护:更新Buildroot版本时,可以避免合并冲突,简化维护工作。
  • 重用性:相同的自定义配置和包可以轻松地在多个项目之间共享和重用。

如何使用BR2_EXTERNAL

  1. 创建外部树结构:首先,你需要创建一个目录作为你的外部树,这个目录将包含你的自定义配置和文件。外部树的推荐目录结构如下:

    1
    2
    3
    4
    5
    6
    7
    8
    your-external-tree/
    ├── Config.in
    ├── external.desc
    ├── external.mk
    ├── configs/
    ├── board/
    ├── package/
    └── fs/

    其中configs/用于存放自定义的配置文件,package/用于存放自定义的软件包描述文件,board/可能包含板级特定文件,如启动脚本和覆盖层。

  2. 设置BR2_EXTERNAL环境变量:在运行Buildroot的make menuconfig之前,通过环境变量BR2_EXTERNAL指向你的外部树目录。这可以通过在命令行中直接设置,或者添加到你的shell配置文件中:

    1
    export BR2_EXTERNAL=/path/to/your-external-tree

    或者,在make命令中直接指定:

    1
    make BR2_EXTERNAL=/path/to/your-external-tree menuconfig
  3. 使用自定义配置和包:一旦设置了BR2_EXTERNAL,Buildroot构建系统将自动识别外部树中的配置和包。你可以在make menuconfig中选择这些包,或者使用外部树中定义的配置作为构建的起点。

  4. 构建系统:使用你的配置构建系统。如果一切设置正确,Buildroot将包含你的外部树中的自定义内容进行构建。

注意事项

  • 多个外部树:从Buildroot 2016.11版本开始,BR2_EXTERNAL支持指定多个外部树路径,使用冒号(:)分隔。
  • 版本兼容性:在使用BR2_EXTERNAL时,要确保外部树中的自定义内容与Buildroot的版本兼容。

通过使用BR2_EXTERNAL,你可以灵活地扩展Buildroot,添加自定义功能和支持,同时保持与Buildroot主树的清晰分离,这对于项目的长期维护和升级非常有益。

当使用BR2_EXTERNAL机制在Buildroot中引入外部树时,你需要在外部树的根目录创建一些特定的文件和目录来定义你的自定义配置、板级支持包、软件包和文件系统扩展。以下是如何组织和编写这些文件的一些基本指导:

1. Config.in

Config.in是一个Kconfig文件,它定义了在Buildroot配置界面中出现的选项。这个文件通常用来引入外部软件包的配置选项或者特定的配置界面。

1
2
3
4
5
6
7
8
menu "My Custom Options"

config BR2_PACKAGE_MY_CUSTOM_PACKAGE
bool "My custom package"
help
This option will enable my custom package.

endmenu

此文件中定义的选项可以在Buildroot的配置界面中找到,并允许用户启用或禁用特定功能。

2. external.desc

external.desc是Buildroot 2020.02版本后引入的新文件,用于描述外部树的元数据,如名称和描述。这个文件不是必需的,但有助于识别外部树。

1
2
name: my-external-tree
description: My custom external tree for Buildroot

3. external.mk

external.mk是Makefile片段,用于包含外部软件包的构建规则。这个文件会被Buildroot构建系统自动包含。

1
2
3
4
# Example of including a custom package
ifeq ($(BR2_PACKAGE_MY_CUSTOM_PACKAGE),y)
include package/my_custom_package/my_custom_package.mk
endif

4. configs/

configs/目录包含预定义的Buildroot配置文件,这些文件可以通过make <config_name>_defconfig命令使用。这些配置文件通常用于快速配置Buildroot以使用特定的板级支持包或软件包组合。

1
2
# Example of a custom defconfig file
BR2_PACKAGE_MY_CUSTOM_PACKAGE=y

5. board/

board/目录包含特定于板级的文件,如启动脚本、内核配置片段或根文件系统覆盖层。

6. package/

package/目录包含自定义软件包的描述和构建规则。每个软件包目录下通常包含两个文件:Config.in<package_name>.mk

1
2
3
4
5
# package/my_custom_package/Config.in
config BR2_PACKAGE_MY_CUSTOM_PACKAGE
bool "My custom package"
help
My custom package description.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# package/my_custom_package/my_custom_package.mk
MY_CUSTOM_PACKAGE_VERSION = 1.0
MY_CUSTOM_PACKAGE_SITE = $(TOPDIR)/path/to/my_custom_package/source
MY_CUSTOM_PACKAGE_LICENSE = GPL-2.0+

define MY_CUSTOM_PACKAGE_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" -C $(@D)
endef

define MY_CUSTOM_PACKAGE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/my_custom_package $(TARGET_DIR)/usr/bin
endef

$(eval $(generic-package))

7. fs/

fs/目录用于添加自定义文件系统支持。这里可以放置生成特定类型文件系统镜像的脚本和配置。

这些文件和目录为你提供了一个框架来扩展Buildroot,添加自定义板级支持、软件包和配置。确保遵循Buildroot的文档和现有的样板(boilerplate)代码来正确实现这些自定义扩展。