srpm spec文件中的问号和感叹号语法

Ban*_*jer 6 specifications centos rpm rpm-spec

我试图了解Postgres 9.1 rpms是如何在CentOS/RHEL 6上构建的,所以我要看一下源rpms中的spec文件.

以下语法是什么意思?具体来说,问号和感叹号?

%{!?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
Run Code Online (Sandbox Code Playgroud)

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

是spec文件的粘贴.

For*_*est 11

让我们在这里查看一个项目:

%{!?plpython:%define plpython 1}
Run Code Online (Sandbox Code Playgroud)

在第102行我们也看到了这个:

%if %plpython
BuildRequires:  python-devel
%endif
Run Code Online (Sandbox Code Playgroud)

正如你所说,我们知道这是一个宏,也可以通过Fedora文档确认.现在,如果我们扩展对Fedora文档的搜索,我们会发现条件宏.这表明以下内容:

您可以使用特殊语法来测试宏的存在.例如:%{?macro_to_test:expression}如果存在macro_to_test,则此语法告诉RPM扩展表达式,否则忽略.一个主要的感叹号,!,测试不存在宏:%{!?macro_to_test:expression}在这个例子中,如果macro_to_test宏不存在,则展开表达式.

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

%define plython 1
Run Code Online (Sandbox Code Playgroud)

如果你看第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.
Run Code Online (Sandbox Code Playgroud)

因此,如果在构建程序包时没有定义宏(我想这是大多数用户会这样做的话),那么它将确保为看起来像标准的PostgreSQL安装正确配置构建需求.