This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH] Re: MM_UNIX::parse_version() and my $VERSION
[perl5.git] / lib / ExtUtils / MM_Unix.pm
index 223310a..4f34883 100644 (file)
@@ -5,12 +5,13 @@ use strict;
 use Exporter ();
 use Config;
 use File::Basename qw(basename dirname fileparse);
+use File::Spec;
 use DirHandle;
 use strict;
 our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos,
            $Verbose,%pm,%static,$Xsubpp_Version);
 
-our $VERSION = '1.12603';
+our $VERSION = '1.12606';
 
 require ExtUtils::MakeMaker;
 ExtUtils::MakeMaker->import(qw($Verbose &neatvalue));
@@ -105,13 +106,8 @@ trailing slash :-)
 # ';
 
 sub catdir {
-    my $self = shift @_;
-    my @args = @_;
-    for (@args) {
-       # append a slash to each argument unless it has one there
-       $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
-    }
-    $self->canonpath(join('', @args));
+    shift;
+    return File::Spec->catdir(@_);
 }
 
 =item catfile
@@ -122,14 +118,8 @@ complete path ending with a filename
 =cut
 
 sub catfile {
-    my $self = shift @_;
-    my $file = pop @_;
-    return $self->canonpath($file) unless @_;
-    my $dir = $self->catdir(@_);
-    for ($dir) {
-       $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
-    }
-    return $self->canonpath($dir.$file);
+    shift;
+    return File::Spec->catdir(@_);
 }
 
 =item curdir
@@ -139,7 +129,7 @@ Returns a string representing of the current directory.  "." on UNIX.
 =cut
 
 sub curdir {
-    return "." ;
+    return File::Spec->curdir();
 }
 
 =item rootdir
@@ -149,7 +139,7 @@ Returns a string representing of the root directory.  "/" on UNIX.
 =cut
 
 sub rootdir {
-    return "/";
+    return File::Spec->rootdir();
 }
 
 =item updir
