You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

rpmbuild重建RPM时无法禁用自动生成依赖?如何解决

原因分析

这些依赖分为两类,成因不同:

  1. rpmlib类依赖:这是RPM包格式特性,由RHEL9的rpmbuild自动添加。RHEL9使用的RPM版本支持新的包属性(如文件摘要、压缩格式),生成的包会携带这些rpmlib依赖,而RHEL7的RPM版本不兼容这些新属性,导致安装失败。
  2. /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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:46