在关于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
你要安装的文件是: 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定义,这意味着你不能只是组成标签,如果你这样做,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会自动添加一些额外的标签,以表示它所知道的事物。 此时,我们有关于我们正在构建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
每次更改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建立在具有严格配置和方法的专用服务器上,以确保正确性和安全性。
相关主题 |