From: Michael G. Schwern Date: Sat, 6 Apr 2002 03:22:03 +0000 (-0500) Subject: MakeMaker core sync 5.54_01 -> 5.55_02 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e0678a309fa2965f0728bdee01f05148de03bc0c;p=p5sagit%2Fp5-mst-13.2.git MakeMaker core sync 5.54_01 -> 5.55_02 Message-ID: <20020406082203.GA28713@blackrider> p4raw-id: //depot/perl@15764 --- diff --git a/MANIFEST b/MANIFEST index f7a7df7..be6e311 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1003,6 +1003,8 @@ lib/ExtUtils/MM_Win95.pm MakeMaker methods for Win95 lib/ExtUtils/MY.pm MakeMaker user override class lib/ExtUtils/Packlist.pm Manipulates .packlist files lib/ExtUtils/t/basic.t See if MakeMaker can build a module +lib/ExtUtils/t/Big-Fat-Dummy/Liar/Makefile.PL MakeMaker dummy module +lib/ExtUtils/t/Big-Fat-Dummy/Liar/lib/Big/Fat/Liar.pm MakeMaker dummy module lib/ExtUtils/t/Big-Fat-Dummy/lib/Big/Fat/Dummy.pm MakeMaker dummy module lib/ExtUtils/t/Big-Fat-Dummy/Makefile.PL MakeMaker dummy module lib/ExtUtils/t/Command.t See if ExtUtils::Command works (Win32 only) @@ -1010,6 +1012,7 @@ lib/ExtUtils/t/Constant.t See if ExtUtils::Constant works lib/ExtUtils/t/Embed.t See if ExtUtils::Embed and embedding works lib/ExtUtils/t/hints.t See if hint files are honored. lib/ExtUtils/t/Installed.t See if ExtUtils::Installed works +lib/ExtUtils/t/INST.t Check MakeMaker INST_* macros lib/ExtUtils/t/Manifest.t See if ExtUtils::Manifest works lib/ExtUtils/t/Mkbootstrap.t See if ExtUtils::Mkbootstrap works lib/ExtUtils/t/MM_BeOS.t See if ExtUtils::MM_BeOS works @@ -1019,6 +1022,7 @@ lib/ExtUtils/t/MM_Unix.t See if ExtUtils::MM_UNIX works lib/ExtUtils/t/MM_VMS.t See if ExtUtils::MM_VMS works lib/ExtUtils/t/MM_Win32.t See if ExtUtils::MM_Win32 works lib/ExtUtils/t/Packlist.t See if Packlist works +lib/ExtUtils/t/prefixify.t See if MakeMaker can apply a PREFIX lib/ExtUtils/t/Problem-Module/Makefile.PL MakeMaker dummy module lib/ExtUtils/t/Problem-Module/subdir/Makefile.PL MakeMaker dummy module lib/ExtUtils/t/problems.t How MakeMaker reacts to build problems diff --git a/lib/ExtUtils/Changes b/lib/ExtUtils/Changes index e344887..f364669 100644 --- a/lib/ExtUtils/Changes +++ b/lib/ExtUtils/Changes @@ -1,3 +1,58 @@ +5.55_02 Sat Apr 6 03:09:15 EST 2002 + [[ Bug Fixes ]] + - Craig Berry fixed install on VMS (again, I munged the last patch) + - MakeMaker might not be recognizing it's in PERL_SRC on Win32. + Made safer. + - For some reason MM_VMS was using $Config{arch} instead of + $Config{archname} + - Fix (well, hack) for creating ABSPERL on VMS. + + [[ Test Fixes ]] + - INST.t has to tell MakeMaker it's in the PERL_CORE + - INST_LIB doesn't change if it's in the core + +5.55_01 Thu Apr 4 23:58:06 EST 2002 + [[ API Changes ]] + * Long deprecated INST_EXE completely removed. + - Removing TEST_LIBS constant (never seen in a stable MM anyway) + - Added $default argument to prefixify() for safer prefixification. + + [[ Bug Fixes ]] + - $mm->{PERM_*} were not being set + - fixin() redundantly chmod'ing scripts. Let the Makefile do that. + - The above means MM_Unix will now compile cleanly under strict + * init_dirscan's search for Makefile.PL's will no longer look + inside a distdir. + * Fixed running tests when there are t/'s in subdirs. + - MM_DOS inheriting from MM_Unix instead of MM_Win32. DJGPP + appears to be unix-like (bleadperl@15650) + - Escaping constants with # in them so they're not confused as + make comments (bleadperl) + * ExtUtils::MM_Win95 didn't return a true value + - Fixing disttest when perl is a relative path. + * Fixed disttest & tests in subdirs on Win95 + - Fixed recursive Makefile.PL scan on VMS so it skips the distdir + - Fixed a bug when an alternative MAKEFILE is specified and you're + using something other than a Makefile.PL (RT 444) + - Quieting uninit warning when there are no tests. + + [[ Doc Fixes ]] + - Documented INSTALLMAN*DIR == 'none' feature. + + [[ Test Fixes ]] + - Paul Green's which_perl patch to build a proper Perl on systems + that use command extensions. + - basic.t's Makefile.PL PREFIX call wasn't properly quoted for VMS + (Craig Berry) + - little initialization glitch in MM_Win32.t + + [[ Internals ]] + - INST_* constants moved to init_INST + - INSTALL* constants moved to inst_INSTALL + * Internal warning supression removed. + - Temporarily turning off SelfLoader in MM_Unix so warnings + have the right line numbers. + 5.54_01 Sat Mar 30 02:32:44 EST 2002 [[ New Features ]] * Added FULLPERLRUN and FULLPERLRUNINST @@ -6,9 +61,12 @@ - hint files were made a little too noisy in 5.53_01 [[ Test Fixes ]] - - mtime appears to be broken on Tru64 5.6.0 + - adjusting for NFS time drift - basic.t was finding the wrong perl in the core + [[ Internals ]] + - FULLPERL* PERL* setup moved to init_PERL + 5.53_02 Fri Mar 29 04:47:44 EST 2002 - Adjusted for Perl core. Synced into bleadperl. @@ -161,7 +219,7 @@ 5.48_04 Mon Jan 21 19:28:38 EST 2002 - No longer requiring Test::More - Now tested to work with a clean 5.6.1 - - Stripped out $Revision: 1.27 $ based $VERSIONs. + - Stripped out $Revision: 1.48 $ based $VERSIONs. - Rolled in patches from p5p, vmsperl & VOS (14325, 14338, 14360, 14364) * hint files now run in a safer context. Only $self is available. - ExtUtils::testlib now provides absolute paths into @INC. @@ -182,7 +240,7 @@ 5.48_02 Wed Jan 16 19:11:26 EST 2002 - Fixed some Win32 warnings. Needs more work. -5.48_01 Wed Jan 16 15:10:28 EST 200 +5.48_01 Wed Jan 16 15:10:28 EST 2002 * Adapted from bleadperl@14303 * Backported to 5.6.1 - inst and xsubpp moved out of lib/ and into bin/ diff --git a/lib/ExtUtils/Command/MM.pm b/lib/ExtUtils/Command/MM.pm index 702353a..b57386c 100644 --- a/lib/ExtUtils/Command/MM.pm +++ b/lib/ExtUtils/Command/MM.pm @@ -34,18 +34,21 @@ Any $(FOO) used in the examples are make variables, not Perl. =item B - perl -MExtUtils::Command::MM -e "test_harness($(TEST_VERBOSE))" t/*.t + test_harness($verbose, @test_libs); -Runs the given tests via Test::Harness. Will exit with non-zero if -the test fails. - -Typically used with t/*.t files. +Runs the tests on @ARGV via Test::Harness passing through the $verbose +flag. Any @test_libs will be unshifted onto the test's @INC. =cut sub test_harness { require Test::Harness; + require File::Spec; + $Test::Harness::verbose = shift; + + local @INC = @INC; + unshift @INC, map { File::Spec->rel2abs($_) } @_; Test::Harness::runtests(@ARGV); } diff --git a/lib/ExtUtils/MM_Any.pm b/lib/ExtUtils/MM_Any.pm index 214c316..fb48ae2 100644 --- a/lib/ExtUtils/MM_Any.pm +++ b/lib/ExtUtils/MM_Any.pm @@ -145,8 +145,8 @@ Used on the t/*.t files. sub test_via_harness { my($self, $perl, $tests) = @_; - return qq{\t$perl "-MExtUtils::testlib" "-MExtUtils::Command::MM" }. - qq{"-e" "test_harness(\$(TEST_VERBOSE))" $tests\n}; + return qq{\t$perl "-MExtUtils::Command::MM" }. + qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n}; } =item test_via_script @@ -164,7 +164,7 @@ formatting. sub test_via_script { my($self, $perl, $script) = @_; - return "\t$perl \$(TEST_LIBS) $script\n"; + return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n}; } =back diff --git a/lib/ExtUtils/MM_Cygwin.pm b/lib/ExtUtils/MM_Cygwin.pm index 3d72aec..0192836 100644 --- a/lib/ExtUtils/MM_Cygwin.pm +++ b/lib/ExtUtils/MM_Cygwin.pm @@ -10,11 +10,12 @@ require ExtUtils::MM_Any; require ExtUtils::MM_Unix; @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); -$VERSION = 1.01_01; +$VERSION = 1.02_01; sub cflags { my($self,$libperl)=@_; return $self->{CFLAGS} if $self->{CFLAGS}; + return '' unless $self->needs_linking(); my $base = $self->SUPER::cflags($libperl); foreach (split /\n/, $base) { diff --git a/lib/ExtUtils/MM_NW5.pm b/lib/ExtUtils/MM_NW5.pm index fa3469c..6652fbb 100644 --- a/lib/ExtUtils/MM_NW5.pm +++ b/lib/ExtUtils/MM_NW5.pm @@ -87,14 +87,14 @@ sub constants { for $tmp (qw/ AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION - VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB + VERSION_SYM XS_VERSION INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_INC PERL FULLPERL LIBPTH BASE_IMPORT PERLRUN - FULLPERLRUN PERLRUNINST FULLPERLRUNINST TEST_LIBS + FULLPERLRUN PERLRUNINST FULLPERLRUNINST FULL_AR PERL_CORE NLM_VERSION MPKTOOL TOOLPATH / ) { diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index ae0251d..61f07cf 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -5,6 +5,7 @@ require 5.005_03; # Maybe further back, dunno use strict; use Exporter (); +use Carp (); use Config; use File::Basename qw(basename dirname fileparse); use File::Spec; @@ -16,7 +17,7 @@ use vars qw($VERSION @ISA use ExtUtils::MakeMaker qw($Verbose neatvalue); -$VERSION = '1.18_01'; +$VERSION = '1.20_01'; require ExtUtils::MM_Any; @ISA = qw(ExtUtils::MM_Any); @@ -125,6 +126,7 @@ sub maybe_command; sub maybe_command_in_dirs; sub needs_linking; sub nicetext; +sub parse_abstract; sub parse_version; sub pasthru; sub perl_archive; @@ -132,10 +134,10 @@ sub perl_archive_after; sub perl_script; sub perldepend; sub pm_to_blib; +sub ppd; sub post_constants; sub post_initialize; sub postamble; -sub ppd; sub prefixify; sub processPL; sub quote_paren; @@ -159,14 +161,14 @@ sub xs_cpp; sub xs_o; sub xsubpp_version; -use SelfLoader; +#use SelfLoader; # SelfLoader not smart enough to avoid autoloading DESTROY sub DESTROY { } -1; +#1; -__DATA__ +#__DATA__ =head2 SelfLoaded methods @@ -266,7 +268,7 @@ sub cflags { my($name); ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ; - if ($prog = $Config::Config{$name}) { + if ($prog = $Config{$name}) { # Expand hints for this extension via the shell print STDOUT "Processing $name hint:\n" if $Verbose; my(@o)=`cc=\"$cflags{cc}\" @@ -298,10 +300,11 @@ sub cflags { } for (qw(ccflags optimize perltype)) { + $cflags{$_} ||= ''; $cflags{$_} =~ s/^\s+//; $cflags{$_} =~ s/\s+/ /g; $cflags{$_} =~ s/\s+$//; - $self->{uc $_} ||= $cflags{$_} + $self->{uc $_} = $cflags{$_}; } if ($self->{POLLUTE}) { @@ -476,21 +479,22 @@ sub constants { for $tmp (qw/ AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION - VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB + VERSION_SYM XS_VERSION INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST - FULLPERLRUNINST TEST_LIBS + FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST FULL_AR PERL_CORE NOOP NOECHO / ) { next unless defined $self->{$tmp}; -# VOS pathnames can have sharp signs in them; escape them so -# make doesn't think it is a comment-start character. - if ($Is_VOS) {$self->{$tmp} =~ s/#/\\#/g}; + + # pathnames can have sharp signs in them; escape them so + # make doesn't think it is a comment-start character. + $self->{$tmp} =~ s/#/\\#/g; push @m, "$tmp = $self->{$tmp}\n"; } @@ -847,7 +851,7 @@ sub dist_test { my @m; push @m, q{ disttest : distdir - cd $(DISTVNAME) && $(PERLRUN) Makefile.PL + cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL cd $(DISTVNAME) && $(MAKE) cd $(DISTVNAME) && $(MAKE) test }; @@ -980,8 +984,8 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf'); # The IRIX linker doesn't use LD_RUN_PATH - my $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"} - if ($^O eq 'irix' && $self->{LD_RUN_PATH}); + my $ldrun = $^O eq 'irix' && $self->{LD_RUN_PATH} ? + qq{-rpath "$self->{LD_RUN_PATH}"} : ''; # For example in AIX the shared objects/libraries from previous builds # linger quite a while in the shared dynalinker cache even when nobody @@ -991,7 +995,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists push(@m,' $(RM_F) $@ '); - my $libs = $self->{LDLOADLIBS}; + my $libs = $self->{LDLOADLIBS} || ''; if ($^O eq 'netbsd') { # Use nothing on static perl platforms, and to the flags needed @@ -1096,15 +1100,17 @@ specified by @ExtUtils::MakeMaker::MM_Sections. =item fixin -Inserts the sharpbang or equivalent magic number to a script + $mm->fixin(@files); + +Inserts the sharpbang or equivalent magic number to a set of @files. =cut sub fixin { # stolen from the pink Camel book, more or less - my($self,@files) = @_; - my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/; - my($file,$interpreter); - for $file (@files) { + my($self, @files) = @_; + + my($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/; + for my $file (@files) { local(*FIXIN); local(*FIXOUT); open(FIXIN, $file) or Carp::croak "Can't process '$file': $!"; @@ -1116,6 +1122,7 @@ sub fixin { # stolen from the pink Camel book, more or less $cmd =~ s!^.*/!!; # Now look (in reverse) for interpreter in absolute PATH (unless perl). + my $interpreter; if ($cmd eq "perl") { if ($Config{startperl} =~ m,^\#!.*/perl,) { $interpreter = $Config{startperl}; @@ -1168,14 +1175,6 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}' close FIXIN; close FIXOUT; - # can't rename/chmod open files on some DOSISH platforms - - # If they override perm_rwx, we won't notice it during fixin, - # because fixin is run through a new instance of MakeMaker. - # That is why we must run another CHMOD later. - $mode = oct($self->perm_rwx) unless $dev; - chmod $mode, $file; - unless ( rename($file, "$file.bak") ) { warn "Can't rename $file to $file.bak: $!"; next; @@ -1191,8 +1190,6 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}' unlink "$file.bak"; } continue { close(FIXIN) if fileno(FIXIN); - chmod oct($self->perm_rwx), $file or - die "Can't reset permissions for $file: $!\n"; system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';; } } @@ -1261,8 +1258,15 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) my($self) = @_; my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods); local(%pm); #the sub in find() has to see this hash - @ignore{qw(Makefile.PL test.pl)} = (1,1); - $ignore{'makefile.pl'} = 1 if $Is_VMS; + + @ignore{qw(Makefile.PL test.pl t)} = (1,1,1); + + # ignore the distdir + $Is_VMS ? $ignore{"$self->{DISTVNAME}.dir"} = 1 + : $ignore{$self->{DISTVNAME}} = 1; + + @ignore{map lc, keys %ignore} = values %ignore if $Is_VMS; + foreach $name ($self->lsdir($Curdir)){ next if $name =~ /\#/; next if $name eq $Curdir or $name eq $Updir or $ignore{$name}; @@ -1340,14 +1344,14 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n" if ($Verbose >= 2); require File::Find; - File::Find::find(sub { - if (-d $_){ - if ($_ eq "CVS" || $_ eq "RCS"){ - $File::Find::prune = 1; - } - return; - } - return if /\#/; + File::Find::find(sub { + if (-d $_){ + if ($_ eq "CVS" || $_ eq "RCS"){ + $File::Find::prune = 1; + } + return; + } + return if /\#/; return if /~$/; # emacs temp files my $path = $File::Find::name; @@ -1380,7 +1384,8 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) foreach my $man (qw(MAN1 MAN3)) { unless ($self->{"${man}PODS"}) { $self->{"${man}PODS"} = {}; - $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/; + $pods{$man} = 1 unless + $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/; } } @@ -1436,7 +1441,8 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) } # Remove "Configure.pm" and similar, if it's not the only pod listed - # To force inclusion, just name it "Configure.pod", or override MAN3PODS + # To force inclusion, just name it "Configure.pod", or override + # MAN3PODS foreach $name (keys %manifypods) { if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) { delete $manifypods{$name}; @@ -1462,7 +1468,7 @@ Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE, EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*, INSTALL*, INSTALLDIRS, LD, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME, OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB, -PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, TEST_LIBS, VERSION, +PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION, VERSION_FROM, VERSION_SYM, XS_VERSION. =cut @@ -1495,6 +1501,7 @@ sub init_main { } ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ; + $self->{PARENT_NAME} ||= ''; if (defined &DynaLoader::mod2fname) { # As of 5.001m, dl_os2 appends '_' @@ -1504,7 +1511,7 @@ sub init_main { } - # --- Initialize PERL_LIB, INST_LIB, PERL_SRC + # --- Initialize PERL_LIB, PERL_SRC # *Real* information: where did we get these two from? ... my $inc_config_dir = dirname($INC{'Config.pm'}); @@ -1518,7 +1525,7 @@ sub init_main { File::Spec->catdir($Updir,$Updir,$Updir,$Updir)) { if ( - -f File::Spec->catfile($dir,"config.sh") + -f File::Spec->catfile($dir,"config_h.SH") && -f File::Spec->catfile($dir,"perl.h") && @@ -1529,6 +1536,10 @@ sub init_main { } } } + + warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if + $self->{PERL_CORE} and !$self->{PERL_SRC}; + if ($self->{PERL_SRC}){ $self->{PERL_LIB} ||= File::Spec->catdir("$self->{PERL_SRC}","lib"); $self->{PERL_ARCHLIB} = $self->{PERL_LIB}; @@ -1563,8 +1574,8 @@ from the perl source tree. } else { # we should also consider $ENV{PERL5LIB} here my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC}; - $self->{PERL_LIB} ||= $Config::Config{privlibexp}; - $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp}; + $self->{PERL_LIB} ||= $Config{privlibexp}; + $self->{PERL_ARCHLIB} ||= $Config{archlibexp}; $self->{PERL_INC} = File::Spec->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now my $perl_h; @@ -1617,177 +1628,25 @@ usually solves this kind of problem. # MakeMaker. $self->{INSTALLDIRS} ||= "site"; - # INST_LIB typically pre-set if building an extension after - # perl has been built and installed. Setting INST_LIB allows - # you to build directly into, say $Config::Config{privlibexp}. - unless ($self->{INST_LIB}){ - - - ##### XXXXX We have to change this nonsense - - if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") { - $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB}; - } else { - $self->{INST_LIB} = File::Spec->catdir($Curdir,"blib","lib"); - } - } - $self->{INST_ARCHLIB} ||= File::Spec->catdir($Curdir,"blib","arch"); - $self->{INST_BIN} ||= File::Spec->catdir($Curdir,'blib','bin'); - - # We need to set up INST_LIBDIR before init_libscan() for VMS - my @parentdir = split(/::/, $self->{PARENT_NAME}); - $self->{INST_LIBDIR} = File::Spec->catdir($self->{INST_LIB},@parentdir); - $self->{INST_ARCHLIBDIR} = File::Spec->catdir($self->{INST_ARCHLIB},@parentdir); - $self->{INST_AUTODIR} = File::Spec->catdir($self->{INST_LIB},'auto',$self->{FULLEXT}); - $self->{INST_ARCHAUTODIR} = File::Spec->catdir($self->{INST_ARCHLIB},'auto',$self->{FULLEXT}); - - # INST_EXE is deprecated, should go away March '97 - $self->{INST_EXE} ||= File::Spec->catdir($Curdir,'blib','script'); - $self->{INST_SCRIPT} ||= File::Spec->catdir($Curdir,'blib','script'); - - # The user who requests an installation directory explicitly - # should not have to tell us an architecture installation directory - # as well. We look if a directory exists that is named after the - # architecture. If not we take it as a sign that it should be the - # same as the requested installation directory. Otherwise we take - # the found one. - # We do the same thing twice: for privlib/archlib and for sitelib/sitearch - my($libpair); - for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) { - my $lib = "install$libpair->{l}"; - my $Lib = uc $lib; - my $Arch = uc "install$libpair->{a}"; - if( $self->{$Lib} && ! $self->{$Arch} ){ - my($ilib) = $Config{$lib}; - $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS; - - $self->prefixify($Arch,$ilib,$self->{$Lib}); - - unless (-d $self->{$Arch}) { - print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose; - $self->{$Arch} = $self->{$Lib}; - } - print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose; - } - } - - # we have to look at the relation between $Config{prefix} and the - # requested values. We're going to set the $Config{prefix} part of - # all the installation path variables to literally $(PREFIX), so - # the user can still say make PREFIX=foo - my($configure_prefix) = $Config{'prefix'}; - $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS; - $self->{PREFIX} ||= $configure_prefix; - - - my($install_variable,$search_prefix,$replace_prefix); - # If the prefix contains perl, Configure shapes the tree as follows: - # perlprefix/lib/ INSTALLPRIVLIB - # perlprefix/lib/pod/ - # perlprefix/lib/site_perl/ INSTALLSITELIB - # perlprefix/bin/ INSTALLBIN - # perlprefix/man/ INSTALLMAN1DIR - # else - # prefix/lib/perl5/ INSTALLPRIVLIB - # prefix/lib/perl5/pod/ - # prefix/lib/perl5/site_perl/ INSTALLSITELIB - # prefix/bin/ INSTALLBIN - # prefix/lib/perl5/man/ INSTALLMAN1DIR - # - # The above results in various kinds of breakage on various - # platforms, so we cope with it as follows: if prefix/lib/perl5 - # or prefix/lib/perl5/man exist, we'll replace those instead - # of /prefix/{lib,man} - - $replace_prefix = qq[\$\(PREFIX\)]; - for $install_variable (qw/ - INSTALLBIN - INSTALLSCRIPT - /) { - $self->prefixify($install_variable,$configure_prefix,$replace_prefix); - } - my $funkylibdir = File::Spec->catdir($configure_prefix,"lib","perl5"); - $funkylibdir = '' unless -d $funkylibdir; - $search_prefix = $funkylibdir || - File::Spec->catdir($configure_prefix,"lib"); + $self->init_INST; + $self->init_INSTALL; - if ($self->{LIB}) { - $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB}; - $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = - File::Spec->catdir($self->{LIB},$Config{'archname'}); - } - else { - if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5")) { - $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", - "perl5"); - } - else { - $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib"); - } - for $install_variable (qw/ - INSTALLPRIVLIB - INSTALLARCHLIB - INSTALLSITELIB - INSTALLSITEARCH - /) - { - $self->prefixify($install_variable,$search_prefix,$replace_prefix); - } - } - my $funkymandir = File::Spec->catdir($configure_prefix,"lib","perl5","man"); - $funkymandir = '' unless -d $funkymandir; - $search_prefix = $funkymandir || File::Spec->catdir($configure_prefix,"man"); - if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5", "man")) { - $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man"); - } - else { - $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"man"); - } - for $install_variable (qw/ - INSTALLMAN1DIR - INSTALLMAN3DIR - /) - { - $self->prefixify($install_variable,$search_prefix,$replace_prefix); - } - - # Now we head at the manpages. Maybe they DO NOT want manpages - # installed - $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir} - unless defined $self->{INSTALLMAN1DIR}; - unless (defined $self->{INST_MAN1DIR}){ - if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){ - $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR}; - } else { - $self->{INST_MAN1DIR} = File::Spec->catdir($Curdir,'blib','man1'); - } - } - $self->{MAN1EXT} ||= $Config::Config{man1ext}; - - $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir} - unless defined $self->{INSTALLMAN3DIR}; - unless (defined $self->{INST_MAN3DIR}){ - if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){ - $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR}; - } else { - $self->{INST_MAN3DIR} = File::Spec->catdir($Curdir,'blib','man3'); - } - } - $self->{MAN3EXT} ||= $Config::Config{man3ext}; + $self->{MAN1EXT} ||= $Config{man1ext}; + $self->{MAN3EXT} ||= $Config{man3ext}; # Get some stuff out of %Config if we haven't yet done so print STDOUT "CONFIG must be an array ref\n" if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY'); $self->{CONFIG} = [] unless (ref $self->{CONFIG}); push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config); - push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags}; + push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags}; my(%once_only,$m); foreach $m (@{$self->{CONFIG}}){ next if $once_only{$m}; print STDOUT "CONFIG key '$m' does not exist in Config.pm\n" - unless exists $Config::Config{$m}; - $self->{uc $m} ||= $Config::Config{$m}; + unless exists $Config{$m}; + $self->{uc $m} ||= $Config{$m}; $once_only{$m} = 1; } @@ -1831,6 +1690,7 @@ usually solves this kind of problem. $self->{VERSION} ||= "0.10"; ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g; + $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION}"; # Graham Barr and Paul Marquess had some ideas how to ensure # version compatibility between the *.pm file and the @@ -1838,11 +1698,6 @@ usually solves this kind of problem. # XS_VERSION macro that defaults to VERSION: $self->{XS_VERSION} ||= $self->{VERSION}; - # What extra library dirs do we need when running the tests? - # Make sure these are absolute paths in case the test chdirs. - $self->{TEST_LIBS} .= join '', - map { ' "-I'.File::Spec->rel2abs($_).'"' } - $self->{INST_ARCHLIB}, $self->{INST_LIB}; # --- Initialize Perl Binary Locations $self->init_PERL; @@ -1874,7 +1729,8 @@ sub init_others { # --- Initialize Other Attributes my(@libs) = $self->extliblist($libs); if ($libs[0] or $libs[1] or $libs[2]){ # LD_RUN_PATH now computed by ExtUtils::Liblist - ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs; + ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, + $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs; last; } } @@ -1898,7 +1754,7 @@ sub init_others { # --- Initialize Other Attributes if (!$self->{LINKTYPE}) { $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'} ? 'static' - : ($Config::Config{usedl} ? 'dynamic' : 'static'); + : ($Config{usedl} ? 'dynamic' : 'static'); }; # These get overridden for VMS and maybe some other systems @@ -1918,15 +1774,180 @@ sub init_others { # --- Initialize Other Attributes $self->{DEV_NULL} ||= "> /dev/null 2>&1"; } +=item init_INST + + $mm->init_INST; + +Called by init_main. Sets up all INST_* variables. + +=cut + +sub init_INST { + my($self) = shift; + + $self->{INST_ARCHLIB} ||= File::Spec->catdir($Curdir,"blib","arch"); + $self->{INST_BIN} ||= File::Spec->catdir($Curdir,'blib','bin'); + + # INST_LIB typically pre-set if building an extension after + # perl has been built and installed. Setting INST_LIB allows + # you to build directly into, say $Config{privlibexp}. + unless ($self->{INST_LIB}){ + if ($self->{PERL_CORE}) { + $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB}; + } else { + $self->{INST_LIB} = File::Spec->catdir($Curdir,"blib","lib"); + } + } + + my @parentdir = split(/::/, $self->{PARENT_NAME}); + $self->{INST_LIBDIR} = File::Spec->catdir($self->{INST_LIB},@parentdir); + $self->{INST_ARCHLIBDIR} = File::Spec->catdir($self->{INST_ARCHLIB}, + @parentdir); + $self->{INST_AUTODIR} = File::Spec->catdir($self->{INST_LIB},'auto', + $self->{FULLEXT}); + $self->{INST_ARCHAUTODIR} = File::Spec->catdir($self->{INST_ARCHLIB}, + 'auto',$self->{FULLEXT}); + + $self->{INST_SCRIPT} ||= File::Spec->catdir($Curdir,'blib','script'); + + $self->{INST_MAN1DIR} ||= File::Spec->catdir($Curdir,'blib','man1'); + $self->{INST_MAN3DIR} ||= File::Spec->catdir($Curdir,'blib','man3'); + + return 1; +} + +=item init_INSTALL + + $mm->init_INSTALL; + +Called by init_main. Sets up all INSTALL_* variables (except +INSTALLDIRS) and PREFIX. + +=cut + +sub init_INSTALL { + my($self) = shift; + + # The user who requests an installation directory explicitly + # should not have to tell us an architecture installation directory + # as well. We look if a directory exists that is named after the + # architecture. If not we take it as a sign that it should be the + # same as the requested installation directory. Otherwise we take + # the found one. + # We do the same thing twice: for privlib/archlib and for sitelib/sitearch + for my $libpair ({l=>"privlib", a=>"archlib"}, + {l=>"sitelib", a=>"sitearch"}) + { + my $lib = "install$libpair->{l}"; + my $Lib = uc $lib; + my $Arch = uc "install$libpair->{a}"; + if( $self->{$Lib} && ! $self->{$Arch} ){ + my($ilib) = $Config{$lib}; + $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS; + + $self->prefixify($Arch,$ilib,$self->{$Lib}); + + unless (-d $self->{$Arch}) { + print STDOUT "Directory $self->{$Arch} not found\n" + if $Verbose; + $self->{$Arch} = $self->{$Lib}; + } + print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose; + } + } + + # we have to look at the relation between $Config{prefix} and the + # requested values. We're going to set the $Config{prefix} part of + # all the installation path variables to literally $(PREFIX), so + # the user can still say make PREFIX=foo + my($configure_prefix) = $Config{'prefix'}; + $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS; + $self->{PREFIX} ||= $configure_prefix; + + + my($search_prefix, $replace_prefix); + # If the prefix contains perl, Configure shapes the tree as follows: + # perlprefix/lib/ INSTALLPRIVLIB + # perlprefix/lib/pod/ + # perlprefix/lib/site_perl/ INSTALLSITELIB + # perlprefix/bin/ INSTALLBIN + # perlprefix/man/ INSTALLMAN1DIR + # else + # prefix/lib/perl5/ INSTALLPRIVLIB + # prefix/lib/perl5/pod/ + # prefix/lib/perl5/site_perl/ INSTALLSITELIB + # prefix/bin/ INSTALLBIN + # prefix/lib/perl5/man/ INSTALLMAN1DIR + # + # The above results in various kinds of breakage on various + # platforms, so we cope with it as follows: if prefix/lib/perl5 + # or prefix/lib/perl5/man exist, we'll replace those instead + # of /prefix/{lib,man} + + $replace_prefix = '$(PREFIX)'; + for my $install_variable (qw/INSTALLBIN INSTALLSCRIPT/) + { + $self->prefixify($install_variable,$configure_prefix,$replace_prefix); + } + + my $funkylibdir = File::Spec->catdir($configure_prefix,"lib","perl5"); + $funkylibdir = '' unless -d $funkylibdir; + $search_prefix = $funkylibdir || + File::Spec->catdir($configure_prefix,"lib"); + + if ($self->{LIB}) { + $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB}; + $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = + File::Spec->catdir($self->{LIB},$Config{'archname'}); + } + else { + if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5")) { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", + "perl5"); + } + else { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib"); + } + for my $install_variable (qw/ + INSTALLPRIVLIB + INSTALLARCHLIB + INSTALLSITELIB + INSTALLSITEARCH + /) + { + $self->prefixify($install_variable,$search_prefix,$replace_prefix); + } + } + my $funkymandir = File::Spec->catdir($configure_prefix,"lib","perl5","man"); + $funkymandir = '' unless -d $funkymandir; + $search_prefix = $funkymandir || File::Spec->catdir($configure_prefix,"man"); + if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5", "man")) { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man"); + } + else { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"man"); + } + for my $install_variable (qw/ + INSTALLMAN1DIR + INSTALLMAN3DIR + /) + { + $self->prefixify($install_variable,$search_prefix,$replace_prefix); + } + + return 1; +} + =item init_PERL - $self->init_PERL; + $mm->init_PERL; -Called by init_main. Sets up PERL, FULLPERL, PERLRUN, PERLRUNINST, -FULLPERLRUN and FULLPERLRUNINST. +Called by init_main. Sets up ABSPERL, PERL, FULLPERL and all the +*PERLRUN* permutations. PERL is allowed to be miniperl FULLPERL must be a complete perl + ABSPERL is PERL converted to an absolute path *PERLRUN contains everything necessary to run perl, find it's libraries, etc... @@ -1941,7 +1962,7 @@ sub init_PERL { my @defpath = (); foreach my $component ($self->{PERL_SRC}, $self->path(), - $Config::Config{binexp}) + $Config{binexp}) { push @defpath, $component if defined $component; } @@ -1972,11 +1993,23 @@ sub init_PERL { ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i unless $self->{FULLPERL}; + # Little hack to get around VMS's find_perl putting "MCR" in front + # sometimes. + $self->{ABSPERL} = $self->{PERL}; + my $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//; + if( File::Spec->file_name_is_absolute($self->{ABSPERL}) ) { + $self->{ABSPERL} = '$(PERL)'; + } + else { + $self->{ABSPERL} = File::Spec->rel2abs($self->{ABSPERL}); + $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr; + } + # Are we building the core? $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE}; # How do we run perl? - foreach my $perl (qw(PERL FULLPERL)) { + foreach my $perl (qw(PERL FULLPERL ABSPERL)) { $self->{$perl.'RUN'} = "\$($perl)"; # Make sure perl can find itself before it's installed. @@ -1984,12 +2017,29 @@ sub init_PERL { if $self->{UNINSTALLED_PERL} || $self->{PERL_CORE}; $self->{$perl.'RUNINST'} = - q{$(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}; + sprintf q{$(%sRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}, $perl; } return 1; } +=item init_PERM + + $mm->init_PERM + +Called by init_main. Initializes PERL_* + +=cut + +sub init_PERM { + my($self) = shift; + + $self->{PERM_RW} = 644; + $self->{PERM_RWX} = 755; + + return 1; +} + =item install (o) @@ -2008,9 +2058,6 @@ install_perl :: all pure_perl_install doc_perl_install install_site :: all pure_site_install doc_site_install -install_ :: install_site - @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site - pure_install :: pure_$(INSTALLDIRS)_install doc_install :: doc_$(INSTALLDIRS)_install @@ -2261,8 +2308,8 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) $cccmd = $self->const_cccmd($libperl); $cccmd =~ s/^CCCMD\s*=\s*//; $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /; - $cccmd .= " $Config::Config{cccdlflags}" - if ($Config::Config{useshrplib} eq 'true'); + $cccmd .= " $Config{cccdlflags}" + if ($Config{useshrplib} eq 'true'); $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/; # The front matter of the linkcommand... @@ -2350,7 +2397,7 @@ MAP_PERLINC = @{$perlinc || []} MAP_STATIC = ", join(" \\\n\t", reverse sort keys %static), " -MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} +MAP_PRELIBS = $Config{perllibs} $Config{cryptlib} "; if (defined $libperl) { @@ -2367,7 +2414,7 @@ MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} if (! -f $libperl and ! -f $lperl) { # We did not find a static libperl. Maybe there is a shared one? if ($^O eq 'solaris' or $^O eq 'sunos') { - $lperl = $libperl = "$dir/$Config::Config{libperl}"; + $lperl = $libperl = "$dir/$Config{libperl}"; # SUNOS ld does not take the full path to a shared library $libperl = '' if $^O eq 'sunos'; } @@ -2379,8 +2426,12 @@ MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} unless (-f $lperl || defined($self->{PERL_SRC})); } + # SUNOS ld does not take the full path to a shared library + my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl'; + push @m, " MAP_LIBPERL = $libperl +LLIBPERL = $llibperl "; push @m, " @@ -2393,12 +2444,10 @@ MAP_LIBPERL = $libperl foreach $catfile (@$extra){ push @m, "\tcat $catfile >> \$\@\n"; } - # SUNOS ld does not take the full path to a shared library - $self->{LLIBPERL} = ($libperl)?'$(MAP_LIBPERL)':'-lperl'; push @m, " \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all - \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $self->{LLIBPERL} `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) + \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call' $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)' $self->{NOECHO}echo 'To remove the intermediate files say' @@ -2466,7 +2515,7 @@ $(OBJECT) : $(FIRST_MAKEFILE) push @m, q{ # We take a very conservative approach here, but it\'s worth it. # We move Makefile to Makefile.old here to avoid gnu make looping. -}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP) +}.$self->{MAKEFILE}.q{ :: Makefile.PL $(CONFIGDEP) }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?" }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..." -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{ @@ -2477,10 +2526,6 @@ $(OBJECT) : $(FIRST_MAKEFILE) }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <==" false -# To change behavior to :: would be nice, but would break Tk b9.02 -# so you find such a warning below the dist target. -#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM) -# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)" }; join "", @m; @@ -2633,6 +2678,33 @@ sub nicetext { $text; } +=item parse_abstract + +parse a file and return what you think is the ABSTRACT + +=cut + +sub parse_abstract { + my($self,$parsefile) = @_; + my $result; + local *FH; + local $/ = "\n"; + open(FH,$parsefile) or die "Could not open '$parsefile': $!"; + my $inpod = 0; + my $package = $self->{DISTNAME}; + $package =~ s/-/::/g; + while () { + $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; + next if !$inpod; + chop; + next unless /^($package\s-\s)(.*)/; + $result = $2; + last; + } + close FH; + return $result; +} + =item parse_version parse a file and return what you think is $VERSION in this file set to. @@ -2674,32 +2746,6 @@ sub parse_version { return $result; } -=item parse_abstract - -parse a file and return what you think is the ABSTRACT - -=cut - -sub parse_abstract { - my($self,$parsefile) = @_; - my $result; - local *FH; - local $/ = "\n"; - open(FH,$parsefile) or die "Could not open '$parsefile': $!"; - my $inpod = 0; - my $package = $self->{DISTNAME}; - $package =~ s/-/::/g; - while () { - $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; - next if !$inpod; - chop; - next unless /^($package\s-\s)(.*)/; - $result = $2; - last; - } - close FH; - return $result; -} =item pasthru (o) @@ -2816,68 +2862,13 @@ PERL_HDRS = \ $(PERL_INC)/warnings.h $(OBJECT) : $(PERL_HDRS) -} if $self->{OBJECT}; + } if $self->{OBJECT}; push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}}; join "\n", @m; } -=item ppd - -Defines target that creates a PPD (Perl Package Description) file -for a binary distribution. - -=cut - -sub ppd { - my($self) = @_; - my(@m); - if ($self->{ABSTRACT_FROM}){ - $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or - Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n"; - } - my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3]; - push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n"); - push(@m, "ppd:\n"); - push(@m, "\t\@\$(PERL) -e \"print qq{{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}"); - push(@m, ". qq{\\t$self->{DISTNAME}\\n}"); - my $abstract = $self->{ABSTRACT}; - $abstract =~ s/\n/\\n/sg; - $abstract =~ s//>/g; - push(@m, ". qq{\\t$abstract\\n}"); - my ($author) = $self->{AUTHOR}; - $author =~ s//>/g; - $author =~ s/@/\\@/g; - push(@m, ". qq{\\t$author\\n}"); - push(@m, ". qq{\\t\\n}"); - my ($prereq); - foreach $prereq (sort keys %{$self->{PREREQ_PM}}) { - my $pre_req = $prereq; - $pre_req =~ s/::/-/g; - my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3]; - push(@m, ". qq{\\t\\t\\n}"); - } - push(@m, ". qq{\\t\\t\\n}"); - push(@m, ". qq{\\t\\t\\n}"); - my ($bin_location) = $self->{BINARY_LOCATION}; - $bin_location =~ s/\\/\\\\/g; - if ($self->{PPM_INSTALL_SCRIPT}) { - if ($self->{PPM_INSTALL_EXEC}) { - push(@m, " . qq{\\t\\t{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}\\n}"); - } - else { - push(@m, " . qq{\\t\\t$self->{PPM_INSTALL_SCRIPT}\\n}"); - } - } - push(@m, ". qq{\\t\\t\\n}"); - push(@m, ". qq{\\t\\n}"); - push(@m, ". qq{\\n}\" > $self->{DISTNAME}.ppd"); - - join("", @m); -} =item perm_rw (o) @@ -2933,7 +2924,7 @@ pm_to_blib: $(TO_INST_PM) }; my %pm_to_blib = %{$self->{PM}}; my @a; - my $l; + my $l = 0; while (my ($pm, $blib) = each %pm_to_blib) { my $la = length $pm; my $lb = length $blib; @@ -2983,23 +2974,125 @@ sub postamble { ""; } +=item ppd + +Defines target that creates a PPD (Perl Package Description) file +for a binary distribution. + +=cut + +sub ppd { + my($self) = @_; + + if ($self->{ABSTRACT_FROM}){ + $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or + Carp::carp "WARNING: Setting ABSTRACT via file ". + "'$self->{ABSTRACT_FROM}' failed\n"; + } + + my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0)x4)[0..3]; + + my $abstract = $self->{ABSTRACT} || ''; + $abstract =~ s/\n/\\n/sg; + $abstract =~ s//>/g; + + my $author = $self->{AUTHOR} || ''; + $author =~ s//>/g; + $author =~ s/@/\\@/g; + + my $make_ppd = sprintf <<'PPD_OUT', $pack_ver, $abstract, $author; +# Creates a PPD (Perl Package Description) for a binary distribution. +ppd: + @$(PERL) -e "print qq{\n\t$(DISTNAME)\n\t%s\n\t%s\n}" > $(DISTNAME).ppd +PPD_OUT + + + $make_ppd .= ' @$(PERL) -e "print qq{\t\n'; + foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) { + my $pre_req = $prereq; + $pre_req =~ s/::/-/g; + my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), + (0) x 4) [0 .. 3]; + $make_ppd .= sprintf q{\t\t\n}, $pre_req, $dep_ver; + } + $make_ppd .= qq[}" >> \$(DISTNAME).ppd\n]; + + + $make_ppd .= sprintf <<'PPD_OUT', $Config{archname}; + @$(PERL) -e "print qq{\t\t\n\t\t\n +PPD_OUT + + chomp $make_ppd; + + + if ($self->{PPM_INSTALL_SCRIPT}) { + if ($self->{PPM_INSTALL_EXEC}) { + $make_ppd .= sprintf q{\t\t%s\n}, + $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT}; + } + else { + $make_ppd .= sprintf q{\t\t%s\n}, + $self->{PPM_INSTALL_SCRIPT}; + } + } + + my ($bin_location) = $self->{BINARY_LOCATION} || ''; + $bin_location =~ s/\\/\\\\/g; + + $make_ppd .= sprintf q{\t\t\n}, $bin_location; + $make_ppd .= q{\t\n}; + $make_ppd .= q{\n}; + + $make_ppd .= '}" >> $(DISTNAME).ppd'; + + return $make_ppd; +} + =item prefixify - my $prefixed = $MM->prefixify($var, $search, $replace); + $MM->prefixify($var, $prefix, $new_prefix, $default); -Check a path variable in $self from %Config, if it contains a prefix, -and replace it with another one. +Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to +replace it's $prefix with a $new_prefix. Should the $prefix fail to +match it sill simply set it to the $new_prefix + $default. -Takes as arguments an attribute name, a search prefix and a -replacement prefix. Changes the attribute in the object. +This is for heuristics which attempt to create directory structures +that mirror those of the installed perl. + +For example: + + $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1'); + +this will attempt to remove '/usr' from the front of the +$MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir} +if necessary) and replace it with '/home/foo'. If this fails it will +simply use '/home/foo/man/man1'. =cut sub prefixify { - my($self,$var,$sprefix,$rprefix) = @_; - $self->{uc $var} ||= $Config{lc $var}; - $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS; - $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s; + my($self,$var,$sprefix,$rprefix,$default) = @_; + + my $path = $self->{uc $var} || $Config{lc $var}; + + print STDERR "Prefixing $var=$path\n" if $Verbose >= 2; + print STDERR " from $sprefix to $rprefix\n" + if $Verbose >= 2; + + $path = VMS::Filespec::unixpath($path) if $Is_VMS; + + unless( $path =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s ) { + + print STDERR " cannot prefix, using default.\n" if $Verbose >= 2; + print STDERR " no default!\n" if $Verbose >= 2; + + $path = File::Spec->catdir($rprefix, $default) if $default; + } + + print " now $path\n" if $Verbose >= 2; + return $self->{uc $var} = $path; } @@ -3057,16 +3150,25 @@ sub realclean { my($self, %attribs) = @_; my(@m); - push(@m,'LLIBPERL = '.$self->{LLIBPERL}."\n"); - push(@m,' # Delete temporary files (via clean) and also delete installed files realclean purge :: clean '); # realclean subdirectories first (already cleaned) - my $sub = ($Is_Win32 && Win32::IsWin95()) ? - "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" : - "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n"; + my $sub; + if( $Is_Win32 && Win32::IsWin95() ) { + $sub = <<'REALCLEAN'; + -cd %s + -$(PERLRUN) -e "exit unless -f shift; system q{$(MAKE) realclean}" %s + -cd .. +REALCLEAN + } + else { + $sub = <<'REALCLEAN'; + -cd %s && $(TEST_F) %s && $(MAKE) %s realclean +REALCLEAN + } + foreach(@{$self->{DIR}}){ push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old")); push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",'')); @@ -3302,7 +3404,7 @@ sub test { # --- Test and Installation Sections --- my($self, %attribs) = @_; - my $tests = $attribs{TESTS}; + my $tests = $attribs{TESTS} || ''; if (!$tests && -d 't') { $tests = $Is_Win32 ? join(' ', ) : 't/*.t'; } @@ -3319,8 +3421,14 @@ testdb :: testdb_\$(LINKTYPE) test :: \$(TEST_TYPE) "); - push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n", - @{$self->{DIR}})); + + if ($Is_Win32 && Win32::IsWin95()) { + push(@m, map(qq{\t$self->{NOECHO}\$(PERLRUN) -e "exit unless -f shift; chdir '$_'; system q{\$(MAKE) test \$(PASTHRU)}" $self->{MAKEFILE}\n}, @{$self->{DIR}})); + } + else { + push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n", @{$self->{DIR}})); + } + push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n") unless $tests or -f "test.pl" or @{$self->{DIR}}; push(@m, "\n"); diff --git a/lib/ExtUtils/MM_VMS.pm b/lib/ExtUtils/MM_VMS.pm index 881b8a9..bb38b8b 100644 --- a/lib/ExtUtils/MM_VMS.pm +++ b/lib/ExtUtils/MM_VMS.pm @@ -14,7 +14,7 @@ use VMS::Filespec; use File::Basename; use File::Spec; use vars qw($Revision @ISA $VERSION); -($VERSION) = $Revision = '5.62_01'; +($VERSION) = $Revision = '5.63_01'; require ExtUtils::MM_Any; require ExtUtils::MM_Unix; @@ -332,6 +332,20 @@ sub replace_manpage_separator { $man; } +=item init_main (override) + +Override DISTVNAME so it uses VERSION_SYM to avoid getting too many +dots in the name. + +=cut + +sub init_main { + my($self) = shift; + + $self->SUPER::init_main; + $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}"; +} + =item init_others (override) Provide VMS-specific forms of various utility commands, then hand @@ -373,6 +387,7 @@ sub constants { # Be kind about case for pollution for (@ARGV) { $_ = uc($_) if /POLLUTE/i; } + $self->{DEFINE} ||= ''; if ($self->{DEFINE} ne '') { my(@terms) = split(/\s+/,$self->{DEFINE}); my(@defs,@udefs); @@ -391,8 +406,12 @@ sub constants { push @$targ, $def; } $self->{DEFINE} = ''; - if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; } - if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; } + if (@defs) { + $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; + } + if (@udefs) { + $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; + } } if ($self->{OBJECT} =~ /\s/) { @@ -403,7 +422,7 @@ sub constants { foreach $macro ( qw [ - INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB + INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INSTALLPRIVLIB INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH @@ -424,13 +443,14 @@ sub constants { foreach $macro (qw/ AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION - INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX + INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST - FULLPERLRUNINST TEST_LIBS PERL_CORE NOECHO NOOP + FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST + PERL_CORE NOECHO NOOP / ) { next unless defined $self->{$macro}; push @m, "$macro = $self->{$macro}\n"; @@ -631,6 +651,8 @@ sub cflags { # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g; $self->{CCFLAGS} = $quals; + $self->{PERLTYPE} ||= ''; + $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'}; if ($self->{OPTIMIZE} !~ m!/!) { if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' } @@ -681,7 +703,7 @@ sub const_cccmd { push @m,' .FIRST ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ', - ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),' + ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),' ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include'; } @@ -939,6 +961,8 @@ sub dist { $attribs{VERSION} =~ s/[^\w\$]/_/g; $attribs{NAME} =~ s/[^\w\$]/-/g; + $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)'; + return $self->SUPER::dist(%attribs); } @@ -1578,7 +1602,7 @@ q{ disttest : distdir startdir = F$Environment("Default") Set Default [.$(DISTVNAME)] - $(PERLRUN) Makefile.PL + $(ABSPERLRUN) Makefile.PL $(MMS)$(MMSQUALIFIERS) $(MMS)$(MMSQUALIFIERS) test Set Default 'startdir' @@ -1620,9 +1644,6 @@ install_perl :: all pure_perl_install doc_perl_install install_site :: all pure_site_install doc_site_install $(NOECHO) $(NOOP) -install_ :: install_site - $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" - pure_install :: pure_$(INSTALLDIRS)_install $(NOECHO) $(NOOP) @@ -1637,8 +1658,8 @@ doc__install : doc_site_install # This hack brought to you by DCL's 255-character command line limit pure_perl_install :: - $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist') " >.MM_tmp - $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist') " >>.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp @@ -1651,8 +1672,8 @@ pure_perl_install :: # Likewise pure_site_install :: - $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist') " >.MM_tmp - $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist') " >>.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp @@ -1743,7 +1764,7 @@ $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h if ($self->{PERL_SRC}) { my(@macros); my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)'; - push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP'; + push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP'; push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc'; push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc'; push(@macros,'SOCKET=1') if $Config{'d_has_sockets'}; diff --git a/lib/ExtUtils/MM_Win32.pm b/lib/ExtUtils/MM_Win32.pm index d8c7367..2d8ccca 100644 --- a/lib/ExtUtils/MM_Win32.pm +++ b/lib/ExtUtils/MM_Win32.pm @@ -184,14 +184,15 @@ sub constants { for $tmp (qw/ AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION - VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB + VERSION_SYM XS_VERSION INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST - FULLPERLRUNINST TEST_LIBS FULL_AR PERL_CORE + FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST + FULL_AR PERL_CORE / ) { next unless defined $self->{$tmp}; @@ -475,26 +476,6 @@ sub export_list return "$self->{BASEEXT}.def"; } -=item canonpath - -No physical check on the filesystem, but a logical cleanup of a -path. On UNIX eliminated successive slashes and successive "/.". - -=cut - -sub canonpath { - my($self,$path) = @_; - $path =~ s/^([a-z]:)/\u$1/; - $path =~ s|/|\\|g; - $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx - $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx - $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx - $path =~ s|\\$|| - unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx - $path .= '.' if $path =~ m#\\$#; - $path; -} - =item perl_script Takes one argument, a file name, and returns the file name, if the @@ -786,7 +767,6 @@ sub pasthru { } - 1; __END__ diff --git a/lib/ExtUtils/MM_Win95.pm b/lib/ExtUtils/MM_Win95.pm index aaabc13..65fac14 100644 --- a/lib/ExtUtils/MM_Win95.pm +++ b/lib/ExtUtils/MM_Win95.pm @@ -1,7 +1,7 @@ package ExtUtils::MM_Win95; use vars qw($VERSION @ISA); -$VERSION = 0.01; +$VERSION = 0.02; require ExtUtils::MM_Win32; @ISA = qw(ExtUtils::MM_Win32); @@ -9,6 +9,18 @@ require ExtUtils::MM_Win32; # a few workarounds for command.com (very basic) +sub dist_test { + my($self) = shift; + return q{ +disttest : distdir + cd $(DISTVNAME) + $(ABSPERLRUN) Makefile.PL + $(MAKE) $(PASTHRU) + $(MAKE) test $(PASTHRU) + cd .. +}; +} + sub xs_c { my($self) = shift; return '' unless $self->needs_linking(); diff --git a/lib/ExtUtils/MakeMaker.pm b/lib/ExtUtils/MakeMaker.pm index a505b15..075049d 100644 --- a/lib/ExtUtils/MakeMaker.pm +++ b/lib/ExtUtils/MakeMaker.pm @@ -2,10 +2,10 @@ BEGIN {require 5.004;} package ExtUtils::MakeMaker; -$VERSION = "5.54_01"; +$VERSION = "5.55_02"; $Version_OK = "5.49"; # Makefiles older than $Version_OK will die # (Will be checked from MakeMaker version 4.13 onwards) -($Revision = substr(q$Revision: 1.23 $, 10)) =~ s/\s+$//; +($Revision = substr(q$Revision: 1.33 $, 10)) =~ s/\s+$//; require Exporter; use Config; @@ -14,7 +14,7 @@ use Carp (); use vars qw( @ISA @EXPORT @EXPORT_OK $ISA_TTY $Revision $VERSION $Verbose $Version_OK %Config - %Keep_after_flush %MM_Sections @Prepend_dot_dot + %Keep_after_flush %MM_Sections @Prepend_parent %Recognized_Att_Keys @Get_from_Config @MM_Sections @Overridable @Parent $PACKNAME ); @@ -34,26 +34,23 @@ full_setup(); require ExtUtils::MM; # Things like CPAN assume loading ExtUtils::MakeMaker # will give them MM. -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; require ExtUtils::MY; my %att = @_; - MM->new(\%att)->flush; + my $mm = MM->new(\%att); + $mm->flush; + + return $mm; } 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; + Carp::confess("prompt function called without an argument") + unless defined $mess; my $dispdef = defined $def ? "[$def] " : " "; $def = defined $def ? $def : ""; my $ans; @@ -123,7 +120,7 @@ sub full_setup { INC INCLUDE_EXT INSTALLARCHLIB INSTALLBIN INSTALLDIRS INSTALLMAN1DIR INSTALLMAN3DIR INSTALLPRIVLIB INSTALLSCRIPT INSTALLSITEARCH - INSTALLSITELIB INST_ARCHLIB INST_BIN INST_EXE INST_LIB + INSTALLSITELIB INST_ARCHLIB INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR INST_SCRIPT LDFROM LIB LIBPERL_A LIBS LINKTYPE MAKEAPERL MAKEFILE MAN1PODS MAN3PODS MAP_TARGET MYEXTLIB PERL_MALLOC_OK @@ -133,7 +130,7 @@ sub full_setup { PL_FILES PM PM_FILTER PMLIBDIRS POLLUTE PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ - SKIP TEST_LIBS TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG + SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG XS_VERSION clean depend dist dynamic_lib linkext macro realclean tool_autosplit MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC @@ -210,8 +207,8 @@ sub full_setup { # 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_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT + @Prepend_parent = qw( + INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC PERL FULLPERL ); @@ -273,15 +270,17 @@ sub new { foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) { eval "require $prereq"; + my $pr_version = $prereq->VERSION || 0; + if ($@) { warn sprintf "Warning: prerequisite %s %s not found.\n", $prereq, $self->{PREREQ_PM}{$prereq} unless $self->{PREREQ_FATAL}; $unsatisfied{$prereq} = 'not installed'; - } elsif ($prereq->VERSION < $self->{PREREQ_PM}->{$prereq} ){ + } elsif ($pr_version < $self->{PREREQ_PM}->{$prereq} ){ warn "Warning: prerequisite %s %s not found. We have %s.\n", $prereq, $self->{PREREQ_PM}{$prereq}, - ($prereq->VERSION || 'unknown version') + ($pr_version || 'unknown version') unless $self->{PREREQ_FATAL}; $unsatisfied{$prereq} = $self->{PREREQ_PM}->{$prereq} ? $self->{PREREQ_PM}->{$prereq} : 'unknown version' ; @@ -323,7 +322,7 @@ sub new { if (defined $Parent[-2]){ $self->{PARENT} = $Parent[-2]; my $key; - for $key (@Prepend_dot_dot) { + for $key (@Prepend_parent) { next unless defined $self->{PARENT}{$key}; $self->{$key} = $self->{PARENT}{$key}; unless ($^O eq 'VMS' && $key =~ /PERL$/) { @@ -391,6 +390,7 @@ END $self->init_dirscan(); $self->init_others(); + $self->init_PERM(); my($argv) = neatvalue(\@ARGV); $argv =~ s/^\[/(/; $argv =~ s/\]$/)/; @@ -476,7 +476,6 @@ END sub WriteEmptyMakefile { Carp::croak "WriteEmptyMakefile: Need even number of args" if @_ % 2; - local $SIG{__WARN__} = \&warnhandler; my %att = @_; my $self = MM->new(\%att); @@ -635,6 +634,7 @@ 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. + no warnings 'redefine'; foreach my $method (@Overridable) { # We cannot say "next" here. Nick might call MY->makeaperl @@ -729,7 +729,7 @@ sub flush { rename("MakeMaker.tmp", $finalname); chmod 0644, $finalname unless $Is_VMS; - if ($self->{PARENT}) { + if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) { foreach (keys %$self) { # safe memory delete $self->{$_} unless $Keep_after_flush{$_}; } @@ -808,13 +808,9 @@ ExtUtils::MakeMaker - create an extension Makefile =head1 SYNOPSIS -C + use ExtUtils::MakeMaker; -C VALUE [, ...] );> - -which is really - -Cnew(\%att)-Eflush;> + WriteMakefile( ATTRIBUTE => VALUE [, ...] ); =head1 DESCRIPTION @@ -827,7 +823,7 @@ that can be individually overridden. Each subroutine returns the text it wishes to have written to the Makefile. MakeMaker is object oriented. Each directory below the current -directory that contains a Makefile.PL. Is treated as a separate +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(). @@ -987,7 +983,9 @@ relatives, then the defaults for INSTALLPRIVLIB, INSTALLARCHLIB, INSTALLSCRIPT, etc. will be appropriate, and this incantation will be the best: - perl Makefile.PL; make; make test + perl Makefile.PL; + make; + make test make install make install per default writes some documentation of what has been @@ -1322,11 +1320,15 @@ second with INSTALLDIRS=site. Default is site. This directory gets the man pages at 'make install' time. Defaults to $Config{installman1dir}. +If set to 'none', no man 1 pages will be installed. + =item INSTALLMAN3DIR This directory gets the man pages at 'make install' time. Defaults to $Config{installman3dir}. +If set to 'none', no man 3 pages will be installed. + =item INSTALLPRIVLIB Used by 'make install', which copies files from INST_LIB to this @@ -1356,11 +1358,6 @@ Same as INST_LIB for architecture dependent files. Directory to put real binary files during 'make'. These will be copied to INSTALLBIN during 'make install' -=item INST_EXE - -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 @@ -1724,13 +1721,6 @@ 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 TEST_LIBS - -The set of -I's necessary to run a "make test". Use as: -$(PERL) $(TEST_LIBS) -e '...' for example. - -The paths will be absolute. - =item TYPEMAPS Ref to array of typemap file names. Use this when the typemaps are @@ -1761,7 +1751,7 @@ MakeMaker object. The following lines will be parsed o.k.: $VERSION = '1.00'; *VERSION = \'1.01'; - ( $VERSION ) = '$Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/; + ( $VERSION ) = '$Revision: 1.33 $ ' =~ /\$Revision:\s+([^\s]+)/; $FOO::VERSION = '1.10'; *FOO::VERSION = \'1.11'; our $VERSION = 1.2.3; # new for perl5.6.0 @@ -1881,7 +1871,7 @@ be linked. If you cannot achieve the desired Makefile behaviour by specifying attributes you may define private subroutines in the Makefile.PL. -Each subroutines returns the text it wishes to have written to +Each subroutine returns the text it wishes to have written to the Makefile. To override a section of the Makefile you can either say: @@ -1889,8 +1879,8 @@ either say: or you can edit the default by saying something like: - sub MY::c_o { - package MY; # so that "SUPER" works right + package MY; # so that "SUPER" works right + sub c_o { my $inherited = shift->SUPER::c_o(@_); $inherited =~ s/old text/new text/; $inherited; @@ -1903,18 +1893,20 @@ 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. +F -For a complete description of all MakeMaker methods see L. +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 { - ' + return <<'MAKE_FRAG'; $(MYEXTLIB): sdbm/Makefile cd sdbm && $(MAKE) all - '; + + MAKE_FRAG } @@ -2078,8 +2070,8 @@ ExtUtils::Embed =head1 AUTHORS -Andy Dougherty >, Andreas KEnig ->, Tim Bunce >. VMS +Andy Dougherty >, Andreas KEnig +>, Tim Bunce >. VMS support by Charles Bailey >. OS/2 support by Ilya Zakharevich >. @@ -2087,6 +2079,9 @@ Currently maintained by Michael G Schwern > Send patches and ideas to >. -Send bug reports via http://rt.cpan.org/. +Send bug reports via http://rt.cpan.org/. Please send your +generated Makefile along with your report. + +For more up-to-date information, see http://www.makemaker.org. =cut diff --git a/lib/ExtUtils/t/Big-Fat-Dummy/Liar/Makefile.PL b/lib/ExtUtils/t/Big-Fat-Dummy/Liar/Makefile.PL new file mode 100644 index 0000000..c6478dd --- /dev/null +++ b/lib/ExtUtils/t/Big-Fat-Dummy/Liar/Makefile.PL @@ -0,0 +1,12 @@ +use ExtUtils::MakeMaker; + +my $mm = WriteMakefile( + NAME => 'Big::Fat::Liar', + VERSION_FROM => 'lib/Big/Fat/Liar.pm', + _KEEP_AFTER_FLUSH => 1 + ); + +print "Big::Fat::Liar's vars\n"; +foreach my $key (qw(INST_LIB INST_ARCHLIB)) { + print "$key = $mm->{$key}\n"; +} diff --git a/lib/ExtUtils/t/Big-Fat-Dummy/Liar/lib/Big/Fat/Liar.pm b/lib/ExtUtils/t/Big-Fat-Dummy/Liar/lib/Big/Fat/Liar.pm new file mode 100644 index 0000000..11e6fc6 --- /dev/null +++ b/lib/ExtUtils/t/Big-Fat-Dummy/Liar/lib/Big/Fat/Liar.pm @@ -0,0 +1,5 @@ +package Big::Fat::Liar; + +$VERSION = 0.01; + +1; diff --git a/lib/ExtUtils/t/INST.t b/lib/ExtUtils/t/INST.t new file mode 100644 index 0000000..2d28104 --- /dev/null +++ b/lib/ExtUtils/t/INST.t @@ -0,0 +1,110 @@ +#!/usr/bin/perl -w + +# Wherein we ensure the INST_* and INSTALL* variables are set correctly +# according to the values of PREFIX, SITEPREFIX, INSTALLDIRS, etc... +# +# Essentially, this test is a Makefile.PL. + +BEGIN { + if( $ENV{PERL_CORE} ) { + chdir 't' if -d 't'; + @INC = ('../lib', 'lib'); + } + else { + unshift @INC, 't/lib'; + } +} + +use strict; +use Test::More tests => 17; +use MakeMaker::Test::Utils; +use ExtUtils::MakeMaker; +use File::Spec; +use TieOut; +use Config; + +$ENV{PERL_CORE} ? chdir '../lib/ExtUtils/t' : chdir 't'; + +perl_lib; + +$| = 1; + +my $Makefile = makefile_name; +my $Curdir = File::Spec->curdir; +my $Updir = File::Spec->updir; + +ok( chdir 'Big-Fat-Dummy', "chdir'd to Big-Fat-Dummy" ) || + diag("chdir failed: $!"); + +my $stdout = tie *STDOUT, 'TieOut' or die; +my $mm = WriteMakefile( + NAME => 'Big::Fat::Dummy', + VERSION_FROM => 'lib/Big/Fat/Dummy.pm', + PREREQ_PM => {}, + PERL_CORE => $ENV{PERL_CORE}, +); +like( $stdout->read, qr{ + Writing\ $Makefile\ for\ Big::Fat::Liar\n + Big::Fat::Liar's\ vars\n + INST_LIB\ =\ \S+\n + INST_ARCHLIB\ =\ \S+\n + Writing\ $Makefile\ for\ Big::Fat::Dummy\n +}x ); +undef $stdout; +untie *STDOUT; + +isa_ok( $mm, 'ExtUtils::MakeMaker' ); + +is( $mm->{NAME}, 'Big::Fat::Dummy', 'NAME' ); +is( $mm->{VERSION}, 0.01, 'VERSION' ); + +my $config_prefix = $^O eq 'VMS' ? VMS::Filespec::unixify($Config{prefix}) + : $Config{prefix}; +is( $mm->{PREFIX}, $config_prefix, 'PREFIX' ); + +is( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE}, 'PERL_CORE' ); + +my($perl_src, $mm_perl_src); +if( $ENV{PERL_CORE} ) { + $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir); + $perl_src = File::Spec->canonpath($perl_src); + $mm_perl_src = File::Spec->canonpath($mm->{PERL_SRC}); +} +else { + $mm_perl_src = $mm->{PERL_SRC}; +} + +is( $mm_perl_src, $perl_src, 'PERL_SRC' ); + + +# PERM_* +is( $mm->{PERM_RW}, 644, 'PERM_RW' ); +is( $mm->{PERM_RWX}, 755, 'PERM_RWX' ); + + +# INST_* +is( $mm->{INST_ARCHLIB}, + $mm->{PERL_CORE} ? $mm->{PERL_ARCHLIB} + : File::Spec->catdir($Curdir, 'blib', 'arch'), + 'INST_ARCHLIB'); +is( $mm->{INST_BIN}, File::Spec->catdir($Curdir, 'blib', 'bin'), + 'INST_BIN' ); + +is( keys %{$mm->{CHILDREN}}, 1 ); +my($child_pack) = keys %{$mm->{CHILDREN}}; +my $c_mm = $mm->{CHILDREN}{$child_pack}; +is( $c_mm->{INST_ARCHLIB}, + $c_mm->{PERL_CORE} ? $c_mm->{PERL_ARCHLIB} + : File::Spec->catdir($Updir, 'blib', 'arch'), + 'CHILD INST_ARCHLIB'); +is( $c_mm->{INST_BIN}, File::Spec->catdir($Updir, 'blib', 'bin'), + 'CHILD INST_BIN' ); + + +my $inst_lib = File::Spec->catdir($Curdir, 'blib', 'lib'); +is( $mm->{INST_LIB}, + $mm->{PERL_CORE} ? $mm->{PERL_LIB} : $inst_lib, 'INST_LIB' ); + + +# INSTALL* +is( $mm->{INSTALLDIRS}, 'site', 'INSTALLDIRS' ); diff --git a/lib/ExtUtils/t/MM_Cygwin.t b/lib/ExtUtils/t/MM_Cygwin.t index 3c995b7..42d3949 100644 --- a/lib/ExtUtils/t/MM_Cygwin.t +++ b/lib/ExtUtils/t/MM_Cygwin.t @@ -23,7 +23,7 @@ BEGIN { use Config; use File::Spec; -require ExtUtils::MM; +use ExtUtils::MM; use_ok( 'ExtUtils::MM_Cygwin' ); @@ -52,12 +52,15 @@ delete $args->{CFLAGS}; # respects the config setting, should ignore whitespace around equal sign my $ccflags = $Config{useshrplib} eq 'true' ? ' -DUSEIMPORTLIB' : ''; -$args->cflags(<{NEEDS_LINKING} = 1; + $args->cflags(<{CFLAGS}, qr/OPTIMIZE = opt/, '... should set OPTIMIZE' ); like( $args->{CFLAGS}, qr/PERLTYPE = pt/, '... should set PERLTYPE' ); diff --git a/lib/ExtUtils/t/MM_Win32.t b/lib/ExtUtils/t/MM_Win32.t index 01fb849..8e2b52c 100644 --- a/lib/ExtUtils/t/MM_Win32.t +++ b/lib/ExtUtils/t/MM_Win32.t @@ -33,7 +33,7 @@ require_ok( 'ExtUtils::MM_Win32' ); my $MM = bless { DIR => [], NOECHO => '@', - XS => '', + XS => {}, MAKEFILE => 'Makefile', RM_RF => 'rm -rf', MV => 'mv', diff --git a/lib/ExtUtils/t/basic.t b/lib/ExtUtils/t/basic.t index 966aa10..b0cb6f7 100644 --- a/lib/ExtUtils/t/basic.t +++ b/lib/ExtUtils/t/basic.t @@ -14,17 +14,19 @@ BEGIN { } use strict; -use Test::More tests => 15; +use Test::More tests => 17; use MakeMaker::Test::Utils; use File::Spec; use TieOut; -my $perl = which_perl; +my $perl = which_perl(); $ENV{PERL_CORE} ? chdir '../lib/ExtUtils/t' : chdir 't'; perl_lib; +my $Touch_Time = calibrate_mtime(); + $| = 1; ok( chdir 'Big-Fat-Dummy', "chdir'd to Big-Fat-Dummy" ) || @@ -33,12 +35,28 @@ ok( chdir 'Big-Fat-Dummy', "chdir'd to Big-Fat-Dummy" ) || # The perl core test suite will run any .t file in the MANIFEST. # So we have to generate this on the fly. -mkdir 't'; +mkdir 't' || die "Can't create test dir: $!"; open(TEST, ">t/compile.t") or die "Can't open t/compile.t: $!"; -print TEST ; +print TEST <<'COMPILE_T'; +print "1..2\n"; + +print eval "use Big::Fat::Dummy; 1;" ? "ok 1\n" : "not ok 1\n"; +print "ok 2 - TEST_VERBOSE\n"; +COMPILE_T close TEST; -END { unlink 't/compile.t' } +mkdir 'Liar/t' || die "Can't create test dir: $!"; +open(TEST, ">Liar/t/sanity.t") or die "Can't open Liar/t/sanity.t: $!"; +print TEST <<'SANITY_T'; +print "1..3\n"; + +print eval "use Big::Fat::Dummy; 1;" ? "ok 1\n" : "not ok 1\n"; +print eval "use Big::Fat::Liar; 1;" ? "ok 2\n" : "not ok 2\n"; +print "ok 3 - TEST_VERBOSE\n"; +SANITY_T +close TEST; + +END { unlink 't/compile.t', 'Liar/t/sanity.t' } my @mpl_out = `$perl Makefile.PL PREFIX=dummy-install`; @@ -56,14 +74,9 @@ ok( grep(/^Current package is: main$/, ok( -e $makefile, 'Makefile exists' ); -# -M is flakey on VMS, flat out broken on Tru64 5.6.0 -SKIP: { - skip "stat a/mtime broken on Tru64 5.6.0", 1 if $^O eq 'dec_osf' and - $] >= 5.006; - - my $mtime = (stat($makefile))[9]; - cmp_ok( $^T, '<=', $mtime, ' its been touched' ); -} +# -M is flakey on VMS +my $mtime = (stat($makefile))[9]; +cmp_ok( $Touch_Time, '<=', $mtime, ' its been touched' ); END { unlink makefile_name(), makefile_backup() } @@ -93,11 +106,25 @@ is( $?, 0 ); my $dist_test_out = `$make disttest`; is( $?, 0, 'disttest' ) || diag($dist_test_out); + +# Make sure init_dirscan doesn't go into the distdir +@mpl_out = `$perl Makefile.PL "PREFIX=dummy-install"`; + +cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) || + diag(@mpl_out); + +ok( grep(/^Writing $makefile for Big::Fat::Dummy/, + @mpl_out) == 1, + 'init_dirscan skipped distdir') || + diag(@mpl_out); + +# I know we'll get ignored errors from make here, that's ok. +# Send STDERR off to oblivion. +open(SAVERR, ">&STDERR") or die $!; +open(STDERR, ">".File::Spec->devnull) or die $!; + my $realclean_out = `$make realclean`; is( $?, 0, 'realclean' ) || diag($realclean_out); -__DATA__ -print "1..2\n"; - -print eval "use Big::Fat::Dummy; 1;" ? "ok 1\n" : "not ok 1\n"; -print "ok 2 - TEST_VERBOSE\n"; +open(STDERR, ">&SAVERR") or die $!; +close SAVERR; diff --git a/lib/ExtUtils/t/prefixify.t b/lib/ExtUtils/t/prefixify.t new file mode 100644 index 0000000..ba2851b --- /dev/null +++ b/lib/ExtUtils/t/prefixify.t @@ -0,0 +1,24 @@ +#!/usr/bin/perl -w + +BEGIN { + if( $ENV{PERL_CORE} ) { + chdir 't' if -d 't'; + @INC = ('../lib', 'lib'); + } + else { + unshift @INC, 't/lib'; + } +} + +use strict; +use Test::More tests => 1; +use File::Spec; +use ExtUtils::MM; + +my $mm = bless {}, 'MM'; + +my $default = File::Spec->catdir(qw(this that)); +$mm->prefixify('installbin', 'wibble', 'something', $default); + +is( $mm->{INSTALLBIN}, File::Spec->catdir('something', $default), + 'prefixify w/defaults'); diff --git a/t/lib/MakeMaker/Test/Utils.pm b/t/lib/MakeMaker/Test/Utils.pm index b1de088..e039a6f 100644 --- a/t/lib/MakeMaker/Test/Utils.pm +++ b/t/lib/MakeMaker/Test/Utils.pm @@ -9,10 +9,10 @@ use vars qw($VERSION @ISA @EXPORT); require Exporter; @ISA = qw(Exporter); -$VERSION = 0.01; +$VERSION = 0.02; @EXPORT = qw(which_perl perl_lib makefile_name makefile_backup - make make_run make_macro + make make_run make_macro calibrate_mtime ); my $Is_VMS = $^O eq 'VMS'; @@ -36,6 +36,8 @@ MakeMaker::Test::Utils - Utility routines for testing MakeMaker my $make_run = make_run; make_macro($make, $targ, %macros); + my $mtime = calibrate_mtime; + =head1 DESCRIPTION A consolidation of little utility functions used through out the @@ -63,17 +65,24 @@ sub which_perl { # VMS should have 'perl' aliased properly return $perl if $Is_VMS; - $perl = File::Spec->rel2abs( $perl ); + $perl .= $Config{exe_ext} unless $perl =~ m/$Config{exe_ext}$/i; - unless( -x $perl ) { + my $perlpath = File::Spec->rel2abs( $perl ); + unless( -x $perlpath ) { # $^X was probably 'perl' + + # When building in the core, *don't* go off and find + # another perl + die "Can't find a perl to use (\$^X=$^X), (\$perlpath=$perlpath)" + if $ENV{PERL_CORE}; + foreach my $path (File::Spec->path) { - $perl = File::Spec->catfile($path, $^X); - last if -x $perl; + $perlpath = File::Spec->catfile($path, $perl); + last if -x $perlpath; } } - return $perl; + return $perlpath; } =item B @@ -201,6 +210,25 @@ sub make_macro { return $is_mms ? "$make$macros $target" : "$make $target $macros"; } +=item B + + my $mtime = calibrate_mtime; + +When building on NFS, file modification times can often lose touch +with reality. This returns the mtime of a file which has just been +touched. + +=cut + +sub calibrate_mtime { + open(FILE, ">calibrate_mtime.tmp") || die $!; + print FILE "foo"; + close FILE; + my($mtime) = (stat('calibrate_mtime.tmp'))[9]; + unlink 'calibrate_mtime.tmp'; + return $mtime; +} + =back =head1 AUTHOR