|
Packit |
37d9e7 |
use strict;
|
|
Packit |
37d9e7 |
BEGIN {
|
|
Packit |
37d9e7 |
require 5.00503;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
use Config;
|
|
Packit |
37d9e7 |
use ExtUtils::MakeMaker ();
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Should we build the XS version?
|
|
Packit |
37d9e7 |
my $make_xs = undef;
|
|
Packit |
37d9e7 |
foreach ( @ARGV ) {
|
|
Packit |
37d9e7 |
/^-pm/ and $make_xs = 0;
|
|
Packit |
37d9e7 |
/^-xs/ and $make_xs = 1;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
unless ( defined $make_xs ) {
|
|
Packit |
37d9e7 |
$make_xs = can_xs();
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
if ( $^O eq 'cygwin' and $make_xs == 1 and not /^-xs/ ) {
|
|
Packit |
37d9e7 |
# Cygwin goes bonkers breaking `` if using Params::Util XS version
|
|
Packit |
37d9e7 |
# for no apparent reason.
|
|
Packit |
37d9e7 |
$make_xs = 0;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Generate the non-XS tests if we are making the XS version
|
|
Packit |
37d9e7 |
my @tests = qw{
|
|
Packit |
37d9e7 |
t/01_compile.t
|
|
Packit |
37d9e7 |
t/02_main.t
|
|
Packit |
37d9e7 |
t/03_all.t
|
|
Packit |
37d9e7 |
t/04_codelike.t
|
|
Packit |
37d9e7 |
t/05_typelike.t
|
|
Packit |
37d9e7 |
t/06_invocant.t
|
|
Packit |
37d9e7 |
t/07_handle.t
|
|
Packit |
37d9e7 |
t/08_driver.t
|
|
Packit |
37d9e7 |
t/09_insideout.t
|
|
Packit |
37d9e7 |
};
|
|
Packit |
37d9e7 |
if ( $make_xs ) {
|
|
Packit |
37d9e7 |
foreach my $file ( @tests ) {
|
|
Packit |
37d9e7 |
# Load the original
|
|
Packit |
37d9e7 |
local *FILE;
|
|
Packit |
37d9e7 |
local $/ = undef;
|
|
Packit |
37d9e7 |
open( FILE, "<$file" ) or die("Failed to open '$file'");
|
|
Packit |
37d9e7 |
my $buffer = <FILE>;
|
|
Packit |
37d9e7 |
close( FILE ) or die("Failed to close '$file'");
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Convert it to a pure perl version
|
|
Packit |
37d9e7 |
$file =~ s/0/1/;
|
|
Packit |
37d9e7 |
$buffer =~ s/0;/1;/;
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Write the pure perl version
|
|
Packit |
37d9e7 |
open( FILE, ">$file" ) or die("Failed to open '$file'");
|
|
Packit |
37d9e7 |
print FILE $buffer;
|
|
Packit |
37d9e7 |
close( FILE ) or die("Failed to close '$file'");
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
my @clean = (
|
|
Packit |
37d9e7 |
# 'test.c',
|
|
Packit |
37d9e7 |
'*.old'
|
|
Packit |
37d9e7 |
);
|
|
Packit |
37d9e7 |
if ( $make_xs ) {
|
|
Packit |
37d9e7 |
push @clean, @tests;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
WriteMakefile(
|
|
Packit |
37d9e7 |
# We created our own META.yml
|
|
Packit |
37d9e7 |
# NO_META => 1,
|
|
Packit |
37d9e7 |
NAME => 'Params::Util',
|
|
Packit |
37d9e7 |
ABSTRACT => 'Simple, compact and correct param-checking functions',
|
|
Packit |
37d9e7 |
VERSION_FROM => 'lib/Params/Util.pm',
|
|
Packit |
37d9e7 |
AUTHOR => 'Adam Kennedy <adamk@cpan.org>',
|
|
Packit |
37d9e7 |
LICENSE => 'perl',
|
|
Packit |
37d9e7 |
DEFINE => '-DPERL_EXT',
|
|
Packit |
37d9e7 |
MIN_PERL_VERSION => '5.00503',
|
|
Packit |
37d9e7 |
CONFIGURE_REQUIRES => {
|
|
Packit |
37d9e7 |
'ExtUtils::MakeMaker' => '6.52',
|
|
Packit |
37d9e7 |
'ExtUtils::CBuilder' => '0.27',
|
|
Packit |
37d9e7 |
},
|
|
Packit |
37d9e7 |
PREREQ_PM => {
|
|
Packit |
37d9e7 |
'Scalar::Util' => $make_xs ? '1.18' : '1.10',
|
|
Packit |
37d9e7 |
},
|
|
Packit |
37d9e7 |
BUILD_REQUIRES => {
|
|
Packit |
37d9e7 |
'ExtUtils::MakeMaker' => '6.52',
|
|
Packit |
37d9e7 |
'Test::More' => '0.42',
|
|
Packit |
37d9e7 |
'File::Spec' => '0.80',
|
|
Packit |
37d9e7 |
},
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Special stuff
|
|
Packit |
37d9e7 |
CONFIGURE => sub {
|
|
Packit |
37d9e7 |
my $hash = $_[1];
|
|
Packit |
37d9e7 |
unless ( $make_xs ) {
|
|
Packit |
37d9e7 |
$hash->{XS} = {};
|
|
Packit |
37d9e7 |
$hash->{C} = [];
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
return $hash;
|
|
Packit |
37d9e7 |
},
|
|
Packit |
37d9e7 |
clean => {
|
|
Packit |
37d9e7 |
FILES => join( ' ', @clean ),
|
|
Packit |
37d9e7 |
},
|
|
Packit |
37d9e7 |
);
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
#####################################################################
|
|
Packit |
37d9e7 |
# Support Functions (adapted from Module::Install)
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Modified from eumm-upgrade by Alexandr Ciornii.
|
|
Packit |
37d9e7 |
sub WriteMakefile {
|
|
Packit |
37d9e7 |
my %params=@_;
|
|
Packit |
37d9e7 |
my $eumm_version=$ExtUtils::MakeMaker::VERSION;
|
|
Packit |
37d9e7 |
$eumm_version=eval $eumm_version;
|
|
Packit |
37d9e7 |
die "EXTRA_META is deprecated" if exists $params{EXTRA_META};
|
|
Packit |
37d9e7 |
die "License not specified" unless exists $params{LICENSE};
|
|
Packit |
37d9e7 |
if ( $params{BUILD_REQUIRES} and $eumm_version < 6.5503 ) {
|
|
Packit |
37d9e7 |
#EUMM 6.5502 has problems with BUILD_REQUIRES
|
|
Packit |
37d9e7 |
$params{PREREQ_PM} = {
|
|
Packit |
37d9e7 |
%{$params{PREREQ_PM} || {}},
|
|
Packit |
37d9e7 |
%{$params{BUILD_REQUIRES}},
|
|
Packit |
37d9e7 |
};
|
|
Packit |
37d9e7 |
delete $params{BUILD_REQUIRES};
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
delete $params{CONFIGURE_REQUIRES} if $eumm_version < 6.52;
|
|
Packit |
37d9e7 |
delete $params{MIN_PERL_VERSION} if $eumm_version < 6.48;
|
|
Packit |
37d9e7 |
delete $params{META_MERGE} if $eumm_version < 6.46;
|
|
Packit |
37d9e7 |
delete $params{META_ADD} if $eumm_version < 6.46;
|
|
Packit |
37d9e7 |
delete $params{LICENSE} if $eumm_version < 6.31;
|
|
Packit |
37d9e7 |
delete $params{AUTHOR} if $] < 5.005;
|
|
Packit |
37d9e7 |
delete $params{ABSTRACT_FROM} if $] < 5.005;
|
|
Packit |
37d9e7 |
delete $params{BINARY_LOCATION} if $] < 5.005;
|
|
Packit |
37d9e7 |
ExtUtils::MakeMaker::WriteMakefile(%params);
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Secondary compile testing via ExtUtils::CBuilder
|
|
Packit |
37d9e7 |
sub can_xs {
|
|
Packit |
37d9e7 |
# Do we have the configure_requires checker?
|
|
Packit |
37d9e7 |
local $@;
|
|
Packit |
37d9e7 |
eval "require ExtUtils::CBuilder;";
|
|
Packit |
37d9e7 |
if ( $@ ) {
|
|
Packit |
37d9e7 |
# They don't obey configure_requires, so it is
|
|
Packit |
37d9e7 |
# someone old and delicate. Try to avoid hurting
|
|
Packit |
37d9e7 |
# them by falling back to an older simpler test.
|
|
Packit |
37d9e7 |
return can_cc();
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Do a simple compile that consumes the headers we need
|
|
Packit |
37d9e7 |
my @libs = ();
|
|
Packit |
37d9e7 |
my $object = undef;
|
|
Packit |
37d9e7 |
my $builder = ExtUtils::CBuilder->new( quiet => 1 );
|
|
Packit |
37d9e7 |
unless ( $builder->have_compiler ) {
|
|
Packit |
37d9e7 |
# Lack of a compiler at all
|
|
Packit |
37d9e7 |
return 0;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# Write a C file representative of what XS becomes
|
|
Packit |
37d9e7 |
require File::Temp;
|
|
Packit |
37d9e7 |
my ( $FH, $tmpfile ) = File::Temp::tempfile(
|
|
Packit |
37d9e7 |
"sanexs-XXXXX",
|
|
Packit |
37d9e7 |
SUFFIX => '.c',
|
|
Packit |
37d9e7 |
);
|
|
Packit |
37d9e7 |
binmode $FH;
|
|
Packit |
37d9e7 |
print $FH <<'END_C';
|
|
Packit |
37d9e7 |
#include "EXTERN.h"
|
|
Packit |
37d9e7 |
#include "perl.h"
|
|
Packit |
37d9e7 |
#include "XSUB.h"
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
int main(int argc, char **argv) {
|
|
Packit |
37d9e7 |
return 0;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
int boot_sanexs() {
|
|
Packit |
37d9e7 |
return 1;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
END_C
|
|
Packit |
37d9e7 |
close $FH;
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
eval {
|
|
Packit |
37d9e7 |
$object = $builder->compile(
|
|
Packit |
37d9e7 |
source => $tmpfile,
|
|
Packit |
37d9e7 |
);
|
|
Packit |
37d9e7 |
@libs = $builder->link(
|
|
Packit |
37d9e7 |
objects => $object,
|
|
Packit |
37d9e7 |
module_name => 'sanexs',
|
|
Packit |
37d9e7 |
);
|
|
Packit |
37d9e7 |
};
|
|
Packit |
37d9e7 |
my $broken = !! $@;
|
|
Packit |
37d9e7 |
foreach ( $tmpfile, $object, @libs ) {
|
|
Packit |
37d9e7 |
next unless defined $_;
|
|
Packit |
37d9e7 |
1 while unlink $_;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
if ( $broken ) {
|
|
Packit |
37d9e7 |
### NOTE: Don't do this in a production release.
|
|
Packit |
37d9e7 |
# Compiler is officially screwed, you don't deserve
|
|
Packit |
37d9e7 |
# to do any of our downstream depedencies as you'll
|
|
Packit |
37d9e7 |
# probably end up choking on them as well.
|
|
Packit |
37d9e7 |
# Trigger an NA for their own protection.
|
|
Packit |
37d9e7 |
print "Unresolvable broken external dependency.\n";
|
|
Packit |
37d9e7 |
print "This package requires a C compiler with full perl headers.\n";
|
|
Packit |
37d9e7 |
print "Trivial test code using them failed to compile.\n";
|
|
Packit |
37d9e7 |
print STDERR "NA: Unable to build distribution on this platform.\n";
|
|
Packit |
37d9e7 |
exit(0);
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
return 1;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
sub can_cc {
|
|
Packit |
37d9e7 |
my @chunks = split(/ /, $Config::Config{cc}) or return;
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
# $Config{cc} may contain args; try to find out the program part
|
|
Packit |
37d9e7 |
while ( @chunks ) {
|
|
Packit |
37d9e7 |
return can_run("@chunks") || (pop(@chunks), next);
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
return;
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
sub can_run {
|
|
Packit |
37d9e7 |
my ($cmd) = @_;
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
my $_cmd = $cmd;
|
|
Packit |
37d9e7 |
return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
|
|
Packit |
37d9e7 |
next if $dir eq '';
|
|
Packit |
37d9e7 |
my $abs = File::Spec->catfile($dir, $cmd);
|
|
Packit |
37d9e7 |
return $abs if (-x $abs or $abs = MM->maybe_command($abs));
|
|
Packit |
37d9e7 |
}
|
|
Packit |
37d9e7 |
|
|
Packit |
37d9e7 |
return;
|
|
Packit |
37d9e7 |
}
|