5

我负责构建多个 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。我要求一种可以协调该过程的工具。

4

5 回答 5

7

根据您需要做的事情的复杂性,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'
        )

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

如果您只想使用 Python,另一种选择是直接使用 Python 对 RPM 进行编程,如此所述。

于 2012-10-24T05:27:53.457 回答
1

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

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

于 2012-10-23T22:41:33.210 回答
1

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

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

于 2012-10-24T07:14:36.260 回答
0

我想这可能是您找不到结果 RPM。默认值应为<YOUR_RPMBUILD_DIR>/RPMS/<ARCH>

取决于您的架构。ARCH可能在x86_64,i586noarch.

你可以有以下~/.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
于 2013-11-12T08:44:54.117 回答
0

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

https://github.com/genereese/togo

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

于 2017-08-04T14:09:12.903 回答