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
之间的 spec
文件的所有内容仅在 32 位 AMD 和 Intel 构架或基于 Sun SPARC 的系统上时才被处理。
%ifnarch 条件
%ifnarch
条件的逻辑与 %ifarch
条件的逻辑相反。
例 5.6. 使用 %ifnarch 条件的示例
%ifnarch alpha … %endif
%ifnarch
和 %endif
之间的 spec
文件的所有内容仅当没有在基于 Digital Alpha/AXP 的系统上完成时才被处理。
%ifos 条件
%ifos
条件用于根据构建的操作系统控制处理。其后可以使用一个或多个操作系统名称。
例 5.7. 使用 %ifos 条件的示例
%ifos linux … %endif
%ifos
和 %endif
之间的 spec
文件的所有内容仅在构建在 Linux 系统上完成时才被处理。