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 文件。
步骤
进入
~/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.spec
、cello.spec
和pello.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
创建。
步骤
-
打开
rpmdev-newspec
程序提供的~/rpmbuild/SPECS/<name>.spec
文件的输出模板: 填充 SPEC 文件的第一个部分:
第一部分包括
rpmdev-newspec
分组在一起的这些指令:-
名称
-
版本
-
Release
概述
Name
已指定为rpmdev-newspec
的参数。将
Version
设置为与源代码的上游版本匹配。Release
自动设置为1%{?dist}
,它最初是1
。每当更新软件包而上游发行版本的Version
没有更改时(例如当包含补丁时),增加初始的值。当出现新的上游版本时,Release
被重置为1
。Summary
是该软件的简短说明。
-
填充
License
、URL
和Source0
指令:License
字段是与上游发行版本中源代码关联的软件许可证。如何在 SPEC 文件中标记License
的具体格式将有所不同,具体取决于您遵循的基于哪个基于 RPM 的 Linux 发行版准则。例如,您可以使用 GPLv3+。
URL
字段提供上游软件网站的 URL。为实现一致性,请使用 RPM 宏变量%{name}
,并使用 https://example.com/%{name}。Source0
字段提供上游软件源代码的 URL。它应直接链接到被打包的特定版本。请注意,本文档中给出的示例 URL 包括可在以后更改的硬编码值。同样,发行版本也可以更改。要简化这些潜在的更改,请使用%{name}
和%{version}
宏。通过使用以上,您仅需要在 SPEC 文件中更新一个字段。填充
BuildRequires
、Requires
和BuildArch
指令:BuildRequires
指定软件包的构建时依赖项。Requires
指定软件包的运行时依赖项。这是使用没有原生编译扩展的解释编程语言编写的软件。因此,使用
noarch
值添加BuildArch
指令。这告知 RPM 不需要将这个软件包绑定到构建它的处理器架构。填充
%description
、%prep
、%build
、%install
、%files
和%license
指令:这些指令可被视为部分标题,因为它们是可以定义多行、多结构或脚本化任务的指令。
%description
是一个比Summary
更长的软件的信息,其中包含一个或多个段落。%prep
部分指定如何准备构建环境。这通常涉及对源代码的压缩存档、补丁应用程序以及可能解析源代码中提供的信息的扩展,以便在 SPEC 文件以后的部分中使用。在本节中,您可以使用内置的%setup -q
宏。%build
部分指定如何构建软件。%install
部分包含在BUILDROOT
目录中构建软件后如何安装软件的rpmbuild
指令。该目录是一个空的 chroot 基础目录,类似于最终用户的根目录。您可以在此处创建包含安装文件的目录。要创建这样的目录,您可以使用 RPM 宏,而无需硬编码路径。
%files
部分指定此 RPM 提供的文件列表及其终端用户系统的完整路径位置。在本节中,您可以使用内置宏来指示各种文件的角色。这对于使用 command[]
rpm
命令查询软件包文件清单元数据很有用。例如,要表示 LICENSE 文件是软件许可证文件,请使用%license
宏。最后一个部分(
%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
可用。