cpanspec 选项 --filter-requires 无法删除:MODULE_COMPAT

cpanspec option --filter-requires fails to remove :MODULE_COMPAT

我想制作一个可以安装在 RHEL5,6 和 7 上的 rpm。

[p4474668@rhel7dev source]$ cpanspec webmin-ajax-0.00.tar.gz  -d '' --force --filter-requires 'perl(:MODULE_COMPAT_5.16.3)' -b
(... lots of infos here ...)
[p4474668@rhel7dev source]$ rpm -qpR noarch/perl-webmin-ajax-0.00-1.noarch.rpm
perl(:MODULE_COMPAT_5.16.3)
perl(DST::System)
perl(WebminCore)
perl(lib)
perl(strict)
perl(warnings)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1useless
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1

由于没有去除依赖,所以无法在RHEL5上安装。

如何删除 perl(:MODULE_COMPAT_5.16.3) 不需要的依赖项?

此功能的文档不足,并且(恕我直言)并没有实现其名称所暗示的所有功能。

它的作用是:

  • 它与 .spec 文件一起创建了一个过滤器脚本文件(在 .sh 脚本中有一些 sed),这在 .spec 文件中被引用并且是rpmbuild 期间需要。写入 .spec 文件的依赖项不受过滤影响。
  • sed 过滤器脚本在 rpmbuild 期间被 sed 重写,以调用正确的 perl.req
  • 过滤器脚本 应用于 perl.req 的输出(通常 find-requires)

(据我所知,perl.req 早于 Makefile.PL and/or META 文件中明确列出的依赖项。它所做的是寻找可能的 userequire perl 代码中的指令,带有一些逻辑和正则表达式,其实现与您期望的一样有吸引力)。

老实说,我完全不确定在什么情况下 perl.reqfind-requires 被调用或不被调用(粗略测试通过设置 AutoReq 对我没有影响),但是 cpanspec 无论如何都会直接读取和处理 META.yml。唯一其他与依赖相关的功能是(基本)处理 Makefile.PL 以提取 PREREQ_PM 中的模块引用并将它们添加为 BuildRequires

通常您可以将 .spec 文件修补为 add something like

%filter_from_requires /XSLoader/d
%filter_setup

但是,:MODULE_COMPAT_xxx 特例依赖项 cpanspec 中,您可以使用 -o 选项关闭它以创建"compatible" 适用于旧系统的 RPM。这也有其他影响,因此分步构建可能问题较小,以便您可以调整构建:

cpanspec [...]   yourmodule
sed -i'.bak' '/^Requires.*:MODULE_COMPAT.*/d' yourmodule.spec
rpmbuild -ba yourmodule.spec

(特别是因为 cpanspec 警告说 -b 不能保证总是有效)。

当然最终的包可能不会像预期的那样工作,cpanspec 是谨慎的,但是对于这个约束可能有一个真正的 API 要求(在你的情况下 "noarch" build 可能会限制问题的范围,我认为)。 经验法则 是 API/ABI 尝试向后兼容,而不是向前兼容(如果您尝试构建二进制文件以使用 glibc 比你编译的对象更旧)。

在 CentOS 5 系统上构建您的运气可能更好(或研究 Mock 以获得更完整的解决方案)。