8. 多架构 RPM 构建

RPM 现在可以用来为 Intel i386、运行 Linux 的 Digital Alpha 和 Sparc(以及其他架构)构建软件包。有几个特性使得在所有平台上构建软件包变得容易。其中第一个是 /etc/rpmrc 中的 “optflags” 指令。它可用于将构建软件时使用的标志设置为特定于架构的值。另一个特性是 spec 文件中的 “arch” 宏。它们可以用于根据您正在构建的架构执行不同的操作。另一个特性是头部中的 “Exclude” 指令。

8.1. 示例 spec 文件

以下是 “fileutils” 软件包的 spec 文件的一部分。它被设置为在 Alpha 和 Intel 上构建。

Summary: GNU File Utilities
Name: fileutils
Version: 3.16
Release: 1
Copyright: GPL
Group: Utilities/File
Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz
Source1: DIR_COLORS
Patch: fileutils-3.16-mktime.patch

%description
These are the GNU file management utilities.  It includes programs
to copy, move, list, etc, files.

The ls program in this package now incorporates color ls!

%prep
%setup

%ifarch alpha
%patch -p1
autoconf
%endif
%build
configure --prefix=/usr --exec-prefix=/
make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s

%install
rm -f /usr/info/fileutils*
make install
gzip -9nf /usr/info/fileutils*

.
.
.

      

8.2. Optflags

在此示例中,您将看到如何从 /etc/rpmrc 中使用 “optflags” 指令。根据您正在构建的架构,将适当的值赋予RPM_OPT_FLAGS。您必须修补软件包的 Makefile 以使用此变量代替您可能使用的常规指令(如-m486-O2)。您可以通过安装此源软件包,然后解压缩源代码并检查 Makefile 来更好地了解需要做什么。然后查看 Makefile 的补丁,看看必须进行哪些更改。

8.3. 宏

%ifarch 宏对于所有这些都非常重要。大多数时候,您需要创建一个或两个特定于一个架构的补丁。在这种情况下,RPM 将允许您仅将该补丁应用于一个架构。

在上面的示例中,fileutils 有一个用于 64 位机器的补丁。显然,目前这应该只应用于 Alpha。因此,我们在 64 位补丁周围添加一个 %ifarch 宏,如下所示

%ifarch axp
%patch1 -p1
%endif
      

这将确保该补丁不会应用于 Alpha 以外的任何架构。

8.4. 从软件包中排除架构

为了您可以在一个目录中维护所有平台的源 RPM,我们实现了“排除”在某些架构上构建软件包的功能。这使您仍然可以执行以下操作,例如

rpm --rebuild /usr/src/SRPMS/*.rpm
      

并构建正确的软件包。如果您尚未将应用程序移植到某个平台,您只需添加一行类似

ExcludeArch: alpha
      

到源软件包的 spec 文件的头部。然后在它构建的平台上重建软件包。然后,您将拥有一个在 Intel 上构建的源软件包,并且可以在 Alpha 上轻松跳过。

8.5. 完成

使用 RPM 制作多架构软件包通常比让软件包本身在这两个地方都构建更容易。然而,随着更多硬性软件包的构建,这种情况变得越来越容易。与往常一样,当您在构建 RPM 时遇到困难时,最好的帮助是查看类似的源软件包。