RPM包的构建说明
rpm 的版本 <=4.4.x,rpmbuid 工具其默认的工作路径是 /usr/src/redhat。
普通用户不能制作 rpm 包,制作 rpm 软件包时必须切换到 root 身份才可以。
rpm 从 4.5.x 版本开始,将 rpmbuid 的默认工作路径移动到用户家目录下的 rpmbuild目录里
即 $HOME/rpmbuild ,并且推荐用户在制作 rpm 软件包时尽量不要以 root 身份进行操作。
本文所在环境:
- RPM版本:rpm-4.11.3-32.el7.x86_64 版本。
- CentOS 7
如果想发布 rpm 格式的源码包或者是二进制包,就要使用 rpmbuild 工具( rpm 最新打包工具)。
如果我们已经根据本地源码包的成功编译安装而写了 spec 文件(该文件要以 .spec 结束)
那我们就可以建立一个打包环境,也就是目录树的建立,一般是在 ~/rpmbuild 目录下建立 5 个目录。
它门分别是:
- BUILD:目录用来存放打包过程中的源文件,就是来源于 SOURCE
- SOURCE :用来存放打包是要用到的源文件和patch,主要是一些 tar 包
- SPEC:用来存放 spec 文件
- SRPM:存放打包生成的 rpm格式的源文件
- RPM:二进制文件
SPEC 阶段与目录的对应关系#
阶段 | 读取的目录 | 写入的目录 | 具体动作 |
---|---|---|---|
%prep | %_sourcedir | %_builddir | 读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。 |
%build | %_builddir | %_builddir | 编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。 |
%install | %_builddir | %_buildrootdir | 读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。 |
%check | %_builddir | %_builddir | 检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。 |
bin | %_buildrootdir | %_rpmdir | 读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。 |
src | %_sourcedir | %_srcrpmdir | 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。 |
安装工具#
RPM打包使用的是 rpmbuild 命令,来自 rpm-build 包:
yum install -y rpm-build
也可以安装 rpmdevtools,依赖 rpm-build,所以直接安装会将 rpm-build 装上:
yum install -y rpmdevtools
工具使用#
rpmbuild 命令使用一套标准化的「工作空间」 ,生成 %_topdir 工作目录 ~/rpmbuild,以及配置文件 ~/.rpmmacros:
rpmdev-setuptree
rpmdev-setuptree这个命令就是安装 rpmdevtools 带来的。可以看到运行了这个命令之后,在 $HOME 家目录下多了一个叫做 rpmbuild 的文件夹,里边内容如下:
$ tree rpmbuildrpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
rpmdev-setuptree 命令在当前用户 home/rpmbuild 目录里自动建立上述目录。
如果没有安装 rpmdevtools 的话,其实用 mkdir 命令创建这些文件夹也是可以的:mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}。
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir | 源代码 RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目录 | 保存 %install 阶段安装的文件 |
rpmbuild 默认工作路径的确定,通常由在 /usr/lib/rpm/macros 这个文件里的一个叫做 %topdir 的宏变量来定义。如果用户想更改这个目录名,rpm 官方并不推荐直接更改这个目录,而是在用户家目录下建立一个名为 .rpmmacros 的隐藏文件(Linux下隐藏文件,前面的点不能少),然后在里面重新定义 %topdir,指向一个新的目录名。
生成 SPEC 文件#
最最最重要的 SPEC 文件,命名格式一般是“软件名-版本.spec”的形式,将其拷贝到 SPECS 目录下。
如果系统有 rpmdevtools 工具,可以用 rpmdev-newspec -o name.spec 命令来生成 SPEC 文件的模板
如果没有安装 rpmdevtools,也可以自己手动创建一个 spec 文件。
打包命令#
rpmbuild -bp
只解压源码及应用补丁-bc 只进行编译-bi 只进行安装到%{buildroot}-bb 只生成二进制 rpm 包-bs 只生成源码 rpm 包-ba 生成二进制 rpm 包和源码 rpm 包--target 指定生成 rpm 包的平台,默认会生成 i686 和 x86_64 的 rpm 包。
rpmbuild -bb 软件名-版本.spec
用此命令生成软件包,生成的文件会在刚才建立的RPM目录下存在。
rpmbuild-bs 软件名-版本.spec
生成的文件会在刚才建立的SRPM目录下存在。
rpmbuild-ba 软件名-版本.spec
软件包制作完成后可用 rpm 命令查询,看看效果。如果不满意的话可以再次修改软件包描述文件,重新运行以上命令产生新的 RPM 软件包。
结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类