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

dav*_*vka 10 linux scripting rpm rpm-spec

RPM规范中是否有一种"包含"指令?我用谷歌搜索找不到答案.

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

如果没有include,是否有一种惯用的方法来做这个(相当常见,我相信)任务?

小智 18

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

%include common.inc
Run Code Online (Sandbox Code Playgroud)

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

%include %{_topdir}/Common/common.inc
Run Code Online (Sandbox Code Playgroud)


m1t*_*tk4 8

RPM不支持包含.

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

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

rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec
Run Code Online (Sandbox Code Playgroud)

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

  • 最近的rpm 4.12+支持加载macrofile,例如你可以做这样的事情`%{?load:%{SOURCE1}}`参见http://pkgs.fedoraproject.org/cgit/ruby.git/tree/ruby的.spec?ID = b9da2e689a47e432a4272b43c849a9a818965bbb#N92 (2认同)

Bob*_*ell 5

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

这是我所做的通用版本:

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

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