【发布时间】:2015-06-18 15:19:24
【问题描述】:
我正在尝试使用模拟创建一个 rpm。 https://fedoraproject.org/wiki/Projects/Mock
我能够通过源 rpm 构建一个 rpm。现在我想为这个包添加一个补丁,但我不知道如何继续。你能告诉我我该怎么做吗?使用 mock 修改/修补包的方法是什么?
【问题讨论】:
我正在尝试使用模拟创建一个 rpm。 https://fedoraproject.org/wiki/Projects/Mock
我能够通过源 rpm 构建一个 rpm。现在我想为这个包添加一个补丁,但我不知道如何继续。你能告诉我我该怎么做吗?使用 mock 修改/修补包的方法是什么?
【问题讨论】:
这里的正常做法是不使用 mock 以任何方式修改你的包。 Mock 只是一种确保你的包每次都在干净的环境中构建的方法(一个新的 chroot),它并没有真正的意思。
那么,正常的做法是将补丁放入您的 RPM 本身的规范文件中。
这需要两个部分 - 首先,将补丁文件作为包的一部分包含在内,其次,它的应用程序。
首先,在规范文件顶部附近列出补丁,通常紧跟在您的Source 行(或行)之后。每个补丁都有一个数字,通常的惯例是从 0 开始计数,所以如果你只有一个,那将如下所示:
Patch0: packagename-version-terse_patch_description.patch
与源文件一样,该文件名中直到最后一个 / 的所有内容都将被删除,因此您可以根据需要使用 URL。补丁需要在您的 RPM 源目录中(通常在 tarball 旁边)。
此时,如果您根据修改后的规范构建源 RPM,生成的 src.rpm 文件将包含此补丁文件。 (试试看——rpm -qlp packagename-ver-rel.src.rpm)。但是,它不会应用。为此,您需要使用 %patch 宏。
这位于规范文件的 %prep 部分,通常紧跟在 %setup 宏行之后。每个%patch 宏在标题中都有一个对应于 Patch 行的数字,因此对于您的Patch0,添加如下一行:
%patch0 -p1 -b .bugfix
再一次按照惯例,RPM 中使用的补丁是在上一级构建的,因此-p1 是合适的。 (方便的是,这对于使用 git 进行的差异也是正确的。)并且-b .bugfix 位不是必需的,但它是调试的习惯,我猜它可以作为这个特定补丁宏的一种内联注释. (将字符串“bugfix”替换为适合您实际补丁的内容。)
【讨论】:
yumdownloader --source mock 获取它。然后,编辑mock.spec 以添加您链接到的错误中的补丁文件,就像上面描述的那样。您还需要增加Release 标签——通常,我通过将Release: 1%{?dist} 更改为Release: 1%{?dist}.mattdm1 或类似的方法来做到这一点(因为如果您只是转到“2”,您将与可能的新官方包发生冲突)。