@@ -159,88 +149,87 @@ Returns a string representing of the parent directory.  ".." on UNIX.
 =cut
 
 sub updir {
-    return "..";
-}
-
-sub ExtUtils::MM_Unix::c_o ;
-sub ExtUtils::MM_Unix::clean ;
-sub ExtUtils::MM_Unix::const_cccmd ;
-sub ExtUtils::MM_Unix::const_config ;
-sub ExtUtils::MM_Unix::const_loadlibs ;
-sub ExtUtils::MM_Unix::constants ;
-sub ExtUtils::MM_Unix::depend ;
-sub ExtUtils::MM_Unix::dir_target ;
-sub ExtUtils::MM_Unix::dist ;
-sub ExtUtils::MM_Unix::dist_basics ;
-sub ExtUtils::MM_Unix::dist_ci ;
-sub ExtUtils::MM_Unix::dist_core ;
-sub ExtUtils::MM_Unix::dist_dir ;
-sub ExtUtils::MM_Unix::dist_test ;
-sub ExtUtils::MM_Unix::dlsyms ;
-sub ExtUtils::MM_Unix::dynamic ;
-sub ExtUtils::MM_Unix::dynamic_bs ;
-sub ExtUtils::MM_Unix::dynamic_lib ;
-sub ExtUtils::MM_Unix::exescan ;
-sub ExtUtils::MM_Unix::export_list ;
-sub ExtUtils::MM_Unix::extliblist ;
-sub ExtUtils::MM_Unix::file_name_is_absolute ;
-sub ExtUtils::MM_Unix::find_perl ;
-sub ExtUtils::MM_Unix::fixin ;
-sub ExtUtils::MM_Unix::force ;
-sub ExtUtils::MM_Unix::guess_name ;
-sub ExtUtils::MM_Unix::has_link_code ;
-sub ExtUtils::MM_Unix::htmlifypods ;
-sub ExtUtils::MM_Unix::init_dirscan ;
-sub ExtUtils::MM_Unix::init_main ;
-sub ExtUtils::MM_Unix::init_others ;
-sub ExtUtils::MM_Unix::install ;
-sub ExtUtils::MM_Unix::installbin ;
-sub ExtUtils::MM_Unix::libscan ;
-sub ExtUtils::MM_Unix::linkext ;
-sub ExtUtils::MM_Unix::lsdir ;
-sub ExtUtils::MM_Unix::macro ;
-sub ExtUtils::MM_Unix::makeaperl ;
-sub ExtUtils::MM_Unix::makefile ;
-sub ExtUtils::MM_Unix::manifypods ;
-sub ExtUtils::MM_Unix::maybe_command ;
-sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
-sub ExtUtils::MM_Unix::needs_linking ;
-sub ExtUtils::MM_Unix::nicetext ;
-sub ExtUtils::MM_Unix::parse_version ;
-sub ExtUtils::MM_Unix::pasthru ;
-sub ExtUtils::MM_Unix::path ;
-sub ExtUtils::MM_Unix::perl_archive;
-sub ExtUtils::MM_Unix::perl_archive_after;
-sub ExtUtils::MM_Unix::perl_script ;
-sub ExtUtils::MM_Unix::perldepend ;
-sub ExtUtils::MM_Unix::pm_to_blib ;
-sub ExtUtils::MM_Unix::post_constants ;
-sub ExtUtils::MM_Unix::post_initialize ;
-sub ExtUtils::MM_Unix::postamble ;
-sub ExtUtils::MM_Unix::ppd ;
-sub ExtUtils::MM_Unix::prefixify ;
-sub ExtUtils::MM_Unix::processPL ;
-sub ExtUtils::MM_Unix::realclean ;
-sub ExtUtils::MM_Unix::replace_manpage_separator ;
-sub ExtUtils::MM_Unix::static ;
-sub ExtUtils::MM_Unix::static_lib ;
-sub ExtUtils::MM_Unix::staticmake ;
-sub ExtUtils::MM_Unix::subdir_x ;
-sub ExtUtils::MM_Unix::subdirs ;
-sub ExtUtils::MM_Unix::test ;
-sub ExtUtils::MM_Unix::test_via_harness ;
-sub ExtUtils::MM_Unix::test_via_script ;
-sub ExtUtils::MM_Unix::tool_autosplit ;
-sub ExtUtils::MM_Unix::tool_xsubpp ;
-sub ExtUtils::MM_Unix::tools_other ;
-sub ExtUtils::MM_Unix::top_targets ;
-sub ExtUtils::MM_Unix::writedoc ;
-sub ExtUtils::MM_Unix::xs_c ;
-sub ExtUtils::MM_Unix::xs_cpp ;
-sub ExtUtils::MM_Unix::xs_o ;
-sub ExtUtils::MM_Unix::xsubpp_version ;
-
-package ExtUtils::MM_Unix;
+    return File::Spec->updir();
+}
+
+sub c_o;
+sub clean;
+sub const_cccmd;
+sub const_config;
+sub const_loadlibs;
+sub constants;
+sub depend;
+sub dir_target;
+sub dist;
+sub dist_basics;
+sub dist_ci;
+sub dist_core;
+sub dist_dir;
+sub dist_test;
+sub dlsyms;
+sub dynamic;
+sub dynamic_bs;
+sub dynamic_lib;
+sub exescan;
+sub export_list;
+sub extliblist;
+sub file_name_is_absolute;
+sub find_perl;
+sub fixin;
+sub force;
+sub guess_name;
+sub has_link_code;
+sub htmlifypods;
+sub init_dirscan;
+sub init_main;
+sub init_others;
+sub install;
+sub installbin;
+sub libscan;
+sub linkext;
+sub lsdir;
+sub macro;
+sub makeaperl;
+sub makefile;
+sub manifypods;
+sub maybe_command;
+sub maybe_command_in_dirs;
+sub needs_linking;
+sub nicetext;
+sub parse_version;
+sub pasthru;
+sub path;
+sub perl_archive;
+sub perl_archive_after;
+sub perl_script;
+sub perldepend;
+sub pm_to_blib;
+sub post_constants;
+sub post_initialize;
+sub postamble;
+sub ppd;
+sub prefixify;
+sub processPL;
+sub quote_paren;
+sub realclean;
+sub replace_manpage_separator;
+sub static;
+sub static_lib;
+sub staticmake;
+sub subdir_x;
+sub subdirs;
+sub test;
+sub test_via_harness;
+sub test_via_script;
+sub tool_autosplit;
+sub tool_xsubpp;
+sub tools_other;
+sub top_targets;
+sub writedoc;
+sub xs_c;
+sub xs_cpp;
+sub xs_o;
+sub xsubpp_version;
 
 use SelfLoader;
 
@@ -272,30 +261,30 @@ sub c_o {
         $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
         push @m, '
 .c.i:
-       '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c > $*.i
+       '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
 ';
     }
     push @m, '
 .c.s:
-       $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+       $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
 ';
     push @m, '
 .c$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
 ';
     push @m, '
 .C$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.C
 ' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific
     push @m, '
 .cpp$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
 
 .cxx$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
 
 .cc$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cc
 ';
     join "", @m;
 }
@@ -397,6 +386,9 @@ sub cflags {
        $pollute = '$(PERL_MALLOC_DEF)';
     }
 
