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

时间:2013-01-17 16:57:44

标签: centos rpm specifications rpm-spec

我正在尝试了解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文件的粘贴。

1 个答案:

答案 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>

相关问题