问题描述
|
RPM规范中是否有一种\“ include \\”指令?我通过谷歌搜索找不到答案。
动机:我有一个RPM规范模板,构建过程会使用版本,修订和其他特定于构建的数据对其进行修改。当前由
sed
完成。我认为,如果规范将“ 1”特定于构建的定义文件(由构建过程生成)会更干净,因此我不需要在规范中进行搜索和替换。
如果没有include
,是否有惯用的方法来完成此任务(我认为很常见)?
解决方法
RPM不支持包含。
我已经解决了类似的问题,无论是使用m4宏处理器还是仅连接规范的一部分(当“ include \”开头时)。
如果您只需要在构建时传递几个变量,而不必包含另一个文件中的几行,则可以运行
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文件的内容是3倍,并且每次main-foo.spec文件中的ѭ9s扩展为bar
,baz
和ѭ12each中的每一个时,我都将其视为模板。如果需要,您可以轻松地将此参数扩展为多个参数(我没有)。
,对于潜在的问题,我所知道的所有rpm版本中都可能存在两个其他解决方案。
子包
macro
和rpmrc
文件。
子包
另一种选择(也许是“ RPM方式”)是使用子包。最大RPM还包含信息和子包示例。
我认为问题在于尝试构建类似的结构,
两个规格文件;说rpm_debug.spec和rpm_production.spec
都用%include common.spec
调试和生产也可以是客户端和服务器等。对于重新定义变量的示例,每个子包都可以具有其自己的变量列表。
局限性
子软件包的主要优点是仅进行一次构建。这也可能是一个缺点。调试和生产示例可能会突出显示这一点。可以解决使用strip
创建变体或使用不同的输出编译两次的问题。也许在Gnu Make中使用VPATH
)。必须编译大型软件包,然后仅进行简单的更改,例如带有/不带有开发人员信息,例如headers
,静态库等,可以使您欣赏此方法。
巨集和Rpmrc
子包不能解决整个rootfs层次结构或更大的RPM集合所需的结构化定义问题。为此,我们有19英镑。运行rpm
和rpmbuild
时,可以通过更改rpmrc
和macros
来定义大量的变量和宏。在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
可以解决的所有问题。但是,ѭ26是一个熟悉的概念,可能是为了使rpm更全功能和开发人员友好而添加的。
,您可以包括SOURCES目录(%_sourcedir
)中的*.inc
个文件:
Source1: common.inc
%include %{SOURCE1}
这样,它们将自动进入SRPMS。
,您正在谈论哪个版本?我目前在我的规格文件中有%include filename.txt,它似乎像C #include指令一样工作。
> rpmbuild --version
RPM version 4.8.1
,我已经使用脚本(命名为您的最爱)来获取模板并从中创建规范文件。同样,%files
标记可以导入由另一个进程创建的文件,例如Python的33英镑。