RPM规范中是否有一种“include”指令?我无法通过谷歌搜索找到答案。
动机:我有一个RPM规范模板,构建过程使用版本,修订版和其他特定于构建的数据进行修改。目前由sed
完成。我认为如果规范#include
是一个特定于构建的定义文件,它将由构建过程生成,那将更清晰,所以我不需要在规范中搜索和替换。
如果没有include
,是否有一种惯用的方式来执行此操作(相当常见,我相信)任务?
答案 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
扩展为bar
,baz
和{{1}中的每一个反过来,允许我将其视为模板。如果您有需要(我没有),您可以轻松地将其扩展为多个参数。
答案 3 :(得分:4)
对于潜在的问题,我所知道的所有 rpm 版本中可能还有两个其他解决方案。
macro
和rpmrc
个文件。另一种选择(也许是“ RPM方式”)是使用sub-packages。 Maximum RPM还包含子包的信息和示例。
我认为问题是尝试构建类似的东西,
%include common.spec
debug 和 production 也可以是客户端和服务器等。有关重新定义变量的示例,每个子包都可以拥有自己的变量列表。
子包的主要优点是只发生一次构建;这也可能是一个缺点。 debug 和 production 示例可能会突出显示此内容。这可以使用strip
来创建变体或使用不同的输出编译两次;也许使用VPATH
与Gnu Make)。必须编译大型包然后只有简单的变体,比如有/无开发者信息,如headers
,静态库等,可以让你欣赏这种方法。
子包无法解决结构定义您希望整个 rootfs 层次结构或更大的RPM集合的问题。我们rpmbuild --showrc
为此。运行rpmrc
和{{1}时,您可以通过更改macros
和rpm
来定义大量变量和宏 }}。从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
。