我在一段时间前发布了Net::NSCAng::Client
,并且在OpenBSD上得到了很多测试失败。原因是NSCAng协议以预共享密钥模式(RFC4279)使用OpenSSL, LibreSSL(现在是OpenBSD的默认值)的人已经删除了这些内容。然而,他们似乎一直在用最不透明的方式做这件事:包含文件定义了所有的函数,只是共享库缺少相应的符号,所以编译工作得很好,但测试失败了。
在OpenBSD上有一个名为eopenssl的兼容性包,通过首先在Makefile.PL中测试它(使用ExtUtils::PkgConfig
),如果安装了兼容性库,我可以使它工作。如果不是,事情还是会失败。
我可以检查CPP符号OPENSSL_NO_PSK,但由于包含总是来自LibreSSL,即使与eopenssl链接也会失败。我剩下的唯一想法是尝试让测试程序作为编译阶段的一部分运行,就像autoconf所做的那样。这是可能的ExtUtils::MakeMaker
(或其他东西-我不介意切换构建系统,如果有必要)?
使用Devel::CheckLib
编写功能测试很容易。可以使用以下代码检查函数your_func
是否存在(在Makefile.PL
中):
my $your_func_exists = check_lib(
header => 'your_header.h',
function => 'return your_func ? 1 : 0;',
);
如果您只是想在函数缺失时中止编译:
check_lib(
...
) or warn('your_func is missing'), exit;
以0退出应该避免CPAN Tester的'FAIL'报告。