什么是好的RPM构建工具?

时间:2012-10-23 22:07:37

标签: build makefile rpm scons

我负责构建多个RPM。我为每个RPM包提供了pristine 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文件(和二进制文件的相关源代码)'编译'RPMs作为'源代码'。我要求一个可以协调这个过程的工具。

5 个答案:

答案 0 :(得分:6)

根据您需要做的复杂性,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 :(得分:1)

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

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

答案 2 :(得分:0)

我已经使用scons来构建RPM和Debian软件包,因此像Package这样的集成工具是最糟糕的,并且具有最小的功能而不能实现。根据我的经验,我建议您使用bash或python或其他脚本语言创建构建脚本,并使用自定义Action从scons调用它以使用子进程调用脚本,并从具有Depends函数的包所需的二进制文件/库/其他工件设置依赖性这个命令。

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

答案 3 :(得分:0)

我猜你可能找不到结果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

答案 4 :(得分:0)

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

https://github.com/genereese/togo

它专注于让您的构建环境更加清晰且易于管理