RPM打包简述

此文档将简要介绍RPM打包的基本概念和操作,更详细的信息请参考上游的其它文档。

RPM基本概念

RPM是一系列重要Linux发行版使用的标准打包格式。除了Red Hat主导的Fedora, RHEL, CentOS行发行版外,其它一些重要发行版也都采用RPM来打包,包括但不限于:openSuSE, Turbo Linux, openEuler等发行版。

打包原理

RPM系统使用spec文件来描述软件的准备,编译和打包过程。然后根据spec文件中不同阶段的设置来进行打包工作。

spec文件结构

spec文件一般有通用的结构,代表从源代码到RPM包的各个阶段,一般结构如下:

阶段 对应源目录 对应目的目录 操作
%prep %_sourcedir %_builddir 使用%_sourcedir中保存的源码tarball、文件和patch在%_builddir目录生成准备编译打包的源码
%build %_builddir %_builddir 在%_builddir中执行configure脚本和make或者其它类似操作生成二进制文件
%install %_builddir %_buildrootdir 将编译出的二进制文件,安装到以%_buildrootdir为根目录的文件系统中
%check %_builddir %_builddir 一般使用软件源码自带的test程序检查是否编译生成正确,也可跳过
%files %_buildrootdir %_rpmdir或%_srpmdir %_builddir中有此段声明的文件和目录会根据打包要求分别生成RPM或SRPM包到相应目录

打包过程

准备工作

工具

在使用RPM的发行版中使用RPM打包,需要先安装工具软件包:

  • rpm-build
  • rpmdevtools(可选,建议使用)

目录

一般来说,打包有一个标准的目录结构,可以使用rpmdevtools中的命令rpmdev-setuptree来生成。 默认目录生成为~/rpmbuild,结构如下:

rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

如果直接使用rpm命令安装SRPM包,也会生成此目录。

spec文件默认放入SPECS目录下。

源码的tarball和patch以及所有编译时会用到的文件默认放入SOURCES目录,所有的tarball,文件和patch都应该在spec文件中有对应声明。

打包

将spec写好并安排好对应的源码在打包目录树中后,可以使用rpmbuild命令打包。

  • 打包SRPM
rpmbuild -bs ~/rpmbuild/SPECS/my.spec
  • 打包RPM
rpmbuild -bb ~/rpmbuild/SPECS/my.spec
  • 同时打包SRPM和RPM
rpmbuild -ba ~/rpmbuild/SPECS/my.spec

如果spec文件和源码都没有问题,会在~/rpmbuild/SRPMS~/rpmbuild/RPMS下生成相应的SRPM和RPM目录和包。

如果需要对RPM打包有进一步了解,建议参照Fedora社区的详细文档:

示例

mock工具

编译打包过程往往和环境中已经安装的包相关,所以一般打包需要一个“干净”的文件系统环境来进行,mock就是这样一个从已有的RPM仓库生成”干净“根文件系统,并在其中打包的工具。目前大量正式发行的RPM软件包均使用了mock来进行打包。

mock打包需要准备的文件一般是一样的,打包使用命令:

mock -r distro-config-file  --rebuild --spec=spec-file --sources=source-dir

了解mock的详细信息,参见文档

打包系统

一般除了本地打包,发行版或者oepkgs.net这样的社区会提供打包的资源,可以让开发者方便的直接在系统中使用源码或者源码仓库直接生成相应的RPM包。

Copyright © oepkgs.net All rights reserved.

版权所有 © oepkgs.net 保留所有权利

中国科学院软件研究所openEuler 社区共同发起并提供支持

京ICP备05046678号-13

Email: support(at)oepkgs.net