如何通过debian/rules钩子实现内核源码修改后的增量编译?
如何通过debian/rules钩子实现内核源码修改后的增量编译?
嗨,我之前也踩过这个坑!其实问题根源在于Ubuntu内核的构建逻辑:它默认会把顶层源码复制到debian/build目录下完成编译,而且debian/rules binary默认会跳过重复的构建检查,所以才会出现改了代码却不重新编译的情况。下面给你几个亲测有效的解决方法:
先理清核心问题
当你第一次执行构建命令时,系统会把顶层内核源码复制到debian/build/<flavor>目录(比如你编译的是generic内核,路径就是debian/build/build-generic),之后所有编译操作都在这个目录里进行。如果你只修改了顶层的源文件,构建系统根本看不到你的改动;就算直接跑fakeroot debian/rules binary,它也会认为之前的构建产物是最新的,不会重新检查源码变化。
方法一:直接修改构建目录里的源码(最直接的增量方式)
- 找到
debian/build下对应内核版本的源码路径,比如你改的是efifb驱动,路径就是debian/build/build-generic/drivers/video/fbdev/efifb/efifb.c - 在这个文件里添加你的
pr_info("hello world\n");语句并保存 - 运行
fakeroot debian/rules build——这一步会调用底层的make,它会自动检测到源文件的改动,只重新编译修改过的efifb.o,然后重新链接内核镜像(因为是内置驱动,必须整合到vmlinuz里) - 最后运行
fakeroot debian/rules binary,把更新后的内核打包成deb包即可
方法二:修改顶层源码后同步到构建目录
如果你习惯在顶层源码目录修改代码,可以用官方提供的同步钩子来同步改动:
- 在顶层内核源码目录修改目标文件(比如
drivers/video/fbdev/efifb/efifb.c) - 运行
fakeroot debian/rules update-build-tree——这个命令专门用来把顶层源码的改动同步到debian/build目录,覆盖旧文件 - 接着执行
fakeroot debian/rules build binary,就能完成增量编译和打包了
补充小贴士
- 为什么直接跑
fakeroot debian/rules binary没用?因为binary目标默认依赖build,但如果之前已经执行过build,它会跳过构建检查。单独运行build会强制触发make的依赖检测,从而实现增量编译。 - 如果你删除
efifb.o还是没效果,大概率是删错了文件——要删debian/build目录下的efifb.o,而不是顶层源码里的(顶层本来就没有这个构建产物)
备注:内容来源于stack exchange,提问作者Michael Walton
相关产品推荐
相关产品推荐

