RPM软件包管理系统

一 RPM 简介

RPM Package Manager (RPM)是一个运行在 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 上的软件包管理系统。
您可以使用 RPM 为任何这些操作系统分发、管理和更新创建的软件。

与在传统存档文件中分发软件相比,RPM 软件包管理系统有以下优点:
RPM 以可独立安装、更新或删除的软件包形式管理软件,从而更轻松地维护操作系统。
RPM 简化了软件的分发,因为 RPM 软件包是独立的二进制文件,类似于压缩存档。这些软件包是为特定的操作系统和硬件架构构建的。
RPM 包含诸如已编译的	可执行文件和库等文件,这些文件在安装软件包时被放在文件系统上的适当路径下

使用 RPM,您可以执行以下任务:

安装、升级和删除打包的软件。
查询关于打包的软件的详细信息。
验证打包的软件的完整性。
从软件源构建您自己的软件包,并完成构建说明。
使用 GNU Privacy Guard (GPG)工具对您的软件包进行数字签名。
在 DNF 存储库中发布您的软件包

在 Red Hat Enterprise Linux 中,RPM 完全集成到更高级别的软件包管理软件中,如 DNF 或 PackageKit。
虽然 RPM 提供了自己的命令行界面,但大多数用户只需要通过这个软件与 RPM 进行交互。
但是,在构建 RPM 软件包时,您必须使用 RPM 工具,如 rpmbuild (8) 。

1.1 RPM软件包
RPM 软件包由文件的存档和用来安装和删除这些文件的元数据组成。具体来说,RPM 软件包包含以下部分:

GPG 签名
GPG 签名用于验证软件包的完整性。

标头(软件包元数据)
RPM 软件包管理器使用此元数据来确定软件包依赖项、安装文件的位置和其他信息。

payload	
有效负载是一个 cpio 归档,其包含要安装到系统的文件。

RPM 软件包有两种类型。这两种类型都共享文件格式和工具,但内容不同,并实现不同的目的:
源 RPM(SRPM)
SRPM 包含源代码和 spec 文件,该文件描述了如何将源代码构建为二进制 RPM。另外,SRPM 可以包含源代码的补丁。
二进制 RPM
一个二进制 RPM 包含了根据源代码和补丁构建的二进制文件。

1.2 列出RPM打包工具
除了用于构建软件包的 rpmbuild (8) 程序外,RPM 还提供其他工具,以便更轻松地创建软件包。
您可以在 rpmdevtools 软件包中找到这些程序

先决条件
rpmdevtools 软件包已安装: 
dnf install rpmdevtools 
步骤:使用以下方法之一列出 RPM 打包工具 
要列出 rpmdevtools 软件包提供的某些工具及其简短描述,请输入 
rpm -qi rpmdevtools 
要列出所有工具,请输入: 
rpm -ql rpmdevtools | grep ^/usr/bin 

二 为 RPM 打包创建软件

要为 RPM 打包准备软件,您必须了解什么是源代码以及如何创建软件。
2.1. 什么是源代码 
源代码是人类可读的计算机指令,其描述了如何执行计算。源代码是使用编程语言表示的。
以下用三种不同编程语言编写的 Hello World 程序版本涵盖了主要的 RPM 软件包管理器用例:

使用 Bash 编写的hello World
bello 项目在 Bash 中实现 Hello World。该实现仅包含 bello shell 脚本。此程序的目的是在命令行上输出 Hello World。 
bello 文件包含以下内容: 
#!/bin/bash
printf "Hello World\n"
使用 Python 编写的 hello World
pello 项目在 Python 中实现 Hello World。该实施现仅包含 pello.py 程序。程序的目的是在命令行中输出 Hello World。
pello.py 文件包含以下内容: 
#!/usr/bin/python3
print("Hello World")
使用 C 语言编写的 hello World
cello 项目在 C 中实现 Hello World。实现仅包含 cello.c 和 Makefile 文件。
因此,除了 LICENSE 文件外,生成的 tar.gz 存档还有两个文件。程序的目的是在命令行中输出 Hello World。
cello.c 文件包含以下内容:
#include <stdio.h>
int main(void) {
    printf("Hello World\n");
    return 0;
}
注意
对于 Hello World 程序的每个版本,打包过程是不同的。

2 创建软件的方法
您可以使用以下方法之一将人类可读的源代码转换为机器代码:
原生编译软件。
使用语言解释器或语言虚拟机解释软件。您可以使用原始解释或字节编译软件。

