https://wiki.centos.org/zh/HowTos/SetupRpmBuildEnvironment
在 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′ e c h o ′ 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:openssl 及 openssl-devel。openssl RPM 组件内藏有那些连结到 openssl 的程序在执行时所需的库。举个例说,wget 的加密连接需要 OpenSSL,因此安装 wget RPM 时,你必须先安装 openssl RPM。
然而,编译的代码若采用 OpenSSL 库,openssl RPM 档并不包含所需的库标头档。spec 档包装小组在设计发行版本时,分拆较少用的标头档是个常见的决定,目的就是要节约非开发者机器上的空间。
举个例说,如果你下载 wget 的源代码然后尝试创建它,它会投诉找不到 OpenSSL 的库。编译采用 OpenSSL 的代码所需的文件都收录在 openssl-devel RPM 内。因此,当你安装了该组件、SRPM 和 spec 档所需的其它依赖性组件后,便能编译那些利用到 OpenSSL 库标头档的代码。
因此,从调试的角度来说,当你尝试创建一个 RPM 组件,而它输出一个错误信息告诉你不能找到某某库,你应该利用上述方法寻找该库的 -devel 组件是否已安装。要是它不存在,请安装它来解决问题。这样你便能继续创建原先的 RPM。……或在逐一排除障碍的过程中面对下个须解决的问题。
外置参考材料
zh/PackageManagement/Rpm
在 CentOS 下以非管理员身份创建源代码 RPM
mock chroot 设置及组件创建工具
Translation of revision 10