下载并编译 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>
无法与此宏同时使。 - 错误解决:
- 拷贝
Makefile
为Makefile_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.in
,Makefile
修改为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.patch
到package/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