5.4. 使用 spec 文件
要打包新软件,您必须创建一个 spec 文件。您可以使用以下方法之一创建 spec 文件:
-
从头开始手动编写新的
spec文件。 -
使用
rpmdev-newspec工具。这个工具会创建一个未填充的spec文件,您可以在其中填充必要的指令和字段。
某些以程序员为中心的文本编辑器,预先使用自己的 spec 模板填充一个新的 spec 文件。rpmdev-newspec 实用程序提供了一种不依赖于文本编辑器的方法。
5.4.1. 为 Bash、Python 和 C 程序示例创建一个新的 spec 文件 复制链接链接已复制到粘贴板!
您可以使用 rpmdev-newspec 工具为 Hello World! 程序的三个实现创建一个 spec 文件。
先决条件
以下
Hello World!程序实现被放在~/rpmbuild/SOURCES目录中:
流程
进到
~/rpmbuild/SPECS目录:$ cd ~/rpmbuild/SPECS为
Hello World!程序的三个实现创建一个spec文件:$ 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 python-pello python-pello.spec created; type minimal, rpm version >= 4.11.重要将 Python 项目打包到 RPM 中时,需要将
python-前缀添加到项目的原始名称中。此处的项目名称是Pello,因此spec的名称是python-pello。~/rpmbuild/SPECS/目录现在包含三个名为bello.和spec、cello.specpython-pello.spec的 spec 文件。检查创建的文件。
文件中的指令代表 About spec files 中描述的指令。在以下部分中,您将在
rpmdev-newspec的输出文件中填充特定的部分。
5.4.2. 修改原始 spec 文件 复制链接链接已复制到粘贴板!
rpmdev-newspec 工具生成的原始输出 spec 文件代表一个模板,您必须修改该模板,以便为 rpmbuild 工具提供必要的指令。然后 rpmbuild 使用这些说明构建 RPM 软件包。
先决条件
-
未填充的
~/rpmbuild/SPECS/<name>.specspec文件是使用rpmdev-newspec工具创建的。如需更多信息,请参阅 为 Bash、Python 和 C 程序示例创建一个新的 spec 文件。
流程
-
打开
rpmdev-newspec工具提供的~/rpmbuild/SPECS/<name>.spec文件。 填充
spec文件 Preamble 部分的以下指令:Name-
Name已被指定为rpmdev-newspec的参数。 Version-
将
Version设置为与源代码的上游版本匹配。 Release-
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 文件。
5.4.3. Bash 程序示例的 spec 文件示例 复制链接链接已复制到粘贴板!
对于使用 bash 编写的 bello 程序,您可以使用以下示例 spec 文件作为参考。
使用 bash 编写的程序的 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
%autosetup
%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脚本只需要bashshell 环境即可执行。 -
%autosetup宏解压缩源存档,由Source0指令引用,并更改它。 -
指定如何构建软件的
%build部分为空,因为不需要构建bash脚本。
要安装 bello,您必须创建目标目录,并在其中安装可执行的 bash 脚本文件。因此,您可以在 %install 部分中使用 install 命令。您可以使用 RPM 宏来完成,而无需硬编码路径。
5.4.4. 使用 Python 编写的程序的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以将以下示例 spec 文件用于使用 Python 编程语言编写的 pello 程序供您参考。
使用 Python 编写的程序的 spec 文件示例
%global python3_pkgversion 3.12
Name: python-pello
Version: 1.0.2
Release: 1%{?dist}
Summary: Example Python library
License: MIT
URL: https://github.com/fedora-python/Pello
Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz
BuildArch: noarch
BuildRequires: python%{python3_pkgversion}-devel
# Build dependencies needed to be specified manually
BuildRequires: python%{python3_pkgversion}-setuptools
# Test dependencies needed to be specified manually
# Also runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires: python%{python3_pkgversion}-pytest >= 3
%global _description %{expand:
Pello is an example package with an executable that prints Hello World! on the command line.}
%description %_description
%package -n python%{python3_pkgversion}-pello
Summary: %{summary}
%description -n python%{python3_pkgversion}-pello %_description
%prep
%autosetup -p1 -n Pello-%{version}
%build
# The macro only supported projects with setup.py
%py3_build
%install
# The macro only supported projects with setup.py
%py3_install
%check
%{pytest}
# Note that there is no %%files section for the unversioned python module
%files -n python%{python3_pkgversion}-pello
%doc README.md
%license LICENSE.txt
%{_bindir}/pello_greeting
# The library files needed to be listed manually
%{python3_sitelib}/pello/
# The metadata files needed to be listed manually
%{python3_sitelib}/Pello-*.egg-info/
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0.2-1
- First pello package
- 1
- 通过定义
python3_pkgversion宏,您可以设置将为哪个 Python 版本构建此软件包。要为默认的 Python 版本 3.9 构建,请将宏设置为默认值3或完全删除行。 - 2
- 将 Python 项目打包到 RPM 中时,需要将
python-前缀添加到项目的原始名称中。这里原始名称为pello,因此源 RPM (SRPM)的名称是python-pello。 - 3
BuildRequires指令指定需要哪些软件包来构建和测试此软件包。在BuildRequires中,始终包括提供构建 Python 软件包所需的工具:python3-devel(或python3.11-devel或python3.12-devel)以及您软件包的特定软件所需的相关软件包,如python3-setuptools(或python3.11-setuptools或python3.12-setuptools)或运行%check部分中测试所需的运行时和测试依赖项。- 4
- 当为二进制 RPM 选择名称(用户必须安装的软件包)时,请添加版本化的 Python 前缀。对默认的 Python 3.9 使用
python3-前缀,对Python 3.11 使用python3.11-前缀或对 Python 3.12 使用python3.12-前缀。您可以使用%{python3_pkgversion}宏,它针对默认的 Python 版本 3.9 评估为3,除非您将其设置为显式版本,例如3.11(请参阅脚注 1)。 - 5
%py3_build和%py3_install宏会分别运行setup.py build和setup.py install命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。- 6
%check部分应该运行打包项目的测试。确切的命令取决于项目本身,但可以使用%pytest宏,以 RPM 友好的方式运行pytest命令。
5.4.5. C 程序示例的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以对使用 C 编程语言编写的 cello 程序使用以下示例 spec 文件作为参考。
使用 C 语言编写的程序的 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.patch
BuildRequires: gcc
BuildRequires: make
%description
The long-tail description for our Hello World Example implemented in
C.
%prep
%autosetup
%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 标准库之外的任何内容。 -
%autosetup宏解压缩源存档,由Source0指令引用,并更改它。 -
%build部分反映在本示例中,cello 程序的Makefile文件被写入。因此,您可以使用 GNU make 命令。但是,您必须删除对%configure的调用,因为您没有提供配置脚本。
您可以使用 %make_install 宏安装 cello 程序。这是可能是因为 cello 程序的 Makefile 文件可用。