Centos srpm规范文件中的问号和感叹号语法

Centos srpm规范文件中的问号和感叹号语法,centos,rpm,specifications,rpm-spec,Centos,Rpm,Specifications,Rpm Spec,我试图了解Postgres 9.1 RPM是如何在CentOS/RHEL 6上构建的,因此我将从中查看规范文件 下面的语法是什么意思?特别是问号和感叹号 %{!?test:%define test 1} %{!?plpython:%define plpython 1} %{!?pltcl:%define pltcl 1} %{!?plperl:%define plperl 1} %{!?ssl:%define ssl 1} %{!?intdatetimes:%define intdatetime

我试图了解Postgres 9.1 RPM是如何在CentOS/RHEL 6上构建的,因此我将从中查看规范文件

下面的语法是什么意思?特别是问号和感叹号

%{!?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[(opts)]
定义宏变量,我相信感叹号是一个逻辑求反运算符。我找不到任何关于问号的信息,也找不到像上面这样的例子。似乎是在定义宏变量之前的某种测试


是规范文件的粘贴。

让我们在此处查看单个项目:

%{!?plpython:%define plpython 1}
在第102行,我们还看到:

%if %plpython
BuildRequires:  python-devel
%endif
# 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.
正如您所说,我们知道这是一个宏,也可以通过。现在,如果我们把搜索范围扩大到找到的Fedora文档。该条规定如下:

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

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

%define plython 1
如果你看第38行,你也可以看到:

%if %plpython
BuildRequires:  python-devel
%endif
# 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安装