如何为每次调用的 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 设置构建区域的主要内容,如果未能解决你的问题,请参考以下文章
如何为 React Native 中调用的每次 onPress 函数提供自动增量?