OpenWrt 快速打patch 与快速编译
场景
我最近在调试linux 内核代码,需要打patch
方法1.OpenWrt 官方patch方法
- make target/linux/{clean,prepare} QUILT=1
- cd build_dir/target_xxx/linux-xx
- quilt push -a
- quilt new xx
- quilt edit xx
- quilt refresh
- cd openwrt ; make target/linux/{update,install}
该方法有明显缺点
- 仅适用于改动较少的情况
- 改动代码行数多,改动文件数量多时,用quilt edit 逐个去编辑修改就很费力费时
当改动较多时,如何快速打patch呢 ?
方法2.使用 diff 快速生成 patch
diff -uNr dir_old dir_new
可以对比整个目录差异
可以将 quilt push -a 后的 linux 目录复制到 /opt/linux.old , 再复制一份 /opt/linux.new
cp build_dir/target_xxx/linux-xx -af /opt/linux-xx.old
cp build_dir/target_xxx/linux-xx -af /opt/linux-xx.new
在 /opt/linux-xx.new 上编译修改,可以放心用 sorceinsight 和 beyongcompare 等进行编辑,比 quilt edit 来的方便
改完后将补丁写入 target/linux/xx/patches
cd /opt
diff -uNr linux-xx.old linux-xx.new > target/linux/xx/patches/xx-new.patches
打完补丁后,重新 make clean 能生效
make target/linux/{clean,install}
但也有个问题,就是 make target/linux/{clean,install} 因为要clean , 重编整个kernel 需要花很长时间。
如何改进呢?
2.1 如何快速重编
需要一种办法,不 make clean 也能让patch 生效
改进如下
diff -uNr linux-xx.old linux-xx.new > target/linux/xx/patches/xx-new.patches
改为
diff -uNr linux-xx.old linux-xx.new > build_dir/target_xx/linux-xx/linux-x.x.x/patches/platform/xx-new.patches
quilt pop -f
quilt push -a
这样使 new.patches 生效
然后
make target/linux/install V=s -j5
这样可以看到只有新打补丁的那几个文件会重编,这样大大节省了编译时间。