ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 1.概述 RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。 ## 2.环境准备 ``` // RPM打包使用的是rpmbuild,这个包必装 yum install rpm-build yum install rpmdevtools // rpmdev-setuptree 命令可以自动生成编译打包的工作空间rpmbuild,手动创建也可 //根据软件的不同,选择安装其他编译打包等工具 ``` ## 3.原理 **目录结构说明** <table> <thead> <tr> <th>默认位置</th> <th>宏代码</th> <th>名称</th> <th>用途</th> </tr> </thead> <tbody> <tr> <td>~/rpmbuild/SPECS</td> <td>%_specdir</td> <td>Spec 文件目录</td> <td>保存 RPM 包配置(.spec)文件</td> </tr> <tr> <td>~/rpmbuild/SOURCES</td> <td>%_sourcedir</td> <td>源代码目录</td> <td>保存源码包(如 .tar 包)和所有 patch 补丁</td> </tr> <tr> <td>~/rpmbuild/BUILD</td> <td>%_builddir</td> <td>构建目录</td> <td>源码包被解压至此,并在该目录的子目录完成编译</td> </tr> <tr> <td>~/rpmbuild/BUILDROOT</td> <td>%_buildrootdir</td> <td>最终安装目录</td> <td>保存 %install 阶段安装的文件</td> </tr> <tr> <td>~/rpmbuild/RPMS</td> <td>%_rpmdir</td> <td>标准 RPM 包目录</td> <td>生成/保存二进制 RPM 包</td> </tr> <tr> <td>~/rpmbuild/SRPMS</td> <td>%_srcrpmdir</td> <td>源代码 RPM 包目录</td> <td>生成/保存源码 RPM 包(SRPM)</td> </tr> </tbody> </table> <br> SPECS目录下是RPM包的配置文件,该文件会告诉`rpmbuild`命令如何打包。`宏代码`在该文件中代指对应的目录。 <br> <br> **打包过程说明** * 首先,需要把源码放到`%\_sourcedir`中; * 然后进行编译,编译是在`%\_builddir`中完成的,需要将源码复制到该目录下。 * 把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到`%_buildrootdir`中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在`/usr/bin`下,那么就在`%_buildrootdir`下也按照同样的目录结构放置; * 需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉`rpmbuild`命令; * 还有一步可选操作,那就是检查软件是否正常运行; * 最后,生成的RPM包放置到`%_rpmdir`,源码包放置到`%_srpmdir`下。 <table> <thead> <tr> <th>阶段</th> <th>读取的目录</th> <th>写入的目录</th> <th>具体动作</th> </tr> </thead> <tbody> <tr> <td>%prep</td> <td>%_sourcedir</td> <td>%_builddir</td> <td>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。</td> </tr> <tr> <td>%build</td> <td>%_builddir</td> <td>%_builddir</td> <td>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。</td> </tr> <tr> <td>%install</td> <td>%_builddir</td> <td>%_buildrootdir</td> <td>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。</td> </tr> <tr> <td>%check</td> <td>%_builddir</td> <td>%_builddir</td> <td>检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。</td> </tr> <tr> <td>bin</td> <td>%_buildrootdir</td> <td>%_rpmdir</td> <td>读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。</td> </tr> <tr> <td>src</td> <td>%_sourcedir</td> <td>%_srcrpmdir</td> <td>创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。</td> </tr> </tbody> </table>