package ExtUtils::MakeMaker;
-$VERSION = "5.46";
+$VERSION = "5.47";
$Version_OK = "5.17"; # Makefiles older than $Version_OK will die
# (Will be checked from MakeMaker version 4.13 onwards)
($Revision = substr(q$Revision: 1.222 $, 10)) =~ s/\s+$//;
my $ans;
local $|=1;
print "$mess $dispdef";
- if ($ISA_TTY) {
+ if ($ISA_TTY && !$ENV{PERL_MM_USE_DEFAULT}) {
chomp($ans = <STDIN>);
} else {
print "$def\n";
sub eval_in_subdirs {
my($self) = @_;
my($dir);
- use Cwd 'cwd';
+ use Cwd qw(cwd abs_path);
my $pwd = cwd();
+ local @INC = map eval {abs_path($_) if -e} || $_, @INC;
foreach $dir (@{$self->{DIR}}){
my($abs) = $self->catdir($pwd,$dir);
PERL_LIB PERL_SRC PERM_RW PERM_RWX
PL_FILES PM PM_FILTER PMLIBDIRS POLLUTE PPM_INSTALL_EXEC
PPM_INSTALL_SCRIPT PREFIX
- PREREQ_PM SKIP TEST_LIBS TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
+ PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ
+ SKIP TEST_LIBS TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
XS_VERSION clean depend dist dynamic_lib linkext macro realclean
tool_autosplit
MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
my($class,$self) = @_;
my($key);
+ if ("@ARGV" =~ /\bPREREQ_PRINT\b/) {
+ require Data::Dumper;
+ print Data::Dumper->Dump([$self->{PREREQ_PM}], [qw(PREREQ_PM)]);
+ }
+
+ # PRINT_PREREQ is RedHatism.
+ if ("@ARGV" =~ /\bPRINT_PREREQ\b/) {
+ print join(" ", map { "perl($_)>=$self->{PREREQ_PM}->{$_} " } sort keys %{$self->{PREREQ_PM}}), "\n";
+ exit 0;
+ }
+
print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose;
if (-f "MANIFEST" && ! -f "Makefile"){
check_manifest();
my %configure_att; # record &{$self->{CONFIGURE}} attributes
my(%initial_att) = %$self; # record initial attributes
+ my(%unsatisfied) = ();
my($prereq);
foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
my $eval = "require $prereq";
eval $eval;
if ($@) {
- warn "Warning: prerequisite $prereq failed to load: $@";
- }
- elsif ($prereq->VERSION < $self->{PREREQ_PM}->{$prereq} ){
- warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found";
-# Why is/was this 'delete' here? We need PREREQ_PM later to make PPDs.
-# } else {
-# delete $self->{PREREQ_PM}{$prereq};
+ warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found.\n" unless $self->{PREREQ_FATAL};
+ $unsatisfied{$prereq} = 'not installed';
+ } elsif ($prereq->VERSION < $self->{PREREQ_PM}->{$prereq} ){
+ warn "Warning: prerequisite $prereq $self->{PREREQ_PM}->{$prereq} not found. We have"
+ . ($prereq->VERSION || 'unknown version') unless $self->{PREREQ_FATAL};
+ $unsatisfied{$prereq} = $self->{PREREQ_PM}->{$prereq} ? $self->{PREREQ_PM}->{$prereq} : 'unknown version' ;
}
}
-# if (@unsatisfied){
+ if (%unsatisfied && $self->{PREREQ_FATAL}){
# unless (defined $ExtUtils::MakeMaker::useCPAN) {
-# print qq{MakeMaker WARNING: prerequisites not found (@unsatisfied)
-# Please install these modules first and rerun 'perl Makefile.PL'.\n};
+ my $failedprereqs = join ', ', map {"$_ $unsatisfied{$_}"} keys %unsatisfied;
+ die qq{MakeMaker FATAL: prerequisites not found ($failedprereqs)
+ Please install these modules first and rerun 'perl Makefile.PL'.\n};
# if ($ExtUtils::MakeMaker::hasCPAN) {
# $ExtUtils::MakeMaker::useCPAN = prompt(qq{Should I try to use the CPAN module to fetch them for you?},"yes");
# } else {
# require CPAN;
# CPAN->import(@unsatisfied);
# } else {
-# die qq{prerequisites not found (@unsatisfied)};
+# die qq{prerequisites not found (@unsatisfied)};
# }
# warn qq{WARNING: prerequisites not found (@unsatisfied)};
-# }
+ }
if (defined $self->{CONFIGURE}) {
if (ref $self->{CONFIGURE} eq 'CODE') {
}
if ($self->{PARENT}) {
$self->{PARENT}->{CHILDREN}->{$newclass} = $self;
- foreach my $opt (qw(CAPI POLLUTE PERL_CORE)) {
+ foreach my $opt (qw(POLLUTE PERL_CORE)) {
if (exists $self->{PARENT}->{$opt}
and not exists $self->{$opt})
{
}
}
}
+ my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
+ parse_args($self,@fm) if @fm;
} else {
parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
}
}
sub WriteEmptyMakefile {
- if (-f 'Makefile.old') {
- chmod 0666, 'Makefile.old';
- unlink 'Makefile.old' or warn "unlink Makefile.old: $!";
- }
- rename 'Makefile', 'Makefile.old' or warn "rename Makefile Makefile.old: $!"
- if -f 'Makefile';
- open MF, '> Makefile' or die "open Makefile for write: $!";
- print MF <<'EOP';
+ Carp::croak "WriteEmptyMakefile: Need even number of args" if @_ % 2;
+ local $SIG{__WARN__} = \&warnhandler;
+
+ my %att = @_;
+ my $self = MM->new(\%att);
+ if (-f "$self->{MAKEFILE}.old") {
+ chmod 0666, "$self->{MAKEFILE}.old";
+ unlink "$self->{MAKEFILE}.old" or warn "unlink $self->{MAKEFILE}.old: $!";
+ }
+ rename $self->{MAKEFILE}, "$self->{MAKEFILE}.old"
+ or warn "rename $self->{MAKEFILE} $self->{MAKEFILE}.old: $!"
+ if -f $self->{MAKEFILE};
+ open MF, '>', $self->{MAKEFILE} or die "open $self->{MAKEFILE} for write: $!";
+ print MF <<'EOP';
all:
clean:
test:
EOP
- close MF or die "close Makefile for write: $!";
+ close MF or die "close $self->{MAKEFILE} for write: $!";
}
sub check_manifest {
and the values portion of the XS attribute hash. This is not
currently used by MakeMaker but may be handy in Makefile.PLs.
-=item CAPI
-
-[This attribute is obsolete in Perl 5.6. PERL_OBJECT builds are C-compatible
-by default.]
-
-Switch to force usage of the Perl C API even when compiling for PERL_OBJECT.
-
-Note that this attribute is passed through to any recursive build,
-but if and only if the submodule's Makefile.PL itself makes no mention
-of the 'CAPI' attribute.
-
=item CCFLAGS
String that will be included in the compiler call command line between
desired version is the value. If the required version number is 0, we
only check if any version is installed already.
+=item PREREQ_FATAL
+
+Bool. If this parameter is true, failing to have the required modules
+(or the right versions thereof) will be fatal. perl Makefile.PL will die
+with the proper message.
+
+Note: see L<Test::Harness> for a shortcut for stopping tests early if
+you are missing dependencies.
+
+Do I<not> use this parameter for simple requirements, which could be resolved
+at a later time, e.g. after an unsuccessful B<make test> of your module.
+
+It is I<extremely> rare to have to use C<PREREQ_FATAL> at all!
+
+=item PREREQ_PRINT
+
+Bool. If this parameter is true, the prerequisites will be printed to
+stdout and MakeMaker will exit. The output format is
+
+$PREREQ_PM = {
+ 'A::B' => Vers1,
+ 'C::D' => Vers2,
+ ...
+ };
+
+=item PRINT_PREREQ
+
+RedHatism for C<PREREQ_PRINT>. The output format is different, though:
+
+ perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...
+
=item SKIP
Arrayref. E.g. [qw(name1 name2)] skip (do not write) sections of the
C<WriteMakefile()>. The string is split on whitespace, and the result
is processed before any actual command line arguments are processed.
+=item PERL_MM_USE_DEFAULT
+
+If set to a true value then MakeMaker's prompt function will
+always return the default without waiting for user input.
+
=back
=head1 SEE ALSO
support by Charles Bailey <F<bailey@newman.upenn.edu>>. OS/2 support
by Ilya Zakharevich <F<ilya@math.ohio-state.edu>>.
+Contact the MakeMaker mailing list <F<makemaker@perl.org>> if you have
+any questions.
+
Send patches and bug reports to <F<perlbug@perl.org>>.
=cut