rpmbuild重建RPM时无法禁用自动生成依赖?如何解决
原因分析
这些依赖分为两类,成因不同:
- rpmlib类依赖:这是RPM包格式特性,由RHEL9的rpmbuild自动添加。RHEL9使用的RPM版本支持新的包属性(如文件摘要、压缩格式),生成的包会携带这些rpmlib依赖,而RHEL7的RPM版本不兼容这些新属性,导致安装失败。
- /bin/sh依赖:通常是rpmbuild检测到包内有带shebang的可执行文件(如脚本、service文件的ExecStart指向脚本)自动生成。你添加的禁用规则未覆盖全部检测逻辑,或者rpmlib的强制属性间接触发了这个依赖。
解决方法
1. 消除rpmlib兼容问题
要让RHEL9构建的包兼容RHEL7,需强制使用旧版RPM格式,添加以下宏到SPEC文件或rpmbuild命令行:
命令行方式:
rpmbuild -bb -vvv --define "_topdir $dstdir" --buildroot "$src" \ --define "_binary_payload w9.gzdio" \ --define "_source_payload w9.gzdio" \ --define "rpm_payload_format gzip" \ --define "_with_filedigest 0" \ "$spec"
SPEC文件方式(头部添加):
%global _binary_payload w9.gzdio %global _source_payload w9.gzdio %global rpm_payload_format gzip %global _with_filedigest 0
这些设置会关闭RHEL9默认启用的新特性,生成兼容RHEL7的包格式,自动移除rpmlib类依赖。
2. 彻底消除/bin/sh依赖
在SPEC文件中补充以下宏,覆盖rpmbuild的依赖检测逻辑:
%global __find_requires %{nil} %global __find_provides %{nil}
同时检查包内文件:如果有带#!/bin/sh的脚本,若不需要该依赖,可在%install阶段用sed -i '1d' <file>移除shebang,或修改文件权限为非可执行(如果不影响功能)。
3. 额外建议
- 不要修改系统级的
find-requires文件,会影响所有RPM构建,优先用SPEC宏或命令行参数覆盖。 - 最稳妥的兼容方式是直接在RHEL7系统上重建包,生成的包天然适配目标环境。
内容的提问来源于stack exchange,提问作者Dmitry Donskih
相关产品推荐
相关产品推荐

