5.4. 使用 spec 文件


要打包新软件,您必须创建一个 spec 文件。您可以使用以下方法之一创建 spec 文件:

  • 从头开始手动编写新的 spec 文件。
  • 使用 rpmdev-newspec 工具。这个工具会创建一个未填充的 spec 文件,您可以在其中填充必要的指令和字段。
注意

某些以程序员为中心的文本编辑器,预先使用自己的 spec 模板填充一个新的 spec 文件。rpmdev-newspec 实用程序提供了一种不依赖于文本编辑器的方法。

您可以使用 rpmdev-newspec 工具为 Hello World! 程序的三个实现创建一个 spec 文件。

先决条件

流程

  1. 进到 ~/rpmbuild/SPECS 目录:

    $ cd ~/rpmbuild/SPECS
    Copy to Clipboard Toggle word wrap
  2. 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.
    Copy to Clipboard Toggle word wrap
    重要

    将 Python 项目打包到 RPM 中时,需要将 python- 前缀添加到项目的原始名称中。此处的项目名称是 Pello,因此 spec 的名称是 python-pello

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

  3. 检查创建的文件。

    文件中的指令代表 About spec files 中描述的指令。在以下部分中,您将在 rpmdev-newspec 的输出文件中填充特定的部分。

5.4.2. 修改原始 spec 文件

rpmdev-newspec 工具生成的原始输出 spec 文件代表一个模板,您必须修改该模板,以便为 rpmbuild 工具提供必要的指令。然后 rpmbuild 使用这些说明构建 RPM 软件包。

先决条件

流程

  1. 打开 rpmdev-newspec 工具提供的 ~/rpmbuild/SPECS/<name>.spec 文件。
  2. 填充 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
    指定软件架构。
  3. 填充 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
Copy to Clipboard Toggle word wrap

  • BuildRequires 指令指定软件包的 build-time 依赖项已被删除,因为没有可用于 bello 的构建步骤。Bash 是原始解释编程语言,文件仅安装到其系统上的位置。
  • Requires 指令,其指定软件包的运行时依赖项,仅包含 bash,因为 bello 脚本只需要 bash shell 环境即可执行。
  • %autosetup 宏解压缩源存档,由 Source0 指令引用,并更改它。
  • 指定如何构建软件的 %build 部分为空,因为不需要构建 bash 脚本。
注意

要安装 bello,您必须创建目标目录,并在其中安装可执行的 bash 脚本文件。因此,您可以在 %install 部分中使用 install 命令。您可以使用 RPM 宏来完成,而无需硬编码路径。

5.4.4. 使用 Python 编写的程序的 spec 文件示例

您可以将以下示例 spec 文件用于使用 Python 编程语言编写的 pello 程序供您参考。

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

%global python3_pkgversion 3.12                                       
1


Name:           python-pello                                          
2

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                     
3


# 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                         
4

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                                                            
5



%install
# The macro only supported projects with setup.py
%py3_install


%check                                                                
6

%{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
Copy to Clipboard Toggle word wrap

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-develpython3.12-devel)以及您软件包的特定软件所需的相关软件包,如 python3-setuptools (或 python3.11-setuptoolspython3.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 buildsetup.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
Copy to Clipboard Toggle word wrap

  • BuildRequires 指令,其指定软件包的 build-time 依赖项,包括以下执行编译构建过程所需的软件包:

    • gcc
    • make
  • 本例中省略了该软件包的运行时依赖项 Requires 指令。所有运行时要求都由 rpmbuild 进行处理,而 cello 程序不需要核心 C 标准库之外的任何内容。
  • %autosetup 宏解压缩源存档,由 Source0 指令引用,并更改它。
  • %build 部分反映在本示例中,cello 程序的 Makefile 文件被写入。因此,您可以使用 GNU make 命令。但是,您必须删除对 %configure 的调用,因为您没有提供配置脚本。

您可以使用 %make_install 宏安装 cello 程序。这是可能是因为 cello 程序的 Makefile 文件可用。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat