RPM规范文件可以“包含”其他文件吗?

时间:2011-05-26 09:00:22

标签: linux scripting rpm rpm-spec

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

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

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

7 个答案:

答案 0 :(得分:16)

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

%include common.inc

不幸的是,他们并不是很聪明 - 例如,没有已知的目录集,它会查找所请求的文件。但它存在并且变量被扩展,例如:

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

答案 1 :(得分:7)

RPM不支持包含。

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

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

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

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

答案 2 :(得分: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文件的内容是三次,并且main-foo.spec文件中的每次%1扩展为barbaz和{{1}中的每一个反过来,允许我将其视为模板。如果您有需要(我没有),您可以轻松地将其扩展为多个参数。

答案 3 :(得分:4)

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

  1. 子程序包
  2. macrorpmrc个文件。
  3. 子程序包

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

    我认为问题是尝试构建类似的东西,

    • 两个规范文件;说 rpm_debug.spec rpm_production.spec
    • 都使用%include common.spec

    debug production 也可以是客户端服务器等。有关重新定义变量的示例,每个子包都可以拥有自己的变量列表。

    限制

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

    宏和Rpmrc

    子包无法解决结构定义您希望整个 rootfs 层次结构或更大的RPM集合的问题。我们rpmbuild --showrc为此。运行rpmrc和{{1}时,您可以通过更改macrosrpm来定义大量变量 }}。从rpmbuild页面

    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 更全功能和开发人员友好。

答案 4 :(得分:3)

您可以在SOURCES目录中添加*.inc个文件(%_sourcedir):

Source1: common.inc

%include %{SOURCE1}

通过这种方式,他们将自动进入 SRPMS

答案 5 :(得分:2)

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

> rpmbuild --version
RPM version 4.8.1

答案 6 :(得分:1)

我已经使用脚本(命名你最喜欢的)来获取模板并从中创建spec文件。此外,%files标记可以导入由其他进程创建的文件,例如Python的bdist-rpm