就 rpm 规格而言,“%{__install}”是什么意思?
What does "%{__install}" mean in terms of rpm spec?
也许这是一个非常愚蠢的问题,但我找不到答案。
直到今天我才尝试为 rpm 包编写规范文件。我找到了一个规范的例子,我在 %install
部分看到了很多 %{__install}
的想法。据我对语法的理解,它是 makros 之王。但是在规范文件中没有对它的定义。在我的示例中,它看起来像这样:
%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 or 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 生成器的某种内置宏?很难 google 它或在官方文档中找到它,但它看起来像是某种常见的东西。
遗憾的是没有神奇的答案。 Rpm 宏可以在不同的 OS 上以不同的方式重新定义,甚至可以在其他包之后重新定义。
可以在 /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
在我的规范文件中...(在解释这个时;我刚刚知道安装的 -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}
没有展开,因为那不是系统宏,而是在spec文件中由Name
标签定义的。
此外,rpm --showrc
向您显示系统上定义的系统宏列表。它显示了定义 - 不是展开的宏。
也许这是一个非常愚蠢的问题,但我找不到答案。
直到今天我才尝试为 rpm 包编写规范文件。我找到了一个规范的例子,我在 %install
部分看到了很多 %{__install}
的想法。据我对语法的理解,它是 makros 之王。但是在规范文件中没有对它的定义。在我的示例中,它看起来像这样:
%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 or 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 生成器的某种内置宏?很难 google 它或在官方文档中找到它,但它看起来像是某种常见的东西。
遗憾的是没有神奇的答案。 Rpm 宏可以在不同的 OS 上以不同的方式重新定义,甚至可以在其他包之后重新定义。
可以在 /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
在我的规范文件中...(在解释这个时;我刚刚知道安装的 -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}
没有展开,因为那不是系统宏,而是在spec文件中由Name
标签定义的。
此外,rpm --showrc
向您显示系统上定义的系统宏列表。它显示了定义 - 不是展开的宏。