【问题标题】:What is a good RPM building tool?什么是好的 RPM 构建工具?
【发布时间】:2012-10-23 22:07:36
【问题描述】:

我负责构建多个 RPM。对于我需要制作的每个 RPM 包,我都有原始的 SPEC 文件,并且我有 BASH 脚本来设置必要的环境并构建 RPM。

我想使用实际的构建工具(例如 make)来构建这些 RPM。通过这样做,我希望消除对自定义的、混淆的 BASH 脚本的需求,而使用清晰、可维护的配置文件(类似于 make 的 Makefile)。然而,使用POSIX make 并保持 make 文件集是最新的可能与维护我目前用于构建 RPM 包的 BASH 脚本一样多。像 cmake 和 automake 这样的程序包含 make 命令的功能是有原因的 - 这些工具更具表现力,允许更小、更清晰的配置文件。

但是,使用autoconf/automake 似乎也是一个糟糕的选择,因为它们似乎是专门为 C 和 C++ 开发而构建的。也有人建议我使用scons,但尽管这似乎是最佳选择(因为它的配置文件是实际的 Python 脚本),但它也适用于特定语言。

将我的 SPEC 文件用作“源代码”,将环境用作“依赖项”(例如设置制作 RPM 所需的 rpmbuild 目录树结构),是否有一个好的构建工具可以用来替换我的 BASH 脚本更清洁、更可维护的 RPM 构建解决方案?

编辑:当我说“构建工具”时,我似乎不清楚我需要什么。我已经使用 rpmbuild 作为“编译器”,我使用 SPEC 文件(以及二进制文件的相关源代码)作为“源代码”来“编译”RPM。我正在寻求一种可以协调该过程的工具。

【问题讨论】:

  • rpmbuildlinux.die.net/man/8/rpmbuild 怎么了?
  • 您提到的所有工具都负责创建“最终”分发文件。这是按照源作者的意图完成的。您正在寻找的生活要高一级。一步之后。
  • 正如下面评论中所述,没有 rpmbuild 就无法制作 RPM。我已经用过那个工具了。但是,我有很多 RPM 需要构建,因此我将 rpmbuild 视为构建工具(如 make),而不是将其视为“编译器”,将 SPEC 文件视为“源代码”。这些 RPM 共同组成一个套件,这是构建工具将生成的产品。

标签: build makefile rpm scons


【解决方案1】:

根据您需要做的事情的复杂性,SCons 确实是一个不错的选择。我总是发现用 Python 编写脚本比用 Bash 编写脚本要容易得多。但这也是个人喜好。

这是在 SCons 中生成 RPM 的相关 Python/SCons 代码:

env = Environment(tools=['default', 'packaging'])

rpmSourceFiles = ['file1', 'file2'] # This is a Python list
rpmTargetFile = 'yourRpmFile'

env.Package( source         = rpmSourceFiles,
             target         = rpmTargetFile,
             NAME           = 'foo',
             VERSION        = '1.2.3',
             PACKAGEVERSION = 0,
             PACKAGETYPE    = 'rpm',
             LICENSE        = 'gpl',
             SUMMARY        = 'balalalalal',
             DESCRIPTION    = 'this should be really really long',
             X_RPM_GROUP    = 'Application/fu',
             SOURCE_URL     = 'http://foo.org/foo-1.2.3.tar.gz'
        )

您可以找到记录在 here 的 Package() 构建器。关于rpmSourceFiles,它是一个 Python 列表,应该列出 RPM 输入文件。如果您使用 SCons 安装这些源文件,那么您可以只列出简单的名称,否则您需要提供绝对路径。

如果您只想使用 Python,另一种选择是直接使用 Python 编写 RPM,如 here 所述。

【讨论】:

  • +1 用于指出 scons 中可能与我的案例相关的功能。我会调查的。
  • CMake 也带有CPack can target RPMs
  • @Steve-o,我相信它可以,但首先你必须学习不直观的 C​​Make 语法,然后创建 makefile(非常庞大且不可读),然后实际执行制作。不,谢谢,我会坚持使用 SCons,它的 Python,而且 Python 很棒! :)
  • 感谢您提供指向相关参考指南和示例代码的链接。看来这是我应该做的。
  • @Brady,使用 CMake 你不需要自己创建 Makefile,只需要 CMakeLists.txt。
