[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

重建一个源代码 RPM

这份文件会指引你如何在你的 CentOS 发行版本上重建一个源代码 RPM(SRPM)。

你想如此做的其中一个原因可能是去安装不附带於 CentOS 软件库内的软件。就算 CentOS 并不提供这个软件,你亦应该尽量尝试取得或创建这个软件的 RPM,因为采用组件管理系统所得的好处会补偿你花费在包装组件上的工夫。使用一个组件管理系统来处理互赖性相比起安装源代码提供不少优势。创建组件后,你或许会考虑创建一个本地的软件库,并通过 yum 或图像界面工具来简化组件管理。

1. 你是否真的需要重建?

首先请考虑重建 SRPM 将会为你带来的负担。每次当有安全性更新发布时,你须维护及重建它。在你决定重建一个 SRPM 前,你应该检查所需的组件是否已经藏在现存的软件库内。

多数采用软件库的用户期望获得支持(邮件列表、论坛、错误跟踪器、IRC 频道),以及组件备有安全性及功能上的更新。在 Wiki 的「软件库」页面所列出的网站大多数都有这些资源及功能,但某些则没有。举例说,CentOS 'testing' 软件库刻意提供升级的途径。唯有那些以适当的 CentOS GPG 金钥签署的组件才算是 CentOS 计划的产品。

2. 从那里取得 SRPM 组件

重建一个 SRPM 组件的成功率主要视乎该发行版本与 CentOS 有多近似。举个例说,你几乎肯定能成功地重建同一主要版本的 Red Hat 或 CentOS 组件。你也可考虑其它以 Red Hat 为基础的发行版本的 SRPM,例如 Scientific Linux,因为它们倾向兼容 CentOS 的 base 组件。由于 Red Hat(从而 CentOS)是以 Fedora 的某个稳定子集作为基础,所以你往往能在 CentOS 重建来自 Fedora 的 SRPM。重建更高版本的 Red Hat 或 CentOS 组件的成数亦很高;在 CentOS-5 上重建来自 Fedora Core 6 或 Fedora 7 的 SRPM 的成数依然偏高;然而重建更高版本 Fedora 的组件的成数便较低了,因为它们与从 FC6 测试版本分支出来的 EL5 存有很大差异。延至 Fedora 11,某至 SRPM 在 CentOS-5 依然能顺利地重建,但安装 F11 或更新的SRPM 时,rpm 指令必须使用 "--nomd5" 选项。针对 CentOS-6,相应的 Fedora 版本是 12/13,亦即是 EL6 的分支版本,很多 Fedora 14 及更新版的 SRPM 也能顺利地重建。至于其它以 RPM 为基础的发行版本,例如 Mandriva 或 SuSE,重建它们的 SRPM 的成数是中等到低。最后,有些跨发行版本的开源软件亦备有 SRPM 格式。你或许能通过下列指引在你的系统上重建这些 SRPM。

重建 SRPM 时,系统的附加组件比核心组件成功率高。要是你要重建的 SRPM 需要把核心组件更新,这可能是时候找更旧的 SRPM 作为出发点。你大概应该用这个方法将 glibc、gcc、python、perl、或其它核心组件升级到较新版本。如果你这样做,你要承受系统损坏到难以修复的风险。

如果你想修正一个上游已经修正,但 CentOS 仍未修正的错误(这个时差一般很短),你可以看看上游所提供者所发行的 SRPM:

否则,你可以看看那些针对较新版 CentOS 的 SRPM。举个例子,多数针对 CentOS 5 的 SRPM 都可以在 CentOS 4 机器上重建。CentOS 的 SRPM 已收录在:

一旦你找到了 SRPM 文件,你便可以利用 wget 或浏览器将它下载到你的机器里。你可以将文件存储到任何目录。虽然你可以将它存放在你创建 RPM 的目录内的 SRPMS 位置,你或许不会想这样做,因为你重建 RPM 时也许会取替了它。

<!> 注:虽然你有机会能成功地重建及使用来自其它发行版本的 SRPM,这并不是必然的。你应该留意,安装那些重建自其它发行版本的 RPM 或许会将你的系统损坏到一个难以修复的地步。为了安全起见,你应该尽量沿用那些来自 CentOS 或者被推荐软件库的组件。请记得,如果系统损坏了,你要独自收拾残局。

3. 预备好创建 RPM 的环境

请遵从这些指引来将你的环境设置为可创建 RPM 的。

4. 单一步重建 SRPM

重建 SRPM 最快捷方法就是使用 rpmbuild --rebuild ... 指令。这个指令会将 SRPM 解压为 spec 文件及源代码文件,然后按照 spec 文件内的指引创建 RPM。

<!> 不论是用 RPM 组件管理系统、抑或是原始的 tar 压缩档,以 root 身份来创建软件可能会导致灾难。这里对此事有更详细的讨论。

举个例子,要重建 /tmp/mypackage-1.0.0-1.src.rpm 组件,执行这个指令:

[user@host ~]$ rpmbuild --rebuild /tmp/mypackage-1.0.0-1.src.rpm

一切顺利的话,你便会在 ~/rpmbuild/RPMS/i386 目录里产生一个 mypackage-1.0.0-1.i386.rpm 文件(如果你的结构是 i386,否则文件名称及目录都会相应地有变)。

假如重建 RPM 的过程中出了问题,错误信息应该能让你估计什么地方出了错及需要修正。很多时问题出于你未安装好重建 RPM 时所需的工具。请参阅这里来看看重建 RPM 时一般所需的工具清单。有时候,你可能要为重新命名或改版的组件调整 BuildRequires,或在 spec 档加增违漏了的依赖性。

5. 安装 SRPM 然后以 spec 文件重建

另一个做法就是先安装来自 SRPM 的文件,然后利用 rpmbuild 按照 spec 文件重建。Fedora >= 11 的 RPM 必须这样处理。

要安装一个 SRPM,请执行 rpm -i 指令并提供 SRPM 组件的名称作为参数。请留意用没有特殊权限的户口执行 rpm -i,而不是 root。你亦可以利用 rpm -qpl 来列出 SRPM 组件内的文件。当你安装一个 SRPM 组件时,spec 文件(也就是有 .spec 扩展名的那个)会被放进你的 ~/rpmbuild/SPECS 目录内,而其它来自 SRPM 的文件(多数是 tar 压缩档及修正档)会被放进你的 ~/rpmbuild/SOURCES 目录内。举个例说,要解压 /tmp/mypackage-1.0.0-1.src.rpm 这个组件的内容,这执行这个指令:

[user@host ~]$ rpm -i /tmp/mypackage-1.0.0-1.src.rpm

假如是後期 Fedora 的 RPMS,或者出現的錯誤類似 "error: unpacking of archive failed on file /builddir/build/SOURCES/mypackage-1.0.0.tar.gz;4dc983a7: cpio: MD5 sum mismatch":

[user@host ~]$ rpm --nomd5 -i /tmp/mypackage-1.0.0-1.src.rpm

当你将 SRPM 解压后,你便会留意到在 ~/rpmbuild/SPECS 目录内多了一个 spec 文件(在这个例子里它多数会称为 mypackage.spec)。你就是利用这个文件来创建 RPM。要这样做,请使用下列指令:

[user@host ~]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -ba mypackage.spec

rpmbuild -ba 这个指令会执行 RPM 创建过程里的所有步骤,然后在完成时创建一个 RPM 组件(它会被存储在 ~/rpmbuild/RPMS/i386 内,或者对应你结构的目录内),与及一个新的 SRPM 文件(它会被存储在 ~/rpmbuild/SRPMS 内)。

先将 SRPM 解压然后利用 rpmbuild -ba 以 spec 文件重建的好处,就是你可以按需要修改 spec 文件(或者加入修正文件,甚至乎将 tar 压缩档升级)。对比起重建 SRPM,这却是一个较复杂的情况,所以如果你要走这条路,你应该参考下面的推荐阅读更多关于这方面的数据,不过程序上它大致是:

  1. cd ~/rpmbuild/SPECS/
  2. rpmbuild -bp mypackage.spec
  3. cd ~/rpmbuild/BUILD/
  4. cp existing_directory existing_directory.orig
  5. cd existing_directory
  6. 寻找你要更改的文件,修改它。
  7. cd ~/rpmbuild/BUILD/
  8. diff -Npru existing_directory.orig existing_directory > name_of_your_patch_file.patch

  9. cp name_of_your_patch_file.patch ~/rpmbuild/SOURCES/
  10. cd ~/rpmbuild/SPECS/
  11. 编辑 mypackage.spec 档并加入 name_of_your_patch_file.patch 的定义和应用它 —— 做法可参考该文件的内容。
  12. rpmbuild -ba mypackage.spec

假如你决定要按自己的需要自定一个 spec 文件,这里有些非常好的资源可以提供帮助:

Translation of revision 31


2023-09-11 07:23