+    $self->{CCFLAGS}  = quote_paren($self->{CCFLAGS});
+    $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE});
+
     return $self->{CFLAGS} = qq{
 CCFLAGS = $self->{CCFLAGS}
 OPTIMIZE = $self->{OPTIMIZE}
@@ -455,7 +447,7 @@ EOT
                         *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
                         $(BOOTSTRAP) $(BASEEXT).bso
                         $(BASEEXT).def lib$(BASEEXT).def
-                        $(BASEEXT).exp
+                        $(BASEEXT).exp $(BASEEXT).x
                        ]);
     push @m, "\t-$self->{RM_RF} @otherfiles\n";
     # See realclean and ext/utils/make_ext for usage of Makefile.old
@@ -478,7 +470,8 @@ sub const_cccmd {
     return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
     return '' unless $self->needs_linking();
     return $self->{CONST_CCCMD} =
-       q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
+       q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+       $(CCFLAGS) $(OPTIMIZE) \\
        $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
 }
@@ -501,7 +494,8 @@ sub const_config {
     foreach $m (@{$self->{CONFIG}}){
        # SITE*EXP macros are defined in &constants; avoid duplicates here
        next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
-       push @m, "\U$m\E = ".$self->{uc $m}."\n";
+       $self->{uc $m} = quote_paren($self->{uc $m});
+       push @m, uc($m) , ' = ' , $self->{uc $m}, "\n";
        $once_only{$m} = 1;
     }
     join('', @m);
@@ -648,11 +642,11 @@ CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
     my @parentdir = split(/::/, $self->{PARENT_NAME});
     push @m, q{
 # Where to put things:
-INST_LIBDIR      = }. $self->catdir('$(INST_LIB)',@parentdir)        .q{
-INST_ARCHLIBDIR  = }. $self->catdir('$(INST_ARCHLIB)',@parentdir)    .q{
+INST_LIBDIR      = }. File::Spec->catdir('$(INST_LIB)',@parentdir)        .q{
+INST_ARCHLIBDIR  = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir)    .q{
 
-INST_AUTODIR     = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)')       .q{
-INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)')   .q{
+INST_AUTODIR     = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)')       .q{
+INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)')   .q{
 };
 
     if ($self->has_link_code()) {
@@ -735,8 +729,8 @@ sub dir_target {
     my($self,@dirs) = @_;
     my(@m,$dir,$targdir);
     foreach $dir (@dirs) {
-       my($src) = $self->catfile($self->{PERL_INC},'perl.h');
-       my($targ) = $self->catfile($dir,'.exists');
+       my($src) = File::Spec->catfile($self->{PERL_INC},'perl.h');
+       my($targ) = File::Spec->catfile($dir,'.exists');
        # catfile may have adapted syntax of $dir to target OS, so...
        if ($Is_VMS) { # Just remove file name; dirspec is often in macro
            ($targdir = $targ) =~ s:/?\.exists\z::;
@@ -1090,8 +1084,25 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
     push(@m,'  $(RM_F) $@
 ');
 
-    push(@m,'  LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
-               ' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
+    my $libs = $self->{LDLOADLIBS};
+
+    if ($^O eq 'netbsd') {
+       # Use nothing on static perl platforms, and to the flags needed
+       # to link against the shared libperl library on shared perl
+       # platforms.  We peek at lddlflags to see if we need -Wl,-R
+       # or -R to add paths to the run-time library search path.
+       if ($Config{'useshrplib'}) {
+           if ($Config{'lddlflags'} =~ /-Wl,-R/) {
+               $libs = '-L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl';
+           } elsif ($Config{'lddlflags'} =~ /-R/) {
+               $libs = '-L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl';
+           }
+       }
+    }
+
+    push(@m,
+'      LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
+' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
     push @m, '
        $(CHMOD) $(PERM_RWX) $@
 ';
@@ -1131,13 +1142,8 @@ Takes as argument a path and returns true, if it is an absolute path.
 =cut
 
 sub file_name_is_absolute {
-    my($self,$file) = @_;
-    if ($Is_Dos){
-        $file =~ m{^([a-z]:)?[\\/]}is ;
-    }
-    else {
-        $file =~ m:^/:s ;
-    }
+    shift;
+    return File::Spec->file_name_is_absolute(@_);
 }
 
 =item find_perl
@@ -1160,12 +1166,12 @@ in these dirs:
        foreach $dir (@$dirs){
            next unless defined $dir; # $self->{PERL_SRC} may be undefined
            my ($abs, $val);
-           if ($self->file_name_is_absolute($name)) { # /foo/bar
+           if (File::Spec->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
-           } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
-               $abs = $self->catfile($dir, $name);
+           } elsif (File::Spec->canonpath($name) eq File::Spec->canonpath(basename($name))) { # foo
+               $abs = File::Spec->catfile($dir, $name);
            } else { # foo/bar
-               $abs = $self->canonpath($self->catfile($self->curdir, $name));
+               $abs = File::Spec->canonpath(File::Spec->catfile(File::Spec->curdir, $name));
            }
            print "Checking $abs\n" if ($trace >= 2);
            next unless $self->maybe_command($abs);
@@ -1222,13 +1228,13 @@ sub fixin { # stolen from the pink Camel book, more or less
                 $interpreter = $Config{perlpath};
             }
        } else {
-           my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
+           my(@absdirs) = reverse grep {File::Spec->file_name_is_absolute} File::Spec->path;
            $interpreter = '';
            my($dir);
            foreach $dir (@absdirs) {
                if ($self->maybe_command($cmd)) {
                    warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
-                   $interpreter = $self->catfile($dir,$cmd);
+                   $interpreter = File::Spec->catfile($dir,$cmd);
                }
            }
        }
@@ -1363,9 +1369,9 @@ sub htmlifypods {
     my($dist);
     my($pod2html_exe);
     if (defined $self->{PERL_SRC}) {
-       $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
+       $pod2html_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2html');
     } else {
-       $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
+       $pod2html_exe = File::Spec->catfile($Config{scriptdirexp},'pod2html');
     }
     unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
        # No pod2html but some HTMLxxxPODS to be installed
@@ -1411,13 +1417,13 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
     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;
-    foreach $name ($self->lsdir($self->curdir)){
+    foreach $name ($self->lsdir(File::Spec->curdir)){
        next if $name =~ /\#/;
-       next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
+       next if $name eq File::Spec->curdir or $name eq File::Spec->updir or $ignore{$name};
        next unless $self->libscan($name);
        if (-d $name){
            next if -l $name; # We do not support symlinks at all
-           $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
+           $dir{$name} = $name if (-f File::Spec->catfile($name,"Makefile.PL"));
        } elsif ($name =~ /\.xs\z/){
            my($c); ($c = $name) =~ s/\.xs\z/.c/;
            $xs{$name} = $c;
@@ -1436,9 +1442,9 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
            if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
                ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
            }
-           else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
+           else { $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name); }
        } elsif ($name =~ /\.(p[ml]|pod)\z/){
-           $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
+           $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name);
        }
     }
 
@@ -1494,11 +1500,11 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
                return;
            }
            return if /\#/;
-           my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
+           my($path, $prefix) = ($File::Find::name, $self->{INST_LIBDIR});
            my($striplibpath,$striplibname);
-           $prefix =  '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
+           $prefix =  $self->{INST_LIB} if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
            ($striplibname,$striplibpath) = fileparse($striplibpath);
-           my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
+           my($inst) = File::Spec->catfile($prefix,$striplibpath,$striplibname);
            local($_) = $inst; # for backwards compatibility
            $inst = $self->libscan($inst);
            print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
@@ -1545,11 +1551,11 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
                next unless $ispod;
                if ($pods{HTMLSCRIPT}) {
                    $self->{HTMLSCRIPTPODS}->{$name} =
-                     $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
+                     File::Spec->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
                }
                if ($pods{MAN1}) {
                    $self->{MAN1PODS}->{$name} =
-                     $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
+                     File::Spec->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
                }
            }
        }
@@ -1591,15 +1597,15 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
            $manpagename =~ s/\.p(od|m|l)\z//;
            if ($pods{HTMLLIB}) {
                $self->{HTMLLIBPODS}->{$name} =
-                 $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
+                 File::Spec->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
            }
            unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
-               $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
+               $manpagename = File::Spec->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
            }
            if ($pods{MAN3}) {
                $manpagename = $self->replace_manpage_separator($manpagename);
                $self->{MAN3PODS}->{$name} =
-                 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
+                 File::Spec->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
            }
        }
     }
