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

问题描述

| 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英镑。