#
# Generate Makefile
#
use 5.008009;
use strict;
use warnings;
use Config;
use ExtUtils::MakeMaker;
use constant MSWin32 => $^O eq 'MSWin32';
my $distro = 'Net::DNS::Resolver::Unbound';
my $module = join '/', 'lib', split /::/, "$distro.pm";
my $author = ['Dick Franks'];
$author = join ', ', @$author if $ExtUtils::MakeMaker::VERSION < 6.58;
# See perldoc ExtUtils::MakeMaker for details of how to influence
# the contents of the Makefile that is written.
my %metadata = (
NAME => $distro,
VERSION_FROM => $module,
ABSTRACT_FROM => $module,
AUTHOR => $author,
LICENSE => 'mit',
MIN_PERL_VERSION => 5.008009,
CONFIGURE_REQUIRES => {'ExtUtils::MakeMaker' => 6.48},
TEST_REQUIRES => {
'ExtUtils::MakeMaker' => 0,
'File::Find' => 1.13,
'File::Spec' => 3.29,
'IO::File' => 1.14,
'Test::More' => 0.80,
} );
my %prerequisite = (
'Carp' => 1.10,
'DynaLoader' => 1.09,
'Net::DNS' => 1.19,
);
my @debris = qw(*.gcov *.gcda *.gcno *.lock);
my $inc = '';
my $lib = '-lunbound';
my $nul = MSWin32 ? 'nul' : '/dev/null';
if (`pkg-config --modversion libunbound 2>$nul`) {
$inc = `pkg-config --cflags libunbound 2>$nul`;
$lib = `pkg-config --libs libunbound 2>$nul`;
} elsif (MSWin32) {
$lib = '-llibunbound' if $Config{cc} =~ /cl/;
$lib = '-lunbound' if $Config{cc} =~ /gcc/;
}
if ( my $dir = $ENV{UNBOUND_PREFIX} ) {
chomp $dir;
$inc = "-I$dir/include";
$lib = "-L$dir/lib $lib";
}
$inc = $ENV{UNBOUND_INCLUDE} if $ENV{UNBOUND_INCLUDE};
$lib = $ENV{UNBOUND_LIB} if $ENV{UNBOUND_LIB};
chomp $_ foreach ( $inc, $lib );
my @header = qw(unbound.h); # library headers
if ( my $cpp = $Config{cppstdin} ) {
my @flag = grep /^-I/, split /\s+(?=\-)/, $Config{cppflags};
my $last = $Config{cppminus};
my $echo = $Config{echo} || 'echo';
foreach my $header (@header) {
my $scriptlet = qq[$echo "#include <$header>" | $cpp @flag $inc -o - $last];
$scriptlet = qq[$echo | $cpp @flag $inc -include $header $last] if MSWin32;
next unless scalar( my @text = `$scriptlet 2>$nul` );
die "$header file not found" unless grep /$header/i, @text;
}
}
WriteMakefile(
%metadata,
PREREQ_PM => {%prerequisite},
INC => $inc,
LIBS => [$lib],
clean => {FILES => "@debris"},
);
exit;
package MY; ## customise generated Makefile
sub test {
return shift->SUPER::test() if $^O =~ /cygwin|MSWin/i;
return join '', shift->SUPER::test(), <<'END';
# suppress parallel test execution
FULLPERLRUN = HARNESS_OPTIONS=j1:c $(FULLPERL)
END
}
sub install {
my $self = shift;
my %install_type = qw(perl INSTALLARCHLIB site INSTALLSITEARCH vendor INSTALLVENDORARCH);
my $install_site = join '', '$(DESTDIR)$(', $install_type{$self->{INSTALLDIRS}}, ')';
for ($install_site) {
s/\$\(([A-Z_]+)\)/$self->{$1}/eg while /\$\(/; # expand Makefile macros
s|([/])[/]+|$1|g; # remove gratuitous //s
}
eval "require $distro"; ## no critic
my @version = grep {$_} 'version', eval { $distro->VERSION };
my $nameregex = join '\W+', '', split /::/, "$distro.pm\$";
my @installed = grep { $_ && m/$nameregex/io } values %INC;
my %occluded;
foreach (@installed) {
my $path = m/^(.+)$nameregex/io ? $1 : '';
my %seen;
foreach (@INC) {
$seen{$_}++; # find $path in @INC
last if $_ eq $path;
}
foreach ( grep { !$seen{$_} } @INC ) {
$occluded{$_}++; # suppress install
}
}
return $self->SUPER::install(@_) unless $occluded{$install_site};
my $message;
warn $message = <<"AMEN";
##
## The install location for this version of $distro
## differs from the existing @version in your perl library at
## @installed
##
## The installation would be rendered ineffective because the
## existing @version occurs in the library search path before
## $install_site
##
## The generated Makefile supports build and test only.
##
AMEN
my $echo = ' $(NOECHO) $(ECHO) "##"';
$message =~ s/##/$echo/eg;
return join '', <<"END";
install :
$message
\$(NOECHO) \$(FALSE)
END
}
sub postamble {
my $devnull = $^O eq 'MSWin32' ? 'nul' : '/dev/null';
return <<"PlanB" unless `gcov -v 2>$devnull`;
test_cover :
cover -delete
HARNESS_PERL_SWITCHES=-MDevel::Cover \$(MAKE) test
cover -summary
PlanB
my $ldflags = "-fprofile-arcs -ftest-coverage";
my $ccflags = "-O0 $ldflags";
return <<"PlanA";
test_cover :
cover -delete
HARNESS_PERL_SWITCHES=-MDevel::Cover \$(MAKE) -W Unbound.xs test CCFLAGS="$ccflags" OTHERLDFLAGS="$ldflags"
gcov Unbound.xs
gcov2perl Unbound.xs.gcov
cover -summary
\$(NOECHO) \$(TOUCH) Unbound.c # force XS rebuild before install
PlanA
}
__END__