@@ -1607,10 +1613,11 @@ sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
 
 =item init_main
 
-Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
-PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
-PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
-LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
+Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
+EXE_EXT, FULLEXT, FULLPERL, 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, VERSION_FROM, VERSION_SYM, XS_VERSION.
 
 =cut
 
@@ -1627,7 +1634,7 @@ sub init_main {
 ### Only UNIX:
 ###    ($self->{FULLEXT} =
 ###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
-    $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
+    $self->{FULLEXT} = File::Spec->catdir(split /::/, $self->{NAME});
 
 
     # Copied from DynaLoader:
@@ -1666,13 +1673,13 @@ sub init_main {
 
     unless ($self->{PERL_SRC}){
        my($dir);
-       foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir(),$self->updir())){
+       foreach $dir (File::Spec->updir(),File::Spec->catdir(File::Spec->updir(),File::Spec->updir()),File::Spec->catdir(File::Spec->updir(),File::Spec->updir(),File::Spec->updir()),File::Spec->catdir(File::Spec->updir(),File::Spec->updir(),File::Spec->updir(),File::Spec->updir())){
            if (
-               -f $self->catfile($dir,"config.sh")
+               -f File::Spec->catfile($dir,"config.sh")
                &&
-               -f $self->catfile($dir,"perl.h")
+               -f File::Spec->catfile($dir,"perl.h")
                &&
-               -f $self->catfile($dir,"lib","Exporter.pm")
+               -f File::Spec->catfile($dir,"lib","Exporter.pm")
               ) {
                $self->{PERL_SRC}=$dir ;
                last;
@@ -1680,17 +1687,17 @@ sub init_main {
        }
     }
     if ($self->{PERL_SRC}){
-       $self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
+       $self->{PERL_LIB}     ||= File::Spec->catdir("$self->{PERL_SRC}","lib");
        $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
-       $self->{PERL_INC}     = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
+       $self->{PERL_INC}     = ($Is_Win32) ? File::Spec->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
 
        # catch a situation that has occurred a few times in the past:
        unless (
-               -s $self->catfile($self->{PERL_SRC},'cflags')
+               -s File::Spec->catfile($self->{PERL_SRC},'cflags')
                or
                $Is_VMS
                &&
-               -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
+               -s File::Spec->catfile($self->{PERL_SRC},'perlshr_attr.opt')
                or
                $Is_Mac
                or
@@ -1715,21 +1722,21 @@ from the perl source tree.
         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_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
+       $self->{PERL_INC}     = File::Spec->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
        my $perl_h;
 
        no warnings 'uninitialized' ;
-       if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
+       if (not -f ($perl_h = File::Spec->catfile($self->{PERL_INC},"perl.h"))
            and not $old){
            # Maybe somebody tries to build an extension with an
            # uninstalled Perl outside of Perl build tree
            my $found;
            for my $dir (@INC) {
-             $found = $dir, last if -e $self->catdir($dir, "Config.pm");
+             $found = $dir, last if -e File::Spec->catdir($dir, "Config.pm");
            }
            if ($found) {
              my $inc = dirname $found;
-             if (-e $self->catdir($inc, "perl.h")) {
+             if (-e File::Spec->catdir($inc, "perl.h")) {
                $self->{PERL_LIB}          = $found;
                $self->{PERL_ARCHLIB}      = $found;
                $self->{PERL_INC}          = $inc;
@@ -1777,25 +1784,25 @@ usually solves this kind of problem.
        if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
            $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
        } else {
-           $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
+           $self->{INST_LIB} = File::Spec->catdir(File::Spec->curdir,"blib","lib");
        }
     }
-    $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
-    $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
+    $self->{INST_ARCHLIB} ||= File::Spec->catdir(File::Spec->curdir,"blib","arch");
+    $self->{INST_BIN} ||= File::Spec->catdir(File::Spec->curdir,'blib','bin');
 
     # We need to set up INST_LIBDIR before init_libscan() for VMS
     my @parentdir = split(/::/, $self->{PARENT_NAME});
-    $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
-    $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
-    $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
-    $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
+    $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} ||= $self->catdir($self->curdir,'blib','script');
-    $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
+    $self->{INST_EXE} ||= File::Spec->catdir(File::Spec->curdir,'blib','script');
+    $self->{INST_SCRIPT} ||= File::Spec->catdir(File::Spec->curdir,'blib','script');
 
     # The user who requests an installation directory explicitly
-    # should not have to tell us a architecture installation directory
+    # 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
@@ -1881,14 +1888,14 @@ usually solves this kind of problem.
            $self->prefixify($install_variable,$search_prefix,$replace_prefix);
        }
     }
-    my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
+    my $funkymandir = File::Spec->catdir($configure_prefix,"lib","perl5","man");
     $funkymandir = '' unless -d $funkymandir;
-    $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
-    if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
-       $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
+    $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 = $self->catdir(qq[\$\(PREFIX\)],"man");
+       $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"man");
     }
     for $install_variable (qw/
                           INSTALLMAN1DIR
@@ -1906,7 +1913,7 @@ usually solves this kind of problem.
        if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
            $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
        } else {
-           $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
+           $self->{INST_MAN1DIR} = File::Spec->catdir(File::Spec->curdir,'blib','man1');
        }
     }
     $self->{MAN1EXT} ||= $Config::Config{man1ext};
@@ -1917,7 +1924,7 @@ usually solves this kind of problem.
        if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
            $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
        } else {
-           $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
+           $self->{INST_MAN3DIR} = File::Spec->catdir(File::Spec->curdir,'blib','man3');
        }
     }
     $self->{MAN3EXT} ||= $Config::Config{man3ext};
