本文介绍制作RPM包的方法:源RPM,包含文件和元数据的存档,此元数据告诉RPM在安装或卸载RPM时从何处创建或删除文件,元数据还包含有关依赖关系的信息,可以是“runtime”或“build time”。 举个例子,我们来看看fpaste,你可以使用dnf下载RPM,这将下载Fedora存储库中提供的最新版本的fpaste,在Fedora 30上,目前为0.3.9.2: $ dnf download fpaste ... fpaste-0.3.9.2-2.fc30.noarch.rpm 参考:dnf命令_Linux dnf命令使用详解:新一代的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(工具)需要: 1、鉴于必须安装的文件。 2、告诉如何生成这些文件,如果要编译它们。 3、告诉必须安装这些文件的位置。 4、该特定软件需要哪些其他依赖项才能正常工作。 源RPM保存所有这些信息,源RPM与RPM类似,但顾名思义,它们不包含构建的二进制文件,而是包含一个软件的源文件,让我们下载fpaste的源RPM: $ dnf download fpaste --source ... fpaste-0.3.9.2-2.fc30.src.rpm 注意文件以“src.rpm”结尾的方式,所有RPM都是从源RPM构建的,你也可以使用dnf轻松检查“binary”RPM来自哪个源RPM: $ dnf repoquery --qf "%{SOURCERPM}" fpaste fpaste-0.3.9.2-2.fc30.src.rpm 此外,由于这是源RPM,因此它不包含构建的文件,相反,它包含有关如何从中构建RPM的源和说明: $ rpm -qpl ./fpaste-0.3.9.2-2.fc30.src.rpm fpaste-0.3.9.2.tar.gz fpaste.spec 这里,第一个文件只是fpaste的源代码,第二个是“spec”文件,spec文件是告诉RPM(工具)如何使用源RPM中包含的源创建RPM(存档)的配方,包含RPM(工具)构建RPM(存档)所需的所有信息在spec文件中,当我们打包维护者将软件添加到Fedora时,我们的大部分时间都花在编写和完善单个spec文件上,当软件包需要更新时,我们返回并调整spec文件,可以在 https://src.fedoraproject.org/browse/projects/ 上的源存储库中查看Fedora中所有软件包的spec文件。 请注意,一个源RPM可能包含构建多个RPM的指令,fpaste是一个非常简单的软件,其中一个源RPM生成一个“binary”RPM,另一方面,Python更复杂,虽然只有一个源RPM,但它会生成多个二进制RPM: $ sudo dnf repoquery --qf "%{SOURCERPM}" python3 python3-3.7.3-1.fc30.src.rpm python3-3.7.4-1.fc30.src.rpm $ sudo dnf repoquery --qf "%{SOURCERPM}" python3-devel python3-3.7.3-1.fc30.src.rpm python3-3.7.4-1.fc30.src.rpm $ sudo dnf repoquery --qf "%{SOURCERPM}" python3-libs python3-3.7.3-1.fc30.src.rpm python3-3.7.4-1.fc30.src.rpm $ sudo dnf repoquery --qf "%{SOURCERPM}" python3-idle python3-3.7.3-1.fc30.src.rpm python3-3.7.4-1.fc30.src.rpm $ sudo dnf repoquery --qf "%{SOURCERPM}" python3-tkinter python3-3.7.3-1.fc30.src.rpm python3-3.7.4-1.fc30.src.rpm 在RPM行话中,“python3”是“main package”,因此spec文件将被称为“python3.spec”,所有其他包都是“sub-packages”,你可以下载python3的源RPM并查看其中的内容(提示:补丁也是源代码的一部分): $ dnf download --source python3 python3-3.7.4-1.fc30.src.rpm $ rpm -qpl ./python3-3.7.4-1.fc30.src.rpm 00001-rpath.patch 00102-lib64.patch 00111-no-static-lib.patch 00155-avoid-ctypes-thunks.patch 00170-gc-assertions.patch 00178-dont-duplicate-flags-in-sysconfig.patch 00189-use-rpm-wheels.patch 00205-make-libpl-respect-lib64.patch 00251-change-user-install-location.patch 00274-fix-arch-names.patch 00316-mark-bdist_wininst-unsupported.patch Python-3.7.4.tar.xz check-pyc-timestamps.py idle3.appdata.xml idle3.desktop python3.spec
从源RPM构建RPM 现在我们拥有源RPM,并知道其中的内容,我们可以从中重建RPM,但是,在我们这样做之前,我们应该将我们的系统设置为构建RPM,首先,我们安装所需的工具: $ sudo dnf install fedora-packager 这将安装rpmbuild工具,rpmbuild需要一个默认布局,以便它知道源rpm的每个必需组件的位置,让我们看看它们是什么: # Where should the spec file go? $ rpm -E %{_specdir} /home/asinha/rpmbuild/SPECS # Where should the sources go? $ rpm -E %{_sourcedir} /home/asinha/rpmbuild/SOURCES # Where is temporary build directory? $ rpm -E %{_builddir} /home/asinha/rpmbuild/BUILD # Where is the buildroot? $ rpm -E %{_buildrootdir} /home/asinha/rpmbuild/BUILDROOT # Where will the source rpms be? $ rpm -E %{_srcrpmdir} /home/asinha/rpmbuild/SRPMS # Where will the built rpms be? $ rpm -E %{_rpmdir} /home/asinha/rpmbuild/RPMS 我已经在我的系统上设置了所有这些: $ cd $ tree -L 1 rpmbuild/ rpmbuild/ ├── BUILD ├── BUILDROOT ├── RPMS ├── SOURCES ├── SPECS └── SRPMS 6 directories, 0 files RPM提供了一个工具,可以为你设置一切: $ rpmdev-setuptree 然后我们确保安装了fpaste的所有构建依赖项: sudo dnf builddep fpaste-0.3.9.2-3.fc30.src.rpm 对于fpaste,你只需要Python,并且必须已经安装在你的系统上(dnf也使用Python,参考在Fedora 29系统中安装Python 3.8 alpha的方法),builddep命令也可以给出spec文件而不是源RPM,阅读手册页中的更多内容: $ man dnf.plugin.builddep 现在我们拥有了所需的一切,从源RPM构建RPM非常简单: $ rpmbuild --rebuild fpaste-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.rpm 0 directories, 1 file rpmbuild将安装源RPM并从中构建RPM,你现在可以安装RPM以使用它,就像使用dnf一样,当然,如前所述,如果要更改RPM中的任何内容,则必须修改spec文件。
结语 总结这篇文章: 1、我们通常安装使用软件的RPM是“binary”RPM,其中包含软件的内置版本。 2、这些是从源RPM构建的,包括生成二进制RPM所需的源代码和spec文件。
相关主题 |