什么是一个好的RPM构建工具?

5
我负责构建多个RPM包。我有每个RPM包的原始SPEC文件,需要制作,还有设置必要环境并构建RPM的BASH脚本。
我想使用实际的构建工具(例如make)来构建这些RPM。通过这样做,我希望消除自定义的、混淆的BASH脚本,转而使用清晰、可维护的配置文件(类似于make的Makefile)。然而,使用POSIX make并保持一组make文件最新可能会像维护我目前用于构建RPM包的BASH脚本一样费力。像cmake和automake这样的程序有其存在的理由,它们包装了make命令的功能 - 这些工具更加表达能力强,允许使用更小、更干净的配置文件。
然而,使用autoconf/automake似乎也不是一个好选择,因为它们似乎是专门为C和C++开发构建的。有人建议我使用scons,但尽管它的配置文件是实际的Python脚本,这似乎是最佳选择,但它也是针对特定语言的。
使用我的SPEC文件作为“源代码”,环境作为“依赖项”(例如设置rpmbuild所需的目录树结构以制作RPM),是否有一个良好的构建工具可以替换我的BASH脚本,以实现更清洁、更易维护的RPM构建解决方案?
编辑:当我说“构建工具”时,显然我表述不清楚。我已经使用rpmbuild作为“编译器”,使用SPEC文件(和相关的二进制源代码)作为“源代码”来“编译”RPM。我正在寻求一种可以协调该过程的工具。

4
rpmbuild 有什么问题?http://linux.die.net/man/8/rpmbuild - Serge
你提到的所有工具都负责创建“最终”分发文件。这是按照源作者的意图完成的。而你所寻找的位于更高一级或更晚一步。 - glglgl
如下评论所述,没有rpmbuild就无法制作RPM。我已经在使用这个工具了。然而,我有很多RPM需要构建,因此我认为rpmbuild不是构建工具(像make一样),而是“编译器”,SPEC文件则是“源代码”。这些RPM一起组成了一个套件,这个套件就是构建工具将要生成的产品。 - djhaskin987
5个回答

7

根据你需要完成的任务复杂程度,SCons可能确实是一个很好的选择。我总是觉得用Python脚本比用Bash脚本更容易。但这也是个人爱好。

这里提供了生成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()构建器的文档:http://www.scons.org/doc/production/HTML/scons-user/a8580.html。关于rpmSourceFiles,它是一个Python列表,应列出RPM输入文件。如果您使用SCons安装这些源文件,那么只需列出它们的简单名称即可,否则您需要提供绝对路径。
如果您只想使用Python,则另一种选择是直接用Python编写RPM,如此处所解释:http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpm-programming-python.html

+1 指出在我的情况下可能与 scons 相关的功能。我会研究一下。 - djhaskin987
2
CMake 与 CPack 可以将目标定向为 RPM(仅限 Unix)。 - Steve-o
@Steve-o,我相信它是可以的,但首先你得学习不直观的CMake语法,然后创建makefile(非常庞大且难以阅读),最后才能进行编译。不用了,我还是坚持使用SCons吧,因为它是Python编写的,而Python真的很棒! :) - Brady
感谢您提供有关参考指南和示例代码的链接。看起来这就是我应该做的。 - djhaskin987
1
@Brady,使用CMake您不需要手动创建Makefile,只需准备CMakeLists.txt即可。 - Ding-Yi Chen
自从我提出这个问题后,我已经换了工作。在我的新公司,我们使用CMake/CPack。我可以确认它们运行良好 :) - djhaskin987

1

我曾使用scons构建RPM和Debian软件包,因此集成工具作为Package的功能最差,而且功能很少,不够用。根据我的经验,我建议您在bash或python或其他脚本语言上创建构建脚本,并使用自定义操作从scons调用脚本,使用子进程调用脚本并使用Depends函数将二进制文件/库/其他所需工件的依赖关系设置为此命令。

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


1

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

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


我已经使用 rpmbuild 作为我的“编译器”,使用 SPEC 文件(以及相关二进制文件的源代码)作为“源代码”来“编译” RPM。我正在寻找一个可以协调这个过程的工具。 - djhaskin987
@djhaskin987,您之前的问题有点令人困惑。它没有提到您需要协调的东西和在rpmbuild之上的东西。rpmbuild不是编译器。它是一个工具,使用spec文件生成rpm包。它使用环境或spec文件中指定的spec文件和编译器来编译源代码(假设需要 - 取决于spec文件)。 - user648129
1
如果你正在寻找一个构建工具,Fedora项目使用一个名为koji的构建工具。它托管在fedorahosted.org上。你可以设置koji服务器并使用命令行工具来构建RPM包。构建工具可能不能完全解决你的问题,但如果你有一些空闲时间,可以看一下。 - user648129
感谢您的反馈。我会编辑问题。如果您把您的评论转化为答案,我至少会给它投票支持。 - djhaskin987

0

我猜可能是你找不到结果的 RPM 文件。

默认应该在 <YOUR_RPMBUILD_DIR>/RPMS/<ARCH> 目录下。

根据你的架构,ARCH 可能是 x86_64i586 或者 noarch

你可以设置以下的 ~/.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。我正在寻找一个可以协调该过程的工具。 - djhaskin987
我不确定你的工作流程。看起来你需要处理版本(可能是变更日志)和文件列表。Brady的回答是一个很好的开始。 - Ding-Yi Chen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接