云网牛站
所在位置:首页 > Linux编程 > 制作RPM包:spec文件,包括介绍理解源代码及建立RPM

制作RPM包:spec文件,包括介绍理解源代码及建立RPM

2019-09-03 10:02:16作者:但佳稿源:云网牛站

在关于RPM包构建中你会看到源RPMS包含软件的源代码以及spec文件,本篇文章深入探讨spec文件,其中包含有关如何构建RPM的说明,同样,本文使用fpaste作为示例。请先参考制作RPM包的方法:源RPM、从源RPM构建RPM一文。

 

理解源代码

在开始编写spec文件之前,你需要了解一下你要打包的软件,在这里,你正在研究fpaste,一个非常简单的软件,它是用Python编写的,是一个文件脚本,当新版本发布时,它在Pagure上有提供。

存档显示的当前版本为0.3.9.2,下载它,以便你可以看到存档中的内容:

$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz

$ tar -tvf fpaste-0.3.9.2.tar.gz

制作RPM包:spec文件,包括介绍理解源代码及建立RPM

你要安装的文件是:

1、fpaste.py:应该安装到/usr/bin/。

2、docs/man/en/fpaste.1:手册,应该去/usr/share/man/man1/。

3、复制:许可证文本,应该转至/usr/share/license/fpaste/。

4、README.rst,TODO:转到/usr/share/doc/fpaste的文档。

安装这些文件的位置取决于文件系统层次结构标准,或查看Fedora系统上的手册页:

$ man hier

第1部分:我们正在建设什么?

现在我们知道源中有哪些文件,以及它们的去向,让我们看一下spec文件。

这是spec文件的第一部分:

制作RPM包:spec文件,包括介绍理解源代码及建立RPM

名称、版本等称为标记,并以RPM定义,这意味着你不能只是组成标签,如果你这样做,RPM将无法理解它们,值得关注的标签是:

1、Source0:告诉RPM该软件的源存档所在的位置。

2、Requires:列出软件的运行时依赖性,RPM可以自动检测其中的一小部分,但在某些情况下,必须手动提及它们,运行时依赖性是系统必须在此程序包才能运行的功能(通常是程序包),这是dnf在安装此软件包时检测是否需要引入其他软件包的方式。

3、BuildRequires:列出此软件的构建时依赖性,这些通常必须手动确定并添加到spec文件中。

4、BuildArch:构建此软件的计算机体系结构,如果省略此标记,则将为所有支持的体系结构构建软件,值noarch意味着软件是独立于架构的(如fpaste,纯粹用Python编写)。

本节提供有关fpaste的一般信息:它是什么,将哪个版本转换为RPM,其许可证等等,如果你安装了fpaste,并查看其元数据,可以在RPM中看到此信息:

$ sudo dnf install fpaste

$ rpm -qi fpaste

制作RPM包:spec文件,包括介绍理解源代码及建立RPM

参考:配置Fedora系统以使用sudo的方法

RPM会自动添加一些额外的标签,以表示它所知道的事物。

此时,我们有关于我们正在构建RPM的软件的一般信息,接下来,我们开始告诉RPM要做什么。

第2部分:准备构建

规范的下一部分是准备部分,由%prep表示:

%prep

%autosetup

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

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

第3部分:构建软件

下一节是构建软件的地方,用“%build”表示,现在,由于fpaste是一个简单的纯Python脚本,因此不需要构建它,所以,我们得到:

%build

#nothing required

但是,一般来说,你在这里有构建命令,例如:

configure; make

构建部分通常是规范中最难的部分,因为这是从源构建软件的地方,这需要你了解该工具正在使用的构建系统,这可能是众多构建系统中的一个:Autotools、CMake、Meson、Setuptools(用于Python)等等,每个都有自己的命令和风格,你需要充分了解这些以使软件正确构建。

第4部分:安装文件

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

%install

mkdir -p %{buildroot}%{_bindir}

make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}

构建RPM时,RPM不会修改系统文件,向工作安装添加,删除或修改文件的风险太大,如果有问题了怎么办?因此,RPM会创建一个人工文件系统并在那里工作,这被称为buildroot,所以,在buildroot中,我们创建/usr/bin,由宏%{_bindir}表示,然后使用提供的Makefile将文件安装到它。

此时,我们在我们的人造buildroot中安装了fpaste的内置版本。

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

spec文件的最后一部分是files部分,%files,这是我们告诉RPM在它从这个spec文件创建的归档中包含哪些文件的地方,fpaste文件部分非常简单:

%files

%{_bindir}/%{name}

%doc README.rst TODO

%{_mandir}/man1/%{name}.1.gz

%license COPYING

请注意,在这里,我们不指定buildroot,所有这些路径都与它相关,%doc和%license命令只是做了一些,他们创建了所需的文件夹,并记住这些文件必须去那里。

RPM很智能,如果你已经在%install部分安装了文件,但没有列出它们,那么它会告诉你。

第6部分:记录更改日志中的所有更改

Fedora是一个基于社区的项目,许多贡献者维护和共同维护包,因此,对于对包进行了哪些更改并不存在任何混淆是必要的,为确保这一点,spec文件包含最后一部分,即Changelog%changelog:

%changelog

制作RPM包:spec文件,包括介绍理解源代码及建立RPM

每次更改spec文件时都必须有一个changelog条目,正如你在这里看到的,虽然我已经将规范更新为维护者,但其他人也有,清楚地记录变更有助于每个人都知道规范的当前状态,对于系统上安装的所有软件包,你可以使用rpm查看其更改日志:

$ rpm -q --changelog fpaste

 

建立RPM

现在我们准备构建RPM了,如果你想跟随并运行以下命令,请确保你按照上面文章中的步骤设置系统以构建RPM。

我们将fpaste spec文件放在~/rpmbuild/SPECS中,源代码存档在~/rpmbuild/SOURCES/中,现在可以创建源RPM:

$ cd ~/rpmbuild/SPECS

$ wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec

$ cd ~/rpmbuild/SOURCES

$ wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz

$ cd ~/rpmbuild/SPECS

$ rpmbuild -bs fpaste.spec

Wrote: /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.rpm

fpaste-0.3.9.2.tar.gz

fpaste.spec

我们在那里,已经构建了源rpm,让我们一起构建源和二进制rpm:

$ cd ~/rpmbuild/SPECS

$ rpmbuild -ba fpaste.spec

..

..

..

RPM将向你显示完整的构建输出,并详细说明我们之前看到的每个部分的功能,这个“build log”非常重要,当构建没有按预期进行时,我们的打包者会花费大量时间浏览它们,跟踪完整的构建路径以查看出现了什么问题。

真的是这样的,你可以随时安装的RPM应该是:

$ ls ~/rpmbuild/RPMS/noarch/

fpaste-0.3.9.2-3.fc30.noarch.rpm

 

概括

我们已经介绍了如何从spec文件构建RPM的基础知识,这绝不是一份详尽的文件,事实上,它根本不是文档,它只是试图解释事情是如何工作的,这是一个简短的回顾:

1、RPM有两种类型:源和二进制。

2、二进制RPM包含要安装以使用该软件的文件。

3、源RPM包含构建二进制RPM所需的信息:完整的源代码,以及如何在spec文件中构建RPM的说明。

4、spec文件有各个部分,每个部分都有自己的用途。

在这里,我们在Fedora安装上本地构建了RPM,虽然这是基本过程,但我们从存储库获得的RPM建立在具有严格配置和方法的专用服务器上,以确保正确性和安全性。

 

相关主题

RPM包解释:依赖、解决RPM依赖关系、库、安装依赖项、DnfDragora

精选文章
热门文章