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
文件中明确列出的依赖项。它所做的是寻找可能的 use
和 require
perl 代码中的指令,带有一些逻辑和正则表达式,其实现与您期望的一样有吸引力)。
老实说,我完全不确定在什么情况下 perl.req
和 find-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 以获得更完整的解决方案)。
我想制作一个可以安装在 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
文件中明确列出的依赖项。它所做的是寻找可能的 use
和 require
perl 代码中的指令,带有一些逻辑和正则表达式,其实现与您期望的一样有吸引力)。
老实说,我完全不确定在什么情况下 perl.req
和 find-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 以获得更完整的解决方案)。