如何为每次调用rpmbuild设置构建区域

36

我正在修改一个自动化构建,并希望告诉rpmbuild在调用时使用特定的构建区域

这与现有问题类似,但更为具体。

  • 我不想以root用户身份运行任何构建命令;目标只是有一个RPM软件包,而不安装到系统中。

  • 我不想要求用户更改他们的dotfiles(例如$HOME/.rpmrc);构建应为自包含的,不影响用户的现有设置。

  • 我不想将位置硬编码到foo.spec文件中;如果用户想要在其他位置进行构建,则该文件应可直接使用。

  • --buildroot选项并非我所需;它为构建过程的make部分设置了伪根文件系统,但我需要指定整个RPM构建过程的“构建区域”。

我需要的是一个假想的--build-area FOODIR选项,可用于rpmbuild命令,或等效环境变量。因此,它应仅影响该命令的单个调用,并使其使用指定的用户可写位置作为其构建区域。

我看到了有关一个_topdir宏的参考资料,它似乎就是我所说的内容,但它似乎无法针对每次调用进行配置。

如果rpmbuild需要时可以在那个位置设置自己的环境最好,但是如果需要,我也不介意为每次构建设置目录,因为这可以作为构建的一部分自动化。目标是仅在构建运行期间存在该用户可写的位置,然后在生成RPM文件后通过删除整个位置来进行清理。

2个回答

74

虽然没有官方文档,但是 _topdir 是用来确定构建区域的。

你可以使用 rpmbuild --define "_topdir ${PWD}/foobar" ... 来为每次构建设置目录为任意路径。

--define 是设置任何宏值的关键字,不仅限于 _topdir


3
对于Linux内核打包的特定情况,您可以通过在make命令行上传递RPMOPTS='define "foo bar"'选项来实现。 - Phil Miller
6
如果RPM无法创建自包含的构建环境而必须依赖于未记录的功能,那么它就是无用的。 - fuz
@FUZxxl,这是有文档记录的,但很多人不知道所有文档都在哪里。https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros清楚地提到了_topdir,并给出了其默认值,并且注意如何在一个块中使用“--define”设置它(页面底部附近)。 - Edwin Buck

4
--buildroot选项并不是你所要寻找的。这个名称有点误导,因为它并没有改变构建根目录,而是设置了安装阶段的根目录。RPM基本上作为构建的一部分执行“make install”,然后打包其结果。buildroot选项允许您将此安装放入例如/tmp/myinstallroot中。
最近我不得不将rpm软件包构建集成到自动化构建中,并遇到了同样的问题。我生成了一个带有适当设置的%topdir的自定义.rpmmacros文件。然后我只是临时更改了HOME到该自定义.rpmmacros文件的位置。
"HOME=mytopdir rpmbuild ...".

谢谢,但要求用户更改他们的dotfiles不是我需要的。我正在尝试使构建过程独立,以便一个单独的命令就足以生成RPM,而无需对用户环境进行任何其他更改。 - bignose
诀窍在于我没有改变用户的环境。我在我的构建树中生成一个 .rpmmacros 文件,然后使用修改过的 $HOME 调用 rpmbuild。所以,是的,通过暂时更改 $HOME,我正在修改用户的环境。不幸的是,我没有找到另一种方法来做到这一点。 - Frank Meerkötter
啊,好的,你是说你使用了一个名为.rpmmacros的文件,但它并不在实际的主目录中。这是一种有趣的方法,但看起来像是一个可怕的黑客手段。我希望有更干净的方式。 - bignose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接