@@ -1931,7 +1938,7 @@ usually solves this kind of problem.
        if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
            $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
        } else {
-           $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
+           $self->{INST_HTMLLIBDIR} = File::Spec->catdir(File::Spec->curdir,'blib','html','lib');
        }
     }
 
@@ -1941,7 +1948,7 @@ usually solves this kind of problem.
        if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
            $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
        } else {
-           $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
+           $self->{INST_HTMLSCRIPTDIR} = File::Spec->catdir(File::Spec->curdir,'blib','html','bin');
        }
     }
     $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
@@ -1983,7 +1990,7 @@ usually solves this kind of problem.
     # make a simple check if we find Exporter
     warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
         (Exporter.pm not found)"
-       unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
+       unless -f File::Spec->catfile("$self->{PERL_LIB}","Exporter.pm") ||
         $self->{NAME} eq "ExtUtils::MakeMaker";
 
     # Determine VERSION and VERSION_FROM
@@ -2012,16 +2019,32 @@ usually solves this kind of problem.
     # --- Initialize Perl Binary Locations
 
     # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
-    # will be working versions of perl 5. miniperl has priority over perl
-    # for PERL to ensure that $(PERL) is usable while building ./ext/*
+    # will be working versions of perl 5.
     my ($component,@defpath);
-    foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
+    foreach $component ($self->{PERL_SRC}, $self->path(), 
+                        $Config::Config{binexp}) 
+    {
        push @defpath, $component if defined $component;
     }
