Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

3.2. 使用 SPEC 文件

这部分论述了如何创建和修改 SPEC 文件。

先决条件

本节使用 第 2.1.1 节 “源代码示例” 中描述的 Hello World! 程序的三个示例实现。

下表介绍了每个程序。

软件名称

示例说明

bello

程序使用原始解释编程语言编写。它演示了,当不需要构建源代码时,只需要安装源代码。如果需要打包预编译的二进制代码,您也可以使用此方法,因为二进制文件也只是一个文件。

pello

程序以字节编译的解释语言编写。它演示了源代码的字节,并安装字节代码 - 生成的预优化文件。

cello

程序使用原生编译的编程语言编写。它演示了将源代码编译到机器代码中的常见流程,并安装生成的可执行文件。

Hello World 的实现是 :

作为前提条件,这些实施需要放入 ~/rpmbuild/SOURCES 目录中。

3.2.1. 创建新 SPEC 文件的方法

要打包新软件,您需要创建新的 SPEC 文件。

实现这一点有两个:

  • 从头开始手动编写新的 SPEC 文件
  • 使用 rpmdev-newspec 工具

    这个工具会创建一个未填充的 SPEC 文件,并填写所需的指令和字段。

注意

某些以编程为导向的文本编辑器,预先使用其自身 SPEC 模板填充新的 .spec 文件。rpmdev-newspec 实用程序提供了一个与编辑器无关的方法。

3.2.2. 使用 rpmdev-newspec 创建新的 SPEC 文件

以下步骤演示了如何为上述三个 Hello World! 程序(使用 rpmdev-newspec 程序)为每一个创建 SPEC 文件。

步骤

  1. 进入 ~/rpmbuild/SPECS 目录并使用 rpmdev-newspec 实用程序:

    $ cd ~/rpmbuild/SPECS
    
    $ rpmdev-newspec bello
    bello.spec created; type minimal, rpm version >= 4.11.
    
    $ rpmdev-newspec cello
    cello.spec created; type minimal, rpm version >= 4.11.
    
    $ rpmdev-newspec pello
    pello.spec created; type minimal, rpm version >= 4.11.

    ~/rpmbuild/SPECS/ 目录现在包含三个名为 bello.speccello.specpello.spec 的 SPEC 文件。

fd。检查文件:

+

注意

rpmdev-newspec 实用程序不使用特定于任何特定 Linux 发行版的指南或约定。但是,本文档的目标为,因此在 SPEC 文件中引用 RPM 的 Buildroot 时,最好使用 %{buildroot} 表示法而不是 $RPM_BUILD_ROOT 表示法。

3.2.3. 修改原始的 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 分组在一起的这些指令:

    • 名称
    • 版本
    • Release
    • 概述

      Name 已指定为 rpmdev-newspec 的参数。

      Version 设置为与源代码的上游版本匹配。

      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 提供的文件列表及其终端用户系统的完整路径位置。

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

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

    在第一行使用此格式:

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

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

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

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

有关使用不同编程语言编写的 SPEC 文件示例,请参阅:

3.2.4. 使用 bash 编写的程序的 SPEC 文件示例

这部分显示了在 bash 中编写的 bello 程序的示例 SPEC 文件。有关 bello 的详情,请参考 第 2.1.1 节 “源代码示例”

在 bash 中编写的 bello 程序的 SPEC 文件示例

Name:           bello
Version:        0.1
Release:        1%{?dist}
Summary:        Hello World example implemented in bash script

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

Requires:       bash

BuildArch:      noarch

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

%prep
%setup -q

%build

%install

mkdir -p %{buildroot}/%{_bindir}

install -m 0755 %{name} %{buildroot}/%{_bindir}/%{name}

%files
%license LICENSE
%{_bindir}/%{name}

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1-1
- First bello package
- Example second item in the changelog for version-release 0.1-1

