这篇文章将为大家详细讲解有关怎么编写RPM的spec文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

通常,供Linux使用的源代码包还提供一个名为 { 软件名称 }.spec 的文件,即spec文件。如果提供spec文件,则该源代码还可以直接编译成RPM包。

了解源代码

在开始编写 spec 文件之前,你需要对要打包的软件有所了解。在这里,你正在研究 fpaste,这是一个非常简单的软件。它是用 Python 编写的,并且是一个单文件脚本。当它发布新版本时,可在 Pagure 上找到:https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz。

如该档案文件所示,当前版本为 0.3.9.2。下载它,以便你查看该档案文件中的内容:

$wgethttps://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz$tar-tvffpaste-0.3.9.2.tar.gzdrwxrwxr-xroot/root02018-07-2502:58fpaste-0.3.9.2/-rw-rw-r--root/root252018-07-2502:58fpaste-0.3.9.2/.gitignore-rw-rw-r--root/root36722018-07-2502:58fpaste-0.3.9.2/CHANGELOG-rw-rw-r--root/root351472018-07-2502:58fpaste-0.3.9.2/COPYING-rw-rw-r--root/root4442018-07-2502:58fpaste-0.3.9.2/Makefile-rw-rw-r--root/root16562018-07-2502:58fpaste-0.3.9.2/README.rst-rw-rw-r--root/root6582018-07-2502:58fpaste-0.3.9.2/TODOdrwxrwxr-xroot/root02018-07-2502:58fpaste-0.3.9.2/docs/drwxrwxr-xroot/root02018-07-2502:58fpaste-0.3.9.2/docs/man/drwxrwxr-xroot/root02018-07-2502:58fpaste-0.3.9.2/docs/man/en/-rw-rw-r--root/root38672018-07-2502:58fpaste-0.3.9.2/docs/man/en/fpaste.1-rwxrwxr-xroot/root248842018-07-2502:58fpaste-0.3.9.2/fpastelrwxrwxrwxroot/root02018-07-2502:58fpaste-0.3.9.2/fpaste.py->fpaste

你要安装的文件是:

fpaste.py:应该安装到 /usr/bin/。 docs/man/en/fpaste.1:手册,应放到 /usr/share/man/man1/。 COPYING:许可证文本,应放到 /usr/share/license/fpaste/。 README.rst、TODO:放到 /usr/share/doc/fpaste/ 下的其它文档。

这些文件的安装位置取决于文件系统层次结构标准(FHS)。要了解更多信息,可以在这里阅读:http://www.pathname.com/fhs/ 或查看 Fedora 系统的手册页:

$manhier第一部分:要构建什么?

现在我们知道了源文件中有哪些文件,以及它们要存放的位置,让我们看一下 spec 文件。你可以在此处查看这个完整的文件:https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec。

这是 spec 文件的第一部分:

Name:fpasteVersion:0.3.9.2Release:3%{?dist}Summary:AsimpletoolforpastinginfoontostickynotesinstancesBuildArch:noarchLicense:GPLv3+URL:https://pagure.io/fpasteSource0:https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gzRequires:python3%descriptionItisoftenusefultobeabletoeasilypastetexttotheFedoraPastebinathttp://paste.fedoraproject.organdthissimplescriptwilldothatandreturntheresultingURLsothatpeoplemayexaminetheoutput.ThiscanhopefullyhelpfolkswhoareforsomereasonstuckwithoutX,workingremotely,oranyotherreasontheymaybeunabletopastesomethingintothepastebin

Name、Version 等称为标签,它们定义在 RPM 中。这意味着你不能只是随意写点标签,RPM 无法理解它们!需要注意的标签是:

Source0:告诉 RPM 该软件的源代码档案文件所在的位置。 Requires:列出软件的运行时依赖项。RPM 可以自动检测很多依赖项,但是在某些情况下,必须手动指明它们。运行时依赖项是系统上必须具有的功能(通常是软件包),才能使该软件包起作用。这是 dnf 在安装此软件包时检测是否需要拉取其他软件包的方式。 BuildRequires:列出了此软件的构建时依赖项。这些通常必须手动确定并添加到 spec 文件中。 BuildArch:此软件为该计算机体系结构所构建。如果省略此标签,则将为所有受支持的体系结构构建该软件。值 noarch 表示该软件与体系结构无关(例如 fpaste,它完全是用 Python 编写的)。

本节提供有关 fpaste 的常规信息:它是什么,正在将什么版本制作为 RPM,其许可证等等。如果你已安装 fpaste,并查看其元数据时,则可以看到该 RPM 中包含的以下信息:

$sudodnfinstallfpaste$rpm-qifpasteName:fpasteVersion:0.3.9.2Release:2.fc30...

RPM 会自动添加一些其他标签,以代表它所知道的内容。至此,我们掌握了要为其构建 RPM 的软件的一般信息。接下来,我们开始告诉 RPM 做什么。

第二部分:准备构建

spec 文件的下一部分是准备部分,用 %prep 代表:

%prep%autosetup

对于 fpaste,这里唯一的命令是 %autosetup。这只是将 tar 档案文件提取到一个新文件夹中,并为下一部分的构建阶段做好了准备。你可以在此处执行更多操作,例如应用补丁程序,出于不同目的修改文件等等。如果你查看过 Python 的源 RPM 的内容,那么你会在那里看到许多补丁。这些都将在本节中应用。

