什么是$ RPM_BUILD_ROOT?

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

$RPM_BUILD_ROOT/usr/bin 

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

但是最近在阅读一些文档时,build议$ RPM_BUILD_ROOT是要安装的实际位置,而$ RPM_BUILD_ROOT是由用户通过设置环境variables$ RPM_BUILD_ROOT来指定的,以便让用户安装它们的包位置。 否则,$ RPM_BUILD_ROOT将为空,并将安装到默认位置。 在上面的情况下,它是/ usr / bin。 因此,$ RPM_BUILD_ROOT不仅仅是用于打包或“假安装”的过程,而是用户定义安装位置的一种方式,类似于在Windows中select文件夹的位置。

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

Solutions Collecting From Web of "什么是$ RPM_BUILD_ROOT?"

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

SPEC文件的作者应该确保make install (或者相关软件的任何安装程序)将$RPM_BUILD_ROOT下的所有文件放在最后安装软件时应该使用的层次上。 例如要让RPM在/bin/ls %install /bin/ls%install SPEC文件部分应该确保ls被放置在$RPM_BUILD_ROOT/bin/ls

SPEC文件的作者也希望使用BuildRoot:标签来指定一个合适的位置。 另外, rpmrc系统可以有一个rpmrc RPM配置文件和一个正确的条目。 在任何情况下 ,应该设置构建根目录,以便:

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

  • 如果超级用户构建源代码包,则构建过程将不会打开任何系统文件,除非超级用户安装了所产生的二进制包。 是的,可能有一个很好的理由,以root身份建立一些软件包 – 例如,运行完整的glibc测试套件需要一些测试的root权限。

也就是说,RPM可以并且将会构建一个包含一个空的构建根变量的包。 在这种情况下,构建安装和最终目标位置将重合。 一个可能的调用例如make install将使用默认的位置,因此如果以足够的权限运行,则在/usr/lib下打开系统文件。 另外,在你的%files部分有/usr/bin/*将会把build主机的/usr/bin/目录的全部内容拉到你的二进制包中。

底线:

  • 切勿使用空的生成根目录。

  • 除非完全没有其他方式,否则不要以root身份来构建软件包。

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

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

也可以用rpmbuild命令行参数来定义它们:

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