RPM 规范中有一种“包含”指令吗?我无法通过谷歌搜索找到答案。
动机:我有一个 RPM 规范模板,构建过程会根据版本、修订和其他特定于构建的数据进行修改。这是sed
目前完成的。我认为如果规范将#include
是一个特定于构建的定义文件,它将由构建过程生成,所以我不需要在规范中搜索和替换。
如果没有include
,是否有一种惯用的方法来执行此任务(我相信很常见)?
足够新的 rpmbuild 版本确实支持 %include:
%include common.inc
不幸的是,他们对此并不是很聪明——例如,没有已知的目录集可以在其中查找请求的文件。但它在那里并且变量被扩展,例如:
%include %{_topdir}/Common/common.inc
RPM 不支持包含。
我已经使用 m4 宏处理器或仅连接部分规范(当“包含”位于开头时)解决了类似的问题。
如果您只需要在构建时传递几个变量,而不是包含另一个文件中的几行,则可以运行
rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec
您可以在规范中使用 %myvar 。
我最近遇到了同样的问题。我想定义多个相似的子包,但每个子包都略有不同(它们是特定于语言的 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
,baz
和qux
,反过来,我可以将其视为模板。如果您有需要(我没有),您可以轻松地将其扩展到多个参数。
对于根本问题,我知道的所有rpm版本中可能存在两个额外的解决方案。
macro
和rpmrc
文件。另一种选择(也许是“ RPM 方式”)是使用子包。最大 RPM还包含子包的信息和示例。
我认为问题是试图构建类似的结构,
%include common.spec
debug和production也可以是client和server等。对于重新定义变量的示例,每个子包都可以有自己的变量列表。
子包的主要优点是只发生一次构建;这也可能是一个缺点。调试和生产示例可能会突出这一点。可以使用它strip
来创建变体或使用不同的输出编译两次;也许VPATH
与 Gnu Make 一起使用)。必须编译大型包,然后只有简单的变化,比如有/没有开发者信息,比如headers
静态库等,可以让你欣赏这种方法。
子包不能解决您希望整个rootfs层次结构或更大的 RPM 集合的结构定义问题。我们有这个。您可以通过更改和在运行时定义大量变量和宏和。从页面来看,rpmbuild --showrc
rpmrc
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
。然而,%include
这是一个熟悉的概念,并且可能被添加以使rpm功能更全面且对开发人员更友好。
你说的是哪个版本?我目前在我的规范文件中有 %include filename.txt ,它似乎就像 C #include 指令一样工作。
> rpmbuild --version
RPM version 4.8.1
您可以包含*.inc
来自 SOURCES 目录 ( %_sourcedir
) 的文件:
Source1: common.inc
%include %{SOURCE1}
这样,它们将自动进入SRPMS。
我使用脚本(命名你最喜欢的)来获取模板并从中创建规范文件。此外,%files
标签可以导入由另一个进程创建的文件,例如 Python 的bdist-rpm
.