+
+    my @perls = ($self->canonpath($^X), 'perl', 'perl5', "perl$Config{version}");
+
+    # miniperl has priority over all but the cannonical perl when in the 
+    # core.  Otherwise its a last resort.
+    if( $self->{PERL_CORE} ) {
+        splice @perls, 1, 0, 'miniperl';
+    }
+    else {
+        push @perls, 'miniperl';
+    }
+
+    # Build up a set of file names (not command names).
+    foreach $element (@perls) {
+        $element .= "$Config{exe_ext}";
+    }
+
     $self->{PERL} ||=
-        $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
-                               'perl','perl5',"perl$Config{version}" ],
-           \@defpath, $Verbose );
+        $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
     # don't check if perl is executable, maybe they have decided to
     # supply switches with perl
 
@@ -2032,19 +2055,22 @@ usually solves this kind of problem.
     # Are we building the core?
     $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE};
 
+    my $aq = ($^O eq 'VMS' ? '"' : '');  # command-line argument quoter
+
     # How do we run perl?
     $self->{PERLRUN}      = $self->{PERL};
+    $self->{PERLRUN} .= " -${aq}I\$(PERL_LIB)$aq" if $self->{UNINSTALLED_PERL};
 
     # How do we run perl when installing libraries?
-    $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
+    $self->{PERLRUNINST} .= $self->{PERLRUN}. " -${aq}I\$(INST_ARCHLIB)$aq -${aq}I\$(INST_LIB)$aq";
 
     # What extra library dirs do we need when running the tests?
-    $self->{TEST_LIBS}   .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
+    $self->{TEST_LIBS}   .= " -${aq}I\$(INST_ARCHLIB)$aq -${aq}I\$(INST_LIB)$aq";
 
     # When building the core, we need to add some helper libs since
     # perl's @INC won't work (we're not installed yet).
     foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) {
-        $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)'
+        $self->{$targ} .= " -${aq}I\$(PERL_ARCHLIB)$aq -${aq}I\$(PERL_LIB)$aq"
           if $self->{PERL_CORE};
     }
 }
@@ -2152,8 +2178,8 @@ doc__install : doc_site_install
 
 pure_perl_install ::
        }.$self->{NOECHO}.q{$(MOD_INSTALL) \
-               read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+               read }.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+               write }.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
                $(INST_LIB) $(INSTALLPRIVLIB) \
                $(INST_ARCHLIB) $(INSTALLARCHLIB) \
                $(INST_BIN) $(INSTALLBIN) \
@@ -2163,13 +2189,13 @@ pure_perl_install ::
                $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
                $(INST_MAN3DIR) $(INSTALLMAN3DIR)
        }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
-               }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
+               }.File::Spec->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
 
 
 pure_site_install ::
        }.$self->{NOECHO}.q{$(MOD_INSTALL) \
-               read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
+               read }.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
+               write }.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
                $(INST_LIB) $(INSTALLSITELIB) \
                $(INST_ARCHLIB) $(INSTALLSITEARCH) \
                $(INST_BIN) $(INSTALLBIN) \
@@ -2179,7 +2205,7 @@ pure_site_install ::
                $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
                $(INST_MAN3DIR) $(INSTALLMAN3DIR)
        }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
