
🌈 个人主页:Zfox_

🔥 前言
🎒 **RPM(Redhat Package Manager)
**是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。看到这篇文章的朋友想必已经知道RPM是个啥,rpm/yum命令怎么用,废话不多说,直接进入正题,来看看RPM包咋打。
一:🔥 准备
首先请准备一个Linux环境,比如CentOS。
RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。
$ yum install rpm-build
当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。
$ yum install rpmdevtools
当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的 make、gcc,python 的 setuptools 等,根据需要安装即可。
二:🔥 制作 rpm
官方文档:
其他资料:
1.设置目录结构(制作车间)
必须要有五个目录
- BUILD(制作车间)
- 源代码解压以后放的位置,config,make,不需要我们管
- RPMS
- 制作完成以后的rpm包,为特定平台准备的子目录的
- SOURCES
- 所有源材料都放到这里,配置文件,源码包,补丁包
- SPECS
- 放置spec文件,每个rpm的纲领性文件(最重要的)
- SRPMS
- src格式的rpm包放置的位置
- BUILDROOT (假想的根目录)
- 是一个目录,它模拟了一个完整的文件系统环境。当构建一个 RPM 包时,所有的构建操作(如编译、安装等)都会在这个目录中进行,而不是直接在系统的根目录下操作。这样可以避免对系统本身的文件系统造成污染。
2. 源码放置到规划好的目录当中
3. 创建一个spec文件,指挥如何使用这些源材料,制作成 rpm包
4. 编译源码生成rpm包 rpmbuild 命令
🦋 第一步学习内容
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
也可以设置目录结构
🎀 查看所有的rpm宏定义
rpmbuild --showrc
_topdir 存放的就是 rpm 制作车间的路径
parallels@ubuntu-linux-2404:~$ rpmbuild --showrc | grep _topdir
-13: _builddir %{_topdir}/BUILD
-13: _buildrootdir %{_topdir}/BUILDROOT
-13: _rpmdir %{_topdir}/RPMS
-13: _sourcedir %{_topdir}/SOURCES
-13: _specdir %{_topdir}/SPECS
-13: _srcrpmdir %{_topdir}/SRPMS
-13: _topdir %{getenv:HOME}/rpmbuild
rpmbuild --showrc | grep macrofiles
rpmbuild --showrc | grep macrofiles
命令可以帮助你了解 RPM 构建过程中使用的宏文件路径。
添加/修改变量,更改制作车间的位置
vim .rpmmacros
%_topdir ~/selffile
🦋 第三步学习内容
这些内容都是 spec 设置的
信息段 (section):
rpm -qi 命令会显示的内容
Source 指令在 .spec 文件中用于指定构建软件包所需的源文件。这些源文件可以是 URL 或本地文件路径。通过正确配置 Source 指令,你可以确保 rpmbuild 能够找到并使用所需的源文件来构建软件包。
依赖关系
BuildRequires 编译依赖
Requires 安装依赖
准备段 (section)
源码包解压缩到 BUILD 的过程
%prep
%prep
是 .spec
文件中的一个部分,用于准备源代码。在这个部分中,通常会执行以下操作:
- 解压源代码文件。
- 应用补丁文件。
- 执行其他必要的准备步骤。
%setup
%setup
是一个宏,用于解压源代码文件。它会自动处理 Source
指令中指定的源文件。
常用选项:
-q
:安静模式,减少输出信息。-n
:指定解压后的目录名称。如果不指定,%setup
会根据源文件的名称自动推断目录名称。
示例:
%prep
%setup -q
这个命令会解压 Source0
指定的源文件,并进入解压后的目录。如果源文件是 myapp-1.0.tar.gz
,解压后的目录通常是 myapp-1.0
。
%patch
%patch
是一个宏,用于应用补丁文件。补丁文件通常用于修复源代码中的问题或添加功能。
常用选项:
-p
:指定补丁的上下文级别。-p1
表示补丁文件是基于一级目录的。-b
:指定补丁后的备份文件后缀。例如,-b .orig
会在应用补丁后生成备份文件。
示例:
%prep
%setup -q
%patch1 -p1
这个命令会:
- 解压
Source0
指定的源文件。 - 应用
Source1
指定的补丁文件。
编译段 (section)
安装阶段
清理阶段
文件段
%files 段在 .spec 文件中用于定义哪些文件和目录应该包含在最终的 RPM 包中,并指定它们在目标系统上的安装位置。通过正确配置 %files 段,你可以确保 RPM 包包含所有必要的文件,并将它们安装到正确的位置。
%defattr 是一个非常重要的指令,用于定义包中文件的默认属性。
%defatter (- root, root, 755)
当你在 %files 部分列出 /usr/local/bin/axel 时,这意味着 /usr/local/bin/axel 文件将被包含在最终生成的 RPM 包中,并且在安装该 RPM 包时,该文件将被安装到目标系统上的 /usr/local/bin/axel 路径。
/usr/local/bin/axel
changelog 段 日志
🦋 第四步
rpmbuild -ba …spec
🎀 rpmbuild 参数信息
- bb 二进制
- ba 都 build
- bs 源 rpm包
%files 和 buildroot 的文件必须一一对应!
三:🔥 rpm 制作过程
使用 rpmbuild 命令
首先读取 SOURCES 下的相关文件解压缩到 BUILD 生成子目录,而后制作过程会跳到子目录执行 config make
以下是详细解释 :
在使用 rpmbuild
命令构建 RPM 包时,%prep
、%build
和 %install
是三个关键的阶段。你提到的 config
和 make
是在 %build
阶段中常用的命令,它们的作用如下:
1. %prep 阶段
%prep
阶段用于准备源代码,通常包括解压源文件和应用补丁。rpmbuild
会读取 .spec
文件中的 Source
指令,下载并解压源文件到 BUILD
目录下的子目录中。例如:
%prep
%setup -q
%patch1 -p1
%setup -q
:解压Source0
指定的源文件,并进入解压后的目录。%patch1 -p1
:应用Source1
指定的补丁文件。
2. %build 阶段
%build
阶段用于编译和构建软件。在这个阶段,通常会执行以下步骤:
在 BUILD下做
config
config
通常是指 ./configure
脚本,这是一个常见的配置工具,用于检查系统环境并生成适合当前系统的配置文件。./configure
脚本通常由 autoconf
工具生成,它会检查系统上的依赖项、库和工具,以确保软件可以正确编译。
%build
%configure
%configure
:这是一个 RPM 宏,等同于运行./configure
脚本。它会执行以下操作:- 检查系统环境。
- 生成配置文件(如
Makefile
)。 - 检查依赖项是否满足。
make
make
是一个构建工具,用于根据 Makefile
文件中的规则编译源代码并生成可执行文件或库文件。make
会读取 Makefile
中的规则,执行编译、链接等操作。
%build
%configure
make %{?_smp_mflags}
make %{?_smp_mflags}
:运行make
命令,%{?_smp_mflags}
是一个 RPM 宏,用于启用并行构建(如果系统支持多核处理器)。
% install
然后使用 install 命令安装到 buildroot 中
buildroot 是 RPM 构建过程中一个非常重要的目录,它用于模拟软件包的安装过程。在构建 RPM 包时,buildroot 起到了一个临时的“根目录”的作用,确保软件包在构建过程中不会直接安装到系统的实际根目录中,从而避免对系统造成污染或破坏。
%check 阶段
如果需要执行测试,使用 %check 是个好主意。测试代码应写入 %check 部分(紧接在 %install 之后,因为需要测试 %{buildroot} 中的文件),而不是写入 %{build} 部分,这样才能在必要时忽略测试。通常,此部分包含:
make test
有时候也可以用:
make check
请熟悉 Makefile 的用法,并选择适当的方式。
%files 段
%files 段用于指定哪些文件和目录应该包含在最终的 RPM 包中,并定义这些文件在目标系统上的安装位置。%files 段并不直接操作 buildroot,而是告诉 rpmbuild 哪些文件应该从 buildroot 中打包到最终的 RPM 包中。
%clean
在 RPM 的 .spec 文件中,%clean 段用于指定在构建过程结束后需要清理的文件和目录。这个阶段的主要目的是确保构建过程中产生的临时文件和目录被正确清理,以避免对系统造成不必要的污染。
%clean 段的作用
清理临时文件:删除构建过程中产生的临时文件和目录。
清理 buildroot:确保 buildroot 目录被清理,避免残留文件影响后续构建。
清理其他临时目录:清理 %prep 和 %build 阶段产生的其他临时目录。
四:🔥 备查
🦋 rpmlint 检查
为避免常见错误,请先使用 rpmlint 查找 SPEC 文件的错误:
$ rpmlint program.spec
如果返回错误/警告,使用 “-i” 选项查看更详细的信息。
也可以使用 rpmlint 测试已构建的 RPM 包,检查 SPEC/RPM/SRPM 是否存在错误。你需要在发布软件包之前,解决这些警告。此页面 提供一些常见问题的解释。如果你位于 SPEC 目录中,请执行:
$ rpmlint NAME.spec ../RPMS/*/NAME*.rpm ../SRPMS/NAME*.rpm
进入 ~/rpmbuild/RPMS 下的特定架构目录中,您会发现有许多二进制 RPM 包。使用以下命令快速查看 RPM 包含的文件和权限:
$ rpmls *.rpm
🦋 代表路径的宏列表
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir} %{_prefix}/share
%{_datadir} %{_datarootdir}
%{_includedir} %{_prefix}/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_lib} lib (lib64 on 64bit multilib systems)
%{_docdir} %{_datadir}/doc
%{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT %{buildroot}
五:🔥 编译 SRPM 包
🦈 编译一个已下载的 RPM 包通常指的是从源代码构建一个 RPM 包。如果你下载的是源 RPM 包(SRPM),可以通过以下步骤进行编译。如果是二进制 RPM 包(即直接安装的 RPM 包),则无法直接“编译”,因为它们已经是编译后的安装包。
🦋 以下是编译 SRPM 包的详细步骤:
1. 安装必要的工具
在编译 RPM 包之前,需要安装一些必要的工具,包括 rpm-build
和 rpmbuild
。在基于 Red Hat 的系统(如 CentOS、Fedora 或 RHEL)上,可以使用以下命令安装:
sudo dnf install rpm-build
或者在较旧的系统中,可能需要使用 yum
:
sudo yum install rpm-build
2. 安装依赖项
编译 RPM 包时,可能需要安装一些编译依赖项。这些依赖项通常在 .spec
文件中指定。可以使用以下命令安装所有依赖项:
sudo dnf builddep <srpm-file>.src.rpm
或者使用 yum
:
sudo yum-builddep <srpm-file>.src.rpm
这会自动安装 .spec
文件中指定的所有依赖项。
3. 创建 RPM 工作目录
如果你还没有创建 RPM 工作目录,可以按照之前提到的步骤创建一个标准的 RPM 工作目录结构:
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
并配置 ~/.rpmmacros
文件:
echo "%_topdir %(echo $HOME)/rpmbuild" > ~/.rpmmacros
4. 安装 SRPM 包
将 SRPM 包安装到你的 RPM 工作目录中。这会将源代码和 .spec
文件解压到相应的位置。使用以下命令:
rpm -ivh --define "_topdir $HOME/rpmbuild" <srpm-file>.src.rpm
例如:
rpm -ivh --define "_topdir $HOME/rpmbuild" example-1.0-1.src.rpm
这会将源代码解压到 ~/rpmbuild/SOURCES
目录,.spec
文件解压到 ~/rpmbuild/SPECS
目录。
5. 编译 RPM 包
使用 rpmbuild
命令从 .spec
文件构建 RPM 包。运行以下命令:
rpmbuild -ba ~/rpmbuild/SPECS/<spec-file>.spec
例如:
rpmbuild -ba ~/rpmbuild/SPECS/example.spec
这个命令会执行以下步骤:
- 解压源代码。
- 编译代码。
- 安装文件到
buildroot
。 - 打包生成 RPM 文件。
6. 检查生成的 RPM 包
如果一切顺利,生成的 RPM 包会出现在 ~/rpmbuild/RPMS
目录中。你可以使用以下命令查看生成的 RPM 包:
ls ~/rpmbuild/RPMS/
7. 安装生成的 RPM 包
你可以使用 dnf
或 yum
安装生成的 RPM 包:
sudo dnf install ~/rpmbuild/RPMS/<arch>/<rpm-file>.rpm
或者:
sudo yum install ~/rpmbuild/RPMS/<arch>/<rpm-file>.rpm
例如:
sudo dnf install ~/rpmbuild/RPMS/x86_64/example-1.0-1.x86_64.rpm
总结
编译一个已下载的 SRPM 包的步骤如下:
- 安装必要的工具(如
rpm-build
)。 - 安装编译依赖项(使用
dnf builddep
或yum-builddep
)。 - 创建 RPM 工作目录并配置
~/.rpmmacros
文件。 - 安装 SRPM 包到工作目录。
- 使用
rpmbuild -ba
命令从.spec
文件构建 RPM 包。 - 检查生成的 RPM 包。
- 安装生成的 RPM 包。
通过这些步骤,你可以从源代码重新编译并生成自己的 RPM 包。
六:🔥 共勉
😋 以上就是我对 RPM 包制作原理详解及备查
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