编译Linux Buildroot时本地修改被覆盖的问题排查
解决Buildroot中kexec源码修改丢失&增量构建不更新的问题
兄弟,我太懂你这种改完代码全量构建被冲没、增量构建又不更新的憋屈了!之前调试Buildroot里的第三方包也踩过一模一样的坑,咱们一步步把问题解决掉:
先搞明白为啥会这样?
Buildroot的包构建逻辑自带“洁癖”:
- 全量构建(
make all)时,它会重新从下载的原始源码包(比如kexec-2.0.15.tar.xz)里完全提取干净的源码到output/build/kexec-2.0.15/目录,你直接改这里的代码肯定会被覆盖得一干二净。 - 增量构建(
make)没反应,是因为Buildroot的依赖跟踪只认它自己的构建规则,你直接修改临时构建目录里的源码,它根本没察觉到变化,自然不会触发重新编译。
方案1:临时调试用(快速验证代码逻辑)
如果只是临时改改看效果,不想搞复杂的补丁流程,可以这么弄:
- 先确保已经执行过一次
make kexec,让Buildroot解压并编译过kexec源码。 - 进入kexec的临时构建目录:
cd buildroot/output/build/kexec-2.0.15/ - 直接修改你的
kexec/kexec.c文件,然后手动执行kexec自身的编译命令:make - 把编译好的新二进制复制到Buildroot的目标根文件系统里:
cp kexec/kexec ../../target/usr/sbin/ - 之后如果要生成镜像,直接跑
make就行,Buildroot会用你替换后的二进制。
注意:这方法是临时救急,一旦执行
make kexec-dirclean或者make all,你的修改还是会被冲掉,只适合快速验证代码是否有效。
方案2:规范补丁法(长期保留修改,Buildroot官方推荐)
这是正经的长期解决方案,把你的修改做成补丁,让Buildroot每次构建时自动应用:
- 生成补丁文件:
- 先去Buildroot的kexec包目录,创建补丁文件夹(如果没有的话):
mkdir -p buildroot/package/kexec/patches/ - 回到kexec的临时构建目录:
cd buildroot/output/build/kexec-2.0.15/ - 初始化本地Git仓库(用来生成补丁):
git init && git add . && git commit -m "original source" - 修改你的
kexec/kexec.c文件,然后生成补丁:git diff > ../../../package/kexec/patches/0001-add-debug-log-to-kexec-c.patch - 补丁文件名要符合Buildroot规范:开头是四位数字序号,后面是描述,比如
0001-add-debug-print.patch。
- 先去Buildroot的kexec包目录,创建补丁文件夹(如果没有的话):
- 让Buildroot加载这个补丁:
- 打开
buildroot/package/kexec/kexec.mk文件,找到KEXEC_PATCHES配置项(如果没有就新增):
如果已经有其他补丁,就把你的补丁追加到列表最后。KEXEC_PATCHES = \ $(KEXEC_PKGDIR)/patches/0001-add-debug-log-to-kexec-c.patch
- 打开
- 重新构建验证:
- 执行
make kexec-dirclean && make kexec,Buildroot会重新提取干净源码,自动应用你的补丁,然后编译出带调试信息的kexec。 - 之后不管是增量构建还是全量构建,你的修改都会被自动应用,再也不会丢失了。
- 执行
额外小技巧
- 如果改完补丁后增量构建还是没反应,直接跑
make kexec-rebuild,强制重新编译kexec包。 - 千万别直接在
output/build/目录下长期修改源码,这是Buildroot的临时工作目录,随时可能被清理。 - 如果需要多次迭代修改调试,可以用
quilt工具来管理补丁,Buildroot对quilt的支持非常友好,你可以翻翻Buildroot官方文档里的补丁管理章节。
内容的提问来源于stack exchange,提问作者RRR




