【问题标题】:Testing for LibreSSL in a Perl build script在 Perl 构建脚本中测试 LibreSSL
【发布时间】:2015-10-04 17:49:47
【问题描述】:

我不久前发布了Net::NSCAng::Client,并且在 OpenBSD 上遇到了很多测试失败。原因是 NSCAng 协议在预共享密钥模式 (RFC4279) 中使用 OpenSSL,LibreSSL(现在 OpenBSD 上的默认设置)的人们已经淘汰了这一点。然而,他们似乎一心想以最不透明的方式做到这一点:包含文件定义了所有函数,只是共享库缺少相应的符号,所以编译工作正常但测试失败。

OpenBSD 上有一个名为 eopenssl 的兼容性包,通过首先在 Makefile.PL 中进行测试(使用ExtUtils::PkgConfig),我可以使其工作如果兼容性库已安装。如果不是,事情仍然会失败。

我可以检查 CPP 符号 OPENSSL_NO_PSK,但由于包含始终来自 LibreSSL,因此即使与 eopenssl 链接可以正常工作,也会失败。我剩下的唯一想法是尝试让测试程序像 autoconf 那样作为编译阶段的一部分运行。 ExtUtils::MakeMaker(或其他东西——我不介意在必要时切换构建系统)甚至可以做到这一点吗?

【问题讨论】:

    标签: perl xs libressl


    【解决方案1】:

    使用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 测试人员的“失败”报告。

    【讨论】:

    • 完美!我需要稍微摆弄一下$ENV{LD_LIBRARY_PATH} 才能真正让它在OpenBSD 上与奇怪的.so 路径一起工作,但现在它完全符合我的需要。非常感谢!
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多