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 目录和包。
Info
如果需要对 RPM 打包有进一步了解,建议参照 [Fedora 社区](https://fedoraproject.org/)的详细 文档。
示例⚓︎
mock 工具⚓︎
编译打包过程往往和环境中已经安装的包相关,所以一般打包需要一个“干净”的文件系统环境来进行,mock 就是这样一个从已有的 RPM 仓库生成”干净“根文件系统,并在其中打包的工具。目前大量正式发行的 RPM 软件包均使用了 mock 来进行打包。
mock 打包需要准备的文件一般是一样的,打包使用命令:
mock -r distro-config-file --rebuild --spec=spec-file --sources=source-dir
Info
了解 mock 的详细信息,参见 文档。
打包系统⚓︎
一般除了本地打包,发行版或者 [oepkgs.net](https://oepkgs.net)这样的社区会提供打包的资源,可以让开发者方便的直接在系统中使用源码或者源码仓库直接生成相应的 RPM 包。