4.5. 使用 spec 文件
要打包新软件,您必须创建一个 spec
文件。您可以使用以下方法之一创建 spec
文件:
-
从头开始手动编写新的
spec
文件。 -
使用
rpmdev-newspec
工具。这个工具会创建一个未填充的spec
文件,您可以在其中填充必要的指令和字段。
某些以程序员为中心的文本编辑器,预先使用自己的 spec
模板填充一个新的 spec
文件。rpmdev-newspec
工具提供了一个与编辑器无关的方法。
4.5.1. 为 Bash、Python 和 C 程序示例创建一个新的 spec 文件 复制链接链接已复制到粘贴板!
您可以使用 rpmdev-newspec
工具为 Hello World!
程序的三个实现创建一个 spec
文件。
先决条件
以下
Hello World!
程序实现被放在~/rpmbuild/SOURCES
目录中:
流程
进到
~/rpmbuild/SPECS
目录:cd ~/rpmbuild/SPECS
$ cd ~/rpmbuild/SPECS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
Hello World!
程序的三个实现创建一个spec
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~/rpmbuild/SPECS/
目录现在包含三个spec
文件,名为bello.spec
、cello.spec
和pello.spec
。检查创建的文件。
文件中的指令代表 About spec files 中描述的指令。在以下部分中,您将在
rpmdev-newspec
的输出文件中填充特定的部分。
4.5.2. 修改原始 spec 文件 复制链接链接已复制到粘贴板!
rpmdev-newspec
实用程序生成的原始输出 spec
文件代表一个模板,您必须进行修改,以便为 rpmbuild
实用程序提供必要的指令。然后,rpmbuild
使用这些指令来构建 RPM 软件包。
先决条件
-
未填充的
~/rpmbuild/SPECS/<name>.spec
spec
文件是使用rpmdev-newspec
工具创建的。如需更多信息,请参阅 为 Bash、Python 和 C 程序示例创建一个新的 spec 文件。
流程
-
打开
rpmdev-newspec
工具提供的~/rpmbuild/SPECS/<name>.spec
文件。 填充
spec
文件 Preamble 部分的以下指令:Name
-
Name
已被指定为rpmdev-newspec
的参数。 Version
-
将
Version
设置为与源代码的上游版本匹配。 发布
-
Release
被自动设置为1%{?dist}
,它最初是1
。 Summary
- 输入软件包的一行解释。
License
- 输入与源代码关联的软件许可证。
URL
-
输入上游软件网站的 URL。为实现一致性,请使用
%{name}
RPM 宏变量,并使用https://example.com/%{name}
格式。 Source
输入上游软件源代码的 URL。直接到被打包的软件版本的连接。
注意本文档中的 URL 示例包括可能在以后更改的硬编码的值。同样,发行版本也可以更改。要简化这些潜在的更改,请使用
%{name}
和%{version}
宏。通过使用这些宏,您只需要更新spec
文件中的一个字段。BuildRequires
- 指定软件包的构建时依赖项。
Requires
- 指定软件包的运行时依赖项。
BuildArch
- 指定软件架构。
填充
spec
文件 Body 部分的以下指令:您可以将这些指令视为部分标题,因为这些指令可以定义要发生的多行、多指令或脚本化任务。%description
- 输入软件的完整描述。
%prep
- 输入准备构建软件的命令或一系列命令。
%build
- 输入构建软件的命令或一系列命令。
%install
-
输入指示
rpmbuild
命令如何将软件安装到BUILDROOT
目录中的命令或一系列命令。 %files
- 指定 RPM 软件包提供的要安装在您的系统上的文件的列表。
%changelog
输入软件包的每个
Version-Release
的日期戳条目的列表。启动带有一个星号(
*
)字符,后跟Day-of-Week Month Day Year Name Surname <email> - Version-Release
的%changelog
部分的第一行对于实际更改条目,请遵循这些规则:
- 每个更改条目都可以包含多个项,每个代表一个更改。
- 每项都从新行开始。
-
每项都以连字符(
-
)字符开头。
现在,您已为所需程序编写了一个完整的 spec
文件。
4.5.3. Bash 程序示例的 spec 文件示例 复制链接链接已复制到粘贴板!
对于使用 bash 编写的 bello 程序,您可以使用以下示例 spec
文件作为参考。
使用 bash 编写的 bello 程序的 spec 文件示例
-
BuildRequires
指令指定软件包的 build-time 依赖项已被删除,因为没有可用于bello
的构建步骤。Bash 是原始解释编程语言,文件仅安装到其系统上的位置。 -
Requires
指令,其指定软件包的运行时依赖项,仅包含bash
,因为bello
脚本只需要bash
shell 环境即可执行。 -
指定如何构建软件的
%build
部分为空,因为不需要构建bash
脚本。
要安装 bello
,您必须创建目标目录,并在其中安装可执行的 bash
脚本文件。因此,您可以在 %install
部分中使用 install
命令。您可以使用 RPM 宏来执行此操作,而无需硬编码路径。
4.5.4. Python 程序示例的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以将以下示例 spec
文件用于使用 Python 编程语言编写的 pello 程序供您参考。
使用 Python 编写的 pello 程序的 spec 文件示例
Requires
指令指定软件包的运行时依赖项,其中包括两个软件包:-
在运行时执行字节编译的代码所需的
python
软件包。 -
执行小入口点脚本所需的
bash
软件包。
-
在运行时执行字节编译的代码所需的
-
BuildRequires
指令指定软件包的 build-time 依赖项,它只包括python
软件包。pello
程序需要python
来执行字节编译构建过程。 -
%build
部分指定如何构建软件,创建编译脚本的字节版本。请注意,在实际打包中,它通常会根据所使用的发行版自动执行。 -
%install
部分与这个事实对应,您必须将字节文件安装到系统的库目录中,以便可以访问它。
在 spec 文件中创建打包程序脚本的示例显示
文件本身可以脚本化。此打包程序脚本使用 spec
此文档
来执行 Python 字节编译代码。
4.5.5. C 程序示例的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以对使用 C 编程语言编写的 cello 程序使用以下示例 spec
文件作为参考。
使用 C 编写的 cello 程序的 spec 文件示例
BuildRequires
指令,其指定软件包的 build-time 依赖项,包括以下执行编译构建过程所需的软件包:-
gcc
-
make
-
-
本例中省略了该软件包的运行时依赖项
Requires
指令。所有运行时要求都由rpmbuild
进行处理,而cello
程序不需要核心 C 标准库之外的任何内容。 -
%build
部分反映了这样一个事实,即此示例中,为 cello 程序编写了Makefile
文件。因此,您可以使用 GNU make 命令。但是,您必须删除对%configure
的调用,因为您没有提供配置脚本。
您可以使用 %make_install
宏安装 cello 程序。这是可能是因为 cello 程序的 Makefile
文件可用。