2.1 原生编译的软件 
原生编译的软件是使用编程语言编写的软件,使用生成的二进制可执行文件编译到机器代码中。
原生编译的软件是独立的软件。
原生编译的 RPM 软件包是特定于架构的。

如果您在使用 64 位(x86_64) AMD 或 Intel 处理器的计算机上编译此类软件,
则它不能在 32 位(x86) AMD 或 Intel 处理器上运行。生成的软件包在其名称中指定了架构。

2.2 解释的软件 
有些编程语言(如 Bash 或 Python )不会编译成机器代码。相反,语言解释器或语言虚拟机会逐步执行程序的源代码步骤,
而无需在之前进行转换。
完全使用解释编程语言编写的软件特定于架构。因此,生成的 RPM 软件包在其名称中包含 noarch 字符串。
您可以使用原始解释或解释语言编写的字节编译软件:
原始解析的软件:
您不需要编译这类软件。原始解析软件由解释器直接执行。
字节编译的软件:
您必须首先将这类软件编译为字节码,然后由语言虚拟机执行。

有些字节编译的语言可以是原始解释的或字节编译的。
请注意,对于这两个软件类型,使用 RPM 构建和打包软件的方式有所不同。

3 从源构建软件 
在软件构建过程中,源代码被转换为可以使用 RPM 打包的软件工件。 

3.1 从原生编译的代码构建软件
您可以使用以下方法之一将用编译语言编写的软件构建成可执行文件: 
手动构建 
自动化构建 

3.1.1  手动构建示例 C 程序 
您可以使用手动构建来构建使用编译语言编写的软件。
使用 C 编写的 Hello World 程序示例(cello.c)包含以下内容:
#include <stdio.h>
int main(void) {
    printf("Hello World\n");
    return 0;
}
步骤 
从 GNU Compiler Collection 调用 C 编译器,将源代码编译到二进制中: 
gcc -g -o cello cello.c 
运行生成的二进制文件 cello : 
./cello ---》 Hello World

3.1.2 为示例 C 程序设置自动构建 
规模软件通常使用自动化构建。您可以通过创建 Makefile 文件设置自动化构建,然后运行 GNU make 工具。
步骤 
	a) 在与 cello.c 相同的目录中,创建包含以下内容的 Makefile 文件:
cello:
	gcc -g -o cello cello.c
clean:
	rm cello
    请注意,cello: 和 clean: 下的行必须以制表符(tab)开头。
    
    b) 构建软件: 
    $ make
	make: 'cello' is up to date.
	
	c) 因为构建已在当前目录中可用,所以请输入 make clean 命令,然后再次输入 make 命令:
	$ make clean; make 
	d) 运行程序:
	$ ./cello 
	
3.2   解释源代码 
	您可以使用以下方法之一将解释编程语言编写的源代码转换为机器码: 
	Byte-compiling 
	字节编译软件的流程因以下因素而异: 
	编程语言  语言虚拟机  与该语言一起使用的工具和流程 
	您还可以原始解释 Python 源代码。但是,字节编译的版本更快。因此,RPM 软件包程序更喜欢打包字节编译的版本,以分发给最终用户。
	Raw-interpreting
	使用 shell 脚本语言(如 Bash )编写的软件始终由原始解释执行。 
	
	3.2.1  字节编译示例 Python 程序 
	通过对 Python 源代码选择字节编译而不是原始解释,您可以创建更快的软件。
	使用 Python 编程语言(pello.py)编写的 Hello World 程序示例具有以下内容:
	print("Hello World") 
	步骤 
	a) 字节编译 pello.py 文件: 
	python -m compileall pello.py
	b) 验证是否文件的字节编译版本已创建: 
	$ ls __pycache__
	pello.cpython-311.pyc 
	请注意,输出中的软件包版本可能会因安装的 Python 版本而有所不同
	c)  运行 pello.py 程序: 
	$ python pello.py
	Hello World
	
	3.2.2 原始解析示例 Bash 程序 
	使用 Bash shell 内置语言(bello)编写的 Hello World 程序示例如下:
	#!/bin/bash
	printf "Hello World\n"
  	注意
	bello 文件顶部的 shebang (#!)符号不是编程语言源代码的一部分。
	使用 shebang 将文本文件转换为可执行文件。系统程序加载程序解析包含 shebang 的行,
	以获取二进制可执行文件的路径,后者然后用作编程语言解释器。
	
	流程
	a) 使源代码文件可执行: 
	$ chmod +x bello 
	b) 运行创建的文件:
	$ ./bello 

