Linux 中 RPM 的构建与打包( 二 )


文章插图
 
在介绍了如何从源码构建软件包后,接下来我们介绍如何给软件打补丁 。
给软件打补丁在计算机软件中,补丁是用来修复代码中的漏洞的 。软件中的补丁表示的是与源代码之间的不同之处 。接下来,我们从原始源代码创建补丁,然后应用补丁 。
创建补丁的第一步是备份原始源代码,通常是将它拷贝为.orig 文件 。我们以 cello.c 为例 。
首先备份 cello.c,然后修改 cello.c 中的内容,如下图 4 所示,我们修改了源代码中的描述:
图 4. 备份并修改源码

Linux 中 RPM 的构建与打包

文章插图
 
首先查看两个源码文件的不同之处,如下图 5 所示:
图 5. 查看两个源码文件的不同
Linux 中 RPM 的构建与打包

文章插图
 
将两个源码的不同之处保存到 
cello-output-first-patch.patch 中 。
# diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
为了验证打补丁的效果,将 cello.c 文件恢复为原始源代码,如下图 6 所示:
图 6. 恢复 cello.c 初始内容
Linux 中 RPM 的构建与打包

文章插图
 
将补丁文件重定向到补丁,给源码打补丁,如下图 7 所示 。
图 7. 给源码打补丁
从上图 cat 命令的输出中可以看到补丁已成功构建并运行,如图 8 所示:
图 8. 构建源码并运行
至此,证明为打补丁成功 。
安装软件一旦我们构建了软件,我们就可以将它放在系统的某个目录下,以便用户可以执行 。为了方便操作,很多时候我们需要将编译和安装进行合并 。
对于不需要编译类的解释型语言,例如 shell,可以使用 install 命令安装到 linux 中,如下图 9 所示:
图 9. 安装并执行 shell
Linux 中 RPM 的构建与打包

文章插图
 
对于需要编译的语言,就需要先编译再安装 。例如使用 make install 。修改 makefile 文件,如下图 10 所示:
图 10. 修改 Makefile
Linux 中 RPM 的构建与打包

文章插图
 
构建并安装 cello.c 程序,并执行验证成功,如下图 11 所示:
图 11. 构建并安装 cello.c
我们刚展示的是编译与安装在相同的环境下,即可以通过 Makefile 的方式,直接编译和安装程序;如果编译和运行是两个环境,那么我们就需要对软件进行 RPM 打包 。在 RPM 打包之前,需要将源代码进行打包生成 tar.gz 文件 。
源代码生成 tar.gz 包在源码打包时,需要在每个源代码版本中包含一个 LICENSE 文件 。我们模拟生成遵守 GPLv3 的压缩包,如下图 12 所示:
图 12. 生成 LICENSE 文件
Linux 中 RPM 的构建与打包

文章插图
 
将 bello 程序的源码打包,如下图 13 所示:
图 13. 将 bello 程序的源码打包
创建~/rpmbuild/SOURCES 目录,将.tar.gz 文件移动过去,如下图 14 所示:
图 14. 移动 tar.gz 包
用相同的方法,我们为 Pello 和 Cello 的源码打包,由于方法相同因此不再赘述 。
将源码打包以后,接下来我们就可以使用 RPM 将其构建成 RPM 包 。
RPM 打包RPM 文件有两类:源 RPM(SRPM)和二进制 RPM 。SRPM 中的有效负载是 SPEC 文件(描述如何构建二进制 RPM) 。
查看 SRPM 的目录结构,如下图 15 所示:
图 15. 查看 SRPM 目录结构
Linux 中 RPM 的构建与打包

文章插图
 
上图中 SRPM 五个目录的作用分别是:
BUILD构建 RPM 包的时,会在此目录下产生各种%buildroot 目录 。如果构建失败,可以据此查看目录日志,进行问题诊断 。RPMS构建成功二进制 RPM 的存放目录 。存放在 architecture 的子目录中 。例如:noarch 和 x86_64SOURCES存放源代码和补丁的目录 。构建 RPM 包时,rpmbuild 命令将会从这个目录查找源代码 。SPEcssPEC 文件存放目录SRPMS存放 SRPM 的目录
在介绍了 SRPM 的目录结构后,我们详细介绍 SPEC 的作用 。
什么是 SPEC 文件?SPEC 文件是 rpmbuild 程序用于实际构建 RPM 的方法 。SPEC 文件包含如下字段:
SPEC DirectiveDefinitionName包的名称,应与 SPEC 文件名匹配Version软件的上游版本号 。ReleaseRPM 软件版本号 。初始值通常应为 1%{?dist},并在一个新版本构建时重置为 1.SummaryRPM 包的简要说明License正在打包的软件的许可证 。URL该程序的更多信息的完整 URL(通常是打包的软件的上游项目网站) 。Source0上游源代码的压缩归档的路径或 URL


推荐阅读