6. 构建 RPM

构建 RPM 相当容易,特别是当您能够让您尝试打包的软件自行构建时。这里我们假设您知道如何从源代码构建软件。如果您不知道,您可能不应该从本文档开始。

构建 RPM 的基本步骤如下:

在正常操作下,RPM 构建二进制和源代码软件包。

6.1. Spec 文件

我们将从讨论 spec 文件开始。构建软件包需要 spec 文件。spec 文件是对软件的描述,以及关于如何构建它的说明和所有已安装二进制文件的文件列表。

您需要按照标准约定来命名您的 spec 文件。它应该是 软件包名称-短划线-版本号-短划线-发行号-点-spec。这将确保如果您为同一软件包的不同版本安装多个源代码 RPM,至少 spec 文件保持完整。

这是一个小的 spec 文件 (eject-2.0.2-1.spec)

Summary: A program that ejects removable media using software control.
Name: eject
Version: 2.0.2
Release: 3
Copyright: GPL
Group: System Environment/Base
Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/eject-2.0.2.tar.gz
Patch: eject-2.0.2-buildroot.patch
BuildRoot: /var/tmp/%{name}-buildroot

%description
The eject program allows the user to eject removable media
(typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks)
using software control. Eject can also control some multi-
disk CD changers and even some devices' auto-eject features.

Install eject if you'd like to eject removable media using
software control.

%prep
%setup -q
%patch -p1 -b .buildroot

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1

install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

%changelog
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com> 
- auto rebuild in the new build environment (release 3)

* Wed Feb 24 1999 Preston Brown <pbrown@redhat.com> 
- Injected new description and group.

[ Some changelog entries trimmed for brevity.  -Editor. ]
      

6.2. 头部

头部有一些您需要填写的标准字段。也有一些注意事项。字段必须按如下方式填写:

6.3. 准备

这是 spec 文件中的第二个部分。它用于使源代码准备好构建。在这里,您需要执行任何必要的操作,以使源代码像需要设置的那样进行补丁和设置,以执行 make

需要注意的一点是:这些部分中的每一个实际上只是执行 shell 脚本的地方。您可以简单地创建一个 sh 脚本,并将其放在 %prep 标签之后,以解包和修补您的源代码。但是,我们制作了宏来帮助完成此操作。

这些宏中的第一个是 %setup 宏。在其最简单的形式(没有命令行选项)中,它只是解包源代码并 cd 进入源代码目录。它还接受以下选项:

下一个可用的宏是 %patch 宏。此宏有助于自动化将补丁应用于源代码的过程。它有几个选项,如下所示:

这应该是您需要的所有宏。在您正确设置这些之后,您还可以通过 sh 类型脚本执行您需要做的任何其他设置。您包含在 %build 宏(在下一节中讨论)之前的所有内容都通过 sh 执行。查看上面的示例,了解您可能想在这里执行的操作类型。

6.4. 构建

此部分实际上没有任何宏。您只需在此处放置您在解压源代码、打补丁并 cd 进入目录后构建软件所需的任何命令。这只是传递给 sh 的另一组命令,因此任何合法的 sh 命令都可以放在这里(包括注释)。

Important

您当前的工作目录在每个部分中都重置为源代码目录的顶层,因此请记住这一点。如果需要,您可以 cd 进入子目录。

变量RPM_OPT_FLAGS使用 /usr/lib/rpm/rpmrc 中的值设置。查看那里以确保您使用的是适合您系统的值(在大多数情况下是这样)。或者 просто 不要在此 spec 文件中使用此变量。它是可选的。

6.5. 安装

这里实际上也没有任何宏。您基本上只想在此处放置安装所需的任何命令。如果您在您正在构建的软件包中有可用的 make install,请将其放在此处。如果没有,您可以修补 makefile 以获得 make install 并在此处执行 make install,或者您可以使用 sh 命令在此处手动安装它们。您可以将当前目录视为源代码目录的顶层。

变量RPM_BUILD_ROOT可用于告诉您在头部中设置为 Buildroot: 的路径。使用构建根目录是可选的,但强烈建议使用,因为它们可以防止您的系统被不在您的 RPM 数据库中的软件弄乱(构建 RPM 不会触及您的数据库...您必须安装您刚刚构建的二进制 RPM 才能做到这一点)。

6.6. 清理您的系统

始终确保在系统上第二次构建软件包之前有一个干净的构建根目录是一个好主意。%clean 宏将对此有所帮助。只需在那里放置适当的命令来清除以前的构建根目录。谨慎的,呃,细心的人可能想要测试RPM_BUILD_ROOT在执行如此不稳定的操作之前,是否将 / 设置为 /

6.7. 可选的安装/卸载前和卸载后脚本

您可以放入在二进制软件包的安装和卸载之前和之后运行的脚本。这样做的主要原因是执行诸如在安装或删除包含共享库的软件包后运行 ldconfig 之类的操作。每个脚本的宏如下:

这些部分的内容应该只是任何 sh 样式脚本,尽管您不需要 #!/bin/sh

6.8. 文件

这是您必须列出二进制软件包文件的部分。RPM 无法知道由于 make install 而安装了哪些二进制文件。没有办法做到这一点。有人建议在软件包安装前后执行 find。在多用户系统中,这是不可接受的,因为在软件包构建过程中可能会创建其他与软件包本身无关的文件。

还有一些宏可用于执行一些特殊操作。它们在此处列出和描述:

文件列表中最大的注意事项是列出目录。如果您意外地列出 /usr/bin,您的二进制软件包将包含您系统上 /usr/bin 中的每个文件。

6.9. 变更日志

这是软件包更新时发生的更改日志。如果您正在修改现有的 RPM,最好在此处列出您所做的更改。

格式很简单。以 * 开头,后跟日期、您的姓名和您的电子邮件地址,开始每个新条目。日期应以与以下命令输出相同的格式显示:

	date +"%a %b %d %Y"
      

本节的其余部分是自由文本字段,但应以某种连贯的方式组织。