三  为 RPM 打包准备软件 

	要准备一个软件以通过 RPM 打包,您可以首先修补软件,为其创建一个 LICENSE 文件,并将它归档为 tarball
	3.1 修复软件 
	在打包软件时,您可能需要对原始源代码进行某些更改,如修复 bug 或更改配置文件。在 RPM 打包中,
	您可以将原始源代码保持不变,并对其应用补丁。

	补丁是更新源代码文件的一段文本。补丁具有 diff 格式,因为它代表文本的两个版本之间的区别。
	您可以使用 diff 实用程序创建补丁,然后使用 patch 实用程序将补丁应用到源代码。 
	3.1.1. 为示例 C 程序创建补丁文件
	您可以使用 diff 工具从原始源代码创建一个补丁。
	例如,要修补使用 C 编写的 Hello world 程序(cello.c),请完成以下步骤。
	先决条件 
	您在系统中安装了 diff 工具: 
	# dnf install diffutils 
	流程:
	a) 备份原始源代码: 
	cp -p cello.c cello.c.orig //-p 选项保留模式、所有权和时间戳。 
	b) 根据需要修改 cello.c : 
#include <stdio.h>
int main(void) {
    printf("Hello World from my very first patch!\n");
    return 0;
}
	c) 生成一个补丁: 
$ diff -Naur cello.c.orig cello.c
--- cello.c.orig        2016-05-26 17:21:30.478523360 -0500
+ cello.c     2016-05-27 14:53:20.668588245 -0500
@@ -1,6 +1,6 @@
 #include<stdio.h>

 int main(void){
-    printf("Hello World!\n");
+    printf("Hello World from my very first patch!\n");
     return 0;
 }
\ No newline at end of file
以 + 开头的行替换以 - 开头的行。
注意
建议将 Naur 选项与 diff 命令一起使用,因为它适合大多数用例:
-N (--new-file)
-N 选项将缺失的文件处理为空文件。
-a (--text)
-a 选项将所有文件视为文本。因此,diff 工具不会忽略它被归类为二进制的文件。
-u (-U NUM or --unified[=NUM])
-u 选项以统一上下文的输出 NUM (默认 3)行的形式返回输出。这是一个紧凑的,且在补丁文件中常用的一种易读的格式。
-r (--recursive)
-r 选项递归比较 diff 工具找到的任何子目录。
但请注意,在此特殊情况下,只需要 -u 选项。

d) 将补丁保存到文件中: 
$ diff -Naur cello.c.orig cello.c > cello.patch 
e) 恢复原始 cello.c : 
 mv cello.c.orig cello.c 
重要
您必须保留原始的 cello.c,因为 RPM 软件包管理器在构建 RPM 软件包时使用原始文件,而不是修改的文件。

3.1.2. 修补示例 C 程序
要对软件应用代码补丁,您可以使用 patch 工具。 
先决条件:
在您的系统上安装了 补丁 工具: 
# dnf install patch 
您从原始源代码创建了补丁。具体步骤请参阅 为示例 C 程序创建补丁文件。
流程
以下步骤在 cello.c 文件中应用之前创建的 cello.patch 文件
a) 将补丁文件重定向到 patch 命令 
$ patch < cello.patch 
b) 检查 cello.c 的内容现在是否反映了所需的更改: 
$ cat cello.c
#include<stdio.h>
int main(void){
    printf("Hello World from my very first patch!\n");
    return 1;
}
验证 
构建打了补丁的 cello.c 程序: 
	make
	gcc -g -o cello cello.c
运行构建的 cello.c 程序 
	$ ./cello
	Hello World from my very first patch!
3.2. 创建 LICENSE 文件 
建议您使用软件许可证发布软件。

软件许可证文件告知用户他们可以使用源代码做什么和不能做什么。
源代码没有许可证意味着您对此代码保留所有权限,任何人都不能从源代码复制、分发或创建衍生产品。
流程 
使用所需许可证声明创建 LICENSE 文件: 
$ vim LICENSE 
例 3.1. GPLv3 LICENSE 文件文本示例 
xxxx....