BuildRequires 指令指定软件包的 build-time 依赖项已被删除,因为没有可用于 bello 的构建步骤。Bash 是原始解释编程语言,文件仅安装到其系统上的位置。

Requires 指令指定软件包的运行时依赖项,它只包括 bash,因为 bello 脚本只需要 bash shell 环境才能执行。

%build 部分指定如何构建软件为空,因为不需要构建 bash

要安装 bello,您只需要创建目标目录并在其中安装可执行的 bash 脚本文件。因此,您可以使用 %install 部分中的 install 命令。RPM 宏允许在没有硬编码路径的情况下执行此操作。

3.2.5. 使用 Python 编写的程序的 SPEC 文件示例

本节介绍使用 Python 编程语言编写的 pello 程序的示例 SPEC 文件。有关 pello 的详情,请参考 第 2.1.1 节 “源代码示例”

使用 Python 编写的 pello 程序的 SPEC 文件示例

Name:           pello
Version:        0.1.1
Release:        1%{?dist}
Summary:        Hello World example implemented in Python

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

BuildRequires:  python
Requires:       python
Requires:       bash

BuildArch:      noarch

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

%prep
%setup -q

%build

python -m compileall %{name}.py

%install

mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/usr/lib/%{name}

cat > %{buildroot}/%{_bindir}/%{name} <←EOF
#!/bin/bash
/usr/bin/python /usr/lib/%{name}/%{name}.pyc
EOF

chmod 0755 %{buildroot}/%{_bindir}/%{name}

install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/

%files
%license LICENSE
%dir /usr/lib/%{name}/
%{_bindir}/%{name}
/usr/lib/%{name}/%{name}.py*

%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1.1-1
  - First pello package

重要

pello 程序以字节编译的解释语言编写。因此,shebang 不适用,因为生成的文件不包含该条目。

因为 shebang 不适用,您可能需要应用以下任一方法:

  • 创建一个将调用可执行文件的非字节编译的 shell 脚本。
  • 使用一小段 Python 代码,它不是字节编译的,作为程序执行的入口点。

这些方法对于具有数以千计的代码的大型软件项目非常有用,因为字节编辑代码可以提高性能。

BuildRequires 指令指定软件包的 build-time 依赖项,其中包括两个软件包:

  • 执行字节构建过程需要 python 软件包
  • 执行小入口点脚本需要 bash 软件包

Requires 指令指定软件包的运行时依赖项,它只包括 python 软件包。pello 程序需要 python 软件包在运行时执行字节编译的代码。

%build 部分指定如何构建软件,对应于软件对字节级编译的事实。

要安装 pello,您需要创建一个打包程序脚本,因为 shebang 不适用于字节编译语言。可以通过多种方式完成此操作,例如:

  • 制作单独的脚本,并将该脚本用作单独的 SourceX 指令。
  • 在 SPEC 文件中创建文件.

此示例显示在 SPEC 文件中使用命令行创建打包程序脚本,以演示 SPEC 文件本身可以脚本化。此打包程序脚本将通过文档来执行 Python 字节编译代码。

本例中的 %install 部分也对应一个事实:您需要将字节文件安装到系统的库目录中,以便访问它。

3.2.6. 使用 C 语言编写的程序的 SPEC 文件示例

本节介绍使用 C 编程语言编写的 cello 程序的示例 SPEC 文件。有关 cello 的详情,请参考 第 2.1.1 节 “源代码示例”

使用 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-output-first-patch.patch

BuildRequires:  gcc
BuildRequires:  make

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

%prep
%setup -q

%patch0

%build
make %{?_smp_mflags}

%install
%make_install

%files
%license LICENSE
%{_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 的事实,因此可以使用 rpmdev-newspec 程序提供的 GNU make 命令。但是,您需要删除对 %configure 的调用,因为您没有提供配置脚本。

可使用 rpmdev-newspec 命令提供的 %make_install 宏来完成 cello 程序安装。这是因为 cello 程序的 Makefile 可用。