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

Posted

技术标签:

【中文标题】如何为每次调用的 rpmbuild 设置构建区域【英文标题】:How to set the build area for rpmbuild per-invocation 【发布时间】:2011-02-27 14:55:02 【问题描述】:

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

这类似于existing question,但更具体。

我不想以 root 用户身份运行任何构建命令;目的只是拥有一个 RPM,而不是在系统中安装任何东西。

我不想require the user to change their dotfiles(例如$HOME/.rpmrc);构建应该是独立的,并且不会影响用户的现有设置。

我不想将位置硬编码到foo.spec 文件中;如果用户想在不同的位置构建,该文件应该可以按原样使用。

--buildroot option 不是我需要的;它为构建过程的make 部分设置了一个伪根文件系统,但我需要为整个 RPM 构建过程指定“构建区域”。

我正在寻找的是一个假设的--build-area FOODIR 选项,它可以赋予rpmbuild 命令或等效的环境变量。因此,它应该只影响命令的单次调用,并使其使用指定的用户可写位置作为其构建区域。

我看到了对 _topdir 宏的引用,这似乎就是我所说的,但它似乎不能在每次调用时进行配置。

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

【问题讨论】:

【参考方案1】:

--buildroot 选项不是您想要的。该名称有点误导,因为它没有更改 buildroot,而是为构建的安装阶段设置 root。 RPM 基本上是在构建过程中进行“make install”,然后打包结果。 buildroot 选项允许您将此安装到例如 /tmp/myinstallroot。

我最近不得不将 rpm 包构建集成到自动构建中,并且遇到了同样的问题。我所做的是生成一个自定义的 .rpmmacros 文件,其中 %topdir 设置得当。然后我只是暂时将 HOME 更改为该自定义 .rpmmacros 文件的位置。

"HOME=mytopdir rpmbuild ...".

【讨论】:

谢谢,但要求用户更改他们的点文件并不是我所需要的。我正在尝试使构建过程独立,这样一个命令就足以生成 RPM,而无需对用户环境进行任何其他更改。 诀窍是我没有改变用户环境。我在构建树的某处生成了一个 .rpmmacros 文件,然后使用修改后的 $HOME 调用 rpmbuild。所以是的,通过临时更改 $HOME 我正在修改用户环境。不幸的是,我确实找到了另一种方法。 啊,好吧,您是说您使用了一个不在实际主目录中的.rpmmacros 文件。这是一种有趣的方法;不过,这似乎是一个可怕的黑客行为。我希望有更清洁的方法。【参考方案2】:

没有记录,但_topdir决定了构建区域。

因此,您可以使用rpmbuild --define "_topdir $PWD/foobar" ... 设置此每次调用以将目录设置为您想要的任何内容。

--define 是为任何宏设置值的关键,而不仅仅是 _topdir。

【讨论】:

谢谢!这个真的帮了我! 对于 Linux 内核打包的特殊情况,您可以在 make 命令行上通过 RPMOPTS='define "foo bar"' 传递该选项。 如果 RPM 甚至不能做像自包含构建环境这样简单的事情,而不必求助于未记录的功能,那么它就是无用的。 @FUZxxl,它已记录在案,但很多人不知道所有文档都是如此。 fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/… 清楚地提到了_topdir,并给出了它的默认值,并没有说明如何在一个块中使用“--define”进行设置(靠近页面底部)

以上是关于如何为每次调用的 rpmbuild 设置构建区域的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Meteor 构建 mongodb

如何为 React Native 中调用的每次 onPress 函数提供自动增量?

如何为 Web 统计模块处理大量数据

如何为R中字符串中的每个位置调用函数?

如何为 Cloud Build 用于 Cloud Run 部署的 Cloud Storage 存储分区指定区域?

如何为我的项目设置构建授权范围?