Red Hat Training

A Red Hat training course is available for RHEL 8

5.4. RPM 条件

RPM 条件可启用 SPEC 文件的各种部分的条件。

条件包括通常会处理:

  • 特定于架构的部分
  • 特定于操作系统的部分
  • 不同操作系统版本之间的兼容性问题
  • 宏的存在和定义

5.4.1. RPM 条件语法

RPM 条件使用以下语法:

如果 expression 为 true,则执行一些操作:

%if expression
…​
%endif

如果 expression为 true,则执行一些操作,在其他情况下执行另一个操作:

%if expression
…​
%else
…​
%endif

5.4.2. %if 条件

以下示例显示了 %if RPM 条件的用法。

例 5.3. 使用 %if 条件来处理 Red Hat Enterprise Linux 8 和其他操作系统间的兼容性

%if 0%{?rhel} == 8
sed -i '/AS_FUNCTION_DESCRIBE/ s/^/#/' configure.in
sed -i '/AS_FUNCTION_DESCRIBE/ s/^/#/' acinclude.m4
%endif

这个条件在支持 AS_FUNCTION_DESCRIBE 宏时处理 RHEL 8 和其他操作系统间的兼容性。如果为 RHEL 构建软件包,则会定义 %rhel 宏,并将其扩展到 RHEL 版本。如果它的值是 8,表示软件包是为 RHEL 8 构建的。然后对 AS_FUNCTION_DESCRIBE 的引用(不被 RHEL 8 支持)会从 autoconfig 脚本中删除。

例 5.4. 使用 %if 条件句处理宏定义

%define ruby_archive %{name}-%{ruby_version}
%if 0%{?milestone:1}%{?revision:1} != 0
%define ruby_archive %{ruby_archive}-%{?milestone}%{?!milestone:%{?revision:r%{revision}}}
%endif

这个条件处理宏的定义。如果设置了 %milestone%revision 宏,则会重新定义用于定义上游 tarball 名称的 %ruby_archive 宏。

5.4.3. %if 条件的专用变体

%ifarch 条件、%ifnarch 条件和 %ifos 条件是 %if 条件的专用变体。这些变体常被使用,因此它们有自己的宏。

%ifarch 条件

%ifarch 条件用于开始特定于体系结构的 SPEC 文件的块。它后接一个或多个架构说明符,各自以逗号或空格分开。

例 5.5. 使用 %ifarch 条件的示例

%ifarch i386 sparc
…​
%endif

%ifarch%endif if 之间所有 SPEC 文件的内容都仅在 32 位 AMD 和 Intel 构架或 Sun SPARC 的系统中处理。

%ifnarch 条件

%ifnarch 条件的逻辑与 %ifarch 条件的逻辑相反。

例 5.6. 使用 %ifnarch 条件的示例

%ifnarch alpha
…​
%endif

只有在基于 Digital Alpha/AXP 的系统上的数字 Alpha/AXP 系统上执行时,才会处理 %ifnarch%endif 之间的 SPEC 文件的内容。

%ifos 条件

%ifos 条件用于根据构建的操作系统控制处理。其后可以使用一个或多个操作系统名称。

例 5.7. 使用 %ifos 条件的示例

%ifos linux
…​
%endif

只有 Linux 系统上完成构建时,才会处理 %ifos%endif 之间的 SPEC 文件的内容。