linux下生成补丁文件的几种方式
平时构建用buildroot,openwrt,在openwrt下,官方文档介绍的是使用quilt生成补丁文件,在buildroot下好像并没有太详细的介绍。不过生成补丁和你所使用的构建框架并没很大的联系,一般来说,有3种方式,diff,quilt, git。
1. 使用diff生成补丁文件
其实quilt和git应该也是基于diff/patch这2个命令来生成和打补丁的,无非是多了额外的一些管理功能。因此,直接使用diff是最原始的方式,简单有效,但是面对一些package里面自带了大量的补丁时,会比较繁琐,因为你生成你自己的补丁前,需要先逐一打完前面已存在的补丁,然后才能生成你自己的补丁。
这里已buildroot为例说明过程:
-
首先source, extract包的源码,然后打上已存在的补丁,dirclean是清理之前的编译目录,非必要,视情况而定。
make opencv3-{dirclean,source,extract,patch}
-
然后进入buildroot的编译目录通常在output/your_platform/build下
cd output/rockchip_rk3568/build/
-
备份经过source, extract,patch 3个步骤后的编译目录
cp -r opencv3-3.4.12 opencv3-3.4.12_bak
-
修改你自己的内容
-
使用diff生成patch
diff -purN opencv3-3.4.12_bak/ opencv3-3.4.12 > ../../../package/opencv3/001_fix_cap_gstreamer_get_duration.patch
这里直接生成到了包目录。需要特别注意的是2个目录的顺序一定别搞错了,前面一个是未做改动前的也就是
opencv3-3.4.12_bak/
,后一个目录是你改动后的,否则打补丁时会失败,因为搞反了。 -
验证
make opencv3-{dirclean,source,extract,patch}
可以看到类似如下提示:
Applying 001_fix_cap_gstreamer_get_duration.patch using patch: patching file modules/videoio/src/cap_gstreamer.cpp
2.使用quilt
quilt工具实际上是一个shell脚本,他以栈的形式管理补丁。一般的linux发行版都自带了diff,但是quilt一般没安装。
安装:
sudo apt install quilt -y
过程:
-
同样打上已存在补丁
make opencv3-{dirclean,source,extract,patch}
-
进入包编译目录
cd output/rockchip_rk3568/build/opencv3-3.4.12
-
创建补丁
quilt new 001_fix_cap_gstreamer_get_duration.patch
此时会在同级目录下生成一个patches的目录,里面有个series文件,包含了你创建的补丁名
-
修改源码
quilt edit file_you_want_modify
-
将补丁刷到补丁文件
quilt refresh
此时补丁文件就生成到了patches目录下,拷贝此文件到包的目录里面。