可以在RPM spec文件中“包含”其他文件吗?

在RPM规范中是否有一种“包含”指令? 我无法通过Googlesearchfind答案。

动机 :我有一个RPM规范模板,构build过程使用版本,修订版本和其他特定于构build的数据进行修改。 这是目前由sed完成的。 我认为如果规范将包含特定于构build的定义文件(这将由构build过程生成),那么将会更清洁,因此我不需要在规范中进行search和replace。

如果没有include ,有没有一种习惯的方式来做到这一点(相当普遍,我相信)的任务?

RPM不支持包含。

我已经解决了与m4宏处理器类似的问题,或者只是连接规范的一部分(当“包含”在开始时)。

如果您只需要在构建时传递一些变量,而不包括来自其他文件的几行,则可以运行

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

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

足够的最新版本的rpmbuild肯定支持%include:

 %include common.inc 

不幸的是,它们并不是很聪明 – 例如,没有已知的目录集合,在这些目录中它将查找所请求的文件。 但它在那里,变量被扩展,例如:

 %include %{_topdir}/Common/common.inc 

我最近面临同样的问题。 我想定义多个类似的子包,但每个都略有不同(它们是语言特定的RPM)。 我不想为每个子包重复相同的锅炉材料。

下面是我所做的一个通用版本:

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

%{expand}确保%(cat)只在宏定义时执行一次。 main-foo.spec文件的内容是三次,每次main-foo.spec文件中的%1依次扩展到barbazqux ,允许我把它当作模板。 如果你有需要(我没有),你可以很容易地扩展到多个参数。

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

  1. 子包
  2. macrorpmrc文件。

子包

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

我想这个问题是在尝试构建一些类似于

  • 两个spec文件; 比如说rpm_debug.specrpm_production.spec
  • 都使用%include common.spec

调试生产也可以是客户端服务器等。对于重新定义变量的例子,每个子包都可以有它自己的变量列表。

限制

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

宏和Rpmrc

子包无法解决您希望整个rootfs层次结构或更大的RPM集合的结构定义问题。 我们有rpmbuild --showrc 。 运行rpmrpmbuild时,可以通过更改rpmrcmacros来定义大量的变量 。 从man页,

  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是一个熟悉的概念,可能是为了使rpm更全面和开发友好而添加的。

你在说哪个版本? 我目前有我的spec文件中包含%filename.txt,它似乎工作就像C#包括指令。

 > rpmbuild --version RPM version 4.8.1 

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

 Source1: common.inc %include %{SOURCE1} 

这样他们将自动进入SRPMS

我已经使用脚本(命名您最喜爱的)采取模板,并从中创建规格文件。 另外, %files标签可以导入另一个进程创建的文件,例如Python的bdist-rpm