搜索

4.2. 关于 spec 文件

download PDF

spec 文件是包含 rpmbuild 实用程序用于构建 RPM 软件包的指令的文件。通过在一系列小节中定义指令,为构建系统提供必要的信息。这些部分在 spec 文件的 PreambleBody 部分中定义:

  • Preamble 部分包含一系列在 Body 部分中使用的元数据项。
  • Body 部分代表说明的主要部分。

4.2.1. Preamble 项

以下是您可以在 RPM spec 文件的 Preamble 部分中使用的一些指令。

表 4.2. Preamble 部分指令
指令定义

名称

软件包的基本名称必须与 spec 文件名匹配。

版本

软件的上游版本。

Release

软件包版本发布的次数。

将初始值设置为 1%{?dist},并与软件包的每个新版本增加。当软件构建新版本时 重置为 1

概述

软件包的简短总结。

许可证

被打包的软件许可证。

如何在 spec 文件中标记 License 的具体格式,具体取决于您遵循的基于 RPM 的 Linux 发行版准则,例如 GPLv3+

URL

有关软件的更多信息的完整 URL,例如,用于打包软件的上游项目网站。

Source

到未修补上游源代码压缩的存档的路径或 URL。此链接必须指向存档的可访问且可靠的存储,例如上游页面,而不是打包程序的本地存储。

您可以在指令名称的末尾应用 Source 指令带有或不带数字。如果没有给定数字,则会在内部给该条目分配数字。您还可以明确提供数字,例如 Source0Source1、 Source 2、Source3 等。

Patch

应用到源代码的第一个补丁的名称(如有必要)。

您可以在指令名称末尾应用带有或没有数字的 Patch 指令。如果没有给定数字,则会在内部给该条目分配数字。您还可以明确提供数字,如 Patch0,Patch1,Patch2,Patch3, 等。

您可以使用 %patch0、%patch1、%patch 2 宏等单独应用补丁。宏在 RPM spec 文件的 Body 部分中的 %prep 指令中应用。或者,您可以使用 %autopatch 宏,按在 spec 文件中提供的顺序自动应用所有补丁。

BuildArch

软件将针对.

如果软件不依赖于架构,例如,如果您完全使用解释编程语言编写软件,请将值设为 BuildArch: noarch。如果没有设置这个值,软件会自动继承构建机器的架构,例如 x86_64

BuildRequires

使用编译语言构建程序所需的逗号或空格分开的软件包列表。BuildRequires 可以有多个条目,每个条目都在 SPEC 文件中的独立的行中。

Requires

安装之后,软件需要以逗号或空格分开的软件包列表。Requires 可以有多个条目,每个条目都在 spec 文件中的单独行中。

ExcludeArch

如果某一软件无法在特定的处理器架构上运行,您可以在 ExcludeArch 指令中排除此架构。

Conflicts

逗号或空格分开的、不能安装在系统中的软件包列表,以便您的软件在安装时正常工作。可以有多个冲突条目 每个条目都在 spec 文件中的一行中。

Obsoletes

Obsoletes 指令根据以下因素更改更新的工作方式:

  • 如果您在命令行中直接使用 rpm 命令,它会删除与正在安装的软件包的过时匹配的所有软件包,或者更新是由更新或依赖项解决执行的。
  • 如果您使用更新或依赖项解析器(DNF),则包含匹配 Obsoletes: 的软件包会被添加为更新,并替换匹配的软件包。

Provides

如果您在软件包中添加 Provides 指令,则这个软件包可以通过其名称以外的依赖项引用。

NameVersionRelease (NVR)指令以 name-version-release 格式组成 RPM 软件包的文件名。

您可以通过使用 rpm 命令查询 RPM 数据库来显示特定软件包的 NVR 信息,例如:

# rpm -q bash
bash-4.4.19-7.el8.x86_64

在这里,bash 是软件包名称,4.4.19 是版本,7el8 是发行版本。x86_64 标记是软件包架构。与 NVR 不同,架构标记不直接控制 RPM 打包程序,而是由 rpmbuild 构建环境定义。这种情况的例外是独立于架构的 noarch 软件包。

4.2.2. 正文项

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

表 4.3. Body 部分项
指令定义

%description

RPM 中打包的软件的完整描述。此描述可跨越多行,并且可以分为几个段落。

%prep

用于准备用于构建的软件的命令或一系列命令,例如,在 Source 指令中解压缩存档。%prep 指令可以包含 shell 脚本。

%build

将软件构建到机器代码(用于编译的语言)或字节码(用于某些解释语言)的命令或一系列命令。

%install

rpmbuild 实用程序将在构建软件后将软件安装到 BUILDROOT 目录中的命令或一系列命令。这些命令将所需的构建工件从 %_builddir 目录中(构建发生)复制到包含要打包文件的目录结构的 %buildroot 目录中。这包括将文件从 ~/rpmbuild/BUILD 复制到 ~/rpmbuild/BUILDROOT,并在 ~/rpmbuild/BUILDROOT 中创建必要的目录。

%install 目录是一个空的 chroot 基础目录,类似于最终用户 的根目录。您可以在此处创建包含安装文件的目录。要创建这样的目录,您可以使用 RPM 宏,而无需硬编码路径。

请注意,%install 仅在创建软件包时运行,而不是在安装它时运行。如需更多信息,请参阅使用 spec 文件

%check

用于测试软件的命令或一系列命令,如单元测试。

%files

RPM 软件包提供的文件列表,要安装到用户的系统及其系统上的完整路径位置。

在构建期间,如果 %buildroot 目录中没有列出 的文件,您将收到有关可能的未打包文件的警告。

%files 部分中,您可以使用内置宏来指示各种文件的角色。这在使用 rpm 命令查询软件包文件清单元数据时很有用。例如,要指示 LICENSE 文件是一个软件许可证文件,请使用 %license 宏。

%changelog

在不同 VersionRelease 构建之间软件包所发生的更改记录。这些更改包括软件包的每个 Version-Release 的日期条目列表。这些条目会记录打包更改,而不是软件更改,例如添加补丁或更改 %build 部分中的构建步骤。

4.2.3. 高级 items

spec 文件可以包含高级项目,如 ScriptletsTriggers

Scriptlets 和 Triggers 在最终用户系统的安装过程中的不同点生效,而不是构建过程。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.