实际上是$ RPM_BUILD_ROOT?

时间:2011-11-10 18:54:16

标签: linux packaging rpm

在构建RPM包的过程中,我必须指定BuildRoot,稍后将在%install中使用,它将调用$ RPM_BUILD_ROOT。我一直认为$ RPM_BUILD_ROOT是RPM执行打包的虚假安装。然后,在安装时使用RPM包,它将安装到实际位置。例如:

$RPM_BUILD_ROOT/usr/bin

我认为$ RPM_BUILD_ROOT仅用于打包过程,并且在某些方面RPM可以区分$ RPM_BUILD_ROOT和用户执行“rpm -ivh package.rpm”时的实际安装位​​置将是/ usr / bin。 / p>

但是最近在阅读一些文档时,建议$ RPM_BUILD_ROOT是将要安装的实际位置,并且用户使用环境变量$ RPM_BUILD_ROOT的设置指定$ RPM_BUILD_ROOT以便让用户安装包在他们渴望的地方。否则,$ RPM_BUILD_ROOT将为null,它将安装到默认位置。在上面的例子中,它是/ usr / bin。因此,$ RPM_BUILD_ROOT不仅适用于打包或“虚假安装”过程,而且是用户定义安装位置的一种方式,类似于Windows中的选择文件夹位置。

我不知道我的想法是否正确。有人可以验证吗?提前谢谢。

2 个答案:

答案 0 :(得分:34)

$RPM_BUILD_ROOT(或等效的%{buildroot} SPEC文件宏)始终保存RPM将查找要打包的任何文件的目录。 RPM脚本(例如压缩手册页的脚本)也将使用该值来知道在哪里查找刚刚安装的文件。通常,此值将为非空且包含远离系统目录的位置 - 通常位于/tmp/var/tmp下的某个位置。

SPEC文件的作者应该确保make install(或者所讨论的软件正在使用的任何安装程序)将任何文件放在$RPM_BUILD_ROOT下,具有应该使用的相同层次结构最终安装软件时。例如。要在ls中安装RPM /bin/ls%install SPEC文件部分应确保ls放置在$RPM_BUILD_ROOT/bin/ls

SPEC文件的作者还应使用BuildRoot:标记来指定正确的位置。或者,构建系统可以具有rpmrc RPM配置文件,其中包含正确的条目。在any case中,应该设置构建根,以便:

  • 普通用户将能够构建源包。

  • 如果超级用户构建源包,则构建过程不会破坏任何系统文件,除非超级用户安装生成的二进制包。是的,可能有充分的理由将某些包构建为root - 例如,运行完整的glibc测试套件需要root某些测试的权限。

也就是说,RPM可以并且将构建一个包含空构建根变量的包。在这种情况下,构建安装和最终目标位置都将重合。可能会打电话给make install将使用默认位置,从而破坏系统文件,例如如果以足够的权限运行,则/usr/lib。此外,在/usr/bin/*部分中使用%files会很乐意将构建主机/usr/bin/目录的全部内容提取到二进制包中。

底线:

  • 永远不要使用空的构建根。

  • 除非绝对没有办法,否则不要将包构建为root

答案 1 :(得分:12)

文件〜/ .rpmmacros 定义每个用户的路径:

%_topdir %(echo $HOME)/rpmbuild
%_tmppath %{_topdir}/tmp

并且还可以使用rpmbuild命令行参数定义它们:

rpmbuild --define '_topdir /home/username/rpmbuild'