OpenWrt 快速打patch 与快速编译

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

这样可以看到只有新打补丁的那几个文件会重编,这样大大节省了编译时间。

猜你喜欢

转载自blog.csdn.net/agave7/article/details/121029806