如何给OpenWrt的源码打patch
给package打patch
OpenWrt有成熟的打patch机制,可以直接从服务器download源码,校验后,再结合自己开发的patch,打上,然后编译。
开发环境:基于Ubuntu 14.04 32bit主机,编译demo_board机型。
需要用到quilt工具,安装如下:
sudo apt-get install quilt
安装成功:
$ quilt --help
Usage: quilt [--trace[=verbose]] [--quiltrc=XX] command [-h] ...
quilt --version
Commands are:
add fold new remove top
annotate fork next rename unapplied
applied graph patches revert upgrade
delete grep pop series
diff header previous setup
edit import push shell
files mail refresh snapshot
Global options:
--trace
Runs the command in bash trace mode (-x). For internal debugging.
--quiltrc file
Use the specified configuration file instead of ~/.quiltrc (or
/etc/quilt.quiltrc if ~/.quiltrc does not exist). See the pdf
documentation for details about its possible contents. The
special value "-" causes quilt not to read any configuration
file.
--version
Print the version number and exit immediately.
这里以libnetfilter-queue这个package为例。新增一个打mark接口。
编译指令:
make PRODUCT_NAME=demo_boardv1 package/libnetfilter-queue/{clean,compile,install}
先准备:
make PRODUCT_NAME=xe75v1_1 iplatform_package/libnetfilter-queue/{clean,prepare} QUILT=1
进入源码编译路径:
cd build_dir/target-arm-openwrt-linux-uclibc-xe75v1_1/libnetfilter_queue-1.0.2
打上原来的patch,如果有的话:
quilt push -a
如果没有,日志如下:
No series file found
新建一个patch,编号需要是基于现有的patch最大编号再+1的,这里尚没有patch,因此可以命名为001:
$ quilt new 001-app-dpi-mark.patch
Patch 001-app-dpi-mark.patch is now on top
编辑想要改动的源文件:
$ quilt edit ./include/libnetfilter_queue/linux_nfnetlink_queue.h
如果有其他想修改的文件,可以继续编辑,直到改动完成。
查看修改:
quilt diff
更新改动到patch文件:
quilt refresh
返回到build目录,并更新patch:
make PRODUCT_NAME=xe75v1_1 iplatform_package/libnetfilter-queue/update V=s
成功的日志:
$ make PRODUCT_NAME=demo_boardv1 package/libnetfilter-queue/update V=s
make[1]: Entering directory `/home/git4/iplatform/platform'
make[2]: Entering directory `/home/git4/iplatform/platform'
make[3]: Entering directory `/home/git4/iplatform/platform'
make[3]: Leaving directory `/home/git4/iplatform/platform'
make[2]: Leaving directory `/home/git4/iplatform/platform'
make[2]: Entering directory `/home/git4/iplatform/platform'
make[3]: Entering directory `/home/git4/iplatform/platform/iplatform/develop/libnetfilter-queue'
if [ -s "/home/git4/iplatform/platform/build_dir/target-arm-openwrt-linux-uclibc-demo_boardv1/libnetfilter_queue-1.0.2/patches/series" ]; then (cd "/home/git4/iplatform/platform/build_dir/target-arm-openwrt-linux-uclibc-demo_boardv1/libnetfilter_queue-1.0.2"; if quilt --quiltrc=- next >/dev/null 2>&1; then quilt --quiltrc=- push -a; else quilt --quiltrc=- top >/dev/null 2>&1; fi ); fi
touch "/home/git4/iplatform/platform/build_dir/target-arm-openwrt-linux-uclibc-demo_boardv1/libnetfilter_queue-1.0.2/.quilt_checked"
mkdir -p ./patches
rm -f ./patches/* 2>/dev/null >/dev/null
'/home/git4/iplatform/platform/build_dir/target-arm-openwrt-linux-uclibc-demo_boardv1/libnetfilter_queue-1.0.2/patches/001-app-dpi-mark.patch' -> './patches/001-app-dpi-mark.patch'
make[3]: Leaving directory `/home/git4/iplatform/platform/iplatform/develop/libnetfilter-queue'
make[2]: Leaving directory `/home/git4/iplatform/platform'
make[1]: Leaving directory `/home/git4/iplatform/platform'
这个时候patch文件已经在package的源码路径生成了。
# tplink @ cyril in ~/git4/iplatform/platform/iplatform/develop/libnetfilter-queue/patches [16:51:35]
$ ls
001-app-dpi-mark.patch
重新编译即可:
make PRODUCT_NAME=xe75v1_1 iplatform_package/libnetfilter-queue/{clean,compile,install}
给kernel打patch
大同小异。
make target/linux/{clean,prepare} V=s QUILT=1
cd build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/linux-4.14.149/
quilt push -a
quilt new platform/666-reboot-softreset-2-hardreset-by-GPIO5.patch
quilt edit kernel/reboot.c
quilt edit 其他文件
quilt diff
quilt refresh
make target/linux/update V=s