Buildroot 构建并打包特定包

本文详述了Buildroot的配置流程,包括使用外部工具链、优化编译选项、选择系统配置及目标包,展示了如何构建特定软件包,并提供了三种打包方法。同时,文章解决了编译过程中的常见错误,如-D_FILE_OFFSET_BITS冲突、Fortran与OpenMP支持缺失以及SSL证书过期问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载并编译 Buildroot

#获取 2024.02.x 分支存储库的副本
git clone https://gitlab.com/buildroot.org/buildroot.git -b 2024.02.x

cd buildroot

make imx6ullevk_defconfig

make menuconfig

#配置交叉编译工具链,移除 Kernel,Bootloaders, 多余的软件
→ Toolchain
	Toolchain type (External toolchain)  --->  #选择使用外部工具链
	Toolchain (Custom toolchain)  --->  #选择具体的外部工具链。"Custom toolchain" 表示用户可以指定自己的工具链
	Toolchain origin (Pre-installed toolchain)  --->  #工具链的来源。"Pre-installed toolchain" 意味着工具链已经安装在系统上。
	(/home/suifeng/work_4t/imx6ull/toolchain/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux) Toolchain path  #指定工具链的安装路径。
	($(ARCH)-linux-gnueabihf) Toolchain prefix  #工具链的前缀,用于确定交叉编译工具的命名
	External toolchain gcc version (4.9.x)  --->  #外部工具链使用的 GCC 版本
	External toolchain kernel headers series (3.1.x)  --->  #具链使用的内核头文件版本。
	External toolchain C library (glibc)  --->  #选择 C 标准库的类型(如 glibc)。
	[*] Toolchain has C++ support?  #工具链支持 C++
	[*] Toolchain has Fortran support?  #工具链是否支持 Fortran
	[*] Toolchain has OpenMP support?  #工具链是否支持 OpenMP
	
→ Build options
	($(CONFIG_DIR)/defconfig) Location to save buildroot config  #指定保存 Buildroot 配置文件的位置
	gcc optimization level (optimize for size)  --->   #GCC 编译器的优化等级,如优化大小或优化性能

→ System configuration
	Init system (None)  --->  #没有选择初始化系统,这意味着系统启动后不会自动运行任何 init 进程
	/dev management (Dynamic using devtmpfs only)  --->  #使用 devtmpfs 管理 /dev 目录
	/bin/sh (none)  --->  #没有为 /bin/sh 指定默认的 shell
	()  Custom scripts to run after creating filesystem images  #创建文件系统镜像后没有配置要运行的自定义脚本

→ Kernel 
	[ ] Linux Kernel  #不构建内核

→ Filesystem images
	[ ] ext2/3/4 root filesystem  #不创建 ext2/3/4 格式的根文件系统镜像。

→ Bootloaders
	[ ] U-Boot  #不构建 U-Boot 启动加载程序

→ Host utilities
	[ ] host dosfstools  #用于 DOS 文件系统的工具
	[ ] host dtc  #设备树编译器
	[ ] host e2fsprogs  #ext2/3/4 文件系统工具
	[ ] host genimage  #生成文件系统镜像的工具
	[ ] host kmod  #用于处理 Linux 内核模块的工具
	[ ] host mtools  #用于操作 MS-DOS 文件系统的工具
	[ ] host util-linux  #提供了一套广泛的系统实用程序

→ Target packages 
	→ Networking applications
		[ ] ifupdown scripts  #网络接口的启动/关闭脚本
	→ Shell and utilities
		[ ] dash  #轻量级的 shell,用于替代 bash。
	→ System tools
		[ ] kmod  #模块加载工具
		[ ] util-linux  ----  #提供大量系统实用程序的软件包

#退出,将 .config 保存为 yz_imx6ull_defconfig
cp .config configs/yz_imx6ull_defconfig

#编译
make

output/target目录创建 git 仓库并提交

cd output/target

git init 

git add .

git commit -m "first commit"

勾选要编译的软件并编译,例如tree

cd ../../

make menuconfig

→ Target packages 
	→ Development tools
		[*] tree

make

打包刚编译的软件到install目录

