11

RPM 规范中有一种“包含”指令吗?我无法通过谷歌搜索找到答案。

动机:我有一个 RPM 规范模板,构建过程会根据版本、修订和其他特定于构建的数据进行修改。这是sed目前完成的。我认为如果规范将#include是一个特定于构建的定义文件,它将由构建过程生成,所以我不需要在规范中搜索和替换。

如果没有include,是否有一种惯用的方法来执行此任务(我相信很常见)?

4

7 回答 7

20

足够新的 rpmbuild 版本确实支持 %include:

%include common.inc

不幸的是,他们对此并不是很聪明——例如,没有已知的目录集可以在其中查找请求的文件。但它在那里并且变量被扩展,例如:

%include %{_topdir}/Common/common.inc
于 2012-01-18T23:43:14.910 回答
7

RPM 不支持包含。

我已经使用 m4 宏处理器或仅连接部分规范(当“包含”位于开头时)解决了类似的问题。

如果您只需要在构建时传递几个变量,而不是包含另一个文件中的几行,则可以运行

rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec

您可以在规范中使用 %myvar 。

于 2011-06-03T01:18:29.777 回答
5

我最近遇到了同样的问题。我想定义多个相似的子包,但每个子包都略有不同(它们是特定于语言的 RPM)。我不想为每个子包重复相同的样板文件。

这是我所做的通用版本:

%define foo_spec() %{expand:%(cat '%{myloc}/main-foo.spec')}
%{foo_spec bar}
%{foo_spec baz}
%{foo_spec qux}

使用%{expand}确保%(cat)仅在定义宏时执行一次。然后 main-foo.spec 文件的内容是 3 次,并且每次%1在 main-foo.spec 文件中扩展为每个bar,bazqux,反过来,我可以将其视为模板。如果您有需要(我没有),您可以轻松地将其扩展到多个参数。

于 2013-05-14T19:59:10.797 回答
4

对于根本问题,我知道的所有rpm版本中可能存在两个额外的解决方案。

  1. 子包
  2. macrorpmrc文件。

子包

另一种选择(也许是“ RPM 方式”)是使用子包最大 RPM还包含子包的信息和示例。

我认为问题是试图构建类似的结构,

  • 两个规格文件;说rpm_debug.specrpm_production.spec
  • 两者都使用%include common.spec

debugproduction也可以是clientserver等。对于重新定义变量的示例,每个子包都可以有自己的变量列表。

限制

子包的主要优点是只发生一次构建;这也可能是一个缺点。调试生产示例可能会突出这一点。可以使用它strip来创建变体使用不同的输出编译两次;也许VPATH与 Gnu Make 一起使用)。必须编译大型包,然后只有简单的变化,比如有/没有开发者信息,比如headers静态等,可以让你欣赏这种方法。

宏和 Rpmrc

子包不能解决您希望整个rootfs层次结构或更大的 RPM 集合的结构定义问题。我们有这个。您可以通过更改和在运行时定义大量变量和。从页面来看,rpmbuild --showrcrpmrcmacrosrpmrpmbuildman

   rpmrc Configuration
       /usr/lib/rpm/rpmrc
       /usr/lib/rpm/redhat/rpmrc
       /etc/rpmrc
       ~/.rpmrc

   Macro Configuration
       /usr/lib/rpm/macros
       /usr/lib/rpm/redhat/macros
       /etc/rpm/macros
       ~/.rpmmacros

我认为这两个功能可以解决所有可以解决的问题%include。然而,%include这是一个熟悉的概念,并且可能被添加以使rpm功能更全面且对开发人员更友好。

于 2013-04-17T16:42:57.953 回答
3

你说的是哪个版本?我目前在我的规范文件中有 %include filename.txt ,它似乎就像 C #include 指令一样工作。

> rpmbuild --version
RPM version 4.8.1
于 2011-08-18T20:15:06.857 回答
3

您可以包含*.inc来自 SOURCES 目录 ( %_sourcedir) 的文件:

Source1: common.inc

%include %{SOURCE1}

这样,它们将自动进入SRPMS

于 2012-06-07T13:58:16.970 回答
1

我使用脚本(命名你最喜欢的)来获取模板并从中创建规范文件。此外,%files标签可以导入由另一个进程创建的文件,例如 Python 的bdist-rpm.

于 2013-04-17T23:20:24.050 回答