RPM是包管理器和许多Linux发行版(如Fedora,Red Hat和CentOS)使用的包格式,以管理和分发二进制形式的软件。
构建环境
RPM构建环境树的根是RPMBuild
目录,其中包含6个子目录:build
,bugbrooot
,rpms
,SOURCES
,specs
和srpms
。
我们将看到如何通过启动一个简单的命令来生成此环境:
rpmbuild |-- BUILD |-- BUILDROOT |-- RPMS |-- SOURCES |-- SPECS |-- SRPMS
这些目录中的每一个都在构建过程中具有特定作用:
- “BUILD”目录是我们要包的程序的源代码是构建的
- “buildroot”目录是由构建目录中的软件编译汇编的文件被复制,反映了与包名称的子目录中的目标系统的结构:
在我们的例子中,将安装在/usr/bin
中的“feh”二进制文件将报告为BUILDROOT/feh-3.0-1.fc29.x86_64/usr/bin。 - “rpms”目录”是生成的
RPM
软件包的位置:每个RPM将放在子目录中
在其架构之后命名,或者,如果它不是特定于架构的,则为noarch
。 - “来源”目录托管我们要打包的软件的压缩源代码,通常是在邮政编码文件的tar包的形式下。
- “specs目录”是我们将
.spec
文件放在哪里,并使用指令构建我们的包:我们将在一瞬间分析此文件的结构。 - “SRPMS”目录相当于RPM,而是用于源RPM。此特殊包包含应用程序的原始源代码,最终修补程序和用于构建包的标本文件。
spec 文件
构建RPM包所需的所有指令和信息的文件是.spec
文件。
一个specfile在另一件事情中包含“构建依赖关系”(编译我们要包的程序所需的软件),“运行时依赖关系”(程序所需的库进行正确运行)和应为OMMands执行以编译软件。
该文件由两个宏观部分组成:“preamble”和“body”。
在每个部分中的每一部中,可以指定不同的指令。
“preamble”部分可以包含以下说明:
- Name:包的基本名称(这应符合规范文件的名称)
- Version:打包软件的上游版本
- Release:包的发布号
- License:用于软件包的许可证
- URL:软件上游URL
- source0:Direct URL或者软件压缩源代码(tar包或者压缩文件)的路径
- buildarch:包的架构:如果未指定架构,则将使用其中一个主机系统
- BuildRequires:构建软件所需的依赖项
- Requires:运行软件所需的依赖项
specfile的body
部分通常包含以下部分:
- %description:包装软件的可选多线描述
- %prep:准备源代码所需的命令(例如,提取tar包所需的命令)
- %build:构建软件所需的命令
- %install:将构建过程中的文件复制到
buildroot
目录所需的命令 - %files:包提供的文件列表,将安装在系统上
宏
为了缓解我们的工作,在一个Specfile中,我们可以使用一些宏,让我们引用许多有用的东西并自动执行某些任务。
首先,我们拥有“rpm目录宏”,它让我们使用的构建环境的目录参考;我们应该始终使用它们而不是直接路径:
- %{_ topdir}:这个宏引用了
rpmbuild
目录 - %{_ builddir}:引用我们构建树中的
build
目录 - %{_ rpmdir}:引用
rpms
目录的路径 - %{_ sourcedir}:这个宏被评估为
scess
目录的路径 - %{_ specdir}:表示
specs
目录的路径的宏 - %{_ srcrpmdir}:引用“SRPMS”目录的路径
- %{_ buildrootdir}:引用
buildroot
目录的路径
其他宏让我们引用我们的计算机文件系统中最重要的目录,例如:
- %{_ sysconfigdir}:
/etc
目录 - %{_ prefix}:
/usr
目录 - %{_ bindir}:
/usr/bin
目录 - %{_ mandir}:
/usr/share/man
目录的路径
以下是常用宏的一些示例:
- “%setup宏”用于Specfile的“%配置”部分,基本上执行以下操作:
- 提取我们要将程序包的程序的源代码提取到“BuildDir”目录中
- 切换到提取的目录中
- 设置它内部的相应文件权限
%{make_build}
宏用于specfile的%build
部分,并基本上使用预定义的选项设置make
命令,以编译软件的源代码。如果我们展开它,我们可以检查它运行的命令:
$rpm --eval "%{make_build}" /usr/bin/make -O -j4
- 相反,
%{make_install}
宏将用于文件的%installs
部分,并运行destdir
参数使用destdir
参数,用于指示命令相对地将编译的文件安装到给定的目录而不是真实系统/
:
$rpm --eval "%{make_install}" /usr/bin/make install DESTDIR=/home/egdoc/rpmbuild/BUILDROOT/%{NAME}-%{VERSION}-%{RELEASE}.x86_64 INSTALL="/usr/bin/install -p"
如何逐步创建RPM包
下面我们看如何创建构建环境并制作第一个RPM包。
安装构建依赖项
我们需要安装“RPMDevTools”,并加上构建“FEH”所需的依赖项:
$sudo dnf install rpmdevtools gcc make imlib2-devel libjpeg-devel libpng-devel libXt-devel libXinerama-devel libexif-devel \ perl-Test-Command perl-Test-Harness libcurl-devel
安装软件包后,生成我们的构建环境。
$rpmdev-setuptree
此时,应该创建之前的“RPMBuild”目录和我们之前看到的所有子目录。
创建specfile.
创建Specfile,并将其保存在具有相同的包名称的specs
目录中。
最小的specfile示例:
Name: feh Version: 3.0 Release: 1%{?dist} Summary: Fast command line image viewer using Imlib2 License: MIT URL: http://feh.finalrewind.org Source0: http://feh.finalrewind.org/feh-%{version}.tar.bz2 BuildRequires: gcc BuildRequires: imlib2-devel BuildRequires: libcurl-devel BuildRequires: libjpeg-devel BuildRequires: libpng-devel BuildRequires: libXt-devel BuildRequires: libXinerama-devel BuildRequires: libexif-devel BuildRequires: perl-Test-Command BuildRequires: perl-Test-Harness %description Fast command line image viewer using Imlib2 %prep %setup -q %build %{make_build} %install %{make_install} PREFIX=%{_prefix} %files /usr/bin/feh /usr/lib/debug/usr/bin/feh-3.0-1.fc29.x86_64.debug /usr/share/applications/feh.desktop /usr/share/doc/feh/AUTHORS /usr/share/doc/feh/ChangeLog /usr/share/doc/feh/README.md /usr/share/doc/feh/TODO /usr/share/doc/feh/examples/buttons /usr/share/doc/feh/examples/find-lowres /usr/share/doc/feh/examples/keys /usr/share/doc/feh/examples/themes /usr/share/feh/fonts/black.style /usr/share/feh/fonts/menu.style /usr/share/feh/fonts/yudit.ttf /usr/share/feh/images/feh.png /usr/share/feh/images/feh.svg /usr/share/feh/images/menubg_default.png /usr/share/icons/hicolor/48x48/apps/feh.png /usr/share/icons/hicolor/scalable/apps/feh.svg /usr/share/man/man1/feh.1.gz
获取来源并构建RPM包
现在我们的规范文件终于准备好了,我们可以构建我们的“rpm”。您可能注意到我们还没有下载“feh”的源代码包:不需要手动执行此操作,因为我们可以使用'spectool'命令:
$spectool -g -R ~/rpmbuild/SPECS/feh.spec Getting http://feh.finalrewind.org/feh-3.0.tar.bz2 to /home/egdoc/rpmbuild/SOURCES/feh-3.0.tar.bz2 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 185 100 185 0 0 898 0 --:--:-- --:--:-- --:--:-- 898 100 2057k 100 2057k 0 0 1988k 0 0:00:01 0:00:01 --:--:-- 4191k
使用“-BB”选项启动时,RPMBuild将仅构建一个“二进制包”:如果我们想要生成“源RPM”,则必须使用“-BA”
运行rpmbuild:
$rpmbuild -bb ~/rpmbuild/SPECS/feh.spec
如果一切顺利,则将在“RPMS”目录中生成RPM包。