3.3 为分发创建源代码存档 
归档文件是一个带有 .tar.gz 或 .tgz 后缀的文件。将源代码放入存档是发布软件以便稍后进行打包以进行分发的一种常见方法。
3.3.1. 为示例 Bash 程序创建源代码存档 
bello 项目是 Bash 中的 Hello World 文件。
以下示例仅包含 bello shell 脚本。因此,生成的 tar.gz 存档除了 LICENSE 文件只有一个文件。
注意:
patch 文件不在存档中随程序一起分发。
构建 RPM 时,RPM 软件包管理器会应用补丁。补丁将与 tar.gz 存档一起放在 ~/rpmbuild/SOURCES/ 目录中。
先决条件:
假定使用 bello 程序的 0.1 版本。 
您创建了 LICENSE 文件。具体步骤请参阅创建 LICENSE 文件。 
流程:
a) 将所有需要的文件移到单个目录中: 
	$ mkdir bello-0.1
	$ mv ~/bello bello-0.1/
	$ mv LICENSE bello-0.1/
b) 为分发创建存档:
$ tar -cvzf bello-0.1.tar.gz bello-0.1 

c) 将创建的存档移到 ~/rpmbuild/SOURCES/ 目录中,这是 rpmbuild 命令存储用于构建软件包的文件的默认目录: 
mv bello-0.1.tar.gz ~/rpmbuild/SOURCES/ 

3.3.2. 为 Python 程序创建源代码存档 
pello 项目是 Python 中的 Hello World 文件。
以下示例仅包含 pello.py 程序。因此,生成的 tar.gz 存档除了 LICENSE 文件只有一个文件。
注意
patch 文件不在存档中随程序一起分发。构建 RPM 时,RPM 软件包管理器会应用补丁。
补丁将与 tar.gz 存档一起放在 ~/rpmbuild/SOURCES/ 目录中。
先决条件 
假定使用 pello 程序的 0.1.1 版本。
您创建了 LICENSE 文件。具体步骤请参阅创建 LICENSE 文件。
流程:
a) 将所有需要的文件移到单个目录中:
$ mkdir pello-0.1.1
$ mv pello.py pello-0.1.1/
$ mv LICENSE pello-0.1.1/
b) 为分发创建存档:
$ tar -cvzf pello-0.1.1.tar.gz pello-0.1.1 
c) 将创建的存档移到 ~/rpmbuild/SOURCES/ 目录中,这是 rpmbuild 命令存储用于构建软件包的文件的默认目录: 
 mv pello-0.1.1.tar.gz ~/rpmbuild/SOURCES/ 

3.3.3. 为示例 C 程序创建源代码存档 
cello 项目是 C 中的 Hello World 文件。
以下示例仅包含 cello.c 和 Makefile 文件。因此,生成的 tar.gz 存档除了 LICENSE 文件有两个文件。 
注意
patch 文件不在存档中随程序一起分发。构建 RPM 时,RPM 软件包管理器会应用补丁。
补丁将与 tar.gz 存档一起放在 ~/rpmbuild/SOURCES/ 目录中。
先决条件
假定使用 cello 程序的 1.0 版本。
您创建了 LICENSE 文件。具体步骤请参阅创建 LICENSE 文件。
流程:
	a) 将所有需要的文件移到单个目录中:
	$ mkdir cello-1.0
	$ mv cello.c cello-1.0/
	$ mv Makefile cello-1.0/
	$ mv LICENSE cello-1.0/
  b) 为分发创建存档:
  $ tar -cvzf cello-1.0.tar.gz cello-1.0
  c) 将创建的存档移到 ~/rpmbuild/SOURCES/ 目录中,这是 rpmbuild 命令存储用于构建软件包的文件的默认目录: 
  $ mv cello-1.0.tar.gz ~/rpmbuild/SOURCES/ 

四 打包软件

4.1. 设置 RPM 打包工作区
要构建 RPM 软件包,您必须首先创建一个特殊的工作区,它由用于不同打包目的的目录组成。
4.1.1. 配置 RPM 打包工作区 
要配置 RPM 打包工作区,您可以使用 rpmdev-setuptree 实用程序设置目录布局 
先决条件 
已安装 rpmdevtools 软件包,它提供打包 RPM 的工具: 
# dnf install rpmdevtools 
rpmdev-setuptree 

在这里插入图片描述

4.1.2. RPM 打包工作区目录
以下是使用 rpmdev-setuptree 工具创建的 RPM 打包工作区目录: 

在这里插入图片描述

4.2. 关于 spec 文件 
spec 文件是包含 rpmbuild 实用程序用于构建 RPM 软件包的指令的文件。
通过在一系列小节中定义指令,为构建系统提供必要的信息。这些部分在 spec 文件的 Preamble 和 Body 部分中定义:
Preamble 部分包含一系列在 Body 部分中使用的元数据项。
Body 部分代表说明的主要部分。

