Linux 是否可以创建RPM规范文件;包括「;其他文件?
RPM规范中是否有一种“include”指令?我在谷歌上找不到答案 动机:我有一个RPM规范模板,构建过程使用版本、修订版和其他构建特定数据修改该模板。这是由sed当前执行的。我认为如果规范Linux 是否可以创建RPM规范文件;包括「;其他文件?,linux,scripting,rpm,rpm-spec,Linux,Scripting,Rpm,Rpm Spec,RPM规范中是否有一种“include”指令?我在谷歌上找不到答案 动机:我有一个RPM规范模板,构建过程使用版本、修订版和其他构建特定数据修改该模板。这是由sed当前执行的。我认为如果规范#包含一个特定于构建的定义文件,它将由构建过程生成,那么它会更干净,因此我不需要在规范中搜索和替换 如果没有包含,是否有一种惯用的方法来完成这项任务(我相信是很常见的)?RPM不支持包含 我已经解决了m4宏处理器的类似问题,或者只是连接了部分规范(当“包含”在开始时) 如果您只需要在构建时传递几个变量,而不包
#包含一个特定于构建的定义文件,它将由构建过程生成,那么它会更干净,因此我不需要在规范中搜索和替换
如果没有包含,是否有一种惯用的方法来完成这项任务(我相信是很常见的)?RPM不支持包含
我已经解决了m4宏处理器的类似问题,或者只是连接了部分规范(当“包含”在开始时)
如果您只需要在构建时传递几个变量,而不包括来自另一个文件的几行,则可以运行
rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec
您可以在规范中使用%myvar。您在谈论哪个版本?目前我的规范文件中有%include filename.txt,它的工作方式似乎与C#include指令一样
> rpmbuild --version
RPM version 4.8.1
rpmbuild的足够新的版本肯定支持%包括:
%include common.inc
不幸的是,他们对此不是很聪明——例如,没有已知的目录集,它将在其中查找请求的文件。但它是存在的,变量被扩展,例如:
%include %{_topdir}/Common/common.inc
您可以包括源目录(%\u sourcedir
)中的*.inc
文件:
通过这种方式,他们将自动进入SRPMS对于根本问题,我知道所有rpm版本中可能存在两种额外的解决方案
分装
macro
和rpmrc
文件
分装
另一种选择(也许还有“RPM方式””)是使用。还有子包的信息和示例
我认为问题是试图构建这样的结构
- 两个规范文件;说rpm\u debug.spec和rpm\u production.spec
- 两者都使用
%包括common.spec
调试和生产也可以是客户端和服务器等。对于重新定义变量的示例,每个子包都可以有自己的变量列表
局限性
子包的主要优点是只进行一次构建;这也可能是一个缺点。调试和生产示例可能会强调这一点。可以使用strip
创建变体,或者使用不同的输出编译两次;可能与Gnu Make一起使用VPATH
)。必须编译大的包,然后只有简单的变体,比如有/没有开发人员信息,比如头文件,静态库等等,这会让你喜欢这种方法
宏与Rpmrc
子包无法解决您希望整个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功能更全面、对开发人员更友好而添加的。我使用脚本(说出您最喜欢的脚本)获取模板并从中创建规范文件。另外,%files
标记可以导入由另一个进程创建的文件,例如Python的bdist rpm
我最近遇到了同样的问题。我想定义多个相似的子包,但每个子包都略有不同(它们是特定于语言的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
都会扩展到条
、baz
和qux
,从而允许我将其视为模板。如果您有需要(我没有),您可以轻松地将其扩展到多个参数。谢谢<代码>--define
是我觉得应该在那里的第二个直观的解决方案谢谢<代码>--define
在我的rpmbuild版本(4.9.1.1)中没有记录,但它可以工作。我找了好几个小时了!!!最近的rpm 4.12+支持加载宏文件的加载,例如,您可以这样做%{?加载:%{SOURCE1}}
参见,幸运的是,这一点现在已不在我的掌握之中,我想问一个合适的CM:)如果有人能对完全支持%include
的版本发表评论,我将不胜感激。我能找到的%include
的最早提及是在中,这意味着对已经存在的功能进行了修复。4.4.x、4.6和4.7的发行说明根本没有提到%include
,这意味着该功能最迟在4.4.2(2005年7月)中引入。从2018年起,我认为如果您的RPM版本不支持%include
,则可以安全地假设您的RPM版本严重需要升级。这与。我认为它只适用于较新的rpm
版本;所以,如果您有更新的rpm
,问题就解决了。
%define foo_spec() %{expand:%(cat '%{myloc}/main-foo.spec')}
%{foo_spec bar}
%{foo_spec baz}
%{foo_spec qux}