X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FMakeMaker.pm;h=c8c559c07959eaad3c5cdfe199c8b031b769f45c;hb=0b27bdda4132eec7d3a41691839fba5d1251c38a;hp=63e742bd12247d6ddfd70d05c61e9f2bc728854a;hpb=3b03c0f31a691e1640848ef99a68578751c45958;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/MakeMaker.pm b/lib/ExtUtils/MakeMaker.pm index 63e742b..c8c559c 100644 --- a/lib/ExtUtils/MakeMaker.pm +++ b/lib/ExtUtils/MakeMaker.pm @@ -1,25 +1,11 @@ -require 5.002; # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m - -package main; -use vars qw(%att); - -package ExtUtils::MakeMaker::TieAtt; -# this package will go away again, when we don't have modules around -# anymore that import %att It ties an empty %att and records in which -# object this %att was tied. FETCH and STORE return/store-to the -# appropriate value from %$self - -# the warndirectuse method warns if somebody calls MM->something. It -# has nothing to do with the tie'd %att. - -$Enough_limit = 5; +BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m package ExtUtils::MakeMaker; -$Version = $VERSION = "5.26"; -$Version_OK = "5.05"; # Makefiles older than $Version_OK will die +$VERSION = "5.45"; +$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.187 $, 10)) =~ s/\s+$//; +($Revision = substr(q$Revision: 1.222 $, 10)) =~ s/\s+$//; @@ -29,17 +15,19 @@ use Carp (); #use FileHandle (); use vars qw( - $VERSION $Version_OK $Revision - $Verbose %MM_Sections $ISA_TTY - @MM_Sections %Recognized_Att_Keys @Get_from_Config - %Prepend_dot_dot %Config @Parent %NORMAL_INC - $Setup_done %Keep_after_flush - @Overridable + + @ISA @EXPORT @EXPORT_OK $AUTOLOAD + $ISA_TTY $Is_Mac $Is_OS2 $Is_VMS $Revision + $VERSION $Verbose $Version_OK %Config %Keep_after_flush + %MM_Sections %Prepend_dot_dot %Recognized_Att_Keys + @Get_from_Config @MM_Sections @Overridable @Parent + ); -#use strict qw(refs); +# use strict; -eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail - # with miniperl. +# &DynaLoader::mod2fname should be available to miniperl, thus +# should be a pseudo-builtin (cmp. os2.c). +#eval {require DynaLoader;}; # # Set up the inheritance before we pull in the MM_* packages, because they @@ -47,9 +35,7 @@ eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail # @ISA = qw(Exporter); @EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt); -@EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists - $Version %att); ## Import of %att is deprecated, please use OO features! - # $Version in mixed case will go away! +@EXPORT_OK = qw($VERSION &Version_check &neatvalue &mkbootstrap &mksymlists); # # Dummy package MM inherits actual methods from OS-specific @@ -66,7 +52,8 @@ eval {require DynaLoader;}; # Get mod2fname, if defined. Will fail # { package MY; - @ISA = qw(MM); + @MY::ISA = qw(MM); +### sub AUTOLOAD { use Devel::Symdump; print Devel::Symdump->rnew->as_string; Carp::confess "hey why? $AUTOLOAD" } package MM; sub DESTROY {} } @@ -77,59 +64,38 @@ package ExtUtils::Liblist; package ExtUtils::MakeMaker; # -# Now we can can pull in the friends +# Now we can pull in the friends # -$Is_VMS = $^O eq 'VMS'; -$Is_OS2 = $^O eq 'os2'; +$Is_VMS = $^O eq 'VMS'; +$Is_OS2 = $^O eq 'os2'; +$Is_Mac = $^O eq 'MacOS'; +$Is_Win32 = $^O eq 'MSWin32'; +$Is_Cygwin= $^O eq 'cygwin'; require ExtUtils::MM_Unix; if ($Is_VMS) { require ExtUtils::MM_VMS; + require VMS::Filespec; # is a noop as long as we require it within MM_VMS } if ($Is_OS2) { require ExtUtils::MM_OS2; } - -%NORMAL_INC = %INC; -@NORMAL_INC{qw|File/Find.pm Cwd.pm ExtUtils/Manifest.pm ExtUtils/Liblist.pm|} = (1) x 4; - - -# This has to go one day... -$SIG{__WARN__} = sub { - $_[0] =~ /^Use of uninitialized value/ && return; - $_[0] =~ /used only once/ && return; - $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return; - warn @_; -}; - -# The SelfLoader would bring a lot of overhead for MakeMaker, because -# we know for sure we will use most of the autoloaded functions once -# we have to use one of them. So we write our own loader - -sub AUTOLOAD { - my $code; - if (defined fileno(DATA)) { - while () { - last if /^__END__/; - $code .= $_; - } - close DATA; - eval $code; - if ($@) { - $@ =~ s/ at .*\n//; - Carp::croak $@; - } - } else { - warn "AUTOLOAD called unexpectedly for $AUTOLOAD"; - } - defined(&$AUTOLOAD) or die "Myloader inconsistency error"; - goto &$AUTOLOAD; +if ($Is_Mac) { + require ExtUtils::MM_MacOS; } +if ($Is_Win32) { + require ExtUtils::MM_Win32; +} +if ($Is_Cygwin) { + require ExtUtils::MM_Cygwin; +} + +full_setup(); -# The only subroutine we do not SelfLoad is Version_Check because it's -# called so often. Loading this minimum still requires 1.2 secs on my -# Indy :-( +# The use of the Version_check target has been dropped between perl +# 5.5.63 and 5.5.64. We must keep the subroutine for a while so that +# old Makefiles can satisfy the Version_check target. sub Version_check { my($checkversion) = @_; @@ -143,58 +109,36 @@ Please rerun 'perl Makefile.PL' to regenerate the Makefile.\n" unless $checkversion == $VERSION; } -sub ExtUtils::MakeMaker::eval_in_subdirs ; -sub ExtUtils::MakeMaker::eval_in_x ; -sub ExtUtils::MakeMaker::full_setup ; -sub ExtUtils::MakeMaker::writeMakefile ; -sub ExtUtils::MakeMaker::new ; -sub ExtUtils::MakeMaker::check_manifest ; -sub ExtUtils::MakeMaker::parse_args ; -sub ExtUtils::MakeMaker::check_hints ; -sub ExtUtils::MakeMaker::mv_all_methods ; -sub ExtUtils::MakeMaker::skipcheck ; -sub ExtUtils::MakeMaker::flush ; -sub ExtUtils::MakeMaker::mkbootstrap ; -sub ExtUtils::MakeMaker::mksymlists ; -sub ExtUtils::MakeMaker::neatvalue ; -sub ExtUtils::MakeMaker::selfdocument ; -sub ExtUtils::MakeMaker::WriteMakefile ; -sub ExtUtils::MakeMaker::prompt ; -sub ExtUtils::MakeMaker::TieAtt::TIEHASH ; -sub ExtUtils::MakeMaker::TieAtt::FETCH ; -sub ExtUtils::MakeMaker::TieAtt::STORE ; -sub ExtUtils::MakeMaker::TieAtt::FIRSTKEY ; -sub ExtUtils::MakeMaker::TieAtt::NEXTKEY ; -sub ExtUtils::MakeMaker::TieAtt::DESTROY ; -sub ExtUtils::MakeMaker::TieAtt::warndirectuse ; - -__DATA__ -package ExtUtils::MakeMaker; +sub warnhandler { + $_[0] =~ /^Use of uninitialized value/ && return; + $_[0] =~ /used only once/ && return; + $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return; + warn @_; +} sub WriteMakefile { Carp::croak "WriteMakefile: Need even number of args" if @_ % 2; - unless ($Setup_done++){ - full_setup(); - undef &ExtUtils::MakeMaker::full_setup; #safe memory - } + local $SIG{__WARN__} = \&warnhandler; + my %att = @_; MM->new(\%att)->flush; } -sub prompt { +sub prompt ($;$) { my($mess,$def)=@_; - $ISA_TTY = -t STDIN && -t STDOUT ; + $ISA_TTY = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; # Pipe? Carp::confess("prompt function called without an argument") unless defined $mess; - $def = "" unless defined $def; - my $dispdef = "[$def] "; + my $dispdef = defined $def ? "[$def] " : " "; + $def = defined $def ? $def : ""; my $ans; + local $|=1; + print "$mess $dispdef"; if ($ISA_TTY) { - local $|=1; - print "$mess $dispdef"; - chop($ans = ); + chomp($ans = ); + } else { + print "$def\n"; } - return $ans if defined $ans; - return $def; + return ($ans ne '') ? $ans : $def; } sub eval_in_subdirs { @@ -224,62 +168,89 @@ sub eval_in_x { # $fh->close; close FH; eval $eval; - warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@; + if ($@) { +# if ($@ =~ /prerequisites/) { +# die "MakeMaker WARNING: $@"; +# } else { +# warn "WARNING from evaluation of $dir/Makefile.PL: $@"; +# } + warn "WARNING from evaluation of $dir/Makefile.PL: $@"; + } } sub full_setup { $Verbose ||= 0; - $^W=1; -# package name for the classes into which the first object will be blessed + # package name for the classes into which the first object will be blessed $PACKNAME = "PACK000"; @Attrib_help = qw/ - C CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS EXE_FILES - NO_VC FIRST_MAKEFILE FULLPERL H INC INSTALLARCHLIB INSTALLBIN - INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB - INSTALLSITEARCH INSTALLSITELIB INST_ARCHLIB INST_EXE INST_LIB - INST_MAN1DIR INST_MAN3DIR LDFROM LIBPERL_A LIBS LINKTYPE MAKEAPERL - MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB NAME NEEDS_LINKING - NOECHO NORECURS OBJECT OPTIMIZE PERL PERLMAINCC PERL_ARCHLIB - PERL_LIB PERL_SRC PL_FILES PM PMLIBDIRS PREFIX PREREQ SKIP - TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean - depend dist dynamic_lib linkext macro realclean tool_autosplit + AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION + C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS + EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE FULLPERL FUNCLIST H + HTMLLIBPODS HTMLSCRIPTPODS IMPORTS + INC INCLUDE_EXT INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLHTMLPRIVLIBDIR + INSTALLHTMLSCRIPTDIR INSTALLHTMLSITELIBDIR INSTALLMAN1DIR + INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH + INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB + INST_HTMLLIBDIR INST_HTMLSCRIPTDIR + INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIB LIBPERL_A LIBS + LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB + PERL_MALLOC_OK + NAME NEEDS_LINKING NOECHO NORECURS NO_VC OBJECT OPTIMIZE PERL PERLMAINCC + PERL_ARCHLIB PERL_LIB PERL_SRC PERM_RW PERM_RWX + PL_FILES PM PMLIBDIRS POLLUTE PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX + PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG + XS_VERSION clean depend dist dynamic_lib linkext macro realclean + tool_autosplit + /; - installpm + # IMPORTS is used under OS/2 and Win32 - /; + # @Overridable is close to @MM_Sections but not identical. The + # order is important. Many subroutines declare macros. These + # depend on each other. Let's try to collect the macros up front, + # then pasthru, then the rules. + # MM_Sections are the sections we have to call explicitly + # in Overridable we have subroutines that are used indirectly - # @Overridable is close to MM_Sections @MM_Sections = qw( - post_initialize const_config constants tool_autosplit - tool_xsubpp tools_other dist macro depend post_constants - pasthru c_o xs_c xs_o top_targets linkext dlsyms dynamic - dynamic_bs dynamic_lib static static_lib manifypods processPL - installbin subdirs clean realclean dist_basics dist_core - dist_dir dist_test dist_ci install force perldepend makefile - staticmake test postamble + post_initialize const_config constants tool_autosplit tool_xsubpp + tools_other dist macro depend cflags const_loadlibs const_cccmd + post_constants + + pasthru + + c_o xs_c xs_o top_targets linkext dlsyms dynamic dynamic_bs + dynamic_lib static static_lib htmlifypods manifypods processPL + installbin subdirs + clean realclean dist_basics dist_core dist_dir dist_test dist_ci + install force perldepend makefile staticmake test ppd ); # loses section ordering @Overridable = @MM_Sections; - push @Overridable, qw[ dir_target - libscan makeaperl - needs_linking subdir_x test_via_harness - test_via_script ]; - push @MM_Sections, qw[ - pm_to_blib selfdocument cflags const_loadlibs - const_cccmd + push @Overridable, qw[ + + dir_target libscan makeaperl needs_linking perm_rw perm_rwx + subdir_x test_via_harness test_via_script + ]; + push @MM_Sections, qw[ - #### Can we drop this? - #### @MM_Sections{@MM_Sections} = {} x @MM_Sections; + pm_to_blib selfdocument + + ]; + + # Postamble needs to be the last that was always the case + push @MM_Sections, "postamble"; + push @Overridable, "postamble"; # All sections are valid keys. @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections; @@ -288,7 +259,8 @@ sub full_setup { @Get_from_Config = qw( ar cc cccdlflags ccdlflags dlext dlsrc ld lddlflags ldflags libc - lib_ext obj_ext ranlib sitelibexp sitearchexp so + lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so + exe_ext full_ar ); my $item; @@ -308,8 +280,11 @@ sub full_setup { # %Prepend_dot_dot = qw( - INST_LIB 1 INST_ARCHLIB 1 INST_EXE 1 MAP_TARGET 1 INST_MAN1DIR 1 INST_MAN3DIR 1 - PERL_SRC 1 PERL 1 FULLPERL 1 + + INST_BIN 1 INST_EXE 1 INST_LIB 1 INST_ARCHLIB 1 INST_SCRIPT 1 + MAP_TARGET 1 INST_HTMLLIBDIR 1 INST_HTMLSCRIPTDIR 1 + INST_MAN1DIR 1 INST_MAN3DIR 1 PERL_SRC 1 PERL 1 FULLPERL 1 + ); my @keep = qw/ @@ -353,6 +328,41 @@ sub ExtUtils::MakeMaker::new { my(%initial_att) = %$self; # record initial attributes + 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}; + } + } +# if (@unsatisfied){ +# unless (defined $ExtUtils::MakeMaker::useCPAN) { +# print qq{MakeMaker WARNING: prerequisites not found (@unsatisfied) +# 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 { +# print qq{Hint: You may want to install the CPAN module to autofetch the needed modules\n}; +# $ExtUtils::MakeMaker::useCPAN=0; +# } +# } +# if ($ExtUtils::MakeMaker::useCPAN) { +# require CPAN; +# CPAN->import(@unsatisfied); +# } else { +# die qq{prerequisites not found (@unsatisfied)}; +# } +# warn qq{WARNING: prerequisites not found (@unsatisfied)}; +# } + if (defined $self->{CONFIGURE}) { if (ref $self->{CONFIGURE} eq 'CODE') { $self = { %$self, %{&{$self->{CONFIGURE}}}}; @@ -363,20 +373,18 @@ sub ExtUtils::MakeMaker::new { # This is for old Makefiles written pre 5.00, will go away if ( Carp::longmess("") =~ /runsubdirpl/s ){ - #$self->{Correct_relativ_directories}++; Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n"); - } else { - $self->{Correct_relativ_directories}=0; } - my $class = ++$PACKNAME; + my $newclass = ++$PACKNAME; + local @Parent = @Parent; # Protect against non-local exits { # no strict; - print "Blessing Object into class [$class]\n" if $Verbose>=2; - mv_all_methods("MY",$class); - bless $self, $class; + print "Blessing Object into class [$newclass]\n" if $Verbose>=2; + mv_all_methods("MY",$newclass); + bless $self, $newclass; push @Parent, $self; - @{"$class\:\:ISA"} = 'MM'; + @{"$newclass\:\:ISA"} = 'MM'; } if (defined $Parent[-2]){ @@ -385,12 +393,26 @@ sub ExtUtils::MakeMaker::new { for $key (keys %Prepend_dot_dot) { next unless defined $self->{PARENT}{$key}; $self->{$key} = $self->{PARENT}{$key}; + # PERL and FULLPERL may be command verbs instead of full + # file specifications under VMS. If so, don't turn them + # into a filespec. $self->{$key} = $self->catdir("..",$self->{$key}) - unless $self->file_name_is_absolute($self->{$key}); + unless $self->file_name_is_absolute($self->{$key}) + || ($^O eq 'VMS' and ($key =~ /PERL$/ && $self->{$key} =~ /^[\w\-\$]+$/)); + } + if ($self->{PARENT}) { + $self->{PARENT}->{CHILDREN}->{$newclass} = $self; + foreach my $opt (qw(CAPI POLLUTE)) { + if (exists $self->{PARENT}->{$opt} + and not exists $self->{$opt}) + { + # inherit, but only if already unspecified + $self->{$opt} = $self->{PARENT}->{$opt}; + } + } } - $self->{PARENT}->{CHILDREN}->{$class} = $self if $self->{PARENT}; } else { - parse_args($self,@ARGV); + parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV); } $self->{NAME} ||= $self->guess_name; @@ -400,12 +422,19 @@ sub ExtUtils::MakeMaker::new { $self->init_main(); if (! $self->{PERL_SRC} ) { - my($pthinks) = $INC{'Config.pm'}; + my($pthinks) = $self->canonpath($INC{'Config.pm'}); + my($cthinks) = $self->catfile($Config{'archlibexp'},'Config.pm'); $pthinks = VMS::Filespec::vmsify($pthinks) if $Is_VMS; - if ($pthinks ne $self->catfile($Config{archlibexp},'Config.pm')){ - $pthinks =~ s!/Config\.pm$!!; - $pthinks =~ s!.*/!!; - print STDOUT <{UNINSTALLED_PERL}; Your perl and your Config.pm seem to have different ideas about the architecture they are running on. Perl thinks: [$pthinks] @@ -418,6 +447,9 @@ END $self->init_dirscan(); $self->init_others(); + my($argv) = neatvalue(\@ARGV); + $argv =~ s/^\[/(/; + $argv =~ s/\]$/)/; push @{$self->{RESULT}}, <{NAME} extension to perl. @@ -428,6 +460,8 @@ END # # ANY CHANGES MADE HERE WILL BE LOST! # +# MakeMaker ARGV: $argv +# # MakeMaker Parameters: END @@ -457,7 +491,6 @@ END $self->eval_in_subdirs if @{$self->{DIR}}; } - tie %::att, ExtUtils::MakeMaker::TieAtt, $self; my $section; foreach $section ( @MM_Sections ){ print "Processing Makefile '$section' section\n" if ($Verbose >= 2); @@ -473,11 +506,33 @@ END } push @{$self->{RESULT}}, "\n# End."; - pop @Parent; $self; } +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'; +all: + +clean: + +install: + +makemakerdflt: + +test: + +EOP + close MF or die "close Makefile for write: $!"; +} + sub check_manifest { print STDOUT "Checking if your kit is complete...\n"; require ExtUtils::Manifest; @@ -509,15 +564,8 @@ sub parse_args{ (getpwuid($>))[7] ]ex; } - # This may go away, in mid 1996 - if ($self->{Correct_relativ_directories}){ - $value = $self->catdir("..",$value) - if $Prepend_dot_dot{$name} && ! $self->file_name_is_absolute($value); - } $self->{uc($name)} = $value; } - # This may go away, in mid 1996 - delete $self->{Correct_relativ_directories}; # catch old-style 'potential_libs' and inform user how to 'upgrade' if (defined $self->{potential_libs}){ @@ -551,12 +599,21 @@ sub parse_args{ # have to build a list with the shell $self->{DIR} = [grep $_, split ":", $self->{DIR}]; } + # Turn a INCLUDE_EXT argument on the command line into an array + if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') { + $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}]; + } + # Turn a EXCLUDE_EXT argument on the command line into an array + if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') { + $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}]; + } my $mmkey; foreach $mmkey (sort keys %$self){ print STDOUT " $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose; print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n" unless exists $Recognized_Att_Keys{$mmkey}; } + $| = 1 if $Verbose; } sub check_hints { @@ -567,7 +624,7 @@ sub check_hints { # First we look for the best hintsfile we have my(@goodhints); - my($hint)="$Config{osname}_$Config{osvers}"; + my($hint)="${^O}_$Config{osvers}"; $hint =~ s/\./_/g; $hint =~ s/_$//; return unless $hint; @@ -630,7 +687,7 @@ sub mv_all_methods { # %MY:: being intact, we have to fill the hole with an # inheriting method: - eval "package MY; sub $method {local *$method; shift->MY::$method(\@_); }"; + eval "package MY; sub $method { shift->SUPER::$method(\@_); }"; } # We have to clean out %INC also, because the current directory is @@ -638,13 +695,18 @@ sub mv_all_methods { # out of a History.pl file which is "required" so woudn't get # loaded again in another extension requiring a History.pl - my $inc; - foreach $inc (keys %INC) { - next if $NORMAL_INC{$inc}; - #warn "***$inc*** deleted"; - delete $INC{$inc}; - } - + # With perl5.002_01 the deletion of entries in %INC caused Tk-b11 + # to core dump in the middle of a require statement. The required + # file was Tk/MMutil.pm. The consequence is, we have to be + # extremely careful when we try to give perl a reason to reload a + # library with same name. The workaround prefers to drop nothing + # from %INC and teach the writers not to use such libraries. + +# my $inc; +# foreach $inc (keys %INC) { +# #warn "***$inc*** deleted"; +# delete $INC{$inc}; +# } } sub skipcheck { @@ -764,53 +826,6 @@ sub selfdocument { join "\n", @m; } -package ExtUtils::MakeMaker::TieAtt; - -sub TIEHASH { - bless { SECRETHASH => $_[1]}; -} - -sub FETCH { - print "Warning (non-fatal): Importing of %att is deprecated [$_[1]] - use \$self instead\n" unless ++$Enough>$Enough_limit; - print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit; - $_[0]->{SECRETHASH}->{$_[1]}; -} - -sub STORE { - print "Warning (non-fatal): Importing of %att is deprecated [$_[1]][$_[2]] - use \$self instead\n" unless ++$Enough>$Enough_limit; - print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit; - $_[0]->{SECRETHASH}->{$_[1]} = $_[2]; -} - -sub FIRSTKEY { - print "Warning (non-fatal): Importing of %att is deprecated [FIRSTKEY] - use \$self instead\n" unless ++$Enough>$Enough_limit; - print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" if $Enough==$Enough_limit; - each %{$_[0]->{SECRETHASH}}; -} - -sub NEXTKEY { - each %{$_[0]->{SECRETHASH}}; -} - -sub DESTROY { -} - -sub warndirectuse { - my($caller) = @_; - return if $Enough>$Enough_limit; - print STDOUT "Warning (non-fatal): Direct use of class methods deprecated; use\n"; - my($method) = $caller =~ /.*:(\w+)$/; - print STDOUT -' my $self = shift; - $self->MM::', $method, "(); - instead\n"; - print "Further ExtUtils::MakeMaker::TieAtt warnings suppressed\n" - if ++$Enough==$Enough_limit; -} - package ExtUtils::MakeMaker; 1; @@ -840,90 +855,37 @@ It splits the task of generating the Makefile into several subroutines that can be individually overridden. Each subroutine returns the text it wishes to have written to the Makefile. -=head2 Hintsfile support +MakeMaker is object oriented. Each directory below the current +directory that contains a Makefile.PL. Is treated as a separate +object. This makes it possible to write an unlimited number of +Makefiles with a single invocation of WriteMakefile(). -MakeMaker.pm uses the architecture specific information from -Config.pm. In addition it evaluates architecture specific hints files -in a C directory. The hints files are expected to be named -like their counterparts in C, but with an C<.pl> file -name extension (eg. C). They are simply Ced by -MakeMaker within the WriteMakefile() subroutine, and can be used to -execute commands as well as to include special variables. The rules -which hintsfile is chosen are the same as in Configure. - -The hintsfile is eval()ed immediately after the arguments given to -WriteMakefile are stuffed into a hash reference $self but before this -reference becomes blessed. So if you want to do the equivalent to -override or create an attribute you would say something like - - $self->{LIBS} = ['-ldbm -lucb -lc']; +=head2 How To Write A Makefile.PL -=head2 What's new in version 5 of MakeMaker +The short answer is: Don't. -MakeMaker 5 is pure object oriented. This allows us to write an -unlimited number of Makefiles with a single perl process. 'perl -Makefile.PL' with MakeMaker 5 goes through all subdirectories -immediately and evaluates any Makefile.PL found in the next level -subdirectories. The benefit of this approach comes in useful for both -single and multi directories extensions. + Always begin with h2xs. + Always begin with h2xs! + ALWAYS BEGIN WITH H2XS! -Multi directory extensions have an immediately visible speed -advantage, because there's no startup penalty for any single -subdirectory Makefile. - -Single directory packages benefit from the much improved -needs_linking() method. As the main Makefile knows everything about -the subdirectories, a needs_linking() method can now query all -subdirectories if there is any linking involved down in the tree. The -speedup for PM-only Makefiles seems to be around 1 second on my -Indy 100 MHz. - -=head2 Incompatibilities between MakeMaker 5.00 and 4.23 - -There are no incompatibilities in the short term, as all changes are -accompanied by short-term workarounds that guarantee full backwards -compatibility. - -You are likely to face a few warnings that expose deprecations which -will result in incompatibilities in the long run: - -You should not use %att directly anymore. Instead any subroutine you -override in the MY package will be called by the object method, so you -can access all object attributes directly via the object in $_[0]. - -You should not call the class methos MM->something anymore. Instead -you should call the superclass. Something like - - sub MY::constants { - my $self = shift; - $self->MM::constants(); - } +even if you're not building around a header file, and even if you +don't have an XS component. -Especially the libscan() and exescan() methods should be altered -towards OO programming, that means do not expect that $_ to contain -the path but rather $_[1]. +Run h2xs(1) before you start thinking about writing a module. For so +called pm-only modules that consist of C<*.pm> files only, h2xs has +the C<-X> switch. This will generate dummy files of all kinds that are +useful for the module developer. -Try to build several extensions simultanously to debug your -Makefile.PL. You can unpack a bunch of distributed packages within one -directory and run +The medium answer is: - perl -MExtUtils::MakeMaker -e 'WriteMakefile()' - -That's actually fun to watch :) - -Do not use exit() in your Makefile.PL. MakeMaker tries hard to enable -multi-module builds in one go. - -Final suggestion: Try to delete all of your MY:: subroutines and -watch, if you really still need them. MakeMaker might already do what -you want without them. If you see no way to avoid your own subroutine -solution, please let us know about the problem. + use ExtUtils::MakeMaker; + WriteMakefile( NAME => "Foo::Bar" ); +The long answer is the rest of the manpage :-) =head2 Default Makefile Behaviour -The automatically generated Makefile enables the user of the extension -to invoke +The generated Makefile enables the user of the extension to invoke perl Makefile.PL # optionally "perl Makefile.PL verbose" make @@ -945,7 +907,7 @@ Other interesting targets in the generated Makefile are =head2 make test -MakeMaker checks for the existence of a file named "test.pl" in the +MakeMaker checks for the existence of a file named F in the current directory and if it exists it adds commands to the test target of the generated Makefile that will execute the script with the proper set of perl C<-I> options. @@ -955,75 +917,89 @@ add commands to the test target of the generated Makefile that execute all matching files via the L module with the C<-I> switches set correctly. +=head2 make testdb + +A useful variation of the above is the target C. It runs the +test under the Perl debugger (see L). If the file +F exists in the current directory, it is used for the test. + +If you want to debug some other testfile, set C variable +thusly: + + make testdb TEST_FILE=t/mytest.t + +By default the debugger is called using C<-d> option to perl. If you +want to specify some other option, set C variable: + + make testdb TESTDB_SW=-Dx + =head2 make install make alone puts all relevant files into directories that are named by -the macros INST_LIB, INST_ARCHLIB, INST_EXE, INST_MAN1DIR, and -INST_MAN3DIR. All these default to something below ./blib if -you are I building below the perl source directory. If you I -building below the perl source, INST_LIB and INST_ARCHLIB default to - ../../lib, and INST_EXE is not defined. +the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_HTMLLIBDIR, +INST_HTMLSCRIPTDIR, INST_MAN1DIR, and INST_MAN3DIR. All these default +to something below ./blib if you are I building below the perl +source directory. If you I building below the perl source, +INST_LIB and INST_ARCHLIB default to ../../lib, and INST_SCRIPT is not +defined. The I target of the generated Makefile copies the files found below each of the INST_* directories to their INSTALL* counterparts. Which counterparts are chosen depends on the setting of INSTALLDIRS according to the following table: - INSTALLDIRS set to - perl site + INSTALLDIRS set to + perl site - INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH - INST_LIB INSTALLPRIVLIB INSTALLSITELIB - INST_EXE INSTALLBIN - INST_MAN1DIR INSTALLMAN1DIR - INST_MAN3DIR INSTALLMAN3DIR + INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH + INST_LIB INSTALLPRIVLIB INSTALLSITELIB + INST_HTMLLIBDIR INSTALLHTMLPRIVLIBDIR INSTALLHTMLSITELIBDIR + INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR + INST_BIN INSTALLBIN + INST_SCRIPT INSTALLSCRIPT + INST_MAN1DIR INSTALLMAN1DIR + INST_MAN3DIR INSTALLMAN3DIR The INSTALL... macros in turn default to their %Config ($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts. You can check the values of these variables on your system with - perl -MConfig -le 'print join $/, map - sprintf("%20s: %s", $_, $Config{$_}), - grep /^install/, keys %Config' + perl '-V:install.*' -If you don't want to keep the defaults, MakeMaker helps you to -minimize the typing needed: the usual relationship between -INSTALLPRIVLIB and INSTALLARCHLIB is determined by Configure at perl -compilation time. MakeMaker supports the user who sets -INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not, then -MakeMaker defaults the latter to be the same subdirectory of -INSTALLPRIVLIB as Configure decided for the counterparts in %Config , -otherwise it defaults to INSTALLPRIVLIB. The same relationship holds -for INSTALLSITELIB and INSTALLSITEARCH. +And to check the sequence in which the library directories are +searched by perl, run -MakeMaker gives you much more freedom than needed to configure -internal variables and get different results. It is worth to mention, -that make(1) also lets you configure most of the variables that are -used in the Makefile. But in the majority of situations this will not -be necessary, and should only be done, if the author of a package -recommends it (or you know what you're doing). + perl -le 'print join $/, @INC' -=cut -#' +=head2 PREFIX and LIB attribute + +PREFIX and LIB can be used to set several INSTALL* attributes in one +go. The quickest way to install a module in a non-standard place might +be + + perl Makefile.PL LIB=~/lib -=head2 PREFIX attribute +This will install the module's architecture-independent files into +~/lib, the architecture-dependent files into ~/lib/$archname/auto. -The PREFIX attribute can be used to set the INSTALL* attributes in one -go. The quickest way to install a module in a non-standard place +Another way to specify many INSTALL directories with a single +parameter is PREFIX. perl Makefile.PL PREFIX=~ This will replace the string specified by $Config{prefix} in all $Config{install*} values. -Note, that the tilde expansion is done by MakeMaker, not by perl by -default, nor by make. +Note, that in both cases the tilde expansion is done by MakeMaker, not +by perl by default, nor by make. Conflicts between parameters LIB, +PREFIX and the various INSTALL* arguments are resolved such that +INSTALL* takes precedence. If the user has superuser privileges, and is not working on AFS (Andrew File System) or relatives, then the defaults for -INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLBIN, etc. will be appropriate, +INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLSCRIPT, etc. will be appropriate, and this incantation will be the best: perl Makefile.PL; make; make test @@ -1040,7 +1016,7 @@ probably have changed since perl itself has been installed. They will have to do this by calling perl Makefile.PL INSTALLSITELIB=/afs/here/today \ - INSTALLBIN=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages + INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages make Be careful to repeat this procedure every time you recompile an @@ -1142,31 +1118,58 @@ of the perl library. The other variables default to the following: If perl has not yet been installed then PERL_SRC can be defined on the command line as shown in the previous section. -=head2 Useful Default Makefile Macros - -FULLEXT = Pathname for extension directory (eg DBD/Oracle). - -BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. -ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) +=head2 Which architecture dependent directory? -INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)> - -INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)> +If you don't want to keep the defaults for the INSTALL* macros, +MakeMaker helps you to minimize the typing needed: the usual +relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined +by Configure at perl compilation time. MakeMaker supports the user who +sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not, +then MakeMaker defaults the latter to be the same subdirectory of +INSTALLPRIVLIB as Configure decided for the counterparts in %Config , +otherwise it defaults to INSTALLPRIVLIB. The same relationship holds +for INSTALLSITELIB and INSTALLSITEARCH. -INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)> +MakeMaker gives you much more freedom than needed to configure +internal variables and get different results. It is worth to mention, +that make(1) also lets you configure most of the variables that are +used in the Makefile. But in the majority of situations this will not +be necessary, and should only be done if the author of a package +recommends it (or you know what you're doing). =head2 Using Attributes and Parameters The following attributes can be specified as arguments to WriteMakefile() or as NAME=VALUE pairs on the command line: -=cut +=over 2 -# The following "=item C" is used by the attrib_help routine -# likewise the "=back" below. So be careful when changing it! +=item AUTHOR -=over 2 +String containing name (and email address) of package author(s). Is used +in PPD (Perl Package Description) files for PPM (Perl Package Manager). + +=item ABSTRACT + +One line description of the module. Will be included in PPD file. + +=item ABSTRACT_FROM + +Name of the file that contains the package description. MakeMaker looks +for a line in the POD matching /^($package\s-\s)(.*)/. This is typically +the first line in the "=head1 NAME" section. $2 becomes the abstract. + +=item BINARY_LOCATION + +Used when creating PPD files for binary packages. It can be set to a +full or relative path or URL to the binary archive for a particular +architecture. For example: + + perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz + +builds a PPD package that references a binary of the C package, +located in the C directory relative to the PPD itself. =item C @@ -1174,6 +1177,22 @@ Ref to array of *.c file names. Initialised from a directory scan 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 +the arguments INC and OPTIMIZE. + =item CONFIG Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from @@ -1198,7 +1217,7 @@ so =item CONFIGURE CODE reference. The subroutine should return a hash reference. The -hash may contain further attributes, e.g. {LIBS => ...}, that have to +hash may contain further attributes, e.g. {LIBS =E ...}, that have to be determined by some evaluation method. =item DEFINE @@ -1217,12 +1236,12 @@ NAME above. =item DL_FUNCS -Hashref of symbol names for routines to be made available as -universal symbols. Each key/value pair consists of the package name -and an array of routine names in that package. Used only under AIX -(export lists) and VMS (linker options) at present. The routine -names supplied will be expanded in the same way as XSUB names are -expanded by the XS() macro. Defaults to +Hashref of symbol names for routines to be made available as universal +symbols. Each key/value pair consists of the package name and an +array of routine names in that package. Used only under AIX, OS/2, +VMS and Win32 at present. The routine names supplied will be expanded +in the same way as XSUB names are expanded by the XS() macro. +Defaults to {"$(NAME)" => ["boot_$(NAME)" ] } @@ -1231,26 +1250,30 @@ e.g. {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )], "NetconfigPtr" => [ 'DESTROY'] } +Please see the L documentation for more information +about the DL_FUNCS, DL_VARS and FUNCLIST attributes. + =item DL_VARS -Array of symbol names for variables to be made available as -universal symbols. Used only under AIX (export lists) and VMS -(linker options) at present. Defaults to []. (e.g. [ qw( -Foo_version Foo_numstreams Foo_tree ) ]) +Array of symbol names for variables to be made available as universal symbols. +Used only under AIX, OS/2, VMS and Win32 at present. Defaults to []. +(e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ]) + +=item EXCLUDE_EXT + +Array of extension names to exclude when doing a static build. This +is ignored if INCLUDE_EXT is present. Consult INCLUDE_EXT for more +details. (e.g. [ qw( Socket POSIX ) ] ) + +This attribute may be most useful when specified as a string on the +command line: perl Makefile.PL EXCLUDE_EXT='Socket Safe' =item EXE_FILES Ref to array of executable files. The files will be copied to the -INST_EXE directory. Make realclean will delete them from there +INST_SCRIPT directory. Make realclean will delete them from there again. -=item NO_VC - -In general any generated Makefile checks for the current version of -MakeMaker and the version the Makefile was built under. If NO_VC is -set, the version check is neglected. Do not write this into your -Makefile.PL, use it interactively instead. - =item FIRST_MAKEFILE The name of the Makefile to be produced. Defaults to the contents of @@ -1261,14 +1284,55 @@ that will be produced for the MAP_TARGET. Perl binary able to run this extension. +=item FUNCLIST + +This provides an alternate means to specify function names to be +exported from the extension. Its value is a reference to an +array of function names to be exported by the extension. These +names are passed through unaltered to the linker options file. + =item H Ref to array of *.h file names. Similar to C. +=item HTMLLIBPODS + +Hashref of .pm and .pod files. MakeMaker will default this to all + .pod and any .pm files that include POD directives. The files listed +here will be converted to HTML format and installed as was requested +at Configure time. + +=item HTMLSCRIPTPODS + +Hashref of pod-containing files. MakeMaker will default this to all +EXE_FILES files that include POD directives. The files listed +here will be converted to HTML format and installed as was requested +at Configure time. + +=item IMPORTS + +This attribute is used to specify names to be imported into the +extension. It is only used on OS/2 and Win32. + =item INC Include file dirs eg: C<"-I/usr/5include -I/path/to/inc"> +=item INCLUDE_EXT + +Array of extension names to be included when doing a static build. +MakeMaker will normally build with all of the installed extensions when +doing a static build, and that is usually the desired behavior. If +INCLUDE_EXT is present then MakeMaker will build only with those extensions +which are explicitly mentioned. (e.g. [ qw( Socket POSIX ) ]) + +It is not necessary to mention DynaLoader or the current extension when +filling in INCLUDE_EXT. If the INCLUDE_EXT is mentioned but is empty then +only DynaLoader and the current extension will be included in the build. + +This attribute may be most useful when specified as a string on the +command line: perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek' + =item INSTALLARCHLIB Used by 'make install', which copies files from INST_ARCHLIB to this @@ -1276,8 +1340,7 @@ directory if INSTALLDIRS is set to perl. =item INSTALLBIN -Used by 'make install' which copies files from INST_EXE to this -directory. +Directory to install binary files (e.g. tkperl) into. =item INSTALLDIRS @@ -1286,6 +1349,22 @@ choose: installprivlib and installarchlib versus installsitelib and installsitearch. The first pair is chosen with INSTALLDIRS=perl, the second with INSTALLDIRS=site. Default is site. +=item INSTALLHTMLPRIVLIBDIR + +This directory gets the HTML pages at 'make install' time. Defaults to +$Config{installhtmlprivlibdir}. + +=item INSTALLHTMLSCRIPTDIR + +This directory gets the HTML pages at 'make install' time. Defaults to +$Config{installhtmlscriptdir}. + +=item INSTALLHTMLSITELIBDIR + +This directory gets the HTML pages at 'make install' time. Defaults to +$Config{installhtmlsitelibdir}. + + =item INSTALLMAN1DIR This directory gets the man pages at 'make install' time. Defaults to @@ -1301,31 +1380,48 @@ $Config{installman3dir}. Used by 'make install', which copies files from INST_LIB to this directory if INSTALLDIRS is set to perl. -=item INSTALLSITELIB +=item INSTALLSCRIPT -Used by 'make install', which copies files from INST_LIB to this -directory if INSTALLDIRS is set to site (default). +Used by 'make install' which copies files from INST_SCRIPT to this +directory. =item INSTALLSITEARCH Used by 'make install', which copies files from INST_ARCHLIB to this directory if INSTALLDIRS is set to site (default). +=item INSTALLSITELIB + +Used by 'make install', which copies files from INST_LIB to this +directory if INSTALLDIRS is set to site (default). + =item INST_ARCHLIB Same as INST_LIB for architecture dependent files. +=item INST_BIN + +Directory to put real binary files during 'make'. These will be copied +to INSTALLBIN during 'make install' + =item INST_EXE -Directory, where executable scripts should be installed during -'make'. Defaults to "./blib/bin", just to have a dummy location during -testing. make install will copy the files in INST_EXE to INSTALLBIN. +Old name for INST_SCRIPT. Deprecated. Please use INST_SCRIPT if you +need to use it. =item INST_LIB Directory where we put library files of this extension while building it. +=item INST_HTMLLIBDIR + +Directory to hold the man pages in HTML format at 'make' time + +=item INST_HTMLSCRIPTDIR + +Directory to hold the man pages in HTML format at 'make' time + =item INST_MAN1DIR Directory to hold the man pages at 'make' time @@ -1334,12 +1430,52 @@ Directory to hold the man pages at 'make' time Directory to hold the man pages at 'make' time +=item INST_SCRIPT + +Directory, where executable files should be installed during +'make'. Defaults to "./blib/script", just to have a dummy location during +testing. make install will copy the files in INST_SCRIPT to +INSTALLSCRIPT. + +=item PERL_MALLOC_OK + +defaults to 0. Should be set to TRUE if the extension can work with +the memory allocation routines substituted by the Perl malloc() subsystem. +This should be applicable to most extensions with exceptions of those + +=over + +=item * + +with bugs in memory allocations which are caught by Perl's malloc(); + +=item * + +which interact with the memory allocator in other ways than via +malloc(), realloc(), free(), calloc(), sbrk() and brk(); + +=item * + +which rely on special alignment which is not provided by Perl's malloc(). + +=back + +B Negligence to set this flag in I of loaded extension +nullifies many advantages of Perl's malloc(), such as better usage of +system resources, error detection, memory usage reporting, catchable failure +of memory allocations, etc. + =item LDFROM defaults to "$(OBJECT)" and is used in the ld command to specify what files to link/load from (also see dynamic_lib below for how to specify ld flags) +=item LIB + +LIB can only be set at C time. It has the effect of +setting both INSTALLPRIVLIB and INSTALLSITELIB to that value regardless any + =item LIBPERL_A The filename of the perllibrary that will be used together with this @@ -1414,14 +1550,14 @@ Makefile.PL. =item NEEDS_LINKING -MakeMaker will figure out, if an extension contains linkable code +MakeMaker will figure out if an extension contains linkable code anywhere down the directory tree, and will set this variable -accordingly, but you can speed it up a very little bit, if you define +accordingly, but you can speed it up a very little bit if you define this boolean variable yourself. =item NOECHO -Defaults the C<@>. By setting it to an empty string you can generate a +Defaults to C<@>. By setting it to an empty string you can generate a Makefile that echos all commands. Mainly used in debugging MakeMaker itself. @@ -1429,6 +1565,13 @@ itself. Boolean. Attribute to inhibit descending into subdirectories. +=item NO_VC + +In general, any generated Makefile checks for the current version of +MakeMaker and the version the Makefile was built under. If NO_VC is +set, the version check is neglected. Do not write this into your +Makefile.PL, use it interactively instead. + =item OBJECT List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long @@ -1451,7 +1594,7 @@ to $(CC). =item PERL_ARCHLIB -Same as above for architecture dependent files +Same as above for architecture dependent files. =item PERL_LIB @@ -1462,6 +1605,16 @@ Directory containing the Perl library to use. Directory containing the Perl source code (use of this should be avoided, it may be undefined) +=item PERM_RW + +Desired permission for read/writable files. Defaults to C<644>. +See also L. + +=item PERM_RWX + +Desired permission for executable files. Defaults to C<755>. +See also L. + =item PL_FILES Ref to hash of files to be processed as perl programs. MakeMaker @@ -1471,7 +1624,11 @@ and the basename of the file being the value. E.g. {'foobar.PL' => 'foobar'} The *.PL files are expected to produce output to the target files -themselves. +themselves. If multiple files can be generated from the same *.PL +file then the value in the hash can be a reference to an array of +target file names. E.g. + + {'foobar.PL' => ['foobar1','foobar2']} =item PM @@ -1479,19 +1636,39 @@ Hashref of .pm files and *.pl files to be installed. e.g. {'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm'} -By default this will include *.pm and *.pl. If a lib directory -exists and is not listed in DIR (above) then any *.pm and *.pl files -it contains will also be included by default. Defining PM in the +By default this will include *.pm and *.pl and the files found in +the PMLIBDIRS directories. Defining PM in the Makefile.PL will override PMLIBDIRS. =item PMLIBDIRS Ref to array of subdirectories containing library files. Defaults to -[ 'lib', $(BASEEXT) ]. The directories will be scanned and any files +[ 'lib', $(BASEEXT) ]. The directories will be scanned and I files they contain will be installed in the corresponding location in the library. A libscan() method can be used to alter the behaviour. Defining PM in the Makefile.PL will override PMLIBDIRS. +=item POLLUTE + +Release 5.005 grandfathered old global symbol names by providing preprocessor +macros for extension source compatibility. As of release 5.6, these +preprocessor definitions are not available by default. The POLLUTE flag +specifies that the old names should still be defined: + + perl Makefile.PL POLLUTE=1 + +Please inform the module author if this is necessary to successfully install +a module under 5.6 or later. + +=item PPM_INSTALL_EXEC + +Name of the executable used to run C below. (e.g. perl) + +=item PPM_INSTALL_SCRIPT + +Name of the script that gets executed by the Perl Package Manager after +the installation of a package. + =item PREFIX Can be used to set the three INSTALL* attributes in one go (except for @@ -1501,18 +1678,19 @@ branch from that node into lib/, lib/ARCHNAME or whatever Configure decided at the build time of your perl (unless you override one of them, of course). -=item PREREQ +=item PREREQ_PM -Placeholder, not yet implemented. Will eventually be a hashref: Names -of modules that need to be available to run this extension (e.g. Fcntl -for SDBM_File) are the keys of the hash and the desired version is the -value. Needs further evaluation, should probably allow to define -prerequisites among header files, libraries, perl version, etc. +Hashref: Names of modules that need to be available to run this +extension (e.g. Fcntl for SDBM_File) are the keys of the hash and the +desired version is the value. If the required version number is 0, we +only check if any version is installed already. =item SKIP Arryref. E.g. [qw(name1 name2)] skip (do not write) sections of the -Makefile +Makefile. Caution! Do not use the SKIP attribute for the negligible +speedup. It may seriously damage the resulting Makefile. Only use it +if you really need it. =item TYPEMAPS @@ -1536,15 +1714,17 @@ routine requires that the file named by VERSION_FROM contains one single line to compute the version number. The first line in the file that contains the regular expression - /(\$[\w:]*\bVERSION)\b.*=/ + /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/ will be evaluated with eval() and the value of the named variable B the eval() will be assigned to the VERSION attribute of the MakeMaker object. The following lines will be parsed o.k.: $VERSION = '1.00'; - ( $VERSION ) = '$Revision: 1.187 $ ' =~ /\$Revision:\s+([^\s]+)/; + *VERSION = \'1.01'; + ( $VERSION ) = '$Revision: 1.222 $ ' =~ /\$Revision:\s+([^\s]+)/; $FOO::VERSION = '1.10'; + *FOO::VERSION = \'1.11'; but these will fail: @@ -1552,9 +1732,16 @@ but these will fail: local $VERSION = '1.02'; local $FOO::VERSION = '1.30'; -The file named in VERSION_FROM is added as a dependency to Makefile to -guarantee, that the Makefile contains the correct VERSION macro after -a change of the file. +The file named in VERSION_FROM is not added as a dependency to +Makefile. This is not really correct, but it would be a major pain +during development to have to rewrite the Makefile for any smallish +change in that file. If you want to make sure that the Makefile +contains the correct VERSION macro after any change of the file, you +would have to do something like + + depend => { Makefile => '$(VERSION_FROM)' } + +See attribute C below. =item XS @@ -1587,7 +1774,7 @@ to the value of the VERSION attribute. =head2 Additional lowercase attributes can be used to pass parameters to the methods which implement that -part of the Makefile. These are not normally required: +part of the Makefile. =over 2 @@ -1601,9 +1788,9 @@ part of the Makefile. These are not normally required: =item dist - {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz', + {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz', SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip', - ZIPFLAGS => '-rl'} + ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' } If you specify COMPRESS, then SUFFIX should also be altered, as it is needed to tell make the target file of the compression. Setting @@ -1616,10 +1803,6 @@ links the rest. Default is 'best'. {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'} -=item installpm - -Deprecated as of MakeMaker 5.23. See L. - =item linkext {LINKTYPE => 'static', 'dynamic' or ''} @@ -1629,7 +1812,7 @@ NB: Extensions that have nothing but *.pm files had to say {LINKTYPE => ''} with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line -can be deleted safely. MakeMaker recognizes, when there's nothing to +can be deleted safely. MakeMaker recognizes when there's nothing to be linked. =item macro @@ -1640,17 +1823,15 @@ be linked. {FILES => '$(INST_ARCHAUTODIR)/*.xyz'} -=item tool_autosplit - - {MAXLEN =E 8} +=item test -=back + {TESTS => 't/*.t'} -=cut +=item tool_autosplit -# bug in pod2html, so leave the =back + {MAXLEN => 8} -# Don't delete this cut, MM depends on it! +=back =head2 Overriding MakeMaker Methods @@ -1665,19 +1846,20 @@ either say: or you can edit the default by saying something like: sub MY::c_o { - my $self = shift; - local *c_o; - $_=$self->MM::c_o; - s/old text/new text/; - $_; + package MY; # so that "SUPER" works right + my $inherited = shift->SUPER::c_o(@_); + $inherited =~ s/old text/new text/; + $inherited; } -Both methods above are available for backwards compatibility with -older Makefile.PLs. +If you are running experiments with embedding perl as a library into +other applications, you might find MakeMaker is not sufficient. You'd +better have a look at ExtUtils::Embed which is a collection of utilities +for embedding. If you still need a different solution, try to develop another -subroutine, that fits your needs and submit the diffs to -F or F as appropriate. +subroutine that fits your needs and submit the diffs to +F or F as appropriate. For a complete description of all MakeMaker methods see L. @@ -1692,6 +1874,24 @@ Makefile: } +=head2 Hintsfile support + +MakeMaker.pm uses the architecture specific information from +Config.pm. In addition it evaluates architecture specific hints files +in a C directory. The hints files are expected to be named +like their counterparts in C, but with an C<.pl> file +name extension (eg. C). They are simply Ced by +MakeMaker within the WriteMakefile() subroutine, and can be used to +execute commands as well as to include special variables. The rules +which hintsfile is chosen are the same as in Configure. + +The hintsfile is eval()ed immediately after the arguments given to +WriteMakefile are stuffed into a hash reference $self but before this +reference becomes blessed. So if you want to do the equivalent to +override or create an attribute you would say something like + + $self->{LIBS} = ['-ldbm -lucb -lc']; + =head2 Distribution Support For authors of extensions MakeMaker provides several Makefile @@ -1715,7 +1915,7 @@ details) =item make distclean does a realclean first and then the distcheck. Note that this is not -needed to build a new distribution as long as you are sure, that the +needed to build a new distribution as long as you are sure that the MANIFEST file is ok. =item make manifest @@ -1737,7 +1937,9 @@ a make test in that directory. =item make tardist First does a distdir. Then a command $(PREOP) which defaults to a null -command. Next it runs C on that directory into a tarfile and +command, followed by $(TOUNIX), which defaults to a null command under +UNIX, and will convert files in distribution directory to UNIX format +otherwise. Next it runs C on that directory into a tarfile and deletes the directory. Finishes with a command $(POSTOP) which defaults to a null command. @@ -1775,12 +1977,13 @@ reference to the dist attribute of the WriteMakefile call. The following parameters are recognized: CI ('ci -u') - COMPRESS ('compress') + COMPRESS ('gzip --best') POSTOP ('@ :') PREOP ('@ :') + TO_UNIX (depends on the system) RCS_LABEL ('rcs -q -Nv$(VERSION_SYM):') SHAR ('shar') - SUFFIX ('Z') + SUFFIX ('.gz') TAR ('tar') TARFLAGS ('cvf') ZIP ('zip') @@ -1788,26 +1991,49 @@ following parameters are recognized: An example: - WriteMakefile( 'dist' => { COMPRESS=>"gzip", SUFFIX=>"gz" }) + WriteMakefile( 'dist' => { COMPRESS=>"bzip2", SUFFIX=>".bz2" }) +=head2 Disabling an extension -=head1 AUTHORS +If some events detected in F imply that there is no way +to create the Module, but this is a normal state of things, then you +can create a F which does nothing, but succeeds on all the +"usual" build targets. To do so, use -Andy Dougherty Fdoughera@lafcol.lafayette.eduE>, Andreas -KEnig FA.Koenig@franz.ww.TU-Berlin.DEE>, Tim Bunce -FTim.Bunce@ig.co.ukE>. VMS support by Charles Bailey -Fbailey@genetics.upenn.eduE>. OS/2 support by Ilya -Zakharevich Filya@math.ohio-state.eduE>. Contact the -makemaker mailing list C, if -you have any questions. + ExtUtils::MakeMaker::WriteEmptyMakefile(); + +instead of WriteMakefile(). + +This may be useful if other modules expect this module to be I +OK, as opposed to I OK (say, this system-dependent module builds +in a subdirectory of some other distribution, or is listed as a +dependency in a CPAN::Bundle, but the functionality is supported by +different means on the current architecture). + +=head1 ENVIRONMENT -=head1 MODIFICATION HISTORY +=over 8 -For a more complete documentation see the file Changes in the -MakeMaker distribution package. +=item PERL_MM_OPT -=head1 TODO +Command line options used by Cnew()>, and thus by +C. The string is split on whitespace, and the result +is processed before any actual command line arguments are processed. -See the file Todo in the MakeMaker distribution package. +=back + +=head1 SEE ALSO + +ExtUtils::MM_Unix, ExtUtils::Manifest, ExtUtils::testlib, +ExtUtils::Install, ExtUtils::Embed + +=head1 AUTHORS + +Andy Dougherty >, Andreas KEnig +>, Tim Bunce >. +VMS support by Charles Bailey >. OS/2 +support by Ilya Zakharevich >. Contact the +makemaker mailing list C, if +you have any questions. =cut