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