在构建RPM包的过程中,我必须指定BuildRoot,稍后将在%install中使用,其中包含$RPM\u BUILD\u ROOT。我一直认为$RPM\u BUILD\u ROOT是RPM执行打包的伪安装。然后,在安装时使用RPM包,它将安装到实际位置。例如:
$RPM\u BUILD\u ROOT/usr/bin
我认为$RPM_BUILD_ROOT仅用于打包过程,在某些方面,RPM可以区分$RPM_BUILD_ROOT和用户执行“RPM-ivh package.RPM”时的实际安装位置是/usr/bin
但最近在阅读一些文档时,有人建议$RPM_BUILD_ROOT是将要安装的实际位置,$RPM_BUILD_ROOT由用户通过设置环境变量$RPM_BUILD_ROOT指定,以便让用户在他们想要的位置安装包。否则,$RPM\u BUILD\u ROOT将为null,并将安装到默认位置。在上述情况下,它是/usr/bin。因此,$RPM\u BUILD\u ROOT不仅用于打包或“假安装”过程,而且是用户定义安装位置的一种方式,类似于Windows中的“选择文件夹位置”
我不知道我的想法是否正确。有人能核实一下吗?提前谢谢
$RPM\u BUILD\u ROOT(或等效的%{buildroot}SPEC file宏)始终保存RPM将在其下查找要打包的任何文件的目录。RPM脚本(例如,压缩手册页面的脚本)也将使用该值来知道在何处查找刚刚安装的文件。通常,该值将不为空,并且包含一个远离系统目录的位置-通常位于/tmp或/var/tmp下
规范文件的作者应确保make install(或相关软件正在使用的任何安装程序)将所有文件放置在$RPM\u BUILD\u ROOT下,其层次结构与最终安装软件时应使用的层次结构相同。例如,要在/bin/ls中安装RPMls,%install规范文件部分应确保ls位于$RPM\u BUILD\u ROOT/bin/ls中
SPEC文件的作者还需要使用BuildRoot:标记来指定正确的位置。或者,构建系统可以有一个带有正确条目的rpmrcRPM配置文件。在任何情况下,都应设置生成根目录,以便:
-
普通用户将能够构建源程序包
-
如果超级用户曾经构建过源程序包,除非超级用户安装了生成的二进制程序包,否则构建过程不会破坏任何系统文件。是的,可能有很好的理由将一些包构建为
root——例如,运行完整的glibctestsuite需要对某些测试具有root权限
也就是说,RPM可以并且将使用空的构建根变量构建一个包。在这种情况下,构建安装和最终目标位置将一致。对例如make install的潜在调用将使用默认位置,因此,如果以足够的权限运行,将在例如/usr/lib下关闭系统文件。此外,在您的%文件部分中有/usr/bin/*,将很高兴地将构建主机/usr/bin/目录的全部内容拉到您的二进制软件包中
底线:
-
永远不要使用空的构建根目录
-
除非绝对没有其他方法,否则不要将包构建为
root