Buildroot

一、什么是 Buildroot

二、获取与配置

git clone https://git.buildroot.net/buildroot
cd buildroot

# 选择 defconfig
make raspberrypi4_64_defconfig
make imx6ull_myboard_defconfig      # 自己提供
make qemu_aarch64_virt_defconfig

# 自定义
make menuconfig

三、目录结构

buildroot/
├── board/                板级支持(自定义配置、rootfs overlay)
├── boot/                 boot loader
├── configs/              defconfig
├── docs/                 文档
├── fs/                   文件系统制作
├── linux/                内核 patch(运行下载的缓存)
├── output/               输出目录
│   ├── build/            各个包源码
│   ├── host/             主机工具
│   ├── images/           最终镜像
│   ├── staging/          sysroot
│   └── target/           目标 rootfs
├── package/              软件包(busybox、systemd、...)
├── system/               系统框架(skeleton)
├── toolchain/            工具链
├── utils/                辅助
├── Config.in
├── Makefile
└── README

四、核心配置项

make menuconfig

Target options

Build options

Toolchain

System configuration

Kernel

Target packages

Filesystem images

五、自定义

1. 板级文件

board/myvendor/myboard/
├── kernel-patches/
├── linux.config              # 覆盖内核 config
├── busybox.config            # busybox 配置
├── readme.txt
├── rootfs_overlay/           # 覆盖 rootfs(直接 cp 过去)
│   ├── etc/
│   ├── usr/
│   └── ...
├── post_build.sh             # 编译后脚本
├── post_image.sh             # 生成镜像后脚本
└── myboard_defconfig         # defconfig(放 configs/)

2. 自定义 defconfig

make myboard_defconfig
cp .config configs/myboard_defconfig

3. 内核补丁

# board/myvendor/myboard/kernel-patches/
0001-my-driver.patch

4. post_build.sh

#!/bin/sh
# 添加自定义文件
cp ${BOARD_DIR}/my_config $TARGET_DIR/etc/
# 设置权限
chmod 755 $TARGET_DIR/etc/init.d/S99myapp

六、编译

make myboard_defconfig
make -j$(nproc)

# 输出
ls output/images/
├── rootfs.ext4              # ext4 镜像
├── rootfs.tar
├── rootfs.cpio.gz
├── vmlinux
├── zImage / uImage / Image
├── myboard.dtb
└── sdcard.img               # 完整 SD 卡镜像(部分板级)

七、清理与重编

make clean                    # 清 build/
make distclean                # 完全清空
make mypackage-dirclean       # 单个包清
make mypackage-rebuild        # 单个包重编
make linux-rebuild
make busybox-rebuild

八、外部工具链

如果已经有工具链:

Toolchain --->
    [*] External toolchain
    Toolchain path: /opt/gcc-arm-9.3
    Toolchain prefix: arm-linux-gnueabihf
    External toolchain C library: (glibc) / (musl)

九、自定义软件包

1. 使用 Buildroot 包系统

package/myapp/
├── Config.in
├── myapp.mk
└── myapp-1.0.tar.gz

2. Config.in

config BR2_PACKAGE_MYAPP
    bool "myapp"
    depends on BR2_PACKAGE_LIBUV
    help
      My awesome application.
      https://example.com/myapp

3. myapp.mk

MYAPP_VERSION = 1.0
MYAPP_SITE = /path/to/source
MYAPP_SITE_METHOD = local
MYAPP_LICENSE = GPL-2.0
MYAPP_LICENSE_FILES = COPYING
MYAPP_DEPENDENCIES = libuv
MYAPP_CONF_OPTS = -DCMAKE_BUILD_TYPE=Release

define MYAPP_BUILD_CMDS
    $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
endef

define MYAPP_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/myapp $(TARGET_DIR)/usr/bin/myapp
endef

$(eval $(generic-package))

十、典型流程

# 1. 配置
make myboard_defconfig
make menuconfig

# 2. 编译
make -j$(nproc)

# 3. 测试
sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress

# 4. 调整
make mypackage-rebuild
make

十一、与 U-Boot、内核关系

Buildroot 同时构建:
- toolchain
- bootloader(U-Boot)
- kernel
- rootfs
- 镜像

一键完成。

十二、文档