在构建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中的选择文件夹位置。
我不知道我的想法是否正确。有人可以验证吗?提前谢谢。
答案 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'