云网牛站
所在位置:首页 > Linux教程 > 制作RPM包的方法:源RPM、从源RPM构建RPM

制作RPM包的方法:源RPM、从源RPM构建RPM

2019-08-27 15:37:29作者:叶云稿源:云网牛站

本文介绍制作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、从源RPM构建RPM

 

源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文件。

 

相关主题

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

精选文章
热门文章