在这里插入图片描述
在这里插入图片描述

Name、Version 和 Release (NVR)指令以 name-version-release 格式组成 RPM 软件包的文件名。
您可以通过使用 rpm 命令查询 RPM 数据库来显示特定软件包的 NVR 信息,例如
	[root@localhost rpmbuild2.04]# rpm -q bash
	bash-5.2.15-9.p01.se.01.ky11.loongarch64
在这里,bash 是软件包名称,5.2.15是版本,p01.se.01.ky11是发行版本。loongarch64标记是软件包架构。
与 NVR 不同,架构标记不直接控制 RPM 打包程序,而是由 rpmbuild 构建环境定义。这种情况的例外是独立于架构的 noarch 软件包。

4.2.2. 正文项
以下是 RPM spec 文件的 Body 部分中使用的项目:

在这里插入图片描述

4.3. BuildRoots
在 RPM 打包上下文中,buildroot 是 chroot 环境。
通过使用与最终用户系统中未来层次结构相同的文件系统层次结构将构建工件放在此位置,buildroot 充当根目录。
构建工件的放置必须遵循最终用户系统的文件系统层次结构标准。

buildroot 中的文件稍后放入 cpio 存档,后者成为 RPM 的主要部分。当在最终用户的系统中安装 RPM 时,
这些文件将提取到 root 目录中,保留正确的层次结构。
注意
rpmbuild 程序具有自己的默认值。覆盖这些默认值可能会导致某些问题。
因此,请避免定义您自己的 buildroot 宏值。改为使用默认的 %{buildroot} 宏。

4.4. RPM 宏 
rpm 宏 是一种直接文本替换,在使用特定内置功能时,可以根据声明的可选评估来有条件地分配。因此,RPM 可以为您执行文本替换。 
例如,您只能在 %{version} 宏中定义打包软件的 Version,并在 spec 文件中使用此宏。
每次出现时都会自动替换为您在宏中定义的 Version。 
注意
如果您看到不熟悉的宏,您可以使用以下命令评估它:
$ rpm --eval %{MACRO}
例如,要评估 %{_bindir} 和 %{_libexecdir} 宏,请输入: 
	$ rpm --eval %{_bindir}
	/usr/bin
	$ rpm --eval %{_libexecdir}
	/usr/libexec
4.5. 使用 SPEC 文件 

要打包新软件,您必须创建一个 SPEC 文件。
您可以使用以下方法创建 SPEC 文件:
从头开始手动编写新的 SPEC 文件。
使用 rpmdev-newspec 工具。
这个工具会创建一个未填充的 SPEC 文件,您需要在其中填写必要的指令和字段。
注意
某些以编程为导向的文本编辑器,预先使用其自身 SPEC 模板填充新的 .spec 文件。
rpmdev-newspec 实用程序提供了一个与编辑器无关的方法。

以下部分使用 Hello World! 程序的三个示例实现:

