Linux 中 RPM 的构建与打包

什么是 RPMRPM 全称为:Red-Hat Package Manager,即红帽 linux 发行版的软件包管理器 。RPM 的出现,提升了 Linux 软件安装、升级的便捷性 。RPM 遵循 GPL 协议,除了红帽 Linux 发行版,Caldera OpenLinux、SUSE 以及 Turbo Linux 等 Linux 的发行版也使用 RPM,因此 RPM 是 Linux 软件包管理的行业标准 。为了使读者能够较为深入理解 RPM,我们先介绍软件的构建方法 。
计算机软件的软件是从源代码构建出来的 。源代码是人们以人类可读的语言书写的、让计算机执行任务的指令 。人类可读的语言格式和规范,就是编程语言 。
从源代码制作软件的过程,称之为是软件编译 。从源代码构建成软件的编译有两种方式:

  • 本机编译 (Natively Compiled),对应编译型语言 。
  • 解释编译(Interpreted Compiled),对应解释性语言 。
本机编译方式下,代码可以独立编译成机器代码或直接编译为二进制文件可执行文件 。本机编译构建的软件包中,包含编译环境下计算机体系架构的特征 。例如,使用 64 位(x86_64)AMD 计算机中编译的软件,不能在 Intel 处理器架构上运行 。
与本机编译可以独立执行相对应,某些编程语言不能将软件编译成计算机可以直接理解的格式,而需要语言解释器或语言虚拟机(如 JVM),我们称之为解释编译 。常用的解释语言有 Byte Compiled(源代码需要编译成字节代码,然后由语言虚拟机执行,如 Python)和 Raw Interpreted(原始解释语言完全不需要编译,它们由解释器直接执行,如 Bash shell)两种 。
我们常用的 bash shell 和 Python 是解释型的,这种方式编译出的程序与硬件架构无关,通过这种方式编译出的 RPM 会被标注为 noarch(说明 RPM 包不依赖于特定 linux 发行版) 。
在介绍了源代码的编译方式后,接下来我们通过实验的方式展现软件的编译过程 。
从源代码构建软件在正式开始验证之前,我们需要在 Linux 中安装编译工具 。
# yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils接下来,我们分别介绍本机编译和解释编译 。
本机编译代码在编程语言中,C 语言是本机编译 。我们查看一个源代码文件,如清单 1 所示:
清单 1. C 语言源码文件# cat cello.c#include <stdio.h>int main(void) {printf("Hello World, I'm DavidWei!n");return 0;}调用 C 编译器 gcc 进行编译:
# gcc -o cello cello.c
编译成功后,我们可以执行结果输出 。
# ./cello
Hello World, I'm DavidWei!
为了实现自动化构建代码,我们添加 Makefile,这是大型软件开发中常用的方法 。
首先创建一个 Makefile,如清单 2 所示:
清单 2. Makefile 文件# cat Makefilecello:gcc -o cello cello.cclean:rm cello接下来,通过 make 来完成编译 。
执行 make 会自动编译源代码,然后可以成功执行,如下图 1 所示:
图 1. 编译并运行代码
Linux 中 RPM 的构建与打包

文章插图
 
执行 make clean 会删除编译结果,如下图 2 所示:图 2. 删除编译结果
Linux 中 RPM 的构建与打包

文章插图
 
在介绍了本机编译后,我们介绍解释编译 。
解释型代码对于用解释型编程语言编写的软件,如果是 Byte Compiled 语言如 Python,就需要一个编译步骤,把源代码构建成 Python 的语言解释器(称为 CPython)的可以执行文件 。
我们查看一个 python 的源代码,如清单 3 所示:
清单 3. Python 源代码文件# cat pello.py#!/usr/bin/env pythonprint("Hello World, I'm DavidWei!")对源代码进行编译:
# python -m compileall pello.py
Compiling pello.py ...
编译成功后运行:
# python pello.pyc
Hello World, I'm DavidWei!
我们看到,对源.py 文件进行字节编译后会生成一个.pyc 文件,这是 python 2.7 字节编译的文件类型,这个文件可以使用 python 语言虚拟机运行 。
查看文件类型:
# file pello.pyc
pello.pyc: python 2.7 byte-compiled
和 python 相对应,无需编译的解释性代码是 Raw Interpreted,如我们日常使用的 bash shell 。
我们看一个 shell 文件,如清单 4 所示:
清单 4. Shell 文件# cat bello#!/bin/bashprintf "Hello World, I'm DavidWei!n"对于 Raw Interpreted 源码,我们使文件可执行、然后直接运行即可,如下图 3 所示:
图 3. 修改权限运行 shell
Linux 中 RPM 的构建与打包


推荐阅读