Buildroot制作文件系统

目录结构介绍

.
├── arch  		# CPU架构配置,在制作工具链时,编译uboot和kernel时很关键
├── board 		# 和具体板子相关,比如这里存放overlay 和 post-script 下面会介绍
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs 	# 默认配置,如执行的 make imx6ull_ebf_pro_defconfig
├── COPYING
├── DEVELOPERS
├── dl      	# 存放下载的源代码及应用软件的压缩包,很慢下载 
├── docs 
├── fs			# 放各种文件系统的源代码. 
├── linux		# 存放着Linux kernel的自动构建脚本. 
├── Makefile
├── Makefile.legacy
├── output	 	# 是编译出来的输出文件夹. 
│   ├── build	# 存放解压后的各种软件包编译完成后的现场.
│   ├── host 	# 存放着制作好的编译工具链,如gcc、arm#linux#gcc等工具.
│   ├── images 	# 存放编译好的uboot.bin, zImage, rootfs等镜像,可烧写到板子里, 让linux系统跑起来.
│   ├── staging
│   └── target 	# 制作rootfs文件系统,放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件
├── package 	# 下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
└── toolchain

编译命令

Cleaning:
  clean                  # 刪除 build目錄下的所有文件
  distclean              # 删除 所有非buildroot源码的文件,如build、dl、.config 等文件

Build:
  all                    # 编译所有
  toolchain              # 单独编译工具链

Configuration:
  menuconfig             # 对整个buildroot进行配置
  savedefconfig          # 保存.config 为 configs/xxx_defconfig 生成的defconfig文件精简易读

Package-specific
  <pkg>                  # 编译和安装pkg 包括它的依赖
  <pkg>-source           # 仅仅下载pkg源码文件到dl目录下
  <pkg>-extract          # 解压pkg 到build目录下
  <pkg>-patch            # 为pkg打补丁
  <pkg>-depends          # 编译pkg 所有的依赖
  <pkg>-configure        # 运行configure命令(如果有的的话) 进行软件包的配置
  <pkg>-build            # 运行编译命令
  <pkg>-show-depends     # List packages on which <pkg> depends
  <pkg>-show-rdepends    # List packages which have <pkg> as a dependency
  <pkg>-graph-depends    # Generate a graph of <pkg>'s dependencies
  <pkg>-graph-rdepends   # Generate a graph of <pkg>'s reverse dependencies
  <pkg>-dirclean         # 清除对应pkg build目录下编译目录
  <pkg>-reconfigure      # Restart the build from the configure step
  <pkg>-rebuild          # 重新单独编译对应 pkg

busybox:
  busybox-menuconfig     # 运行 BusyBox menuconfig
  busybox-build			 # 编译busybox
  busybox-rebuild		 # 重新编译busybox

uclibc:
  uclibc-menuconfig      # 运行 uClibc menuconfig

linux:
  linux-menuconfig       # 运行 Linux kernel menuconfig 
  linux-savedefconfig    # Run Linux kernel savedefconfig
  linux-update-defconfig # Save the Linux configuration to the path specified
                             by BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE
  linux-build			 # 编译linux
  linux-rebuild			 # 重新编译linux

uboot:	
 uboot-menuconfig		# 配置uboot
 uboot-build			# 编译uboot
 uboot-rebuild			# 重新编译uboot

Documentation:
  manual                 # build manual in all formats
  manual-pdf             # build manual in PDF
  graph-build            # 对编译时间、编译依赖、文件系统大小生成图标
  graph-depends          # generate graph of the dependency tree
  graph-size             # generate stats of the filesystem size

Finalizing target 机制

在buildroot编译的末期,需要对编译结果进行一些检查或者其他操作。Buildroot预留了三个接口:

  • FS Overlay:BR2_ROOTFS_OVERLAY

    指向一个目录,目录中存放自己定义的启动脚本配置和预先编译好的库等文件,会替换buildroot生成的文件系统中同路径下的同名文件,这样在最后文件系统打包的时候,最终生效的BR2_ROOTFS_OVERLAY里面的文件

  • Post Build:BR2_ROOTFS_POST_BUILD_SCRIPT

    指向一个脚本文件,更加复杂的对文件进行删除、重命名、strip等等功能,在创建文件系统镜像前调用

  • Post Image:BR2_ROOTFS_POST_IMAGE_SCRIPT

    指向一个脚本文件,对最终生成的images进行打包处理等

FS Overlay

举例如下:

../../_images/image-20221123214202732.png

而【board/embedfire/ebf-imx6ull-pro/rootfs-overlay】目录下存放的就是自己写的一些脚本和提前编译好的库或者驱动模块,这样buildroot在打包文件系统的时候,会把该目录下的所有文件替换busybox生成的文件系统同名文件。

../../_images/image-20221123215329277.png

Post Build

Post image在post build之后,更倾向于生成完整的release文件。包括进行一些images打包、debug文件打包等等

.PHONY: target-post-image
target-post-image: $(TARGETS_ROOTFS) target-finalize
    @$(foreach s, $(call qstrip,$(BR2_ROOTFS_POST_IMAGE_SCRIPT)), \
        $(call MESSAGE,"Executing post-image script $(s)"); \
        $(EXTRA_ENV) $(s) $(BINARIES_DIR) $(call qstrip,$(BR2_ROOTFS_POST_SCRIPT_ARGS))$(sep))

Post Image

举例说明

../../_images/image-20221123214935372.png

而【board/freescale/common/imx/post-image.sh】目录下存放是fsl官方的脚本,用来生成最终的image

../../_images/image-20221123220037319.png