在这里插入图片描述

	Hello World 的实现如下:

	bello-0.1.tar.gz
	pello-0.1.2.tar.gz
	cello-1.0.tar.gz ( cello-output-first-patch.patch )
	作为前提条件,这些实施需要放入 ~/rpmbuild/SOURCES 目录中。

	有关 Hello World! 程序实现的更多信息,请参阅 什么是源代码。
	在以下部分中,了解如何使用 SPEC 文件:

	使用 rpmdev-newspec 创建一个新的 SPEC 文件。
	为创建 RPM 修改原始 SPEC 文件。
	检查使用 bash、Python 和 C 编写的程序的 SPEC 文件示例。
	
	4.5.1. 为 Bash、C 和 Python 程序示例创建新的 spec 文件 
	您可以使用 rpmdev-newspec 实用程序为 Hello World! 程序的三个实现创建一个 spec 文件。 
	先决条件 
	以下 Hello World! 程序实现已放入 ~/rpmbuild/SOURCES 目录中:
	bello-0.1.tar.gz
	pello-0.1.2.tar.gz
	cello-1.0.tar.gz (cello-output-first-patch.patch)
	流'程:
	a) 进入 ~/rpmbuild/SPECS 目录:
	 cd ~/rpmbuild/SPECS 
	b)为 Hello World! 程序的三个实现创建一个 spec 文件 
	[root@localhost SPECS]# rpmdev-newspec cello 
	cello.spec created; type minimal, rpm version >= 4.18.
  c) ~/rpmbuild/SPECS/ 目录现在包含三个名为 bello. spec、cello.spec 和 pello.spec 的 spec 文件。
  检查创建的文件。文件中的指令代表了 关于 spec 文件 中描述的指令。
  在以下部分中,您将在 rpmdev-newspec 的输出文件中填充特定的部分。

 4.5.2. 修改原始 spec 文件
 rpmdev-newspec 实用程序生成的原始输出 spec 文件代表一个模板,您必须修改该模板,
 以便为 rpmbuild 实用程序提供必要的指令。rpmbuild 这些说明构建 RPM 软件包。
 先决条件 
 未填充的 ~/rpmbuild/SPECS/<name>. spec spec 文件是使用 rpmdev-newspec 实用程序创建的。
 如需更多信息,请参阅 为 Bash、C 和 Python 程序创建新的 spec 文件。 
 流程:
 a) 打开 rpmdev-newspec 工具提供的 ~/rpmbuild/SPECS/<name>.spec 文件。 
 b) 填充 spec 文件 Preamble 部分的以下指令:
 Name   名称 已指定为 rpmdev-newspec 的参数。
 Version  将 Version 设置为与源代码的上游版本匹配。
 Release  Release 自动设置为 1%{?dist},它最初是 1。

 概述
 输入软件包的单行说明。
 许可证
 输入与源代码关联的软件许可证。
 URL
 输入上游软件网站的 URL。为实现一致性,请使用 %{name} RPM 宏变量,
 并使用 https://example.com/%{name} 格式。
 Source
 输入上游软件源代码的 URL。直接连接到被打包的软件版本。
 注意
本文档中的 URL 示例包括可能在以后更改的硬编码值。同样,发行版本也可以更改。
要简化这些潜在的更改,请使用 %{name} 和 %{version} 宏。通过使用这些宏,
您只需要更新 spec 文件中的一个字段。
BuildRequires
指定软件包的构建时依赖项。
Requires
指定软件包的运行时依赖项。
BuildArch
指定软件架构。
c) 填充 spec file Body 部分中的以下指令:您可以将这些指令视为部分标题,
因为这些指令可以定义多行、多结构或脚本化任务。 

%description
输入软件的完整描述。
%prep
输入命令或一系列命令来为软件做好构建准备。
%build
输入命令或一系列用于构建软件的命令。
%install
输入命令或一系列命令,指示 rpmbuild 命令如何将软件安装到 BUILDROOT 目录中。
%files
指定要安装在您的系统中的文件列表(由 RPM 软件包提供)。
%changelog
输入软件包的每个 Version-Release 的日期条目列表。

启动 %changelog 部分的第一行,带有一个星号(*)字符,后跟 
Day-of-Week Month Day Year Name Surname <email> - Version-Release。

对于实际更改条目,请遵循这些规则:

每个更改条目都可以包含多个项目,每个代表一个改变。
每个项目在新行中开始。
每个项目以连字符(-)字符开头。
现在,您已为所需程序编写了整个 spec 文件。

4.5.3. 示例 C 程序的 spec 文件示例 
您可以将以下示例 spec 文件用于您的参考,使用 C 编程语言编写的 cello 程序。 
使用 C 编写的 cello 程序的 spec 文件示例:	
Name:           cello
Version:        1.0
Release:        1%{?dist}
Summary:        Hello World example implemented in C

License:        GPLv3+
URL:            https://www.example.com/%{name}
Source0:        https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz

Patch0:         cello.patch

BuildRequires:  gcc
BuildRequires:  make

%description
The long-tail description for our Hello World Example implemented in
C.

%prep
%setup -q

%patch 0

%build
make %{?_smp_mflags}

%install 
install -d %{buildroot}/%{_bindir}
mv cello %{buildroot}/%{_bindir} 

%files
%{_bindir}/%{name}

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0-1 
- First cello package 
BuildRequires 指令指定软件包的 build-time 依赖项,包括执行编译构建过程所需的以下软件包:
gcc
make
本例中省略了该软件包的运行时依赖项 Requires 指令。
所有运行时要求都由 rpmbuild 进行处理,而 cello 程序不需要核心 C 标准库之外的任何内容。

%build 部分反映了编写 cello 程序的 Makefile 文件的事实。
因此,您可以使用 GNU make 命令。但是,您必须删除对 %configure 的调用,因为您没有提供配置脚本。
您可以使用 %make_install 宏安装 cello 程序。这是因为 cello 程序的 Makefile 文件可用。	

