在 Perl 构建脚本中测试 LibreSSL
Testing for LibreSSL in a Perl build script
我不久前发布了 Net::NSCAng::Client
并且在 OpenBSD 上遇到了很多测试失败。这样做的原因是 NSCAng 协议在预共享密钥模式 (RFC4279) 中使用 OpenSSL,LibreSSL(现在 OpenBSD 上的默认设置)的人们已经放弃了这一点。然而,他们似乎一心想用最不透明的方式来做这件事:include文件定义了所有的函数,只是共享库缺少相应的符号,所以编译正常,但测试失败。
OpenBSD 上有一个名为 eopenssl 的兼容包,通过首先在 Makefile.PL 中测试它(使用 ExtUtils::PkgConfig
)我可以让它工作 if 兼容性库已安装。如果不是,事情仍然失败。
我可以检查 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 测试员的 'FAIL' 报告。
我不久前发布了 Net::NSCAng::Client
并且在 OpenBSD 上遇到了很多测试失败。这样做的原因是 NSCAng 协议在预共享密钥模式 (RFC4279) 中使用 OpenSSL,LibreSSL(现在 OpenBSD 上的默认设置)的人们已经放弃了这一点。然而,他们似乎一心想用最不透明的方式来做这件事:include文件定义了所有的函数,只是共享库缺少相应的符号,所以编译正常,但测试失败。
OpenBSD 上有一个名为 eopenssl 的兼容包,通过首先在 Makefile.PL 中测试它(使用 ExtUtils::PkgConfig
)我可以让它工作 if 兼容性库已安装。如果不是,事情仍然失败。
我可以检查 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 测试员的 'FAIL' 报告。