<Linux>使用quilt工具制作补丁(patch)文件

前言

patch是Linux项目编程下常用的工具。
例如:
     一份有Makefile管理的驱动代码文件,每次编译时会有Makefile规则从指定目录下解压到固件目录下,此时在驱动代码中添加了一些功能或者改变了一些功能代码,为了不改变原驱动代码,便可以将新修改的代码做成patch文件,使用Makefile在每次编译固件时候将patch安装到代码中。


提示:以下步骤均在ubuntu下进行示范操作

一、安装quilt工具

ubuntu下打开终端界面输入以下命令安装quilt:

sudo apt-get install quilt

安装完成quilt工具后,可以使用以下命令查看quilt支持的操作:

quilt --help

输入命令后可以看到以下输出:

Usage: quilt [--trace[=verbose]] [--quiltrc=XX] command [-h] ...
       quilt --version
Commands are:
	add       fold    mail      refresh  snapshot
	annotate  fork    new       remove   top
	applied   graph   next      rename   unapplied
	delete    grep    patches   revert   upgrade
	diff      header  pop       series
	edit      import  previous  setup
	files     init    push      shell

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.

quilt工具支持的操作如下:

quilt new				创建一个新的补丁环境

quilt top      			查看最近的一个patch

quilt add {files}   	关联文件

quilt remove files  	取消关联文件,是add相反的操作

quilt diff    			查看对比修改的内容

quilt files       		查看当前patch关联的文件

quilt series      		查看左右的patch

quilt pop     			回退刚才文件的改动

这里只做quilt的入门使用,只使用new、add、refresh三个命令。

new:创建新的patch文件环境
add:添加需要打补丁的文件到patch环境中
refresh:修改完成后,将修该记录更新至补丁中

二、一个需要被打补丁的文件

以简单的print helloworld做示例:
准备一个main.c,目标代码为以下内容,需要将第2个printf中的字符串"Not patching yet!“修改为"finsh patching”,同时添加一个打印代码”printf(“我大意了 没有闪\n”);“

#include <stdio.h>

int main(int argv,char **argc)
{
        printf("Hello world\n");
        printf("Not patching yet!\n");

        return 0;
}

三、quilt new命令创建初始补丁文件

此时需要用到quilt工具来初始化一个补丁文件
这里以与main.c的同目录下进行创建,使用以下命令:

quilt new xxxx.patch
示例:
quilt new 0000.patch

其中xxxx为补丁的名称,可以先随意创建一个名称,完成补丁后再修改至需要名称。
创建patch成功后,可以在目录下看到一个名称为patches的文件夹,文件夹里面只有一个"series"文件。


四、quilt add命令添加目标文件

创建补丁后,需要将要修改的文件添加至补丁环境中。使用以下命令:

quilt add xxxx.c
示例:
quilt add main.c

添加成功后会有以下提示:

File main.c added to patch patches/0000.patch

五、修改目标文件代码内容

示例中会往main.c添加以下内容

  1. 将第2个printf中的字符串"Not patching yet!“修改为"finsh patching”
  2. 添加一个打印代码printf(“我大意了 没有闪\n”);

原代码为:

#include <stdio.h>

int main(int argv,char **argc)
{
        printf("Hello world\n");
        printf("Not patching yet!\n");

        return 0;
}

修改后的代码为

#include <stdio.h>

int main(int argv,char **argc)
{
        printf("Hello world\n");
        printf("Finsh patching!\n");
		printf("我大意了 没有闪\n");
        return 0;
}

六、quilt refresh命令生成补丁文件

修改代码完成后,在创建patch的目录下使用以下命令生成补丁文件:

quilt refresh -pab

生成补丁正确,可以看到以下信息:

Refreshed patch patches/0000.patch

此时可以在同目录下,查看patches文件夹中的补丁文件
生成补丁文件如下(注释为手动添加,用于解释补丁文件构成):

Index: b/main.c 
===================================================================
--- a/main.c # "---"表示旧文件
+++ b/main.c # "+++"表示新文件
@@ -3,7 +3,8 @@ # @@ @@,表示补丁影响行数内容-3,7表示从旧文件的3行开始7行结束,+3,8表示新文件的3行开始8行结束
 int main(int argv,char **argc)
 {
        printf("Hello world\n");
-       printf("Not patching yet!\n"); #- 表示删除该信息
+       printf("Finsh patching!\n");   #+ 表示添加该信息
+       printf("我大意了 没有闪\n");

        return 0;
 }


七、测试结果

首先执行未打补丁前的文件,输出如下:

Hello world
Not patching yet!

使用打补丁命令将patches/0000.patch补丁打到main.c中:

patch main.c < patches/0000.patch

执行成功后输出如下:

patching file main.c

此时main.c的内容为打补丁后的内容:

#include <stdio.h>

int main(int argv,char **argc)
{
        printf("Hello world\n");
        printf("Finsh patching!\n");
        printf("我大意了 没有闪\n");

        return 0;
}

再次编译执行main.c,输出如下:

Hello world
Finsh patching!
我大意了 没有闪

# 总结
  1. 使用quilt new创建补丁环境
  2. 使用quilt add 添加需要改动的文件到补丁环境中
  3. 改动文件
  4. 使用quilt refresh自动生成补丁文件
  5. 使用patch命令将补丁重新打回原来的文件代码中,进行验证

此外,若使用git管理工具的diff命令查看改动文件时,就可以输出的改动差异也是patch格式。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值