)
Linux命令-rpmbuildRPM包构建工具简介语法⚙️选项与操作构建操作通用选项目录结构SPEC 文件关键字段常用宏示例示例 1搭建 rpmbuild 环境示例 2构建一个简单的 RPM 包示例 3从 SRPM 重新构建示例 4使用宏和条件构建示例 5调试构建过程⚠️注意总结相关命令rpmbuild 是 RPM 打包体系的核心工具从 SPEC 文件和源码构建 RPM 包。无论是将自研软件打包分发还是定制系统组件rpmbuild 都是不可或缺的。简介rpmbuild 根据 SPEC 文件中定义的构建流程编译源码并生成二进制 RPM 包.rpm和源码 RPM 包.src.rpm。它是 Fedora/RHEL/CentOS 生态中软件打包的标准工具。特性说明所属软件包rpm-build安装命令dnf install rpm-buildRHEL/CentOS/Fedora配置目录~/rpmbuild/SPEC 文件构建脚本定义打包全流程需要权限不要用 root 构建⚠️绝对不要在 root 用户下构建 RPM构建过程中的 %install 阶段如果出错可能覆盖系统文件。始终使用普通用户操作。语法rpmbuild[选项]操作[SPEC文件|SRPM文件...]⚙️选项与操作构建操作操作说明-ba构建二进制包 源码包最常用-bb仅构建二进制包-bs仅构建源码包-bc执行到 %build 阶段编译-bp执行到 %prep 阶段解压源码打补丁-bi执行到 %install 阶段安装到 buildroot-bl检查 %files 列表中的文件是否存在--rebuild从 SRPM 重新构建二进制包通用选项选项说明--target 架构指定目标架构如 x86_64、aarch64--define 宏 值定义宏变量--with 功能启用条件构建功能--without 功能禁用条件构建功能--nodeps不检查构建依赖--noclean不清理 BUILD 目录-v详细输出--clean构建完成后清理 BUILD 目录目录结构~/rpmbuild/ ├── SOURCES/ # 源码包.tar.gz、补丁文件 ├── SPECS/ # SPEC 文件 ├── BUILD/ # 编译工作目录自动创建 ├── BUILDROOT/ # 伪安装根目录自动创建 ├── RPMS/ # 生成的二进制 RPM 包 │ └── x86_64/ │ └── noarch/ └── SRPMS/ # 生成的源码 RPM 包SPEC 文件关键字段字段说明Name包名Version上游版本号Release发行号补丁级别Summary一行摘要License许可证Source0源码包 URL/文件名Patch0补丁文件名Requires运行时依赖BuildRequires构建时依赖%description详细描述%prep准备阶段解压打补丁%build编译阶段./configure make%install安装阶段make install 到 buildroot%check测试阶段make test%files打包文件列表%changelog变更日志常用宏宏展开值%{_topdir}~/rpmbuild%{buildroot}~/rpmbuild/BUILDROOT/...%{_bindir}/usr/bin%{_sbindir}/usr/sbin%{_libdir}/usr/lib6464位系统%{_datadir}/usr/share%{_sysconfdir}/etc%{_mandir}/usr/share/man%{_docdir}/usr/share/doc示例示例 1搭建 rpmbuild 环境安装构建工具并初始化目录结构# 安装 rpm-build 和开发工具sudodnfinstall-yrpm-build rpmdevtools# 使用 rpmdev-setuptree 创建标准目录结构rpmdev-setuptree# 查看创建的目录tree ~/rpmbuild/# 输出示例/home/user/rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS ├── SRPMS └── BUILDROOT -不存在构建时自动创建生成 SPEC 文件模板# 使用 rpmdev-newspec 生成 SPEC 模板rpmdev-newspec myapp# 输出示例myapp.spec created# 查看模板head-20~/rpmbuild/SPECS/myapp.spec# 输出示例Name: myapp Version: Release:1%{?dist}Summary: License: URL: Source0: BuildRequires: Requires: %description %prep %setup-q%build %installrm-rf$RPM_BUILD_ROOT%files %changelog示例 2构建一个简单的 RPM 包以打包一个 Shell 脚本工具为例完整流程# 1. 准备源码mkdir-p/tmp/hello-1.0cat/tmp/hello-1.0/hello.shEOF #!/bin/bash echo Hello from hello-1.0! echo RPM packaged tool EOFchmodx /tmp/hello-1.0/hello.sh# 2. 打包源码cd/tmptar-czf~/rpmbuild/SOURCES/hello-1.0.tar.gz hello-1.0/# 3. 编写 SPEC 文件cat~/rpmbuild/SPECS/hello.specEOF Name: hello Version: 1.0 Release: 1%{?dist} Summary: A simple hello world tool License: GPLv3 Source0: %{name}-%{version}.tar.gz %description A minimal hello world script packaged as an RPM. %prep %setup -q %build # 无需编译 %install rm -rf %{buildroot} install -d %{buildroot}%{_bindir} install -m 755 hello.sh %{buildroot}%{_bindir}/hello %files %{_bindir}/hello %changelog * Fri Jun 14 2025 User userexample.com - 1.0-1 - Initial package EOF# 4. 构建 RPM 包rpmbuild-bb~/rpmbuild/SPECS/hello.spec# 输出示例Executing(%prep): /bin/sh-e/var/tmp/rpm-tmp.abc123 umask022 cd/home/user/rpmbuild/BUILD cd/home/user/rpmbuild/BUILD rm-rfhello-1.0 /usr/bin/gzip-dc/home/user/rpmbuild/SOURCES/hello-1.0.tar.gz /usr/bin/tar-xvvof- STATUS0[0-ne0]cdhello-1.0 /usr/bin/chmod-RfarX,uw,g-w,o-w.Executing(%build): /bin/sh-e/var/tmp/rpm-tmp.def456 umask022 cd/home/user/rpmbuild/BUILD cdhello-1.0 Executing(%install): /bin/sh-e/var/tmp/rpm-tmp.ghi789 umask022 cd/home/user/rpmbuild/BUILD cd/home/user/rpmbuild/BUILD/hello-1.0 rm-rf/home/user/rpmbuild/BUILDROOT/hello-1.0-1.el9.x86_64 install-d/home/user/rpmbuild/BUILDROOT/hello-1.0-1.el9.x86_64/usr/bin install-m755hello.sh /home/user/rpmbuild/BUILDROOT/hello-1.0-1.el9.x86_64/usr/bin/hello Processing files: hello-1.0-1.el9.x86_64 Provides: hello1.0-1.el9.x86_64 Requires(rpmlib): rpmlib(CompressedFileNames)3.0.4-1 Checkingforunpackaged file(s): /usr/lib/rpm/check-files /home/user/rpmbuild/BUILDROOT/hello-1.0-1.el9.x86_64 Wrote: /home/user/rpmbuild/RPMS/x86_64/hello-1.0-1.el9.x86_64.rpm验证构建结果# 查看生成的 RPM 包ls-lh~/rpmbuild/RPMS/x86_64/# 输出示例-rw-rw-r--.1user user5.2K Jun1410:30 hello-1.0-1.el9.x86_64.rpm# 查看 RPM 包信息rpm-qip~/rpmbuild/RPMS/x86_64/hello-1.0-1.el9.x86_64.rpm# 输出示例Name:hello Version:1.0Release:1.el9 Architecture: x86_64 Install Date:(not installed)Group:Unspecified Size:42License:GPLv3 Signature:(none)Source RPM:hello-1.0-1.el9.src.rpm Summary:A simple hello world tool Description:A minimal hello world script packaged as an RPM.示例 3从 SRPM 重新构建从源码 RPM 包重新编译二进制包# 下载 SRPM 包dnf download--sourcebash# 输出示例bash-5.2.15-2.el9.src.rpm# 从 SRPM 重新构建rpmbuild--rebuildbash-5.2.15-2.el9.src.rpm# 输出示例节选Installing bash-5.2.15-2.el9.src.rpm Executing(%prep): /bin/sh-e/var/tmp/rpm-tmp.xxx cd/home/user/rpmbuild/BUILD cd/home/user/rpmbuild/BUILD rm-rfbash-5.2 /usr/bin/gzip-dc/home/user/rpmbuild/SOURCES/bash-5.2.tar.gz... Wrote: /home/user/rpmbuild/RPMS/x86_64/bash-5.2.15-2.el9.x86_64.rpm Wrote: /home/user/rpmbuild/RPMS/x86_64/bash-debuginfo-5.2.15-2.el9.x86_64.rpm Wrote: /home/user/rpmbuild/RPMS/x86_64/bash-debugsource-5.2.15-2.el9.x86_64.rpm示例 4使用宏和条件构建在 SPEC 文件中使用宏和条件开关# 在 SPEC 文件中定义宏cat~/rpmbuild/SPECS/myapp.specEOF Name: myapp Version: 2.0 Release: 1%{?dist} Summary: My Application License: MIT Source0: %{name}-%{version}.tar.gz # 条件构建--with ssl 启用 SSL 支持 %if %{with ssl} BuildRequires: openssl-devel %endif %description My application with optional features. %prep %setup -q %build %configure \ %{?with_ssl:--enable-ssl} \ %{?with_debug:--enable-debug} make %{?_smp_mflags} %install %make_install %files %{_bindir}/myapp %config(noreplace) %{_sysconfdir}/myapp.conf %doc README.md LICENSE EOF# 不带 SSL 支持rpmbuild-bb~/rpmbuild/SPECS/myapp.spec# 带 SSL 支持构建rpmbuild-bb--withssl ~/rpmbuild/SPECS/myapp.spec# 自定义宏定义rpmbuild-bb--definedebug 1~/rpmbuild/SPECS/myapp.spec示例 5调试构建过程分阶段执行构建方便排查问题# 仅执行 %prep 阶段解压源码打补丁rpmbuild-bp~/rpmbuild/SPECS/myapp.spec# 输出示例Executing(%prep): /bin/sh-e/var/tmp/rpm-tmp.abc umask022 cd/home/user/rpmbuild/BUILD cd/home/user/rpmbuild/BUILD rm-rfmyapp-2.0 /usr/bin/gzip-dc/home/user/rpmbuild/SOURCES/myapp-2.0.tar.gz /usr/bin/tar-xvvof- drwxrwxr-x1000/100002025-06-1410:00 myapp-2.0/ -rw-r--r--1000/10004202025-06-1410:00 myapp-2.0/configure...# 仅执行到 %build 阶段编译rpmbuild-bc~/rpmbuild/SPECS/myapp.spec# 仅执行到 %install 阶段安装到 buildrootrpmbuild-bi~/rpmbuild/SPECS/myapp.spec# 检查 %files 文件列表是否与 buildroot 匹配rpmbuild-bl~/rpmbuild/SPECS/myapp.spec# 输出示例Processing files: myapp-2.0-1.el9.x86_64 error: Installed(but unpackaged)file(s)found: /usr/bin/myapp-util /etc/myapp-defaults.conf# 提示有文件未列入 %files⚠️注意不要用 root 构建 RPM使用普通用户通过rpmdev-setuptree初始化环境BuildRequires必须声明完整否则在其他机器上可能构建失败%files列表必须精确匹配%install阶段安装的文件多了少了都会报错%config(noreplace)保护配置文件不被升级覆盖使用%{?dist}宏确保跨发行版兼容构建依赖缺失时用rpmbuild -bb --nodeps可跳过检查但可能导致构建失败查看宏展开结果rpmbuild --eval %{_bindir}总结rpmbuild 是 RPM 打包的核心工具掌握 SPEC 文件编写是关键。最常用的操作是-ba构建二进制源码包和--rebuild从 SRPM 重建。调试时分步使用-bp、-bc、-bi逐步排查。记住永远不要用 root 构建善用宏提高 SPEC 文件的可维护性。相关命令rpm— RPM 包管理器rpmquery— RPM 包查询rpm2cpio— 提取 RPM 包文件rpmlint— RPM 包质量检查rpmdev-setuptree— 初始化构建目录rpmdev-newspec— 生成 SPEC 模板mock— 在 chroot 环境中构建 RPMspectool— 下载 SPEC 中的 Source 源码