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为
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 文件。检查创建的文件。
文件中的指令代表了 关于 spec 文件 中描述的指令。在以下部分中,您将在
rpmdev-newspec的输出文件中填充特定的部分。
4.5.2. 修改原始 spec 文件 复制链接链接已复制到粘贴板!
rpmdev-newspec 实用程序生成的原始输出 spec 文件代表一个模板,您必须修改该模板,以提供 rpmbuild 实用程序的必要说明。然后 rpmbuild 使用这些指令来构建 RPM 软件包。
先决条件
-
未填充的
~/rpmbuild/SPECS/<name>.spec 文件是使用specrpmdev-newspec实用程序创建的。如需更多信息,请参阅 为 Bash、Python 和 C 程序创建新的 spec 文件。
流程
-
打开
rpmdev-newspec程序提供的~/rpmbuild/SPECS/<name>.spec文件。 填充
spec文件 Preamble 部分的以下指令:名称-
name已指定为rpmdev-newspec的参数。 版本-
将
Version设置为与源代码的上游版本匹配。 Release-
Release会自动设置为1%{?dist},它最初是1。 概述- 输入软件包的单行说明。
许可证- 输入与源代码关联的软件许可证。
URL-
输入上游软件网站的 URL。为实现一致性,请使用
%{name}RPM 宏变量,并使用https://example.com/%{name}格式。 源输入上游软件源代码的 URL。直接链接到被打包的软件版本。
注意本文档中的示例 URL 包括可能会在以后更改的硬编码值。同样,发行版本也可以更改。要简化这些潜在的更改,请使用
%{name}和%{version}宏。通过使用这些宏,您只需要更新spec文件中的一个字段。BuildRequires- 指定软件包的 build-time 依赖项。
Requires- 指定软件包的运行时依赖项。
BuildArch- 指定软件架构。
填充
spec文件 Body 部分中的以下指令:您可以将这些指令视为部分标题,因为这些指令可以定义多行、多结构或脚本化任务。%description- 输入软件的完整描述。
%prep- 输入命令或一系列命令来准备软件以进行构建。
%build- 输入用于构建软件的命令或一系列命令。
%install-
输入命令或一系列命令,以指示
rpmbuild命令如何将软件安装到BUILDROOT目录中。 %files- 指定要在您的系统上安装的 RPM 软件包提供的文件列表。
%changelog输入软件包的每个
Version-Release的 datetamped 条目列表。从
%changelog部分的第一行开始,带有星号(*)字符,后跟Day-of-Week Month Day Year Name Surname <email> - Version-Release。对于实际更改条目,请遵循这些规则:
- 每个更改条目都可以包含多个项目,每个代表一个改变。
- 每个项目在新行中开始。
-
每个项目以连字符(
-)字符开头。
您现在已为所需程序编写了整个 spec 文件。
4.5.3. Bash 程序的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以将以下 spec 文件示例用于 bash 中编写的 bello 程序供您参考。
使用 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 宏来执行此操作,而无需硬编码路径。
4.5.4. Python 程序的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以对使用 Python 编程语言编写的 pello 程序使用以下示例 spec 文件供您参考。
使用 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
Requires指令指定软件包的运行时依赖项,其中包括两个软件包:-
在运行时执行字节代码所需的
python软件包。 -
执行小入口点脚本所需的
bash软件包。
-
在运行时执行字节代码所需的
-
BuildRequires指令指定软件包的 build-time 依赖项,它只包括python软件包。pello程序需要python执行字节型构建流程。 -
%build部分指定如何构建软件,创建脚本的字节版本。请注意,在实际打包中,通常会根据所使用的发行版自动执行。 -
%install部分与这个事实对应,您必须将字节文件安装到系统上的库目录中,以便可以访问它。
在 spec 文件中,创建打包程序脚本的示例显示了 文件本身可以脚本化。这个打包程序脚本使用 spec 此处文档 执行 Python 字节编译的代码。
4.5.5. C 程序的 spec 文件示例 复制链接链接已复制到粘贴板!
您可以将以下示例 spec 文件用于使用 C 编程语言编写的 cello 程序供您参考。
使用 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 文件可用。