MakeMaker core sync 5.54_01 -> 5.55_02
authorMichael G. Schwern <schwern@pobox.com>
Sat, 6 Apr 2002 03:22:03 +0000 (22:22 -0500)
committerJarkko Hietaniemi <jhi@iki.fi>
Sat, 6 Apr 2002 16:58:02 +0000 (16:58 +0000)
Message-ID: <20020406082203.GA28713@blackrider>

p4raw-id: //depot/perl@15764

19 files changed:
MANIFEST
lib/ExtUtils/Changes
lib/ExtUtils/Command/MM.pm
lib/ExtUtils/MM_Any.pm
lib/ExtUtils/MM_Cygwin.pm
lib/ExtUtils/MM_NW5.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_VMS.pm
lib/ExtUtils/MM_Win32.pm
lib/ExtUtils/MM_Win95.pm
lib/ExtUtils/MakeMaker.pm
lib/ExtUtils/t/Big-Fat-Dummy/Liar/Makefile.PL [new file with mode: 0644]
lib/ExtUtils/t/Big-Fat-Dummy/Liar/lib/Big/Fat/Liar.pm [new file with mode: 0644]
lib/ExtUtils/t/INST.t [new file with mode: 0644]
lib/ExtUtils/t/MM_Cygwin.t
lib/ExtUtils/t/MM_Win32.t
lib/ExtUtils/t/basic.t
lib/ExtUtils/t/prefixify.t [new file with mode: 0644]
t/lib/MakeMaker/Test/Utils.pm

index f7a7df7..be6e311 100644 (file)
--- 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
index e344887..f364669 100644 (file)
@@ -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.
 
 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.
 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/
index 702353a..b57386c 100644 (file)
@@ -34,18 +34,21 @@ Any $(FOO) used in the examples are make variables, not Perl.
 
 =item B<test_harness>
 
-  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);
 }
 
