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