就rpm规范而言,“%{__ install}”是什么意思?

时间:2019-03-15 10:10:49

标签: linux rpm rpmbuild rpm-spec

也许这是一个非常愚蠢的问题,但我找不到答案。 直到今天,我从未尝试为rpm包编写规范文件。我找到了一个规范示例,并且在%{__install}部分看到了很多%install的想法。据我的语法了解,它是万能之王。但是在规范文件中没有定义。在我的示例中,它看起来像这样:

%install
%{__install} -pD -m 644 $RPM_BUILD_DIR/my-project-%{version}/deploy/my-project.service $RPM_BUILD_ROOT/usr/lib/systemd/system/my_project-emperor.service

在我发现的其他规范中,我也看到了很多与此宏相关的示例。喜欢 thisthat。它们具有相同的语法:

%{__install} -s %{name} %{buildroot}%{_sbindir}/
%{__install} -c -m 644 examples/acl-content-sw.cfg %{buildroot}%{_sysconfdir}/%{name}/%{name}-acl-content-sw.cfg.example
%{__install} -c -m 644 examples/auth.cfg %{buildroot}%{_sysconfdir}/%{name}/%{name}-auth.cfg.example

但是%{__install}到底是什么? rpm生成器的某种内置宏?很难在Google上对其进行搜索或在官方文档中找到它,但这似乎是一种常见的事情。

2 个答案:

答案 0 :(得分:2)

不幸的是,没有神奇的答案。可以在不同的操作系统上以不同的方式重新定义Rpm宏,甚至可以在以后由其他软件包重新定义。

可以在/usr/lib/rpm/macros中找到默认定义,但是其他软件包可以在/usr/lib/rpm/macros.d/中安装更多宏。

在我的/usr/lib/rpm/macros中,如果找到此定义:

%__install              /usr/bin/install

因此在这种情况下,宏%__install并没有真正添加任何内容。

但是我发现%make_install宏非常方便;定义为:

%make_install %{__make} install DESTDIR=%{?buildroot} INSTALL="%{__install} -p"

所以不要放

make install DESTDIR=%{?buildroot}

我可以放

%make_install

在我的规格文件中...(并且在解释这一点时,我才知道install的-p选项:))

答案 1 :(得分:2)

%__install是一个宏。

如果要获取宏的值,请使用'rpm --eval':

$ rpm --eval '%__install'
/usr/bin/install
$ rpm --eval '%{__install} -s %{name} %{buildroot}%{_sbindir}/'
/usr/bin/install -s %{name} /home/msuchy/rpmbuild/BUILDROOT/%{NAME}-%{VERSION}-%{RELEASE}.x86_64/usr/sbin/

在第二个示例中,您可以看到%{name}没有展开,因为它不是系统宏,而是在规范文件中由Name标记定义的。

此外,rpm --showrc向您显示系统上定义的系统宏的列表。它显示了定义-而不是扩展宏。