quilt工具使用说明
背景
在编译打包tigervncserver时,发现对源码文件进行修改后,编译打包始终会报错。研究发现需要使用quilt工具生成patch才能将我们的修改应用到新编的deb包中。
原理
掌握quilt的关键是了解使用quilt的流程。使用quilt时,我们会在一个完整的源代码树里工作。只要我们在源代码树里使用了quilt命令,quilt就会在源代码树的根目录建立两个特殊目录:patches和.pc。
quilt在patches目录保存它管理的所有补丁。quilt用.pc目录保存自己的内部工作状态。patches/series文件记录了quilt当前管理的补丁。补丁按照加入的顺序排列,早加入的补丁在前。quilt用堆栈的概念管理补丁的应用。
我们在应用补丁A前,必须先应用所有早于补丁A的补丁。所以,patches/series中的补丁总是从上向下应用。
我们在源代码树中作任何修改前,必须用"quilt add"命令将要修改的文件与一个补丁联系起来。在完成修改后,用"quilt refresh"命令将修改保存到已联系的补丁。
常用命令
#查询已应用/未应用的patch
quilt applied/unapplied
#生成一个新的patch
quilt new patch_name
#添加patch关联的文件(如果没有指定patch,文件就和栈顶的patch关联起来)
quilt add [ -P patch_name ] file_name
# 刷新补丁
quilt refresh [patch_name] #即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁,修改完成后生成最终patch,在关联文件后可以直接修改文件,也可以使用quilt edit修改文件,只能对栈顶patch进行操作,不能制定patch
quilt refresh
#查看已修改的文件,可以使用 quilt files [patch_name] 查看与指定patch相关联的文件, quilt files -val 查看所有补丁联系的所有文件,"-v"参数表示更友好的显示,"-a"参数表示显示所有补丁,"-l"参数显示补丁名
quilt files
#显示修改了指定文件的所有补丁
quilt patches file_name
quilt annotate file_name #会指出哪个补丁修改了哪一行
#对比修改的文件,使用 quilt diff -z 命令不会显示已经保存的差异。 quilt diff 显示所有的差异,不管是否保存过
quilt diff
quilt diff -z [-P patch_name] [file_name] #可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动,省略文件名表示查看所有改动。
#查看所有的patch
quilt series
#查看最上层的patch
quilt top
quilt next #显示下一个可以应用的补丁
quilt previous #显示上一条应用过的补丁
#导入patch
quilt import patch_name
#回退到上一个patch
quilt pop
quilt pop -a #撤销所有应用的patch
#重新添加刚刚回退的patch
quilt push
#删除已有的patch
quilt delete filename.patch
实践
添加环境变量
export QUILT_PATCHES=debian/patches
生成一个新的patch
quilt new fde_patch_001.diff
添加patch关联的文件
quilt add unix/xserver/hw/vnc/Input.c
然后修改Input.c文件
vim unix/xserver/hw/vnc/Input.c
刷新补丁
quilt refresh
生成及更新的文件/目录位置如下图:
开始编译打包
DEB_BUILD_OPTIONS="parallel=8" dpkg-buildpackage -b -uc -us