#创建 install 目录
mkdir install
方案 1 :通过git命令直接打包变动文件
cd output/target

git ls-files --modified --others --exclude-standard | tar cf changed_files.tar -T -

mv changed_files.tar ../../install/
方案 2 :先通过 git 提交,再打包两个版本间的变动文件
cd output/target

git add .

git commit -m "tree"

# 获取上次提交变动的文件列表并打包
git archive -o changed_files.tar HEAD $(git diff --name-only HEAD^ HEAD)

mv changed_files.tar ../../install/

# 获取变动文件列表并打包,commit1 和 commit2 是想要比较的两个提交的哈希值。
# git archive -o update.tar HEAD $(git diff --name-only commit1 commit2)

方案 3 :直接通过find查找指定时间后有变动的文件并打包
find ./ -type f -newermt '2024-04-28 13:11:00' -exec tar -rf changed_files.tar --transform 's|^./||' -C ./ {} +

mv changed_files.tar ../../install/ 

重新构建特定包

  • 列出本次配置所要编译所有的目标,这些目标可以单独作为模块,用 make <pkg> 命令进行单独编译
make show-targets
1. 清理并重新构建特定包

你可以使用 Buildroot 的清理命令来清除特定包的构建目录和相关文件,然后重新构建该包。

# 清理特定的包
make <package-name>-dirclean

# 重新构建该包
make <package-name>

这里 <package-name> 是 Buildroot 配置中的包名称(不包括版本号)。例如,如果你想重新构建 tree 包,你可以执行:

make tree-dirclean
make tree
2. 清理所有依赖并重新构建特定包

如果你需要确保所有依赖也被重新构建,你可以使用更彻底的清理命令:

# 清理包及其依赖
make <package-name>-rebuild

这个命令会清理并重新构建指定包及其所有依赖的包。

3. 清理特定包的配置并重新配置

有时候你可能需要重置配置,并重新执行配置步骤:

# 清理配置并重新配置
make <package-name>-reconfigure

这将会清除配置步骤的结果并重新执行配置。


编译时遇到的问题

编译时报错 1
  • 错误信息
    /bin/sh ./libtool  --tag=CC   --mode=link /usr/bin/gcc  -O2 -I/home/suifeng/yyz/test/buildroot/output/host/include  -L/home/suifeng/yyz/test/buildrootib -Wl,-rpath,/home/suifeng/yyz/test/buildroot/output/host/lib -o libmacosx.la  libfakeroot_inode64.lo libfakeroot_unix2003.lo  -ldl
    In file included from libfakeroot_time64.c:13:0:
    /usr/include/fts.h:41:3: error: #error "<fts.h> cannot be used with -D_FILE_OFFSET_BITS==64"
     # error "<fts.h> cannot be used with -D_FILE_OFFSET_BITS==64"
     make[4]: *** [libfakeroot_time64_la-libfakeroot_time64.lo] 错误 1
    
  • 错误分析:
    -D_FILE_OFFSET_BITS=64:这个宏指令告诉编译器将所有对文件的操作(如偏移量)转为 64 位操作。这主要用于确保在 32 位系统上应用程序能够处理大文件。在大多数情况下,这是一个推荐的设置,特别是在现代应用中,它确保了对大文件的支持。
    <fts.h> 的冲突: 如果你的代码中使用了 <fts.h>,这个头文件在某些环境下可能不支持与 -D_FILE_OFFSET_BITS=64 一起使用。这是因为 <fts.h> 中使用的某些内部结构或函数可能无法正确处理扩展到 64 位的文件偏移量。例如,在 GNU C Library (glibc) 中,使用 -D_FILE_OFFSET_BITS=64 会导致 <fts.h> 中的编译错误,因为 <fts.h> 无法与此宏同时使。
  • 错误解决:
    • 拷贝MakefileMakefile_bak
      cp output/build/host-fakeroot-1.32.1/Makefile output/build/host-fakeroot-1.32.1/Makefile_bak
    • 修改 output/build/host-fakeroot-1.32.1/Makefile
      libfakeroot_time64_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 修改为 libfakeroot_time64_la_CPPFLAGS = -D_TIME_BITS=64
    • 创建 0001-remove-FILE_OFFSET_BITS.patch
      diff -uNr Makefile_bak Makefile > 0001-remove-FILE_OFFSET_BITS.patch
    • 0001-remove-FILE_OFFSET_BITS.patch文件中的Makefile_bak修改为a/Makefile.inMakefile修改为b/Makefile.in
      --- a/Makefile.in
      +++ b/Makefile.in
      @@ -437,7 +437,7 @@ noinst_LTLIBRARIES = libcommunicate.la libmacosx.la libfakeroot_time64.la
       libcommunicate_la_SOURCES = communicate.c
       libmacosx_la_SOURCES = libfakeroot_inode64.c libfakeroot_unix2003.c patchattr.h
       libfakeroot_time64_la_SOURCES = libfakeroot_time64.c
      -libfakeroot_time64_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
      +libfakeroot_time64_la_CPPFLAGS = -D_TIME_BITS=64
       lib_LTLIBRARIES = libfakeroot.la
       libfakeroot_la_SOURCES = libfakeroot.c statconv/glibc/linux/alpha/stats.h wrapdef.h  wrapstruct.h communicate.h
       libfakeroot_la_LDFLAGS = -release 0
      
    • 移动0001-remove-FILE_OFFSET_BITS.patchpackage/fakeroot目录。
      mv 0001-remove-FILE_OFFSET_BITS.patch ../../../package/fakeroot
