around _build_MakeFile_PL_template => sub {
my $orig = shift;
my $self = shift;
- my $template = $self->$orig(@_);
-
- $template =~ s/(use ExtUtils::MakeMaker.*)/$1\n\ncheck_conflicts();/;
- $template .= <<'CHECK_CONFLICTS';
-sub check_conflicts {
- my %conflicts = (
- 'Class::MOP' => '1.08',
- 'MooseX::Role::WithOverloading' => '0.08',
- );
- my $found = 0;
- for my $mod ( sort keys %conflicts ) {
- eval "require $mod";
- next if $@;
+ # copied from M::I
+ my $can_cc = <<'CAN_CC';
+use Config ();
+use File::Spec ();
- my $installed = $mod->VERSION();
- if ( $installed le $conflicts{$mod} ) {
+# check if we can run some command
+sub can_run {
+ my ($cmd) = @_;
- print <<"EOF";
+ my $_cmd = $cmd;
+ return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
-***
- This version of Package::Stash conflicts with the version of
- $mod ($installed) you have installed.
+ for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
+ next if $dir eq '';
+ my $abs = File::Spec->catfile($dir, $_[0]);
+ return $abs if (-x $abs or $abs = MM->maybe_command($abs));
+ }
- You will need to upgrade $mod after installing
- this version of Package::Stash.
-***
+ return;
+}
-EOF
+# can we locate a (the) C compiler
+sub can_cc {
+ my @chunks = split(/ /, $Config::Config{cc}) or return;
- $found = 1;
+ # $Config{cc} may contain args; try to find out the program part
+ while (@chunks) {
+ return can_run("@chunks") || (pop(@chunks), next);
}
- }
- return unless $found;
+ return;
+}
+CAN_CC
+
+ my $template = $self->$orig(@_);
- # More or less copied from Module::Build
- return if $ENV{PERL_MM_USE_DEFAULT};
- return unless -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT));
+ my $xs_version = $self->zilla->prereqs->requirements_for('runtime', 'recommends')->as_string_hash->{'Package::Stash::XS'};
- sleep 4;
-}
-CHECK_CONFLICTS
+ $template =~ s/(WriteMakefile\()/\$WriteMakefileArgs{PREREQ_PM}{'Package::Stash::XS'} = $xs_version\n if can_cc();\n\n$1/;
- return $template;
+ return $template . $can_cc;
};
__PACKAGE__->meta->make_immutable;