【解决方案2】:

我使用 scons 构建 RPM 和 Debian 软件包,因此作为 Package 的集成工具是最差的,并且具有的最小功能还不够。根据我的经验,我建议您在 bash 或 python 或其他脚本语言上创建构建脚本,并使用自定义操作从 scons 调用它以使用子进程调用脚本并设置来自二进制文件/库/其他工件的依赖项,这些工件需要使用 Depends 函数来打包这个命令。

当然,如果你使用scons作为构建系统,它适用,否则忽略。

【讨论】:

    【解决方案3】:

    正如@Serge 所提到的,rpmbuild 是您想要使用的工具。它在所有基于 RPM 的发行版中都带有 rpm 包(或子包)。对于基于 RPM 的发行版,还有很多可用的辅助命令,例如对于 fedora 或基于 RH 的 rpmdevtools 包有很多有用的脚本/命令。

    如果您正在寻找构建器,Fedora 项目使用构建器 koji。它托管在 fedorahosted.org 中。您可以设置 koji 服务器并使用 koji 的命令行工具来构建 RPM。 Builder 可能无法完全解决您的问题,但如果您有空闲时间,不妨看看。

    【讨论】:

    • 我已经使用 rpmbuild 作为“编译器”,我使用 SPEC 文件(以及二进制文件的相关源代码)作为“源代码”来“编译”RPM。我正在寻求一种可以协调该过程的工具。
    • @djhaskin987 你的问题之前有点混乱。它没有提到您需要一些东西来协调以及在 rpmbuild 之上的东西。 rpmbuild 不是编译器。它是一个使用 spec 文件生成 rpm 的工具。它使用环境或规范文件中指定的规范文件和编译器来编译源代码(假设它是必需的 - 取决于规范文件)。
    • 如果您正在寻找构建器,Fedora 项目使用构建器 koji。它托管在 fedorahosted.org 中。您可以设置 koji 服务器并使用 koji 的命令行工具来构建 RPM。 Builder 可能无法完全解决您的问题,但如果您有空闲时间,不妨看看。
    • 感谢您的反馈。我将编辑问题。如果你把你的评论变成答案,我至少会投赞成票。
    【解决方案4】:

    我猜你可能找不到结果 RPM。 默认应该是<YOUR_RPMBUILD_DIR>/RPMS/<ARCH>

    取决于您的架构。 ARCH 可能在 x86_64i586noarch 中。

    你可以关注~/.rpmmacros

    %home %(echo $HOME)
    %packager NAME OF PACKAGER
    %vendor NAME OF VENDER
    %_topdir ${home}/rpmbuild
    

    否则,您只需要像下面这样的 Makefile 来编译、构建、打包 tarball 并生成 RPM。

    SRCS = LIST OF SOURCE FILES
    DATA = LIST OF DATA FILES TO BE PACKED
    BINARY = LIST OF FILES AS RESULT OF BUILD
    TARBALL = FILENAME_OF_THE_SOURCE_ARCHIVE
    
    all: rpm
    
    rpm: build pack
       rpmbuild -ba <PATH_TO_SPEC>
    
    pack: TARBALL
    
    TARBALL: BINARY DATA
        COMMAND TO PACK TARBALL
    
    build: BINARY
    
    BINARY: SRCS
       BUILD COMMANDS
    

    【讨论】:

    • 我已经使用 rpmbuild 作为“编译器”,我使用 SPEC 文件(以及二进制文件的相关源代码)作为“源代码”来“编译”RPM。我要求一种可以协调该过程的工具
    • 我不太确定您的工作流程。看起来您需要处理版本(也许是 ChangeLogs)和文件列表。布雷迪的回答是一个好的开始。
    【解决方案5】:

    绝对是一个老问题,但您可能对多哥感兴趣。

    https://github.com/genereese/togo

    它专注于使您的构建环境更加健全和易于管理

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2015-07-22
      • 2010-09-07
      • 2010-11-25
      相关资源
      最近更新 更多