-               }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
+               }.File::Spec->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
 
 doc_perl_install ::
        -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
@@ -2189,7 +2215,7 @@ doc_perl_install ::
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+               >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
 doc_site_install ::
        -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
@@ -2199,7 +2225,7 @@ doc_site_install ::
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+               >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
 };
 
@@ -2208,11 +2234,11 @@ uninstall :: uninstall_from_$(INSTALLDIRS)dirs
 
 uninstall_from_perldirs ::
        }.$self->{NOECHO}.
-       q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
+       q{$(UNINSTALL) }.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
 
 uninstall_from_sitedirs ::
        }.$self->{NOECHO}.
-       q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
+       q{$(UNINSTALL) }.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
 };
 
     join("",@m);
@@ -2231,7 +2257,7 @@ sub installbin {
     my(@m, $from, $to, %fromto, @to);
     push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
     for $from (@{$self->{EXE_FILES}}) {
-       my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
+       my($path)= File::Spec->catfile('$(INST_SCRIPT)', basename($from));
        local($_) = $path; # for backwards compatibility
        $to = $self->libscan($path);
        print "libscan($from) => '$to'\n" if ($Verbose >=2);
@@ -2258,7 +2284,7 @@ realclean ::
        last unless defined $from;
        my $todir = dirname($to);
        push @m, "
-$to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
+$to: $from $self->{MAKEFILE} " . File::Spec->catdir($todir,'.exists') . "
        $self->{NOECHO}$self->{RM_F} $to
        $self->{CP} $from $to
        \$(FIXIN) $to
@@ -2561,7 +2587,7 @@ doc_inst_perl:
                MAP_STATIC "$(MAP_STATIC)" \
                MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
                MAP_LIBPERL "$(MAP_LIBPERL)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+               >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
 
 };
 
@@ -2569,7 +2595,7 @@ doc_inst_perl:
 inst_perl: pure_inst_perl doc_inst_perl
 
 pure_inst_perl: $(MAP_TARGET)
-       }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
+       }.$self->{CP}.q{ $(MAP_TARGET) }.File::Spec->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
 
 clean :: map_clean
 
@@ -2633,13 +2659,13 @@ sub manifypods {
     my($dist);
     my($pod2man_exe);
     if (defined $self->{PERL_SRC}) {
-       $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
+       $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
     } else {
-       $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
+       $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
     }
     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
       # Maybe a build by uninstalled Perl?
-      $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
+      $pod2man_exe = File::Spec->catfile($self->{PERL_INC}, "pod", "pod2man");
     }
     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
        # No pod2man but some MAN3PODS to be installed
