Featured image of post Buildroot 注解 1

Buildroot 注解 1

1. 项目客制化

用户可以自定义的内容有:

  • 配置 Buildroot,即 make menuconfig 的内容
  • 配置其他组件,即 make linux-menuconfig、make busybox-menuconfig 等等
  • 自定义已生成的文件系统:
    • 添加或覆盖目标板文件系统的文件(通过宏 BR2_ROOTFS_OVERLAY
    • 修改或删除目标板文件系统的文件(通过宏 BR2_ROOTFS_POST_BUILD_SCRIPT
    • 在生成镜像文件前运行任意命令(通过宏 BR2_ROOTFS_POST_BUILD_SCRIPT
    • 修改文件权限和所属关系(通过宏 BR2_ROOTFS_DEVICE_TABLE
    • 添加自定义设备节点(devices node)(通过宏 BR2_ROOTFS_STATIC_DEVICE_TABLE
  • 添加自定义用户账户(通过宏 BR2_ROOTFS_USERS_TABLES
  • 在生成镜像文件后运行任意命令(通过宏 BR2_ROOTFS_POST_IMAGE_SCRIPT
  • 为某些软件包打补丁(通过宏 BR2_GLOBAL_PATCH_DIR
  • 添加自定义软件包

2. 官方推荐目录结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
+-- board/
|   +-- <company>/
|       +-- <boardname>/
|           +-- linux.config
|           +-- busybox.config
|           +-- <other configuration files>
|           +-- post_build.sh
|           +-- post_image.sh
|           +-- rootfs_overlay/
|           |   +-- etc/
|           |   +-- <some files>
|           +-- patches/
|               +-- foo/
|               |   +-- <some patches>
|               +-- libbar/
|                   +-- <some other patches>
|
+-- configs/
|   +-- <boardname>_defconfig
|
+-- package/
|   +-- <company>/
|       +-- Config.in (if not using a br2-external tree)
|       +-- <company>.mk (if not using a br2-external tree)
|       +-- package1/
|       |    +-- Config.in
|       |    +-- package1.mk
|       +-- package2/
|           +-- Config.in
|           +-- package2.mk
|
+-- Config.in (if using a br2-external tree)
+-- external.mk (if using a br2-external tree)
+-- external.desc (if using a br2-external tree)

2.1. 客制化内容

如果我们有多个相近的项目,可能会共用一些配置,我们不需要为每个项目都配置一遍相同的内容,可以使用以下结构进行配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
+-- board/
    +-- <company>/
        +-- common/
        |   +-- post_build.sh
        |   +-- rootfs_overlay/
        |   |   +-- ...
        |   +-- patches/
        |       +-- ...
        |
        +-- fooboard/
            +-- linux.config
            +-- busybox.config
            +-- <other configuration files>
            +-- post_build.sh
            +-- rootfs_overlay/
            |   +-- ...
            +-- patches/
                +-- ...

例如需要为 fooboard 的软件包打补丁,可以进行如下配置:
BR2_GLOBAL_PATCH_DIR="board/<company>/common/patches board/<company>/fooboard/patches"

这样的情况,会先为公共部分(common)的软件包打补丁,然后为目标板(fooboard)的软件包打补丁。

1
2
3
4
5
6
7
BR2_ROOTFS_OVERLAY
BR2_ROOTFS_POST_BUILD_SCRIPT
BR2_ROOTFS_DEVICE_TABLE
BR2_ROOTFS_STATIC_DEVICE_TABLE
BR2_ROOTFS_USERS_TABLES
BR2_ROOTFS_POST_IMAGE_SCRIPT
BR2_GLOBAL_PATCH_DIR

上述宏都可使用此方式配置,以空格分隔,Buildroot 将从左到右顺序执行。

3. 保存 Buildroot 配置文件

使用 make savedefconfig 命令可以保存当前 .config 文件为 defconfig 文件。也可使用 BR2_DEFCONFIG 参数指定保存的位置,如 make savedefconfig BR2_DEFCONFIG=<path-to-defconfig>

建议保存的位置为 configs/<boardname>_defconfig,保存在此位置的文件,可以被 make list-defconfigs 列处,并且可以使用 make <boardname>_defconfig 命令重新设为当前的待编译的配置文件。

4. 保存其他组件的配置文件

BusyBox、Linux kernel、U-Boot uClibc 等配置改变后,也需要保存。 对此,Buildroot 也提供了便捷的命令来保存这些文件的修改。

  • make linux-update-defconfig 命令会将 Linux kernel 的配置文件保存在宏 BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE 指定的位置
  • make busybox-update-config 命令会将 BusyBox 的配置文件保存在宏 BR2_PACKAGE_BUSYBOX_CONFIG 指定的位置
  • make uclibc-update-config 命令会将 uClibc 的配置文件保存在宏 BR2_UCLIBC_CONFIG 指定的位置
  • make barebox-update-defconfig 命令会将 BareBox 的配置文件保存在宏 BR2_TARGET_BAREBOX_CUSTOM_CONFIG_FILE 指定的位置
  • make uboot-update-defconfig 命令会将 U-Boot 的配置文件保存在宏 BR2_TARGET_UBOOT_CUSTOM_CONFIG_FILE 指定的位置

5. 客制化已经生成的文件系统

Buildroot 官方推荐两种方式客制化文件系统:Root filesystem overlaysPost-build scripts。两种可以组合使用。

  • Root filesystem overlays (BR2_ROOTFS_OVERLAY)
    Root filesystem overlays 是直接拷贝宏 BR2_ROOTFS_OVERLAY 指定路径下的文件至 rootfs 中的,并且是合并且覆盖的方式,即存在的文件会被替换,不存在的文件会被创建。版本控制文件(如:.git.svn.hg等)、.empty、以 ~ 结尾的文件将被排除,不进行拷贝。
    可以指定多个 rootfs overlay 目录,见 2.1. 客制化内容

  • Post-build scripts (BR2_ROOTFS_POST_BUILD_SCRIPT)
    Post-build scripts 是在 Buildroot 编译完所有的软件之后、生成 rootfs 镜像文件之前被执行的脚本。
    同样可以指定多个脚本执行。
    Buildroot 在执行这些脚本时,会传递一些参数进去:

    • BR2_ROOTFS_POST_SCRIPT_ARGS 指定的参数
    • $BR2_CONFIG Buildroot 配置文件 .config 的文件路径
    • $CONFIG_DIR Buildroot 配置文件 .config 的所在目录
    • $HOST_DIR 给目标板程序编写人员使用的工具的目录
    • $STAGING_DIR 目标板编写程序所需用到的头文件、库文件等的目录
    • $TARGET_DIR 目标板文件系统目录
    • $BUILD_DIR 编译过程中使用的临时目录
    • $BINARIES_DIR 二进制文件目录,即镜像文件所在的目录
    • $BASE_DIR output 的目录,通常情况下是 $BUILD_DIR 的上一级目录

还有三种官方不推荐的修改文件系统的方式:

  • 直接修改
  • 自定义文件系统骨架(skeleton) (BR2_ROOTFS_SKELETON_CUSTOM)
  • Post-fakeroot scripts (BR2_ROOTFS_POST_FAKEROOT_SCRIPT)

附1:文章修订记录

本博客所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
最后更新于 2023/07/20 19:44 CST
使用 Hugo 构建
主题 StackJimmy 设计