也许这是一个非常愚蠢的问题,但我找不到答案。我从来没有试过为rpm包写一个spec文件,直到今天。我找到了一个规范的例子,我看到很多%{__install}
认为在%install
部分。据我所知,它是makros之王。但是在spec文件中没有对它进行任何修改。在我的例子中它看起来像这样:
%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
在我发现的其他规范中,我也看到过很多关于这个宏的例子。像this或that。它们具有相同的语法:
%{__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构建器的某种内置宏?很难谷歌或在官方文档中找到它,但它看起来像是一种常见的东西。
不幸的是,没有神奇的答案。 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
在我的spec文件中...(并解释这个;我只是知道安装的-p
选项:))
%__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
标记在spec文件中定义的。
此外,rpm --showrc
显示了系统中定义的系统宏列表。它显示了定义 - 而不是扩展的宏。