@@ -2698,12 +2724,12 @@ sub maybe_command_in_dirs {     # $ver is optional argument if looking for perl
        next unless defined $dir; # $self->{PERL_SRC} may be undefined
        foreach $name (@$names){
            my($abs,$tryabs);
-           if ($self->file_name_is_absolute($name)) { # /foo/bar
+           if (File::Spec->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
-           } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
-               $abs = $self->catfile($dir, $name);
+           } elsif (File::Spec->canonpath($name) eq File::Spec->canonpath(basename($name))) { # bar
+               $abs = File::Spec->catfile($dir, $name);
            } else { # foo/bar
-               $abs = $self->catfile($self->curdir, $name);
+               $abs = File::Spec->catfile(File::Spec->curdir, $name);
            }
            print "Checking $abs for $name\n" if ($trace >= 2);
            next unless $tryabs = $self->maybe_command($abs);
@@ -2770,7 +2796,8 @@ sub nicetext {
 
 parse a file and return what you think is $VERSION in this file set to.
 It will return the string "undef" if it can't figure out what $VERSION
-is.
+is. $VERSION should be for all to see, so our $VERSION or plain $VERSION
+are okay, but my $VERSION is not.
 
 =cut
 
@@ -2848,10 +2875,14 @@ sub pasthru {
     my($sep) = $Is_VMS ? ',' : '';
     $sep .= "\\\n\t";
 
-    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE INC DEFINE)) {
+    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
        push @pasthru, "$key=\"\$($key)\"";
     }
 
+    foreach $key (qw(DEFINE INC)) {
+       push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
+    }
+
     push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
     join "", @m;
 }
@@ -2863,13 +2894,7 @@ Takes no argument, returns the environment variable PATH as an array.
 =cut
 
 sub path {
-    my($self) = @_;
-    my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
-    my $path = $ENV{PATH};
-    $path =~ s:\\:/:g if $Is_OS2;
-    my @path = split $path_sep, $path;
-    foreach(@path) { $_ = '.' if $_ eq '' }
-    @path;
+    return File::Spec->path();
 }
 
 =item perl_script
@@ -3059,15 +3084,36 @@ destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
 
 =cut
 
+sub _pm_to_blib_flush {
+    my ($self, $autodir, $rr, $ra, $rl) = @_;
+    $$rr .= 
+q{     }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \
+       -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')"
+};
+    @$ra = ();
+    $$rl = 0;
+}
+
 sub pm_to_blib {
     my $self = shift;
-    my($autodir) = $self->catdir('$(INST_LIB)','auto');
-    return q{
+    my($autodir) = File::Spec->catdir('$(INST_LIB)','auto');
+    my $r = q{
 pm_to_blib: $(TO_INST_PM)
-       }.$self->{NOECHO}.q{$(PERLRUNINST) -MExtUtils::Install \
-        -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{','$(PM_FILTER)')"
-       }.$self->{NOECHO}.q{$(TOUCH) $@
 };
+    my %pm_to_blib = %{$self->{PM}};
+    my @a;
+    my $l;
+    while (my ($pm, $blib) = each %pm_to_blib) {
+       my $la = length $pm;
+       my $lb = length $blib;
+       if ($l + $la + $lb + @a / 2 > 200) { # limit line length
+           _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
+        }
+        push @a, $pm, $blib;
+       $l += $la + $lb;
+    }
+    _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
+    return $r.q{       }.$self->{NOECHO}.q{$(TOUCH) $@};
 }
 
 =item post_constants (o)
@@ -3151,6 +3197,22 @@ $target :: $plfile
     join "", @m;
 }
 
+=item quote_paren
+
+Backslashes parentheses C<()> in command line arguments.
+Doesn't handle recursive Makefile C<$(...)> constructs,
+but handles simple ones.
+
+=cut
+
+sub quote_paren {
+    local $_ = shift;
+    s/\$\((.+?)\)/\$\\\\($1\\\\)/g;    # protect $(...)
+    s/(?<!\\)([()])/\\$1/g;            # quote unprotected
+    s/\$\\\\\((.+?)\\\\\)/\$($1)/g;    # unprotect $(...)
+    return $_;
+}
+
 =item realclean (o)
 
 Defines the realclean target.
@@ -3160,6 +3222,9 @@ Defines the realclean target.
 sub realclean {
     my($self, %attribs) = @_;
     my(@m);
+
+    push(@m,'LLIBPERL = '.$llibperl."\n");
+
     push(@m,'
 # Delete temporary files (via clean) and also delete installed files
 realclean purge ::  clean
@@ -3300,7 +3365,7 @@ sub staticmake {
     # And as it's not yet built, we add the current extension
     # but only if it has some C code (or XS code, which implies C code)
     if (@{$self->{C}}) {
-       @static = $self->catfile($self->{INST_ARCHLIB},
+       @static = File::Spec->catfile($self->{INST_ARCHLIB},
                                 "auto",
                                 $self->{FULLEXT},
                                 "$self->{BASEEXT}$self->{LIB_EXT}"
@@ -3428,12 +3493,12 @@ test :: \$(TEST_TYPE)
     push(@m, "\n");
 
     push(@m, "test_dynamic :: pure_all\n");
-    push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
-    push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
+    push(@m, $self->test_via_harness('$(PERLRUN)', '$(TEST_FILES)')) if $tests;
+    push(@m, $self->test_via_script('$(PERLRUN)', '$(TEST_FILE)')) if -f "test.pl";
     push(@m, "\n");
 
     push(@m, "testdb_dynamic :: pure_all\n");
-    push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
+    push(@m, $self->test_via_script('$(PERLRUN) $(TESTDB_SW)', '$(TEST_FILE)'));
     push(@m, "\n");
 
     # Occasionally we may face this degenerate target:
@@ -3571,8 +3636,8 @@ Determines typemaps, xsubpp version, prototype behaviour.
 sub tool_xsubpp {
     my($self) = shift;
     return "" unless $self->needs_linking;
-    my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
-    my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
+    my($xsdir)  = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = File::Spec->catdir('$(XSUBPPDIR)','typemap');
     if( $self->{TYPEMAPS} ){
        my $typemap;
        foreach $typemap (@{$self->{TYPEMAPS}}){
@@ -3591,7 +3656,7 @@ sub tool_xsubpp {
     }
 
 
-    my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
+    my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,"xsubpp"));
 
     # What are the correct thresholds for version 1 && 2 Paul?
     if ( $xsubpp_version > 1.923 ){
@@ -3826,7 +3891,7 @@ sub xs_o {        # many makes are too dumb to use xs_c then c_o
     '
 .xs$(OBJ_EXT):
        $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
-       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
+       $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
 ';
 }