1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
## no critic (NamingConventions::Capitalization)
package inc::MyModuleBuild;
use strict;
use warnings;
use namespace::autoclean;
use Moose;
extends 'Dist::Zilla::Plugin::ModuleBuild';
my $template = <<'EOT';
use strict;
use warnings;
use lib 'inc';
use Config::AutoConf;
use Getopt::Long qw( :config pass_through );
use Module::Build;
my $mb = Module::Build->new(
_mb_args(),
c_source => 'c',
);
$mb->extra_compiler_flags(
@{ $mb->extra_compiler_flags },
qw(-std=c99 -fms-extensions -Wall -g)
);
$mb->extra_linker_flags( @{ $mb->extra_linker_flags }, '-lmaxminddb' );
_check_c_prereqs($mb);
$mb->create_build_script;
sub _mb_args {
my @libs;
my @includes;
GetOptions(
'lib:s@' => \@libs,
'include:s@' => \@includes,
);
my %extra = (
extra_linker_flags => [ map { '-L' . $_ } @libs ],
include_dirs => \@includes,
);
my {{ $module_build_args }}
return (
%module_build_args,
%extra,
);
}
sub _check_c_prereqs {
my $mb = shift;
my @include_dirs = map { my $dir = $_; $dir =~ s/^-I//; $dir }
grep { /^-I/ } @{ $mb->extra_compiler_flags || [] };
push @include_dirs, @{ $mb->include_dirs };
my @lib_dirs = grep { /^-L/ } @{ $mb->extra_linker_flags || [] };
my $ac = Config::AutoConf->new(
extra_include_dirs => \@include_dirs,
extra_link_flags => \@lib_dirs,
);
unless ( $ac->check_lib( 'maxminddb', 'MMDB_lookup_string' ) ) {
warn <<'EOF';
It looks like you either don't have libmaxminddb installed or you have an
older version installed that doesn't define the MMDB_lookup_string
symbol. Please upgrade your libmaxminddb installation.
EOF
exit 1;
}
unless ( $ac->check_header('maxminddb_config.h') ) {
warn <<'EOF';
It looks like the version of libmaxminddb you installed did not provide a
maxminddb_config.h header. Please upgrade your libmaxminddb installation.
EOF
exit 1;
}
unless (
$ac->check_member(
'MMDB_search_node_s.right_record_type',
{ prologue => '#include <maxminddb.h>' }
)
) {
warn <<'EOF';
Your version of libmaxminddb does not support record entries in the
MMDB_search_node_s struct. Please upgrade to libmaxminddb 1.2.0 or newer.
EOF
exit 1;
}
unless ( $ac->check_type('unsigned __int128')
|| $ac->check_type('unsigned int __attribute__ ((__mode__ (TI)))') ) {
warn <<'EOF';
It looks like your compiler doesn't support the "unsigned __int128" or
"unsigned int __attribute__ ((__mode__ (TI)))" types. One of these types is
necessary to compile the MaxMind::DB::Reader::XS module.
EOF
exit 1;
}
if (
$ac->compute_int(
'MMDB_UINT128_IS_BYTE_ARRAY', q{},
'#include <maxminddb_config.h>'
)
) {
warn <<'EOF';
It looks like your installed libmaxminddb was compiled with a compiler that
doesn't support the "unsigned __int128" type. Please recompile it with your
current compiler, which does appear to support this type.
EOF
}
}
EOT
sub gather_files {
my ($self) = @_;
require Dist::Zilla::File::InMemory;
my $file = Dist::Zilla::File::InMemory->new(
{
name => 'Build.PL',
content => $template, # template evaluated later
}
);
$self->add_file($file);
return;
}
__PACKAGE__->meta()->make_immutable();
1;
|