Pau*_*aul 4 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
Run Code Online (Sandbox Code Playgroud)
我还在我发现的其他规范中看到了很多使用此宏的示例。像 这样或那样。它们具有相同的语法:
%{__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
Run Code Online (Sandbox Code Playgroud)
但%{__install}实际上是什么?rpm 构建器的某种内置宏?很难用谷歌搜索或在官方文档中找到它,但看起来这是一种常见的东西。
不幸的是,没有神奇的答案。Rpm 宏可以在不同的操作系统上以不同的方式重新定义,甚至可以随后由其他软件包重新定义。
默认定义可以在 中找到/usr/lib/rpm/macros,但其他软件包可以在 中安装更多宏/usr/lib/rpm/macros.d/。
在我的/usr/lib/rpm/macrosif 中找到这个定义:
%__install /usr/bin/install
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下宏%__install并没有真正添加任何东西。
但我发现这个%make_install宏相当方便;其定义为:
%make_install %{__make} install DESTDIR=%{?buildroot} INSTALL="%{__install} -p"
Run Code Online (Sandbox Code Playgroud)
所以而不是把
make install DESTDIR=%{?buildroot}
Run Code Online (Sandbox Code Playgroud)
我可以把
%make_install
Run Code Online (Sandbox Code Playgroud)
在我的规范文件中...(在解释这一点时;我刚刚知道-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/
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,您可以看到它%{name}没有展开,因为它不是系统宏,而是通过标签在spec文件中定义的Name。
此外,rpm --showrc还显示系统上定义的系统宏列表。它显示了定义 - 未扩展的宏。