0

I released Net::NSCAng::Client a while ago and am getting a lot of test failures on OpenBSD. The reason for that is that the NSCAng protocol uses OpenSSL in preshared-key mode (RFC4279), something the folks at LibreSSL (default on OpenBSD now) have ripped out. However, they seem to have been hell-bent on doing this the most intransparent way: the include files have all the functions defined, just the shared library is missing the corresponding symbols, so compilation works fine but the tests fail.

There is a compatibility package on OpenBSD called eopenssl, and by testing for this first in Makefile.PL (using ExtUtils::PkgConfig) I can make it work if the compatibility library is installed. If it isn't, things still fail.

I could check for the CPP symbol OPENSSL_NO_PSK, but as the includes always come from LibreSSL, this fails even if linking with eopenssl would work fine. The only idea I have left is to try and have a test program run as part of the compilation phase as autoconf does it. Is that even possible with ExtUtils::MakeMaker (or something else -- I wouldn't mind switching the build system if necessary)?

mbethke
  • 935
  • 8
  • 19

1 Answers1

1

It's easy to write feature tests with Devel::CheckLib. Something like the following can be used to check for the presence of function your_func (in Makefile.PL):

my $your_func_exists = check_lib(
    header   => 'your_header.h',
    function => 'return your_func ? 1 : 0;',
);

If you simply want to abort compilation if the function is missing:

check_lib(
    ...
) or warn('your_func is missing'), exit;

Exiting with 0 should avoid a CPAN Tester's 'FAIL' report.

nwellnhof
  • 32,319
  • 7
  • 89
  • 113
  • Perfect! I needed to fiddle around with `$ENV{LD_LIBRARY_PATH}` a little to actually make it work with weird .so paths on OpenBSD but now it does exactly what I need. Thanks very much! – mbethke Oct 06 '15 at 13:57