如何给OpenWrt的源码打patch

发布时间 2023-09-18 20:02:12作者: 付时凡

如何给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