4.6. 构建 RPM
您可以使用 rpmbuild 命令构建 RPM 软件包。使用此命令时,应该有一个特定的目录和文件结构,
它与 rpmdev-setuptree 程序设置的结构相同。 
不同的用例和所需结果需要不同的参数组合到 rpmbuild 命令。以下是主要用例
构建源 RPM.
构建二进制 RPM:
	从源 RPM 重建二进制 RPM.
	从 spec 文件构建二进制 RPM。

4.6.1. 构建源 RPM
构建源 RPM (SRPM)具有以下优点:
您可以保留部署到环境中的 RPM 文件的特定 Name-Version-Release 的源。
这包括确切的 spec 文件、源代码以及所有相关补丁。这可用于跟踪和调试目的。
您可以在不同的硬件平台或构架中构建二进制 RPM。
先决条件 
您已在系统中安装了 rpmbuild 工具:  dnf install rpm-build
以下 Hello World! 实现已放入 ~/rpmbuild/SOURCES/ 目录中:
	bello-0.1.tar.gz
	pello-0.1.2.tar.gz
	cello-1.0.tar.gz ( cello-output-first-patch.patch )
已存在您要打包的程序的 spec 文件。 
流程:
a) 导航到 ~/rpmbuild/SPECS/ 指令,其中包含创建的 spec 文件: 
 cd ~/rpmbuild/SPECS/ 
b) 使用指定 spec 文件输入 rpmbuild 命令来构建源 RPM:
 rpmbuild -bs <specfile> 
 -bs 选项代表 构建源。
 例如,要为 bello、pello 和 cello 程序构建源 RPM,请输入:
$ rpmbuild -bs bello.spec
Wrote: /home/admiller/rpmbuild/SRPMS/bello-0.1-1.el8.src.rpm

$ rpmbuild -bs pello.spec
Wrote: /home/admiller/rpmbuild/SRPMS/pello-0.1.2-1.el8.src.rpm

$ rpmbuild -bs cello.spec
Wrote: /home/admiller/rpmbuild/SRPMS/cello-1.0-1.el8.src.rpm
验证步骤:
验证 rpmbuild/SRPMS 目录是否包含生成的源 RPM。该目录是 rpmbuild 所期望的结构的一部分 

4.6.2. 从源 RPM 重新构建一个二进制 RPM
要从源 RPM (SRPM)重建二进制 RPM,请使用 rpmbuild 命令和-- rebuild 选项。 
创建二进制 RPM 时生成的输出非常详细,这对调试非常有用。输出因不同示例而异,并对应于其 spec 文件。 
生成的二进制 RPM 位于 ~/rpmbuild/RPMS/YOURARCH 目录中,其中 YOURARCH 是您的架构,
如果软件包不是特定于架构的,则生成的二进制 RPM 位于 ~/rpmbuild/RPMS/noarch/ 目录中。
先决条件 
您已在系统中安装了 rpmbuild 工具: 
dnf install rpm-build 
流程:
a) 导航到 ~/rpmbuild/SRPMS/ 指令,其中包含源 RPM: 
cd ~/rpmbuild/SRPMS/ 
b) 从源 RPM 重建二进制 RPM:
rpmbuild --rebuild <srpm> 

注意
调用 rpmbuild --rebuild 涉及以下进程:
将 SRPM ( spec 文件和源代码)的内容安装到 ~/rpmbuild/ 目录中。
使用安装的内容构建一个 RPM。
删除 spec 文件和源代码。

您可以在构建以下任一方法后保留 spec 文件和源代码: 
在构建 RPM 时,请使用 rpmbuild 命令以及-- recompile 选项,而不是-- rebuild 选项。 
为 bello、pello 和 cello 安装 SRPMs: 
rpm -Uvh ~/rpmbuild/SRPMS/cello-1.0-1.el8.src.rpm 

总结:
想要在生成二进制RPM包时保留spec文件和源文件:
a) 构建rpm时, rpmbuild --recompile cello-1.0-1.ky11.src.rpm  
b) rpm -Uvh cello-1.0-1.ky11.src.rpm  

4.6.3. 从 spec 文件构建二进制 RPM 
要从其 spec 文件构建二进制 RPM,请使用 rpmbuild 命令和 -bb 选项。 
先决条件 
您已在系统中安装了 rpmbuild 工具: 
 dnf install rpm-build 
