2.4. 修复软件
本节介绍如何修补软件。
在 RPM 打包中,而不是修改原始源代码,我们保留它,并在上面使用补丁。
				补丁(patch)是用于更新其他源代码的源代码。它被格式化为 diff,因为它代表文本的两个版本之间的区别。使用 diff 实用程序创建 diff,然后使用 patch 实用程序应用到源代码。
			
软件开发人员通常使用版本控制系统(如 git )来管理其代码库。这些工具提供自己创建 diffs 或 patching 软件的方法。
				以下示例演示了如何使用 diff 从原始源代码创建补丁,以及如何使用 patch 应用补丁。创建 RPM 时会在后面的章节中使用补丁 ; 请参阅 第 3.2 节 “使用 SPEC 文件”。
			
				此流程演示了如何从原始源代码为 cello.c 创建补丁。
			
步骤
- 保留原始源代码: - cp -p cello.c cello.c.orig - $ cp -p cello.c cello.c.orig- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - -p选项用于保留模式、所有权和时间戳。
- 根据需要修改 - cello.c:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 使用 - diff实用程序生成补丁:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 以 - -开头的行将从原始源代码中删除,并替换为以- +开头的行。- 建议将 - Naur选项与- diff命令一起使用,因为它符合大多数常见用例。然而,在这种情况下,只需要- -u选项。具体选项可确保:- 
								-N(或--new-file)- 处理缺少的文件,就像它们是空文件一样。
- 
								-a(或--text)- 将所有文件作为文本文件。因此,被diff认为是二进制的文件不会被忽略。
- 
								-u(or-U NUM或--unified[=NUM]) - 以统一上下文的输出 NUM(默认为 3)行返回输出。这是一个易于阅读的格式,允许在将补丁应用到更改的源树时进行模糊匹配。
- -r(or- --recursive) - 递归比较任何找到的子目录。- 有关 - diff实用程序通用参数的更多信息,请参阅- diff手册页。
 
- 
								
- 将补丁保存到文件中: - diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch - $ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 恢复原始 - cello.c:- cp cello.c.orig cello.c - $ cp cello.c.orig cello.c- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 必须保留原始 - cello.c,因为当构建 RPM 时,将使用原始文件,而不是修改的原始文件。更多信息请参阅 第 3.2 节 “使用 SPEC 文件”。
				以下步骤演示了如何使用 cello-output-first-patch.patch 对 cello.c 进行补丁,构建补丁的程序并运行它。
			
- 将补丁文件重定向到 - patch命令:- patch < cello-output-first-patch.patch - $ patch < cello-output-first-patch.patch patching file cello.c- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查 - cello.c的内容现在是否反映了这个补丁:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 构建并运行补丁的 - cello.c:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow