我正在尝试了解Postgres 9.1 rpms是如何构建在CentOS / RHEL 6上的,所以我要看看source 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
我知道你可以用%define <name>[(opts)] <value>
定义一个宏变量,我相信感叹号是一个逻辑否定运算符。我找不到关于问号或上述例子的任何信息。在定义宏变量之前,似乎是某种测试。
Here是spec文件的粘贴。
答案 0 :(得分:11)
让我们在这里查看一个项目:
%{!?plpython:%define plpython 1}
在第102行,我们也看到了这一点:
%if %plpython
BuildRequires: python-devel
%endif
正如你所说,我们知道这是一个宏,也可以通过Fedora docs确认。现在,如果我们扩展搜索Fedora文档,我们会发现conditional macros。这说明如下:
您可以使用特殊语法来测试宏的存在。例如: %{?macro_to_test:expression} 如果macro_to_test存在,则此语法告诉RPM扩展表达式,否则忽略。一个主要的感叹号,!,测试不存在宏: %{!?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.
因此,如果您在构建程序包时没有定义宏(我想这是大多数用户会这样做的话),那么它将确保为看似标准的PostgreSQL安装正确配置构建需求。 / p>