流程:
a) 导航到 ~/rpmbuild/SPECS/ 指令,其中包含 spec 文件:
cd ~/rpmbuild/SPECS/ 
b) 从其 spec 构建二进制 RPM: 
rpmbuild -bb <spec_file> 
例如,要从其 spec 文件构建 bello、pello 和 cello 二进制 RPM,请输入:
rpmbuild -bb cello.spec 

rpmbuild 相关命令总结:
rpmbuild -bs  xxx.spec 构建源码包
rpmbuild -bb xxx.spec 构建二进制包
rpmbuild -ba xxx.spec 构建源代码和二进制包 
rpmbuild -bp xxx.spec 依据 <specfile> 从 %prep(解压缩源代码并应用补丁) 开始构建

4.7. 检查 RPM 健全性
在创建了软件包后,您可能需要检查软件包的质量。检查软件包质量的主要工具是 rpmlint。 
使用 rpmlint 工具,您可以执行以下操作: 
	提高 RPM 可维护性. 
	通过对 RPM 进行静态分析来启用完整性检查。 
	通过对 RPM 进行静态分析来启用错误检查。 
您可以使用 rpmlint 检查二进制 RPM、源 RPM (SRPMs)和 spec 文件。因此,这个工具对打包的所有阶段都很有用。 
请注意,rpmlint 有严格的准则。因此,有时可以接受跳过其中的一些错误和警告,如以下部分所示。 
注意
在以下部分中描述的示例中,rpmlint 会不带任何选项运行,这会产生一个非详细的输出。
有关每个错误或警告的详细说明,请运行 rpmlint -i

4.7.1. 检查示例 C 程序以获取健全
在以下部分中,调查在检查 cello spec 文件和 cello 二进制 RPM 示例时可能会出现的警告和错误。 
4.7.1.1. 检查 sanity 的 cello spec 文件
检查以下示例的输出,以了解如何检查 sanity 的 cello spec 文件。 
在 cello spec 文件中运行 rpmlint 命令的输出 
rpmlint ~/rpmbuild/SPECS/cello.spec 

4.7.1.2. 检查 cello 二进制 RPM 是否健全
在检查二进制 RPM 时,rpmlint 命令会检查以下项目: 
	文档
	手册页
	致地使用文件系统层次结构标准 
检查以下示例的输出,以了解如何检查 cello 二进制 RPM 是否健全。 
在 cello 二进制 RPM 上运行 rpmlint 命令的输出 

4.8  将 RPM 活动记录到 syslog 
您可以使用系统日志协议(syslog)记录任何 RPM 活动或事务 
先决条件 
syslog 插件已安装在系统上: 
dnf install rpm-plugin-syslog 
流程:
a) 打开您配置为存储 syslog 信息的文件。 
或者,如果您使用默认的 syslog 配置,请打开 /var/log/messages 文件。 
b) 搜索包括 [RPM] 字符串的新行。 

4.9. 提取 RPM 内容 
在某些情况下,例如,如果 RPM 需要的软件包被损坏,您可能需要提取软件包的内容。
在这种情况下,如果 RPM 安装仍正常工作,您可以使用 rpm2archive 实用程序将 .rpm 文件
转换为 tar 存档以使用软件包的内容。 
注意
如果 RPM 安装被严重损坏,您可以使用 rpm2cpio 工具将 RPM 软件包文件转换为 cpio 归档。
流程:
将 RPM 文件转换为 tar 归档:
rpm2archive <filename>.rpm 
生成的文件具有 .tgz 后缀。例如,要从 bash 软件包创建归档,请输入: 
rpm2archive RPMS/loongarch64/cello-1.0-1.ky11.loongarch64.rpm  
[root@localhost loongarch64]# ls cello-1.0-1.ky11.loongarch64.rpm.tgz 
cello-1.0-1.ky11.loongarch64.rpm.tgz

5.2. 有关宏的更多内容
本节介绍所选内置 RPM Macros。有关此类宏的详细列表,请参阅 RPM 文档。 
5.2.1. 定义您自己的宏 
下面的部分论述了如何创建自定义宏 
流程:
在 RPM spec 文件中包括以下行: 
%global <name>[(opts)] <body> 
删除 <body> 周围的空白。名称可以是字母数字字符,字符 _,长度必须至少为 3 个字符。包含 (opts) 字段是可选的: 
Simple 宏不包含 (opts) 字段。在这种情况下,只执行递归宏扩展。 
Parametrized 宏包含 (opts) 字段。在宏调用开始时传递括号之间的 opts 字符串可得到 
argc/argv 处理的 getopt(3)。 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘德华海淀分华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值