背景

在编译打包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"命令将修改保存到已联系的补丁。

常用命令

1#查询已应用/未应用的patch 2quilt applied/unapplied 3#生成一个新的patch 4quilt new patch_name 5#添加patch关联的文件(如果没有指定patch,文件就和栈顶的patch关联起来) 6quilt add  [ -P patch_name ] file_name 7# 刷新补丁 8quilt refresh [patch_name] #即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁,修改完成后生成最终patch,在关联文件后可以直接修改文件,也可以使用quilt edit修改文件,只能对栈顶patch进行操作,不能制定patch 9quilt refresh 10#查看已修改的文件,可以使用 quilt files [patch_name] 查看与指定patch相关联的文件, quilt files -val 查看所有补丁联系的所有文件,"-v"参数表示更友好的显示,"-a"参数表示显示所有补丁,"-l"参数显示补丁名 11quilt files 12#显示修改了指定文件的所有补丁 13quilt patches file_name 14quilt annotate file_name #会指出哪个补丁修改了哪一行 15#对比修改的文件,使用 quilt diff -z 命令不会显示已经保存的差异。 quilt diff 显示所有的差异,不管是否保存过 16quilt diff 17quilt diff -z [-P patch_name] [file_name] #可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动,省略文件名表示查看所有改动。 18#查看所有的patch 19quilt series 20#查看最上层的patch 21quilt top 22quilt next #显示下一个可以应用的补丁 23quilt previous #显示上一条应用过的补丁 24#导入patch 25quilt import patch_name 26#回退到上一个patch 27quilt pop  28quilt pop -a #撤销所有应用的patch 29#重新添加刚刚回退的patch 30quilt push 31#删除已有的patch 32quilt delete filename.patch


实践

1添加环境变量 2 3export QUILT_PATCHES=debian/patches 4 5生成一个新的patch 6 7quilt new fde_patch_001.diff  8 9添加patch关联的文件 10quilt add unix/xserver/hw/vnc/Input.c 11 12然后修改Input.c文件 13 14vim unix/xserver/hw/vnc/Input.c 15 16刷新补丁 17quilt refresh  18 19生成及更新的文件/目录位置如下图:

开始编译打包

1DEB_BUILD_OPTIONS="parallel=8" dpkg-buildpackage -b -uc -us