在关于 RPM 软件包构建的上一篇文章中,你了解到了源 RPM 包括软件的源代码以及 spec 文件。这篇文章深刻研究了 spec 文件,该文件中包含了有关如何构建 RPM 的指令。一样,本文以 fpaste
为例。html
在开始编写 spec 文件以前,你须要对要打包的软件有所了解。在这里,你正在研究 fpaste
,这是一个很是简单的软件。它是用 Python 编写的,而且是一个单文件脚本。当它发布新版本时,可在 Pagure 上找到:pagure.io/releases/fp…。python
如该档案文件所示,当前版本为 0.3.9.2。下载它,以便你查看该档案文件中的内容:linux
$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
$ tar -tvf fpaste-0.3.9.2.tar.gz
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/
-rw-rw-r-- root/root 25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore
-rw-rw-r-- root/root 3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG
-rw-rw-r-- root/root 35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING
-rw-rw-r-- root/root 444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile
-rw-rw-r-- root/root 1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst
-rw-rw-r-- root/root 658 2018-07-25 02:58 fpaste-0.3.9.2/TODO
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/
-rw-rw-r-- root/root 3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1
-rwxrwxr-x root/root 24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste
lrwxrwxrwx root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste
复制代码
你要安装的文件是:git
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)。要了解更多信息,能够在这里阅读:www.pathname.com/fhs/ 或查看 Fedora 系统的手册页:github
$ man hier
复制代码
如今咱们知道了源文件中有哪些文件,以及它们要存放的位置,让咱们看一下 spec 文件。你能够在此处查看这个完整的文件:src.fedoraproject.org/rpms/fpaste…。安全
这是 spec 文件的第一部分:bash
Name: fpaste
Version: 0.3.9.2
Release: 3%{?dist}
Summary: A simple tool for pasting info onto sticky notes instances
BuildArch: noarch
License: GPLv3+
URL: https://pagure.io/fpaste
Source0: https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
Requires: python3
%description
It is often useful to be able to easily paste text to the Fedora
Pastebin at http://paste.fedoraproject.org and this simple script
will do that and return the resulting URL so that people may
examine the output. This can hopefully help folks who are for
some reason stuck without X, working remotely, or any other
reason they may be unable to paste something into the pastebin
复制代码
Name
、Version
等称为标签,它们定义在 RPM 中。这意味着你不能只是随意写点标签,RPM 没法理解它们!须要注意的标签是:服务器
Source0
:告诉 RPM 该软件的源代码档案文件所在的位置。Requires
:列出软件的运行时依赖项。RPM 能够自动检测不少依赖项,可是在某些状况下,必须手动指明它们。运行时依赖项是系统上必须具备的功能(一般是软件包),才能使该软件包起做用。这是 dnf 在安装此软件包时检测是否须要拉取其余软件包的方式。BuildRequires
:列出了此软件的构建时依赖项。这些一般必须手动肯定并添加到 spec 文件中。BuildArch
:此软件为该计算机体系结构所构建。若是省略此标签,则将为全部受支持的体系结构构建该软件。值 noarch
表示该软件与体系结构无关(例如 fpaste
,它彻底是用 Python 编写的)。本节提供有关 fpaste
的常规信息:它是什么,正在将什么版本制做为 RPM,其许可证等等。若是你已安装 fpaste
,并查看其元数据时,则能够看到该 RPM 中包含的如下信息:ide
$ sudo dnf install fpaste
$ rpm -qi fpaste
Name : fpaste
Version : 0.3.9.2
Release : 2.fc30
...
复制代码
RPM 会自动添加一些其余标签,以表明它所知道的内容。工具
至此,咱们掌握了要为其构建 RPM 的软件的通常信息。接下来,咱们开始告诉 RPM 作什么。
spec 文件的下一部分是准备部分,用 %prep
表明:
%prep
%autosetup
复制代码
对于 fpaste
,这里惟一的命令是 %autosetup
。这只是将 tar 档案文件提取到一个新文件夹中,并为下一部分的构建阶段作好了准备。你能够在此处执行更多操做,例如应用补丁程序,出于不一样目的修改文件等等。若是你查看过 Python 的源 RPM 的内容,那么你会在那里看到许多补丁。这些都将在本节中应用。
一般,spec 文件中带有 %
前缀的全部内容都是 RPM 以特殊方式解释的宏或标签。这些一般会带有大括号,例如 %{example}
。
下一部分是构建软件的位置,用 %build
表示。如今,因为 fpaste
是一个简单的纯 Python 脚本,所以无需构建。所以,这里是:
%build
#nothing required
复制代码
不过,一般来讲,你会在此处使用构建命令,例如:
configure; make
复制代码
构建部分一般是 spec 文件中最难的部分,由于这是从源代码构建软件的地方。这要求你知道该工具使用的是哪一个构建系统,该系统多是许多构建系统之一:Autotools、CMake、Meson、Setuptools(用于 Python)等等。每一个都有本身的命令和语法样式。你须要充分了解这些才能正确构建软件。
软件构建后,须要在 %install
部分中安装它:
%install
mkdir -p %{buildroot}%{_bindir}
make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
复制代码
在构建 RPM 时,RPM 不会修改你的系统文件。在一个能够正常运行的系统上添加、删除或修改文件的风险太大。若是发生故障怎么办?所以,RPM 会建立一个专门打造的文件系统并在其中工做。这称为 buildroot
。 所以,在 buildroot
中,咱们建立由宏 %{_bindir}
表明的 /usr/bin
目录,而后使用提供的 Makefile
将文件安装到其中。
至此,咱们已经在专门打造的 buildroot
中安装了 fpaste
的构建版本。
spec 文件其后的一部分是文件部分:%files
。在这里,咱们告诉 RPM 从该 spec 文件建立的档案文件中包含哪些文件。fpaste
的文件部分很是简单:
%files
%{_bindir}/%{name}
%doc README.rst TODO
%{_mandir}/man1/%{name}.1.gz
%license COPYING
复制代码
请注意,在这里,咱们没有指定 buildroot
。全部这些路径都是相对路径。%doc
和 %license
命令作的稍微多一点,它们会建立所需的文件夹,并记住这些文件必须放在那里。
RPM 很聪明。例如,若是你在 %install
部分中安装了文件,但未列出它们,它会提醒你。
Fedora 是一个基于社区的项目。许多贡献者维护或共同维护软件包。所以,当务之急是不要被软件包作了哪些更改所搞混。为了确保这一点,spec 文件包含的最后一部分是变动日志 %changelog
:
%changelog
* Thu Jul 25 2019 Fedora Release Engineering < ...> - 0.3.9.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Thu Jan 31 2019 Fedora Release Engineering < ...> - 0.3.9.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Tue Jul 24 2018 Ankur Sinha - 0.3.9.2-1
- Update to 0.3.9.2
* Fri Jul 13 2018 Fedora Release Engineering < ...> - 0.3.9.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Wed Feb 07 2018 Fedora Release Engineering < ..> - 0.3.9.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Sun Sep 10 2017 Vasiliy N. Glazov < ...> - 0.3.9.1-2
- Cleanup spec
* Fri Sep 08 2017 Ankur Sinha - 0.3.9.1-1
- Update to latest release
- fixes rhbz 1489605
...
....
复制代码
spec 文件的每项变动都必须有一个变动日志条目。如你在此处看到的,虽然我以维护者身份更新了该 spec 文件,但其余人也作过更改。清楚地记录变动内容有助于全部人知道该 spec 文件的当前状态。对于系统上安装的全部软件包,均可以使用 rpm
来查看其更改日志:
$ rpm -q --changelog fpaste
复制代码
如今咱们准备构建 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/SOURCES
$ 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 和二进制 RPM:
$ cd ~/rpmbuild/SPECS
$ rpmbuild -ba fpaste.spec
..
..
..
复制代码
RPM 将向你显示完整的构建输出,并在咱们以前看到的每一个部分中详细说明它的工做。此“构建日志”很是重要。当构建未按预期进行时,咱们的打包人员将花费大量时间来遍历它们,以跟踪完整的构建路径来查看出了什么问题。
就是这样!准备安装的 RPM 应该位于如下位置:
$ ls ~/rpmbuild/RPMS/noarch/
fpaste-0.3.9.2-3.fc30.noarch.rpm
复制代码
咱们已经介绍了如何从 spec 文件构建 RPM 的基础知识。这毫不是一份详尽的文档。实际上,它根本不是文档。它只是试图解释幕后的运做方式。简短回顾一下:
你想开始构建软件包,并帮助 Fedora 社区维护咱们提供的大量软件吗?你能够从这里开始加入软件包集合维护者。
若有任何疑问,请发布到 Fedora 开发人员邮件列表,咱们随时乐意为你提供帮助!
这里有一些构建 RPM 的有用参考:
via: fedoramagazine.org/how-rpm-pac…
做者:Ankur Sinha "FranciscoD" 选题:lujun9972 译者:wxy 校对:wxy