index 214c316..fb48ae2 100644 (file)
@@ -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
index 3d72aec..0192836 100644 (file)
@@ -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) {
index fa3469c..6652fbb 100644 (file)
@@ -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
 
              / ) {
index ae0251d..61f07cf 100644 (file)
@@ -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 (<FH>) {
+        $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 (<FH>) {
-        $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{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
-    push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
-    my $abstract = $self->{ABSTRACT};
-    $abstract =~ s/\n/\\n/sg;
-    $abstract =~ s/</&lt;/g;
-    $abstract =~ s/>/&gt;/g;
-    push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
-    my ($author) = $self->{AUTHOR};
-    $author =~ s/</&lt;/g;
-    $author =~ s/>/&gt;/g;
-    $author =~ s/@/\\@/g;
-    push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
-    push(@m, ". qq{\\t<IMPLEMENTATION>\\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<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
-    }
-    push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
-    push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\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<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
-        }
-        else {
-            push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
-        }
-    }
-    push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
-    push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
-    push(@m, ". qq{</SOFTPKG>\\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/</&lt;/g;
+    $abstract =~ s/>/&gt;/g;
+
+    my $author = $self->{AUTHOR} || '';
+    $author =~ s/</&lt;/g;
+    $author =~ s/>/&gt;/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{<SOFTPKG NAME=\"$(DISTNAME)\" VERSION=\"%s\">\n\t<TITLE>$(DISTNAME)</TITLE>\n\t<ABSTRACT>%s</ABSTRACT>\n\t<AUTHOR>%s</AUTHOR>\n}" > $(DISTNAME).ppd
+PPD_OUT
+
+
+    $make_ppd .= '     @$(PERL) -e "print qq{\t<IMPLEMENTATION>\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<DEPENDENCY NAME=\"%s\" VERSION=\"%s\" />\n}, $pre_req, $dep_ver;
+    }
+    $make_ppd .= qq[}" >> \$(DISTNAME).ppd\n];
+
+
+    $make_ppd .= sprintf <<'PPD_OUT', $Config{archname};
+       @$(PERL) -e "print qq{\t\t<OS NAME=\"$(OSNAME)\" />\n\t\t<ARCHITECTURE NAME=\"%s\" />\n
+PPD_OUT
+
+    chomp $make_ppd;
+
+
+    if ($self->{PPM_INSTALL_SCRIPT}) {
+        if ($self->{PPM_INSTALL_EXEC}) {
+            $make_ppd .= sprintf q{\t\t<INSTALL EXEC=\"%s\">%s</INSTALL>\n},
+                  $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT};
+        }
+        else {
+            $make_ppd .= sprintf q{\t\t<INSTALL>%s</INSTALL>\n}, 
+                  $self->{PPM_INSTALL_SCRIPT};
+        }
+    }
+
+    my ($bin_location) = $self->{BINARY_LOCATION} || '';
+    $bin_location =~ s/\\/\\\\/g;
+
+    $make_ppd .= sprintf q{\t\t<CODEBASE HREF=\"%s\" />\n}, $bin_location;
+    $make_ppd .= q{\t</IMPLEMENTATION>\n};
+    $make_ppd .= q{</SOFTPKG>\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>) : '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");
index 881b8a9..bb38b8b 100644 (file)
@@ -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'};
index d8c7367..2d8ccca 100644 (file)
@@ -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__
 
index aaabc13..65fac14 100644 (file)
@@ -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();
index a505b15..075049d 100644 (file)
@@ -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;>
+  use ExtUtils::MakeMaker;
 
-C<WriteMakefile( ATTRIBUTE =E<gt> VALUE [, ...] );>
-
-which is really
-
-C<MM-E<gt>new(\%att)-E<gt>flush;>
+  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<perl5-porters@perl.org> or F<comp.lang.perl.moderated> as appropriate.
+F<makemaker@perl.org>
 
-For a complete description of all MakeMaker methods see L<ExtUtils::MM_Unix>.
+For a complete description of all MakeMaker methods see
+L<ExtUtils::MM_Unix>.
 
 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 <F<doughera@lafcol.lafayette.edu>>, Andreas KE<ouml>nig
-<F<andreas.koenig@mind.de>>, Tim Bunce <F<Tim.Bunce@ig.co.uk>>.  VMS
+Andy Dougherty <F<doughera@lafayette.edu>>, Andreas KE<ouml>nig
+<F<andreas.koenig@mind.de>>, Tim Bunce <F<timb@cpan.org>>.  VMS
 support by Charles Bailey <F<bailey@newman.upenn.edu>>.  OS/2 support
 by Ilya Zakharevich <F<ilya@math.ohio-state.edu>>.
 
@@ -2087,6 +2079,9 @@ Currently maintained by Michael G Schwern <F<schwern@pobox.com>>
 
 Send patches and ideas to <F<makemaker@perl.org>>.
 
-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 (file)
index 0000000..c6478dd
--- /dev/null
@@ -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 (file)
index 0000000..11e6fc6
--- /dev/null
@@ -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 (file)
index 0000000..2d28104
--- /dev/null
@@ -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' );
index 3c995b7..42d3949 100644 (file)
@@ -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(<<FLAGS);
+{
+    local $args->{NEEDS_LINKING} = 1;
+    $args->cflags(<<FLAGS);
 OPTIMIZE = opt
 PERLTYPE  =pt
 LARGE= lg
 SPLIT=split
 FLAGS
+}
 
 like( $args->{CFLAGS}, qr/OPTIMIZE = opt/, '... should set OPTIMIZE' );
 like( $args->{CFLAGS}, qr/PERLTYPE = pt/, '... should set PERLTYPE' );
index 01fb849..8e2b52c 100644 (file)
@@ -33,7 +33,7 @@ require_ok( 'ExtUtils::MM_Win32' );
 my $MM = bless {
                 DIR     => [],
                 NOECHO  => '@',
-                XS      => '',
+                XS      => {},
                 MAKEFILE => 'Makefile',
                 RM_RF   => 'rm -rf',
                 MV      => 'mv',
index 966aa10..b0cb6f7 100644 (file)
@@ -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 <DATA>;
+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 (file)
index 0000000..ba2851b
--- /dev/null
@@ -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');
index b1de088..e039a6f 100644 (file)
@@ -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<perl_lib>
@@ -201,6 +210,25 @@ sub make_macro {
     return $is_mms ? "$make$macros $target" : "$make $target $macros";
 }
 
+=item B<calibrate_mtime>
+
+  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