在上一篇文章中,我们了解了什么是RPM包。它们是包含文件和元数据的存档文件。此元数据告诉RPM在安装或卸载RPM时在何处创建或删除文件。正如您在上一篇文章中所记得的那样,元数据还包含有关“依赖项”的信息,这些信息可以是“运行时”或“构建时”依赖项信息。例如,让我们看一下fpaste。您可以使用dnf下载RPM。这将下载Fedora存储库中可用的最新版本的fpaste。在Fedora30上,当前版本是0.3.9.2:$dnfdownloadfpaste...fpaste-0.3.9.2-2.fc30.noarch.rpm因为这是构建RPM,它只包含使用fpaste所需的文件:$rpm-qpl./fpaste-0.3.9.2-2.fc30.noarch.rpm/usr/bin/fpaste/usr/share/doc/fpaste/usr/share/doc/fpaste/README.rst/usr/share/doc/fpaste/TODO/usr/share/licenses/fpaste/usr/share/licenses/fpaste/COPYING/usr/share/man/man1/fpaste.1.gz源RPM此链中的下一个链接是源RPM。Fedora中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。所以,要制作一个RPM文件,RPM(工具)需要:给出必须安装的文件,比如告诉他们如果要编译怎么生成,告诉他们必须安装在哪里,具体的软件需要哪些其他依赖项才能正常工作。源RPM包含所有这些信息。源RPM类似于构建RPM,但顾名思义,它们不包含构建的二进制文件,而是包含一个软件的源文件。让我们下载fpaste的源RPM:$dnfdownloadfpaste--source...fpaste-0.3.9.2-2.fc30.src.rpm请注意,该文件以src.rpm结尾。所有RPM都是从源RPM构建的。您还可以使用dnf轻松检查“二进制”RPM的源RPM:$dnfrepoquery--qf"%{SOURCERPM}"fpastefpaste-0.3.9.2-2.fc30.src.rpm另外,因为这是源RPM,它不包括构建文件。相反,它包含源代码和如何构建RPM的说明:$rpm-qpl./fpaste-0.3.9.2-2.fc30.src.rpmfpaste-0.3.9.2.tar.gzfpaste.spec这里是第一个文件只是fpaste的源代码。第二个是规范文件。spec文件是一个配方,它告诉RPM(工具)如何使用源RPM中包含的源代码创建RPM(存档)——它包含RPM(工具)构建RPM(存档)所需的所有信息。在规范文件中。当我们包维护者向Fedora添加软件时,我们的大部分时间都花在了编写和完善规范文件上。当需要更新包时,我们返回并调整规范文件。您可以在https://src.fedoraproject.org/browse/projects/的源代码存储库中查看Fedora中所有软件包的规范文件。请注意,源RPM可能包含构建多个RPM的说明。fpaste是一个非常简单的软件,一个生成“二进制”RPM的源RPM。另一方面,Python更复杂。虽然只有一个源RPM,但它会生成多个二进制RPM:$sudodnfrepoquery--qf"%{SOURCERPM}"python3python3-3.7.3-1.fc30.src.rpmpython3-3.7.4-1.fc30。src.rpm$sudodnfrepoquery--qf"%{SOURCERPM}"python3-develpython3-3.7.3-1.fc30.src.rpmpython3-3.7.4-1.fc30.src.rpm$sudodnfrepoquery--qf"%{SOURCERPM}"python3-libspython3-3.7.3-1.fc30.src.rpmpython3-3.7.4-1.fc30.src.rpm$sudodnfrepoquery--qf"%{SOURCERPM}"python3-idlepython3-3.7.3-1.fc30.src.rpmpython3-3.7.4-1.fc30.src.rpm$sudodnfrepoquery--qf"%{SOURCERPM}"python3-tkinterpython3-3.7.3-1.fc30.src。rpmpython3-3.7.4-1.fc30.src.rpm在RPM术语中,“python3”是“主包”,所以spec文件将被称为python3.spec。所有其他包都是“子包”。您可以下载python3的源RPM并查看其中的内容。(提示:补丁也是源代码的一部分):$dnfdownload--sourcepython3python3-3.7.4-1.fc30.src.rpm$rpm-qpl./python3-3.7.4-1.fc30.src.rpm00001-rpath.patch00102-lib64.patch00111-no-static-lib.patch00155-avoid-ctypes-thunks.patch00170-gc-assertions.patch00178-dont-duplicate-flags-in-sysconfig.patch00189-use-rpm-wheels.patch00205-make-libpl-respect-lib64.patch00251-change-user-install-location.patch00274-fix-arch-names.patch00316-mark-bdist_wininst-unsupported.patchPython-3.7.4.tar.xzcheck-pyc-timestamps.pyidle3。appdata.xmlidle3.desktoppython3.spec从源RPM构建RPM现在我们有了源RPM以及其中的内容,我们可以从中重建RPM。然而,在这样做之前,我们应该设置系统来构建RPM。首先,我们安装所需的工具:$sudodnfinstallfedora-packager这将安装rpmbuild工具。rpmbuild需要一个默认布局,以便它知道源RPM中每个必需组件的位置。让我们看看它们是什么:#spec文件会出现在哪里?$rpm-E%{_specdir}/home/asinha/rpmbuild/SPECS#源代码会出现在哪里?$rpm-E%{_sourcedir}/home/asinha/rpmbuild/SOURCES#临时构建目录在哪里?$rpm-E%{_builddir}/home/asinha/rpmbuild/BUILD#构建根目录在哪里?$rpm-E%{_buildrootdir}/home/asinha/rpmbuild/BUILDROOT#源RPM将放置在哪里?$rpm-E%{_srcrpmdir}/home/asinha/rpmbuild/SRPMS#构建的RPM会去哪里?$rpm-E%{_rpmdir}/home/asinha/rpmbuild/RPMS我已经在系统上设置了所有这些目录:$cd$tree-L1rpmbuild/rpmbuild/├──BUILD├──BUILDROOT├──RPMS├──来源├──SPECS└──SRPMS6目录,0个文件RPM还提供了一个工具来为您设置所有这些:$rpmdev-setuptree然后,确保安装了fpaste的所有构建依赖项:sudodnfbuilddepfpaste-0.3.9.2-3.fc30.src.rpm对于fpaste,您只需要Python,并且您的系统上必须已安装它(dnf也使用Python)。也可以为builddep命令提供一个规范文件而不是源RPM。在手册页中阅读更多信息:$mandnf.plugin.builddep现在我们已经拥有了所需的一切,从源RPM构建RPM非常简单:$rpmbuild--rebuildfpaste-0.3.9.2-3.fc30.src.rpm....$tree~/rpmbuild/RPMS/noarch//home/asinha/rpmbuild/RPMS/noarch/└──fpaste-0.3.9.2-3.fc30.noarch.rpm0目录,1个文件rpmbuild将安装源RPM并从中构建您的RPM。现在,您可以使用dnf安装RPM来使用它。当然,如前所述,如果要对RPM进行任何更改,则必须修改spec文件,我们将在下一篇文章中介绍。总结这篇文章有两点:我们通常安装和使用的RPM是包含软件构建版本的“二进制”RPMBuildRPM来自源RPM,其中包括生成二进制RPM所需的源代码和spec文件。如果您想开始构建RPM并帮助Fedora社区维护我们提供的大量软件,您可以从这里开始:https://fedoraproject.org/wiki/Join_the_package_collection_maintainers如果您有任何问题,请发送电子邮件至Fedora开发人员邮件列表,我们随时乐意为您提供帮助!
