在RPM规范中是否有一种“包含”指令? 我无法通过Googlesearchfind答案。
动机 :我有一个RPM规范模板,构build过程使用版本,修订版本和其他特定于构build的数据进行修改。 这是目前由sed
完成的。 我认为如果规范将包含特定于构build的定义文件(这将由构build过程生成),那么将会更清洁,因此我不需要在规范中进行search和replace。
如果没有include
,有没有一种习惯的方式来做到这一点(相当普遍,我相信)的任务?
RPM不支持包含。
我已经解决了与m4宏处理器类似的问题,或者只是连接规范的一部分(当“包含”在开始时)。
如果您只需要在构建时传递一些变量,而不包括来自其他文件的几行,则可以运行
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文件的内容是三次,每次main-foo.spec文件中的%1
依次扩展到bar
, baz
和qux
,允许我把它当作模板。 如果你有需要(我没有),你可以很容易地扩展到多个参数。
对于潜在的问题,可能有两个额外的解决方案存在于我知道的所有rpm版本中。
macro
和rpmrc
文件。 另一种选择(也许是“ RPM方式 ”)是使用子包 。 最大RPM也有子包的信息和例子。
我想这个问题是在尝试构建一些类似于
%include common.spec
调试和生产也可以是客户端和服务器等。对于重新定义变量的例子,每个子包都可以有它自己的变量列表。
子包的主要优点是只有一个构建发生; 这也可能是一个缺点。 调试和生产示例可能会强调这一点。 这可以解决使用strip
创建变种或编译两次不同的输出; 也许用Gnu Make使用VPATH
)。 不得不编译大包,然后只有简单的变化,像有/没有开发者信息,如headers
, 静态库等,可以让你欣赏这种方法。
子包无法解决您希望整个rootfs层次结构或更大的RPM集合的结构定义问题。 我们有rpmbuild --showrc
。 运行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
是一个熟悉的概念,可能是为了使rpm更全面和开发友好而添加的。
你在说哪个版本? 我目前有我的spec文件中包含%filename.txt,它似乎工作就像C#包括指令。
> rpmbuild --version RPM version 4.8.1
您可以包含来自SOURCES目录( %_sourcedir
)的*.inc
文件:
Source1: common.inc %include %{SOURCE1}
这样他们将自动进入SRPMS 。
我已经使用脚本(命名您最喜爱的)采取模板,并从中创建规格文件。 另外, %files
标签可以导入另一个进程创建的文件,例如Python的bdist-rpm
。