在 CentOS 下设置一个创建 RPM 的环境

这份文件会指引你如何在 CentOS 下安装及设置一个用来创建 RPM(及重建 SRPM)的环境。

<!> 切勿以 root 的身份来创建 RPM。这个工作应该永远在一个没有特殊权限的户口内进行。以 root 的身份来创建 RPM 可能会损坏你的系统。已经预先警告过你了。

检查你已经安装了 rpmbuild

首先,你应该检查 rpmbuild 是否已经被安装在你的系统上。你将会利用这个工具从 spec 文件或 SRPM 组件创建 RPM。要检查它是否被安装了,请执行 rpmbuild --showrc 这个指令。它将会显示一大组数据,把 rpmbuild 所采用的创建环境的细节列明。这对检测 .spec 档在做什么颇有用。

假若系统输出:$ rpmbuild: command not found,便意味着 rpmbuild 未被安装。你可以用 root 身份执行下列指令,通过 yum 来安装它:

[root@host ~]# yum install rpm-build

由于化身为 root 来执行指令只会在 bash 日志档内留下记录,大部份小心的管理员都会设置及利用 sudo 来执行此工作:

[userid@hostname ~]# sudo yum install rpm-build

<!> 注:基于过往惯例,含有 /usr/bin/rpmbuild 的组件名叫 rpm-build(留意组件名称内有一个 "-" 号)。

请检查 yum 所安装的清单内包含了某个版本的 rpm-build 组件,然后回答 "y" 批准 yum 继续进行组件的安装。

yum 完成后,再次执行 rpmbuild --showrc 或输出较少的 rpmbuild --version 指令来检查它已经安装妥当。

大部份以 CentOS 作为重建目标的 SRPM 亦需要特定的 rpmbuild 创建宏及辅助脚本,它们都收录在 redhat-rpm-config 组件内。要获得所需的结果,你必须按照上述方法进行安装,并替换此组件名称。你可以通过 yum 用下列指令来安装 redhat-rpm-config

[userid@hostname ~]# sudo yum install redhat-rpm-config

<!> 注:这个组件或许已被安装。要是这样,yum 只会在最后一行输出显示 Nothing to do.。你可以用 rpm -q redhat-rpm-config 这个指令来检查组件(在此要检查 redhat-rpm-config)是否已被安装。如果你看见任何输出,那便代表组件已经存在。rpm 指令的输出亦会包含安装在你系统上的软件的版本及发行信息。

新增目录让你能在主目录内置立 RPM

当你安装好 rpmbuild 后,下一步便是将创建 RPM 时所需的文件及目录新增到你的主目录内。好上文所提及,为避免系统库或其它文件受损,你永远不应以 root 身份创建 RPM。你应利用一个没有特殊权限的户口来进行这项工作。

要以没有特殊权限的用户来创建 RPM,你必须为此新增一个目录结构,然后在你的主目录内置立一个 .rpmmacros 档,在当中指定以新创建的目录取代缺省的 RPM 创建目录。

下面的指引会在你的主目录内新增一个 rpmbuild 作创建 RPM 之用。如果你想采用另一个目录,你必须按你的用途修改下列指引。请阅读外部参考材料来找出如何进行更复杂的设置。

要创建一个创建 RPM 的环境,这执行下列两个指令:

[user@hostname ~]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

<!> 注意:以下指令会取替可能已存在的 .rpmmacros,因此请先检查你没有这个文件,然后才继续。

[user@host ~]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

当你执行完以上两个指令后,你便设置好一个不需其它设置便能创建多数 RPM 的环境。

你可能需用的其它工具

一般而言,创建 RPM 等同创建及编译软件。要达至这个目的,你多数会需要编译及创建源代码组件的工具。

你很有可能需要安装 make 来创建软件(就算不是用 C 或其它编译语言所写的软件亦会在安装过程中采用 Makefile)。一如上文:

[userid@hostname ~]# sudo yum install make

如果你要替那些以 C 写成的软件创建组件,你亦会需要 gcc 编译器。

[root@host ~]# yum install gcc

某些依赖很可能亦会一并被安装,好让 gcc 能够针对系统库作出编译。

如果你创建的软件使用到系统库(例如:OpenSSL),你亦会需要安装额外的 RPM,好让你能针对这些库创建软件。

以 OpenSSL 为例,它有两个独立的 RPM:opensslopenssl-developenssl RPM 组件内藏有那些连结到 openssl 的程序在执行时所需的库。举个例说,wget 的加密连接需要 OpenSSL,因此安装 wget RPM 时,你必须先安装 openssl RPM。

然而,编译的代码若采用 OpenSSL 库,openssl RPM 档并不包含所需的库标头档spec 档包装小组在设计发行版本时,分拆较少用的标头档是个常见的决定,目的就是要节约非开发者机器上的空间。

举个例说,如果你下载 wget 的源代码然后尝试创建它,它会投诉找不到 OpenSSL 的库。编译采用 OpenSSL 的代码所需的文件都收录在 openssl-devel RPM 内。因此,当你安装了该组件、SRPM 和 spec 档所需的其它依赖性组件后,便能编译那些利用到 OpenSSL 库标头档的代码。

因此,从调试的角度来说,当你尝试创建一个 RPM 组件,而它输出一个错误信息告诉你不能找到某某库,你应该利用上述方法寻找该库的 -devel 组件是否已安装。要是它不存在,请安装它来解决问题。这样你便能继续创建原先的 RPM。……或在逐一排除障碍的过程中面对下个须解决的问题。

外置参考材料

Translation of revision 10

zh/HowTos/SetupRpmBuildEnvironment (last edited 2015-11-11 05:40:33 by TimothyLee)