RPM 是 RedHat 和其衍生系统(如 CentOS、Fedora、openEuler、Rocky 等)的软件包格式。由于红帽官方教程过长本文主要是为了方便快速入门。
在打包前通常需要安装:rpmdevtools
sudo dnf install rpmdevtools
使用: rpmdev-setuptree
命令将会默认在 ~/ 下创建 rpmbuild 目录,结构如下:
├── BUILD # 存放构建过程文件
├── RPMS # 存放构建好的 RPM 包
├── SOURCES # 源文件存放目录
├── SPECS # 存放 SPEC 文件
└── SRPMS # 存放预编译的包(源码包)
接下来需要创建一个 .spec
文件,命名自取。这是打包需要的主配置文件,下面这是一个简单的 hello world 配置内容。为了易于理解我只写了个 hello.c
程序作为演示并且打成了 hello.tar.gz
存放在 SOURCES
里(spec 文件可以随便放,但个人喜欢存在上面的 SPECS 目录内)
hello.tar.gz:
├── hello.c
hello.c :
#include <stdio.h>
int main(){
printf("Hello Wolrd\n");
return 0;
}
hello.spec
# 这是包名
Name: hello
# 这是版本号相关
Version: 1.2
# 这是更细分的版本号 (现在相当于 1.2-1)
Release: 1
# 关于包的总体描述信息
Summary: 这是一个测试用的包
# 这是协议相关
License: MIT
%description
# 这里通常写描述信息
这是一个 Hello World RPM测试包
%prep
# 通常这里写解压源码的脚本
tar -zxvf %{_sourcedir}/hello.tar.gz -C %{_builddir}
%build
# 通常这里写编译或构建脚本, 这个阶段会默认 cd 进 _builddir 目录,所以 gcc 可直接使用相对路径。
echo '正在编译:hello.c'
gcc hello.c -o hello
%install
# 这里写安装相关的脚本
echo '正在安装:%{_builddir}/hello 至 %{buildroot}/usr/bin/hello'
mkdir -p %{buildroot}/usr/bin/
install -m 755 %{_builddir}/hello %{buildroot}/usr/bin/hello
%files
# 这里列出打包所涉及到的文件路径
%{_bindir}/hello
%changelog
# 通常这里是更新日志,包括你的名字和邮件
* Wed Jun 18 2025 Jiehai <your.email@example.com> - 1-2
- 测试包第一个版本
其中 ${buildroot}
为打包工具提供的宏,是代表虚拟的根文件系统,因为打包工具不允许直接指定系统级别目录,所以抽象一个单独的工作空间在打包过程中模拟最终安装位置。通常你可以用 %{buildroot}
来代替真实的 /
目录。它实际路径是 rpmbuild/BUILD/项目名称-版本号-build/BUILDROOT,只在打包时临时生成。
有关其他常用的宏:
变量宏 | 对应值 |
---|---|
%{_builddir} | rpmbuild/BUILD/项目 |
%{_sourcedir} | rpmbuild/SOURCES |
%{_rpmdir} | rpmbuild/RPMS |
%{buildroot} | / |
%{_bindir} | /usr/bin |
%{_sbindir} | /usr/sbin |
%{_libdir} | /usr/lib64 |
%{_datadir} | /usr/share |
%{_sysconfdir} | /etc |
脚本宏 | 触发时机 |
---|---|
%prep | 第一个阶段(用于解压源码) |
%build | 构建编译阶段执行 |
%install | 安装阶段执行 |
%pre | 安装前执行 |
%post | 安装后执行 |
%preun | 卸载前执行 |
%postun | 卸载后执行 |
%triggerin | 其他包安装时触发 |
需要注意:%{buildroot} 仅在 %install 阶段有效
一切准备完毕后,假设当前的配置文件存放在 ~/rpmbuild/SPECS/hello.spec
,此时输入 rpmbuild -bb ~/rpmbuild/SPECS/hello.spec
即可开始打包.
我的 cpu 是 x86_64,不出意外的话,rpm包会存放在 ~/rpmbuild/RPMS/x86_64/hello-1.2-1.x86_64.rpm
,这样就已经打包好了,可以使用 sudo dnf install 进行安装。
并且可以执行了,二进制也存放到相应的位置
1.在 spec 文件还可以可显式声明包本身的依赖:
Requires: bash
以及显式声明构建过程的依赖
BuildRequires: cmake gcc g++
2.在 spec 文件中也可以声明该软件包的项目地址,以及指定 SOURCES 目录源文件压缩包
URL: https://github.com/user/仓库名
Source0: ***.zip 或 **.tar.gz
3.打包命令默认不加 --noclean 的话会删除 BUILD 目录内容。 使用 rpmbuild -bb SPECS/hello.spec --noclean
可以保留构建过程的文件,方便检查问题。
4.使用 rpmbuild 有许多参数,其中 -bb 是只输出二进制包 (rpm),如果 -ba 会同时输出二进制包和源码包 (**.rpm,**.src.rpm)
对于更多相关,可以了解:红帽官方文档:https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/7/html-single/rpm_packaging_guide/index