我负责构建多个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作为'源代码'。我要求一个可以协调这个过程的工具。
答案 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_64
,i586
或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
答案 4 :(得分:0)