Linux 是否可以创建RPM规范文件;包括「;其他文件?

Linux 是否可以创建RPM规范文件;包括「;其他文件?,linux,scripting,rpm,rpm-spec,Linux,Scripting,Rpm,Rpm Spec,RPM规范中是否有一种“include”指令?我在谷歌上找不到答案 动机:我有一个RPM规范模板,构建过程使用版本、修订版和其他构建特定数据修改该模板。这是由sed当前执行的。我认为如果规范#包含一个特定于构建的定义文件,它将由构建过程生成,那么它会更干净,因此我不需要在规范中搜索和替换 如果没有包含,是否有一种惯用的方法来完成这项任务(我相信是很常见的)?RPM不支持包含 我已经解决了m4宏处理器的类似问题,或者只是连接了部分规范(当“包含”在开始时) 如果您只需要在构建时传递几个变量,而不包

RPM规范中是否有一种“include”指令?我在谷歌上找不到答案

动机:我有一个RPM规范模板,构建过程使用版本、修订版和其他构建特定数据修改该模板。这是由sed当前执行的。我认为如果规范
#包含一个特定于构建的定义文件,它将由构建过程生成,那么它会更干净,因此我不需要在规范中搜索和替换


如果没有包含,是否有一种惯用的方法来完成这项任务(我相信是很常见的)?

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.specrpm\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}