RPM 包制作备查 &SRPM 包编译

发布于:2025-05-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

🌈 个人主页: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

这个命令会:

  1. 解压 Source0 指定的源文件。
  2. 应用 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 是三个关键的阶段。你提到的 configmake 是在 %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-buildrpmbuild。在基于 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 包

你可以使用 dnfyum 安装生成的 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 包的步骤如下:

  1. 安装必要的工具(如 rpm-build)。
  2. 安装编译依赖项(使用 dnf builddepyum-builddep)。
  3. 创建 RPM 工作目录并配置 ~/.rpmmacros 文件。
  4. 安装 SRPM 包到工作目录。
  5. 使用 rpmbuild -ba 命令从 .spec 文件构建 RPM 包。
  6. 检查生成的 RPM 包。
  7. 安装生成的 RPM 包。

通过这些步骤,你可以从源代码重新编译并生成自己的 RPM 包。

六:🔥 共勉

😋 以上就是我对 RPM 包制作原理详解及备查 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到