通常,spec 文件中带有 % 前缀的所有内容都是 RPM 以特殊方式解释的宏或标签。这些通常会带有大括号,例如 %{example}。

第三部分:构建软件

下一部分是构建软件的位置,用 %build 表示。现在,由于 fpaste 是一个简单的纯 Python 脚本,因此无需构建。因此,这里是:

%build#nothingrequired

不过,通常来说,你会在此处使用构建命令,例如:

configure;make

构建部分通常是 spec 文件中最难的部分,因为这是从源代码构建软件的地方。这要求你知道该工具使用的是哪个构建系统,该系统可能是许多构建系统之一:Autotools、CMake、Meson、Setuptools(用于 Python)等等。每个都有自己的命令和语法样式。你需要充分了解这些才能正确构建软件。

第四部分:安装文件

软件构建后,需要在 %install 部分中安装它:

%installmkdir-p%{buildroot}%{_bindir}makeinstallBINDIR=%{buildroot}%{_bindir}MANDIR=%{buildroot}%{_mandir}

在构建 RPM 时,RPM 不会修改你的系统文件。在一个可以正常运行的系统上添加、删除或修改文件的风险太大。如果发生故障怎么办?因此,RPM 会创建一个专门打造的文件系统并在其中工作。这称为 buildroot。 因此,在 buildroot 中,我们创建由宏 %{_bindir} 代表的 /usr/bin 目录,然后使用提供的 Makefile 将文件安装到其中。

至此,我们已经在专门打造的 buildroot 中安装了 fpaste 的构建版本。

第五部分:列出所有要包括在 RPM 中的文件

spec 文件其后的一部分是文件部分:%files。在这里,我们告诉 RPM 从该 spec 文件创建的档案文件中包含哪些文件。fpaste 的文件部分非常简单:

%files%{_bindir}/%{name}%docREADME.rstTODO%{_mandir}/man1/%{name}.1.gz%licenseCOPYING

请注意,在这里,我们没有指定 buildroot。所有这些路径都是相对路径。%doc 和 %license命令做的稍微多一点,它们会创建所需的文件夹,并记住这些文件必须放在那里。

RPM 很聪明。例如,如果你在 %install 部分中安装了文件,但未列出它们,它会提醒你。

第六部分:在变更日志中记录所有变更

Fedora 是一个基于社区的项目。许多贡献者维护或共同维护软件包。因此,当务之急是不要被软件包做了哪些更改所搞混。为了确保这一点,spec 文件包含的最后一部分是变更日志 %changelog:

%changelog*ThuJul252019FedoraReleaseEngineering-0.3.9.2-3-Rebuiltforhttps://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild*ThuJan312019FedoraReleaseEngineering-0.3.9.2-2-Rebuiltforhttps://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild*TueJul242018AnkurSinha-0.3.9.2-1-Updateto0.3.9.2*FriJul132018FedoraReleaseEngineering-0.3.9.1-4-Rebuiltforhttps://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild*WedFeb072018FedoraReleaseEngineering-0.3.9.1-3-Rebuiltforhttps://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild*SunSep102017VasiliyN.Glazov-0.3.9.1-2-Cleanupspec*FriSep082017AnkurSinha-0.3.9.1-1-Updatetolatestrelease-fixesrhbz1489605.......

spec 文件的每项变更都必须有一个变更日志条目。如你在此处看到的,虽然我以维护者身份更新了该 spec 文件,但其他人也做过更改。清楚地记录变更内容有助于所有人知道该 spec 文件的当前状态。对于系统上安装的所有软件包,都可以使用 rpm 来查看其更改日志:

$rpm-q--changelogfpaste构建 RPM

现在我们准备构建 RPM 包。如果要继续执行以下命令,请确保遵循上一篇文章中的步骤设置系统以构建 RPM。我们将 fpaste 的 spec 文件放置在 ~/rpmbuild/SPECS 中,将源代码档案文件存储在 ~/rpmbuild/SOURCES/ 中,现在可以创建源 RPM 了:

$cd~/rpmbuild/SPECS$wgethttps://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec$cd~/rpmbuild/SOURCES$wgethttps://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz$cd~/rpmbuild/SOURCES$rpmbuild-bsfpaste.specWrote:/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm

让我们看一下结果:

$ls~/rpmbuild/SRPMS/fpaste*/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm$rpm-qpl~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpmfpaste-0.3.9.2.tar.gzfpaste.spec

我们看到源 RPM 已构建。让我们同时构建源 RPM 和二进制 RPM:

$cd~/rpmbuild/SPECS$rpmbuild-bafpaste.spec......

RPM 将向你显示完整的构建输出,并在我们之前看到的每个部分中详细说明它的工作。此“构建日志”非常重要。当构建未按预期进行时,我们的打包人员将花费大量时间来遍历它们,以跟踪完整的构建路径来查看出了什么问题。

就是这样!准备安装的 RPM 应该位于以下位置:

$ ls ~/rpmbuild/RPMS/noarch/ fpaste-0.3.9.2-3.fc30.noarch.rpm

关于“怎么编写RPM的spec文件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。