X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FMakeMaker.pm;h=c8c559c07959eaad3c5cdfe199c8b031b769f45c;hb=0b27bdda4132eec7d3a41691839fba5d1251c38a;hp=f2ee0ce7976690eb63d1b818c31a7b94e3322e54;hpb=a5f75d667838e8e7bb037880391f5c44476d33b4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/MakeMaker.pm b/lib/ExtUtils/MakeMaker.pm index f2ee0ce..c8c559c 100644 --- a/lib/ExtUtils/MakeMaker.pm +++ b/lib/ExtUtils/MakeMaker.pm @@ -1,129 +1,33 @@ -package main; -use vars qw(%att); - -# $Id: MakeMaker.pm,v 1.174 1996/02/06 17:03:12 k Exp $ - -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; - -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; -} - - - - - +BEGIN {require 5.002;} # MakeMaker 5.17 was the last MakeMaker that was compatible with perl5.001m package ExtUtils::MakeMaker; -$Version = $VERSION = "5.21"; -$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.174 $, 10)) =~ s/\s+$//; +($Revision = substr(q$Revision: 1.222 $, 10)) =~ s/\s+$//; -use Config; -use Carp; -use Cwd; require Exporter; -require ExtUtils::Manifest; -{ - # Current (5.21) FileHandle doesn't work with miniperl, so we roll our own - # that's all copy & paste code from FileHandle.pm, version of perl5.002b3 - package FileHandle; - use Symbol; - sub new { - @_ >= 1 && @_ <= 3 or croak('usage: new FileHandle [FILENAME [,MODE]]'); - my $class = shift; - my $fh = gensym; - if (@_) { - FileHandle::open($fh, @_) - or return undef; - } - bless $fh, $class; - } - sub open { - @_ >= 2 && @_ <= 4 or croak('usage: $fh->open(FILENAME [,MODE [,PERMS]])'); - my ($fh, $file) = @_; - if (@_ > 2) { - my ($mode, $perms) = @_[2, 3]; - if ($mode =~ /^\d+$/) { - defined $perms or $perms = 0666; - return sysopen($fh, $file, $mode, $perms); - } - $file = "./" . $file unless $file =~ m#^/#; - $file = _open_mode_string($mode) . " $file\0"; - } - open($fh, $file); - } - sub close { - @_ == 1 or croak('usage: $fh->close()'); - close($_[0]); - } -} +use Config; +use Carp (); +#use FileHandle (); use vars qw( - $VERSION $Version_OK $Revision - $Verbose %MM_Sections - @MM_Sections %Recognized_Att_Keys @Get_from_Config - %Prepend_dot_dot %Config @Parent %NORMAL_INC - $Setup_done + + @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 @@ -131,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 &help &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 @@ -150,56 +52,50 @@ 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; - # From somwhere they will want to inherit DESTROY sub DESTROY {} } +# "predeclare the package: we only load it via AUTOLOAD +# but we have already mentioned it in @ISA +package ExtUtils::Liblist; + +package ExtUtils::MakeMaker; # -# Now we can can pull in the friends -# Since they will require us back, we would better prepare the needed -# data _before_ we require them. +# Now we can pull in the friends # -$Is_VMS = ($Config{osname} eq 'VMS'); -$Is_OS2 = ($Config{osname} =~ m|^os/?2$|i); +$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; - import VMS::Filespec '&vmsify'; + require VMS::Filespec; # is a noop as long as we require it within MM_VMS } if ($Is_OS2) { require ExtUtils::MM_OS2; } +if ($Is_Mac) { + require ExtUtils::MM_MacOS; +} +if ($Is_Win32) { + require ExtUtils::MM_Win32; +} +if ($Is_Cygwin) { + require ExtUtils::MM_Cygwin; +} -%NORMAL_INC = %INC; -# package name for the classes into which the first object will be blessed -$PACKNAME = "PACK000"; - - ##### -# # # # ##### -# # # # # - ##### # # ##### - # # # # # -# # # # # # - ##### #### ##### - +full_setup(); -# -# MakeMaker serves currently (v 5.20) only for two purposes: -# Version_Check, and WriteMakefile. For WriteMakefile SelfLoader -# doesn't buy us anything. But for Version_Check we win with -# SelfLoader more than a second. -# -# 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) = @_; @@ -213,136 +109,163 @@ Please rerun 'perl Makefile.PL' to regenerate the Makefile.\n" unless $checkversion == $VERSION; } -# We don't selfload this, because chdir sometimes has problems +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; + local $SIG{__WARN__} = \&warnhandler; + + my %att = @_; + MM->new(\%att)->flush; +} + +sub prompt ($;$) { + my($mess,$def)=@_; + $ISA_TTY = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; # Pipe? + Carp::confess("prompt function called without an argument") unless defined $mess; + my $dispdef = defined $def ? "[$def] " : " "; + $def = defined $def ? $def : ""; + my $ans; + local $|=1; + print "$mess $dispdef"; + if ($ISA_TTY) { + chomp($ans = ); + } else { + print "$def\n"; + } + return ($ans ne '') ? $ans : $def; +} + sub eval_in_subdirs { my($self) = @_; my($dir); -# print "Starting to wade through directories:\n"; -# print join "\n", @{$self->{DIR}}, "\n"; + use Cwd 'cwd'; my $pwd = cwd(); - # As strange things happened twice in the history of MakeMaker to $self->{DIR}, - # lets be careful, maybe it helps some: -# my(@copy_of_DIR) = @{$self->{DIR}}; -# my %copy; -# @copy{@copy_od_DIR} = (1) x @copy_of_DIR; - - # with Tk-9.02 these give me as third directory "1": - # foreach $dir (@($self->{DIR}){ - # foreach $dir (@copy_of_DIR){ - - # this gives mi as third directory a core dump: - # while ($dir = shift @copy_of_DIR){ - - # this finishes the loop immediately: -# foreach $dir (keys %copy){ -# print "Next to come: $dir\n"; -# chdir $dir or die "Couldn't change to directory $dir: $!"; -# package main; -# my $fh = new FileHandle; -# $fh->open("Makefile.PL") or carp("Couldn't open Makefile.PL in $dir"); -# my $eval = join "", <$fh>; -# $fh->close; -# eval $eval; -# warn "WARNING from evaluation of $dir/Makefile.PL: $@" if $@; -# chdir $pwd or die "Couldn't change to directory $pwd: $!"; -# } - - - # So this did the trick (did it?) foreach $dir (@{$self->{DIR}}){ -# print "Next to come: $dir\n"; my($abs) = $self->catdir($pwd,$dir); $self->eval_in_x($abs); } - chdir $pwd; - -# print "Proudly presenting you self->{DIR}:\n"; -# print join "\n", @{$self->{DIR}}, "\n"; - } sub eval_in_x { my($self,$dir) = @_; package main; - chdir $dir or carp("Couldn't change to directory $dir: $!"); - my $fh = new FileHandle; - $fh->open("Makefile.PL") or carp("Couldn't open Makefile.PL in $dir"); - my $eval = join "", <$fh>; - $fh->close; + chdir $dir or Carp::carp("Couldn't change to directory $dir: $!"); +# use FileHandle (); +# my $fh = new FileHandle; +# $fh->open("Makefile.PL") or Carp::carp("Couldn't open Makefile.PL in $dir"); + local *FH; + open(FH,"Makefile.PL") or Carp::carp("Couldn't open Makefile.PL in $dir"); +# my $eval = join "", <$fh>; + my $eval = join "", ; +# $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: $@"; + } } -# use SelfLoader; -# sub ExtUtils::MakeMaker::full_setup ; -# sub ExtUtils::MakeMaker::attrib_help ; -# sub ExtUtils::MakeMaker::writeMakefile ; -# 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::prompt ; -# sub ExtUtils::MakeMaker::help ; -# sub ExtUtils::MakeMaker::skipcheck ; -# sub ExtUtils::MakeMaker::flush ; -# sub ExtUtils::MakeMaker::mkbootstrap ; -# sub ExtUtils::MakeMaker::mksymlists ; -# sub ExtUtils::MakeMaker::neatvalue ; -# sub ExtUtils::MakeMaker::selfdocument ; - -# 1; - -# __DATA__ - -# -# We're done with inheritance setup. As we have two frequently called -# things: Check_Version() and mod_install(), we want to reduce startup -# time. Only WriteMakefile needs all the power here. -# - sub full_setup { $Verbose ||= 0; - $^W=1; - $SIG{__WARN__} = sub { - $_[0] =~ /^Use of uninitialized value/ && return; - $_[0] =~ /used only once/ && return; - $_[0] =~ /^Subroutine\s+[\w:]+\s+redefined/ && return; - warn @_; - }; + + # package name for the classes into which the first object will be blessed + $PACKNAME = "PACK000"; + + @Attrib_help = qw/ + + 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 + /; + + # 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 + @MM_Sections = qw( - post_initialize const_config constants const_loadlibs - const_cccmd 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 installpm manifypods processPL installbin subdirs - clean realclean dist_basics dist_core dist_dir dist_test - dist_ci install force perldepend makefile staticmake test - postamble selfdocument + + 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 - @MM_Sections{@MM_Sections} = {} x @MM_Sections; + @Overridable = @MM_Sections; + 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[ + + 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; + @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections; # we will use all these variables in the Makefile @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; - foreach $item (split(/\n/,attrib_help())){ - next unless $item =~ m/^=item\s+(\w+)\s*$/; - $Recognized_Att_Keys{$1} = $2; - print "Attribute '$1' => '$2'\n" if ($Verbose >= 2); + foreach $item (@Attrib_help){ + $Recognized_Att_Keys{$item} = 1; } foreach $item (@Get_from_Config) { $Recognized_Att_Keys{uc $item} = $Config{$item}; @@ -351,30 +274,23 @@ sub full_setup { } # - # When we pass these through to a Makefile.PL in a subdirectory, we prepend - # "..", so that all files to be installed end up below ./blib + # When we eval a Makefile.PL in a subdirectory, that one will ask + # us (the parent) for the values and will prepend "..", so that + # all files to be installed end up below OUR ./blib # %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 -sub attrib_help { - return $Attrib_Help if $Attrib_Help; - my $switch = 0; - my $help = ""; - my $line; - while ($line = ) { - $switch ||= $line =~ /^=item C\s*$/; - next unless $switch; - last if $line =~ /^=cut/; - $help .= $line; - } -# close DATA; - $Attrib_Help = $help; + ); + + my @keep = qw/ + NEEDS_LINKING HAS_LINK_CODE + /; + @Keep_after_flush{@keep} = (1) x @keep; } sub writeMakefile { @@ -397,16 +313,8 @@ The MakeMaker team END } -sub WriteMakefile { - Carp::croak "WriteMakefile: Need even number of args" if @_ % 2; - my %att = @_; - MM->new(\%att)->flush; -} - -sub new { +sub ExtUtils::MakeMaker::new { my($class,$self) = @_; - full_setup() unless $Setup_done++; - my($key); print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose; @@ -420,30 +328,63 @@ sub 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}}}}; } else { - croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n"; + Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n"; } } # This is for old Makefiles written pre 5.00, will go away if ( Carp::longmess("") =~ /runsubdirpl/s ){ - #$self->{Correct_relativ_directories}++; - carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n"); - } else { - $self->{Correct_relativ_directories}=0; + Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n"); } - 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]){ @@ -452,12 +393,26 @@ sub 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->{$key} =~ m!^/!; + 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; @@ -467,12 +422,19 @@ sub new { $self->init_main(); if (! $self->{PERL_SRC} ) { - my($pthinks) = $INC{'Config.pm'}; - $pthinks = vmsify($pthinks) if $Is_VMS; - if ($pthinks ne $self->catfile($Config{archlibexp},'Config.pm')){ - $pthinks =~ s!/Config\.pm$!!; - $pthinks =~ s!.*/!!; - print STDOUT <canonpath($INC{'Config.pm'}); + my($cthinks) = $self->catfile($Config{'archlibexp'},'Config.pm'); + $pthinks = VMS::Filespec::vmsify($pthinks) if $Is_VMS; + if ($pthinks ne $cthinks && + !($Is_Win32 and lc($pthinks) eq lc($cthinks))) { + print "Have $pthinks expected $cthinks\n"; + if ($Is_Win32) { + $pthinks =~ s![/\\]Config\.pm$!!i; $pthinks =~ s!.*[/\\]!!; + } + else { + $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] @@ -485,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. @@ -495,6 +460,8 @@ END # # ANY CHANGES MADE HERE WILL BE LOST! # +# MakeMaker ARGV: $argv +# # MakeMaker Parameters: END @@ -510,6 +477,13 @@ END for $skip (@{$self->{SKIP} || []}) { $self->{SKIPHASH}{$skip} = 1; } + delete $self->{SKIP}; # free memory + + if ($self->{PARENT}) { + for (qw/install dist dist_basics dist_core dist_dir dist_test dist_ci/) { + $self->{SKIPHASH}{$_} = 1; + } + } # We run all the subdirectories now. They don't have much to query # from the parent, but the parent has to query them: if they need linking! @@ -517,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); @@ -533,13 +506,36 @@ 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; $ExtUtils::Manifest::Quiet=$ExtUtils::Manifest::Quiet=1; #avoid warning my(@missed)=ExtUtils::Manifest::manicheck(); if (@missed){ @@ -568,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} && ! $value =~ m!^/!; - } $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}){ @@ -610,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 { @@ -626,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; @@ -640,10 +638,15 @@ sub check_hints { return unless -f "hints/$hint.pl"; # really there # execute the hintsfile: - my $fh = new FileHandle; - $fh->open("hints/$hint.pl"); - @goodhints = <$fh>; - $fh->close; +# use FileHandle (); +# my $fh = new FileHandle; +# $fh->open("hints/$hint.pl"); + local *FH; + open(FH,"hints/$hint.pl"); +# @goodhints = <$fh>; + @goodhints = ; +# $fh->close; + close FH; print STDOUT "Processing hints file hints/$hint.pl\n"; eval join('',@goodhints); print STDOUT $@ if $@; @@ -660,30 +663,31 @@ sub mv_all_methods { # still trying to reduce the list to some reasonable minimum -- # because I want to make it easier for the user. A.K. - foreach $method (@MM_Sections, qw[ dir_target -fileparse fileparse_set_fstype installpm_x libscan makeaperl -mksymlists needs_linking subdir_x test_via_harness -test_via_script writedoc ]) { + foreach $method (@Overridable) { # We cannot say "next" here. Nick might call MY->makeaperl # which isn't defined right now - # next unless defined &{"${from}::$method"}; + # Above statement was written at 4.23 time when Tk-b8 was + # around. As Tk-b9 only builds with 5.002something and MM 5 is + # standard, we try to enable the next line again. It was + # commented out until MM 5.23 + + next unless defined &{"${from}::$method"}; *{"${to}::$method"} = \&{"${from}::$method"}; # delete would do, if we were sure, nobody ever called # MY->makeaperl directly - + # delete $symtab->{$method}; - + # If we delete a method, then it will be undefined and cannot # be called. But as long as we have Makefile.PLs that rely on # %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 @@ -691,34 +695,21 @@ test_via_script writedoc ]) { # 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 prompt { - my($mess,$def)=@_; - BEGIN { $ISA_TTY = -t STDIN && -t STDOUT } - Carp::confess("prompt function called without an argument") unless defined $mess; - $def = "" unless defined $def; - my $dispdef = "[$def] "; - my $ans; - if ($ISA_TTY) { - local $|=1; - print "$mess $dispdef"; - chop($ans = ); - } - return $ans if defined $ans; - return $def; -} - -sub help {print &attrib_help, "\n";} - -sub skipcheck{ +sub skipcheck { my($self) = shift; my($section) = @_; if ($section eq 'dynamic') { @@ -746,20 +737,32 @@ sub skipcheck{ sub flush { my $self = shift; my($chunk); - my $fh = new FileHandle; +# use FileHandle (); +# my $fh = new FileHandle; + local *FH; print STDOUT "Writing $self->{MAKEFILE} for $self->{NAME}\n"; unlink($self->{MAKEFILE}, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : ''); - $fh->open(">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!"; +# $fh->open(">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!"; + open(FH,">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!"; for $chunk (@{$self->{RESULT}}) { - print $fh "$chunk\n"; +# print $fh "$chunk\n"; + print FH "$chunk\n"; } - $fh->close; +# $fh->close; + close FH; my($finalname) = $self->{MAKEFILE}; rename("MakeMaker.tmp", $finalname); chmod 0644, $finalname unless $Is_VMS; + + if ($self->{PARENT}) { + foreach (keys %$self) { # safe memory + delete $self->{$_} unless $Keep_after_flush{$_}; + } + } + system("$Config::Config{eunicefix} $finalname") unless $Config::Config{eunicefix} eq ":"; } @@ -800,7 +803,10 @@ sub neatvalue { } return "$v" unless $t eq 'HASH'; my(@m, $key, $val); - push(@m,"$key=>".neatvalue($val)) while (($key,$val) = each %$v); + while (($key,$val) = each %$v){ + last unless defined $key; # cautious programming in case (undef,undef) is true + push(@m,"$key=>".neatvalue($val)) ; + } return "{ ".join(', ',@m)." }"; } @@ -823,13 +829,7 @@ sub selfdocument { package ExtUtils::MakeMaker; 1; -# Without selfLoader we need -__DATA__ - - -# For SelfLoader we need -# __END__ DATA - +__END__ =head1 NAME @@ -855,86 +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.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 What's new in version 5 of MakeMaker - -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. - -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]. +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(). -You should not call the class methos MM->something anymore. Instead -you should call the superclass. Something like +=head2 How To Write A Makefile.PL - sub MY::constants { - my $self = shift; - $self->MM::constants(); - } +The short answer is: Don't. -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]. + Always begin with h2xs. + Always begin with h2xs! + ALWAYS BEGIN WITH H2XS! -Try to build several extensions simultanously to debug your -Makefile.PL. You can unpack a bunch of distributed packages within one -directory and run +even if you're not building around a header file, and even if you +don't have an XS component. - perl -MExtUtils::MakeMaker -e 'WriteMakefile()' +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. -That's actually fun to watch :) +The medium answer is: -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. That's all about it. + 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 @@ -956,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. @@ -966,66 +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_LIB INSTALLPRIVLIB INSTALLSITELIB - INST_ARCHLIB INSTALLARCHLIB INSTALLSITEARCH - 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. -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. +You can check the values of these variables on your system with + + perl '-V:install.*' + +And to check the sequence in which the library directories are +searched by perl, run + + perl -le 'print join $/, @INC' -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. +=head2 PREFIX and LIB attribute -=head2 PREFIX 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 -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 + perl Makefile.PL LIB=~/lib + +This will install the module's architecture-independent files into +~/lib, the architecture-dependent files into ~/lib/$archname/auto. + +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 @@ -1042,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 @@ -1144,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) -INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)> +=head2 Which architecture dependent directory? -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 @@ -1176,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 @@ -1200,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 @@ -1219,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)" ] } @@ -1233,17 +1250,28 @@ 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 FIRST_MAKEFILE @@ -1256,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 @@ -1271,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 @@ -1281,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 @@ -1296,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 @@ -1329,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 @@ -1409,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. @@ -1424,12 +1565,24 @@ 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 string containing all object files, e.g. "tkpBind.o tkpButton.o tkpCanvas.o" +=item OPTIMIZE + +Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is +passed to subdirectory makes. + =item PERL Perl binary for tasks that can be done by miniperl @@ -1441,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 @@ -1452,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 @@ -1461,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 @@ -1469,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 @@ -1491,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 @@ -1526,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.174 $ ' =~ /\$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: @@ -1542,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 @@ -1577,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 @@ -1591,8 +1788,9 @@ part of the Makefile. These are not normally required: =item dist - {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => 'gz', - SHAR => 'shar -m', DIST_CP => 'ln'} + {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz', + SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip', + 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 @@ -1605,10 +1803,6 @@ links the rest. Default is 'best'. {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'} -=item installpm - - {SPLITLIB => '$(INST_LIB)' (default) or '$(INST_ARCHLIB)'} - =item linkext {LINKTYPE => 'static', 'dynamic' or ''} @@ -1618,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 @@ -1629,17 +1823,15 @@ be linked. {FILES => '$(INST_ARCHAUTODIR)/*.xyz'} -=item tool_autosplit +=item test - {MAXLEN =E 8} - -=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 @@ -1654,19 +1846,51 @@ 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. + +Here is a simple example of how to add a new target to the generated +Makefile: + + sub MY::postamble { + ' + $(MYEXTLIB): sdbm/Makefile + cd sdbm && $(MAKE) all + '; + } + + +=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 @@ -1691,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 @@ -1712,10 +1936,12 @@ a make test in that directory. =item make tardist -First does a command $(PREOP) which defaults to a null command. Does a -distdir next and runs C on that directory into a tarfile. Then -deletes the distdir. Finishes with a command $(POSTOP) which defaults -to a null command. +First does a distdir. Then a command $(PREOP) which defaults to a null +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. =item make dist @@ -1727,11 +1953,18 @@ Runs a tardist first and uuencodes the tarfile. =item make shdist -First does a command $(PREOP) which defaults to a null command. Does a -distdir next and runs C on that directory into a sharfile. Then -deletes the distdir. Finishes with a command $(POSTOP) which defaults -to a null command. Note: For shdist to work properly a C -program that can handle directories is mandatory. +First does a distdir. Then a command $(PREOP) which defaults to a null +command. Next it runs C on that directory into a sharfile and +deletes the intermediate directory again. Finishes with a command +$(POSTOP) which defaults to a null command. Note: For shdist to work +properly a C program that can handle directories is mandatory. + +=item make zipdist + +First does a distdir. Then a command $(PREOP) which defaults to a null +command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a +zipfile. Then deletes that directory. Finishes with a command +$(POSTOP) which defaults to a null command. =item make ci @@ -1744,37 +1977,63 @@ 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') + ZIPFLAGS ('-r') 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(). -=head1 MODIFICATION HISTORY +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). -For a more complete documentation see the file Changes in the -MakeMaker distribution package. +=head1 ENVIRONMENT -=head1 TODO +=over 8 -See the file Todo in the MakeMaker distribution package. +=item PERL_MM_OPT + +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. + +=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