6

我试图了解 Postgres 9.1 rpms 是如何在 CentOS/RHEL 6 上构建的,所以我正在查看源 rpms中的规范文件。

以下语法的作用/含义是什么?具体来说,问号和感叹号?

%{!?test:%define test 1}
%{!?plpython:%define plpython 1}
%{!?pltcl:%define pltcl 1}
%{!?plperl:%define plperl 1}
%{!?ssl:%define ssl 1}
%{!?intdatetimes:%define intdatetimes 1}
%{!?kerberos:%define kerberos 1}
%{!?nls:%define nls 1}
%{!?xml:%define xml 1}
%{!?pam:%define pam 1}
%{!?disablepgfts:%define disablepgfts 0}
%{!?runselftest:%define runselftest 0}
%{!?uuid:%define uuid 1}
%{!?ldap:%define ldap 1

我知道你可以用 定义一个宏变量%define <name>[(opts)] <value>,我相信感叹号是一个逻辑否定运算符。我找不到关于问号的任何信息或上面的例子。似乎在定义宏变量之前进行了某种测试。

是规范文件的粘贴。

4

1 回答 1

11

让我们在这里回顾一个项目:

%{!?plpython:%define plpython 1}

在第 102 行,我们还看到:

%if %plpython
BuildRequires:  python-devel
%endif

正如您所说,我们知道这是一个宏,也可以通过Fedora 文档确认。现在,如果我们将搜索范围扩大到 Fedora 文档,我们会发现条件宏。这说明了以下内容:

您可以使用特殊语法来测试宏是否存在。例如: %{?macro_to_test: expression} 此语法告诉 RPM 如果 macro_to_test 存在则扩展表达式,否则忽略。前导感叹号 ! 测试宏不存在: %{!?macro_to_test: expression} 在本例中,如果 macro_to_test 宏不存在,则展开表达式。

Fedora 文档提供了答案,如果 plpython 宏不存在,那么

%define plython 1

如果您查看第 38 行,您还可以看到:

# In this file you can find the default build package list macros.  These can be overridden by defining
# on the rpm command line:
# rpm --define 'packagename 1' .... to force the package to build.
# rpm --define 'packagename 0' .... to force the package NOT to build.
# The base package, the lib package, the devel package, and the server package always get built.

因此,如果您在构建包时没有定义宏(我想这是大多数用户会做的),它将确保 buildrequires 被正确配置为似乎是标准 PostgreSQL 安装。

于 2013-01-17T20:19:10.827 回答