Menu Close

3.9. 修改原始的 SPEC 文件以创建 RPM

以下步骤演示了如何修改 rpmdev-newspec 提供的输出 SPEC 文件以创建 RPM。

先决条件

  • 特定程序的源代码已放入 ~/rpmbuild/SOURCES/ 目录中。
  • 未填充的 SPEC 文件 ~/rpmbuild/SPECS/<name>.spec 已被 rpmdev-newspec 创建。

步骤

  1. 打开 rpmdev-newspec 程序提供的 ~/rpmbuild/SPECS/<name>.spec 文件的输出模板:
  2. 填充 SPEC 文件的第一个部分:

    第一部分包括 rpmdev-newspec 分组在一起的这些指令:

    名称
    Name 已指定为 rpmdev-newspec 的参数。
    版本
    Version 设置为与源代码的上游版本匹配。
    Release
    Release 自动设置为 1%{?dist},它最初是 1。每当更新软件包而上游发行版本的 Version 没有更改时(例如当包含补丁时),增加初始的值。当出现新的上游版本时,Release 被重置为 1
    概述
    Summary 是该软件的简短说明。
  3. 填充 LicenseURLSource0 指令:

    License 字段是与上游发行版本中源代码关联的软件许可证。如何在 SPEC 文件中标记 License 的具体格式将有所不同,具体取决于您遵循的基于哪个基于 RPM 的 Linux 发行版准则。

    例如,您可以使用 GPLv3+

    URL 字段提供上游软件网站的 URL。为实现一致性,请使用 %{name} 的 RPM 宏变量,并使用 https://example.com/%{name}

    Source0 字段提供上游软件源代码的 URL。它应直接链接到被打包的特定版本。请注意,本文档中给出的示例 URL 包括可在以后更改的硬编码值。同样,发行版本也可以更改。要简化这些潜在的更改,请使用 %{name}%{version} 宏。通过使用以上,您仅需要在 SPEC 文件中更新一个字段。

  4. 填充 BuildRequiresRequiresBuildArch 指令:

    BuildRequires 指定软件包的构建时依赖项。

    Requires 指定软件包的运行时依赖项。

    这是使用没有原生编译扩展的解释编程语言编写的软件。因此,使用 noarch 值添加 BuildArch 指令。这告知 RPM 不需要将这个软件包绑定到构建它的处理器架构。

  5. 填充 %description%prep%build%install%files%license 指令:

    这些指令可被视为部分标题,因为它们是可以定义多行、多结构或脚本化任务的指令。

    %description 是一个比 Summary 更长的软件的信息,其中包含一个或多个段落。

    %prep 部分指定如何准备构建环境。这通常涉及对源代码的压缩存档、补丁应用程序以及可能解析源代码中提供的信息的扩展,以便在 SPEC 文件以后的部分中使用。在本节中,您可以使用内置的 %setup -q 宏。

    %build 部分指定如何构建软件。

    %install 部分包含在 BUILDROOT 目录中构建软件后如何安装软件的 rpmbuild 指令。

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

    %files 部分指定此 RPM 提供的文件列表及其终端用户系统的完整路径位置。

    在本节中,您可以使用内置宏来指示各种文件的角色。这可用于使用 rpm 命令查询软件包文件清单元数据。例如,要表示 LICENSE 文件是软件许可证文件,请使用 %license 宏。

  6. 最后一个部分( %changelog )是软件包的每个 Version-Release 的带有日期戳的条目列表。它们记录打包更改,而非软件更改。打包更改示例:添加补丁,更改 %build 部分中的构建流程。

    在第一行使用此格式:

    以一个 * 字符开头,后跟 Day-of-Week Month Day Year Name Surname <email> - Version-Release

    使用以下格式进行实际更改条目:

    • 每个更改条目都可以包含多个项目,每个代表一个改变。
    • 每个项目在新行中开始。
    • 每个项目以 - 字符开头。

您已为所需的程序编写了整个 SPEC 文件。