编译时报错 2 :
  • 错误信息
    Fortran support is not selected but is available in external toolchain
    make[1]: *** [/home/suifeng/yyz/test/buildroot/output/build/toolchain-external-custom/.stamp_configured] 错误 1
    make: *** [_all] 错误 2
    
    OpenMP support is not selected but is available in external toolchain
    make[1]: *** [/home/suifeng/yyz/test/buildroot/output/build/toolchain-external-custom/.stamp_configured] 错误 1
    make: *** [_all] 错误 2
    
  • 错误解决
    make menuconfig
    
    #添加相关支持
    → Toolchain 
    	[*] Toolchain has Fortran support?
    	[*] Toolchain has OpenMP support?
    	
    
编译时报错 3 :
  • 错误信息
wget --passive-ftp -nd -t 3 -O '/home/suifeng/yyz/test/buildroot/output/build/.patchelf-0.13.tar.bz2.GK5YlJ/output' 'https://sources.buildroot.net/patchelf/patchelf-0.13.tar.bz2' --2024-04-26 16:30:11-- https://sources.buildroot.net/patchelf/patchelf-0.13.tar.bz2 正在解析主机 sources.buildroot.net (sources.buildroot.net)... 104.26.1.37, 104.26.0.37, 172.67.72.56, ... 正在连接 sources.buildroot.net (sources.buildroot.net)|104.26.1.37|:443... 已连接。 错误: 无法验证 sources.buildroot.net 的由 “/C=US/O=Let's Encrypt/CN=E1” 颁发的证书: 颁发的证书已经过期。 要以不安全的方式连接至 sources.buildroot.net,使用“--no-check-certificate”。 wget --passive-ftp -nd -t 3 -O '/home/suifeng/yyz/test/buildroot/output/build/.patchelf-0.13.tar.bz2.Kxtkux/output' 'https://sources.buildroot.net/patchelf-0.13.tar.bz2' --2024-04-26 16:30:12-- https://sources.buildroot.net/patchelf-0.13.tar.bz2 正在解析主机 sources.buildroot.net (sources.buildroot.net)... 104.26.1.37, 104.26.0.37, 172.67.72.56, ... 正在连接 sources.buildroot.net (sources.buildroot.net)|104.26.1.37|:443... 已连接。 错误: 无法验证 sources.buildroot.net 的由 “/C=US/O=Let's Encrypt/CN=E1” 颁发的证书: 颁发的证书已经过期。 要以不安全的方式连接至 sources.buildroot.net,使用“--no-check-certificate”。 make[1]: *** [/home/suifeng/yyz/test/buildroot/output/build/host-patchelf-0.13/.stamp_downloaded] 错误 1 make: *** [_all] 错误 2
  • 错误解决
sudo apt install -y ca-certificates
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄金门票

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值