use inc::Module::Install; use Devel::CheckLib; use Getopt::Long; use File::Spec::Functions; BEGIN { if ( $Module::Install::AUTHOR ) { use Module::Install::XSUtil; } } my $headdir; my $libdir; my $prefix; my $randomize; GetOptions( 'headers=s' => \$headdir, 'libs=s' => \$libdir, 'prefix=s' => \$prefix, 'randomize!' => \$randomize, ); if ( $prefix ) { $headdir = catdir( $prefix, 'include' ); $libdir = catdir( $prefix, 'lib' ); } cc_include_paths( $headdir ) if $headdir; cc_libs( '-L' . $libdir ) if $libdir; cc_include_paths( 'include' ); name 'Net-LDNS'; version_from 'lib/Net/LDNS.pm'; license 'bsd'; author 'Calle Dybedahl '; abstract 'Perl wrapper for the ldns DNS library.'; perl_version '5.010001'; configure_requires 'Devel::CheckLib'; requires 'MIME::Base64'; test_requires 'JSON::PP'; test_requires 'Test::Fatal'; use_ppport 3.19; cc_libs 'crypto'; cc_src_paths 'src'; my %assert_args = ( lib => 'crypto', header => 'openssl/crypto.h', function => 'if(SSLeay()) return 0; else return 1;' ); $assert_args{LIBS} = '-L' . $libdir if $libdir; $assert_args{INC} = '-I' . $headdir if $headdir; cc_assert_lib %assert_args; if (not check_ecdsa(%assert_args)) { print "Your OpenSSL does not seem to support ECDSA.\n"; exit; } else { print "ECDSA support detected.\n"; } if (not check_gost(%assert_args)) { print "Your OpenSSL does not seem to support GOST.\n"; } else { print "GOST support detected.\n"; cc_define '-DUSE_GOST'; } if ( check_lib( lib => 'ldns', header => 'ldns/ldns.h', function => 'if (!ldns_resolver_clone(ldns_resolver_new())) return 1; else return 0;' ) ) { print "Using system ldns library.\n"; cc_libs 'ldns'; } else { print "Using embedded ldns library.\n"; cc_include_paths 'ldns/include'; cc_src_paths 'ldns/src'; } if ( check_lib( lib => 'idn', header => 'idna.h', function => 'if(strcmp(IDNA_ACE_PREFIX,"xn--")==0) return 0; else return 1;' ) ) { cc_libs 'idn'; cc_define '-DWE_CAN_HAZ_IDN'; print "IDNA support detected.\n"; } if ( $randomize ) { cc_define '-DRANDOMIZE'; print( ( "=" x 65 ) . "\n" ); print "Compiling with randomzied capitalization.\n"; print( ( "=" x 65 ) . "\n" ); } WriteAll; sub check_ecdsa { my %args = @_; $args{header} = [ 'openssl/crypto.h', 'openssl/ecdsa.h' ]; $args{function} = q[if(ECDSA_SIG_new()) return 0; else return 1;]; return check_lib(%args); } sub check_gost { my %args = @_; $args{header} = [ 'openssl/crypto.h', 'openssl/ecdsa.h', 'openssl/engine.h' ]; $args{function} = <<'CODE'; const EVP_PKEY_ASN1_METHOD* meth; ENGINE* e; meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1); if(meth) { return 0; } e = ENGINE_by_id("gost"); if(!e) { ENGINE_load_builtin_engines(); ENGINE_load_dynamic(); e = ENGINE_by_id("gost"); } if(!e) { return 1; } if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { return 1; } meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1); if(!meth) { return 1; } return 0; CODE return check_lib(%args); }