Re: [PATCH] Re: MakeMaker doesn't pasthru DEFINE command-line args to subdirs on...
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_Unix.pm
index 87d93bf..f49c707 100644 (file)
@@ -9,18 +9,19 @@ use Carp;
 use Config         qw(%Config);
 use File::Basename qw(basename dirname fileparse);
 use DirHandle;
+use Text::ParseWords;
 
 use vars qw($VERSION @ISA
             $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Win95  $Is_Dos $Is_VOS
-            $Is_QNX $Is_AIX $Is_OSF $Is_IRIX  $Is_NetBSD 
+            $Is_QNX $Is_AIX $Is_OSF $Is_IRIX  $Is_NetBSD $Is_BSD
             $Is_SunOS4 $Is_Solaris $Is_SunOS
-            $Verbose %pm %static $Xsubpp_Version
+            $Verbose %pm %static
             %Config_Override
            );
 
 use ExtUtils::MakeMaker qw($Verbose neatvalue);
 
-$VERSION = '1.35';
+$VERSION = '1.41';
 
 require ExtUtils::MM_Any;
 @ISA = qw(ExtUtils::MM_Any);
@@ -40,6 +41,7 @@ $Is_NetBSD  = $^O eq 'netbsd';
 $Is_SunOS4  = $^O eq 'sunos';
 $Is_Solaris = $^O eq 'solaris';
 $Is_SunOS   = $Is_SunOS4 || $Is_Solaris;
+$Is_BSD     = $^O =~ /^(?:free|net|open)bsd|bsdos$/;
 
 
 =head1 NAME
@@ -97,6 +99,17 @@ my $Updir   = __PACKAGE__->updir;
 
 =over 4
 
+=item os_flavor (o)
+
+Simply says that we're Unix.
+
+=cut
+
+sub os_flavor {
+    return('Unix');
+}
+
+
 =item c_o (o)
 
 Defines the suffix rules to compile different flavors of C files to
@@ -115,30 +128,30 @@ sub c_o {
         $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
         push @m, '
 .c.i:
-       '. $cpp_cmd . ' $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
+       '. $cpp_cmd . ' $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.c > $*.i
 ';
     }
     push @m, '
 .c.s:
-       $(CCCMD) -S $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+       $(CCCMD) -S $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.c
 ';
     push @m, '
 .c$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
+       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.c
 ';
     push @m, '
 .C$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.C
+       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.C
 ' if !$Is_OS2 and !$Is_Win32 and !$Is_Dos; #Case-specific
     push @m, '
 .cpp$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
+       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.cpp
 
 .cxx$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
+       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.cxx
 
 .cc$(OBJ_EXT):
-       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cc
+       $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(DEFINE) $(PASTHRU_DEFINE) $*.cc
 ';
     join "", @m;
 }
@@ -282,6 +295,7 @@ clean :: clean_subdirs
     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
     push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) 
                          $(INST_ARCHAUTODIR)/extralibs.all
+                         $(INST_ARCHAUTODIR)/extralibs.ld
                         perlmain.c tmon.out mon.out so_locations pm_to_blib
                         *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
                         $(BOOTSTRAP) $(BASEEXT).bso
@@ -293,6 +307,9 @@ clean :: clean_subdirs
     }
     else {
         push(@otherfiles, qw[core core.*perl.*.? *perl.core]);
+
+        # core.\d+
+        push(@otherfiles, map { "core." . "[0-9]"x$_ } (1..5));
     }
 
     push @m, "\t-\$(RM_RF) @otherfiles\n";
@@ -347,8 +364,10 @@ sub const_cccmd {
     my($self,$libperl)=@_;
     return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
     return '' unless $self->needs_linking();
+    # PASTHRU_INC is defined explicitly by extensions
+    # wanting to do complex things.
     return $self->{CONST_CCCMD} =
-       q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
+       q{CCCMD = $(CC) -c $(INC) $(PASTHRU_INC) \\
        $(CCFLAGS) $(OPTIMIZE) \\
        $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
@@ -417,19 +436,23 @@ sub constants {
     my($self) = @_;
     my @m = ();
 
-    for my $macro (qw/
+    for my $macro (qw(
 
               AR_STATIC_ARGS DIRFILESEP
               NAME NAME_SYM 
               VERSION    VERSION_MACRO    VERSION_SYM DEFINE_VERSION
               XS_VERSION XS_VERSION_MACRO             XS_DEFINE_VERSION
               INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
+              INST_MAN1DIR INST_MAN3DIR
+              MAN1EXT      MAN3EXT
               INSTALLDIRS
               DESTDIR PREFIX
               PERLPREFIX      SITEPREFIX      VENDORPREFIX
-              INSTALLPRIVLIB  INSTALLSITELIB  INSTALLVENDORLIB
-              INSTALLARCHLIB  INSTALLSITEARCH INSTALLVENDORARCH
-              INSTALLBIN      INSTALLSITEBIN  INSTALLVENDORBIN  INSTALLSCRIPT 
+                   ),
+                   (map { ("INSTALL".$_,
+                          "DESTINSTALL".$_)
+                        } $self->installvars),
+                   qw(
               PERL_LIB    
               PERL_ARCHLIB
               LIBPERL_A MYEXTLIB
@@ -441,7 +464,7 @@ sub constants {
               PERL_CORE
               PERM_RW PERM_RWX
 
-             / ) 
+             ) ) 
     {
        next unless defined $self->{$macro};
 
@@ -483,17 +506,6 @@ MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
 MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
 ";
 
-    for my $macro (qw/
-             INST_MAN1DIR  MAN1EXT
-              INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
-             INST_MAN3DIR  MAN3EXT
-              INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
-             /) 
-    {
-       next unless defined $self->{$macro};
-       push @m, "$macro = $self->{$macro}\n";
-    }
-
 
     push @m, q{
 # Where is the Config information that we are using/depend on
@@ -593,6 +605,28 @@ $targ :: $src
     join "", @m;
 }
 
+=item init_DEST
+
+  $mm->init_DEST
+
+Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
+
+=cut
+
+sub init_DEST {
+    my $self = shift;
+
+    # Initialize DESTDIR
+    $self->{DESTDIR} ||= '';
+
+    # Make DEST variables.
+    foreach my $var ($self->installvars) {
+        my $destvar = 'DESTINSTALL'.$var;
+        $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
+    }
+}
+
+
 =item init_dist
 
   $mm->init_dist;
@@ -732,8 +766,8 @@ sub dist_ci {
 ci :
        $(PERLRUN) "-MExtUtils::Manifest=maniread" \\
          -e "@all = keys %{ maniread() };" \\
-         -e "print("Executing $(CI) @all\n"); system(qq{$(CI) @all});" \\
-         -e "print("Executing $(RCS_LABEL) ...\n"); system(qq{$(RCS_LABEL) @all});"
+         -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \\
+         -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
 };
 }
 
@@ -777,11 +811,11 @@ sub dist_target {
 
     my $date_check = $self->oneliner(<<'CODE', ['-l']);
 print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
-  if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
+    if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
 CODE
 
     return sprintf <<'MAKE_FRAG', $date_check;
-dist : $(DIST_DEFAULT)
+dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
        $(NOECHO) %s
 MAKE_FRAG
 }
@@ -1000,8 +1034,6 @@ sub dynamic {
 
     my($self) = shift;
     '
-## $(INST_PM) has been moved to the all: target.
-## It remains here for awhile to allow for old usage: "make dynamic"
 dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
        $(NOECHO) $(NOOP)
 ';
@@ -1059,12 +1091,14 @@ sub dynamic_lib {
     $armaybe = 'ar' if ($Is_OSF and $armaybe eq ':');
     my(@m);
     my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : '';        # Useful on other systems too?
+    my $ld_fix = $Is_OS2 ? '|| ( $(RM_F) $@ && sh -c false )' : '';
     push(@m,'
 # This section creates the dynamically loadable $(INST_DYNAMIC)
 # from $(OBJECT) and possibly $(MYEXTLIB).
 ARMAYBE = '.$armaybe.'
 OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
+INST_DYNAMIC_FIX = '.$ld_fix.'
 
 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
 ');
@@ -1105,7 +1139,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILE
 
     push(@m,
 '      LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
-' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
+' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) $(INST_DYNAMIC_FIX)');
     push @m, '
        $(CHMOD) $(PERM_RWX) $@
 ';
@@ -1157,14 +1191,16 @@ in these dirs:
 
     my $stderr_duped = 0;
     local *STDERR_COPY;
-    if( open(STDERR_COPY, '>&STDERR') ) {
-        $stderr_duped = 1;
-    }
-    else {
-        warn <<WARNING;
+    unless ($Is_BSD) {
+        if( open(STDERR_COPY, '>&STDERR') ) {
+            $stderr_duped = 1;
+        }
+        else {
+            warn <<WARNING;
 find_perl() can't dup STDERR: $!
 You might see some garbage while we search for Perl
 WARNING
+        }
     }
 
     foreach $name (@$names){
@@ -1183,11 +1219,20 @@ WARNING
             next unless $self->maybe_command($abs);
             print "Executing $abs\n" if ($trace >= 2);
 
+            my $version_check = qq{$abs -e "require $ver; print qq{VER_OK\n}"};
             # To avoid using the unportable 2>&1 to supress STDERR,
             # we close it before running the command.
-            close STDERR if $stderr_duped;
-            $val = `$abs -e "require $ver; print qq{VER_OK\n}"`;
-            open STDERR, '>&STDERR_COPY' if $stderr_duped;
+            # However, thanks to a thread library bug in many BSDs
+            # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
+            # we cannot use the fancier more portable way in here
+            # but instead need to use the traditional 2>&1 construct.
+            if ($Is_BSD) {
+                $val = `$version_check 2>&1`;
+            } else {
+                close STDERR if $stderr_duped;
+                $val = `$version_check`;
+                open STDERR, '>&STDERR_COPY' if $stderr_duped;
+            }
 
             if ($val =~ /^VER_OK/) {
                 print "Using PERL=$abs\n" if $trace;
@@ -1237,6 +1282,9 @@ sub fixin { # stolen from the pink Camel book, more or less
 
     my($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
     for my $file (@files) {
+        my $file_new = "$file.new";
+        my $file_bak = "$file.bak";
+
        local(*FIXIN);
        local(*FIXOUT);
        open(FIXIN, $file) or croak "Can't process '$file': $!";
@@ -1288,11 +1336,10 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
            next;
        }
 
-       unless ( open(FIXOUT,">$file.new") ) {
+       unless ( open(FIXOUT,">$file_new") ) {
            warn "Can't create new $file: $!\n";
            next;
        }
-       my($dev,$ino,$mode) = stat FIXIN;
        
        # Print out the new #! line (or equivalent).
        local $\;
@@ -1301,19 +1348,21 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
        close FIXIN;
        close FIXOUT;
 
-       unless ( rename($file, "$file.bak") ) { 
-           warn "Can't rename $file to $file.bak: $!";
+        chmod 0666, $file_bak;
+        unlink $file_bak;
+       unless ( rename($file, $file_bak) ) {   
+           warn "Can't rename $file to $file_bak: $!";
            next;
        }
-       unless ( rename("$file.new", $file) ) { 
-           warn "Can't rename $file.new to $file: $!";
-           unless ( rename("$file.bak", $file) ) {
-               warn "Can't rename $file.bak back to $file either: $!";
-               warn "Leaving $file renamed as $file.bak\n";
+       unless ( rename($file_new, $file) ) {   
+           warn "Can't rename $file_new to $file: $!";
+           unless ( rename($file_bak, $file) ) {
+               warn "Can't rename $file_bak back to $file either: $!";
+               warn "Leaving $file renamed as $file_bak\n";
            }
            next;
        }
-       unlink "$file.bak";
+       unlink $file_bak;
     } continue {
        close(FIXIN) if fileno(FIXIN);
        system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
@@ -1386,7 +1435,7 @@ Called by init_main.
 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
+    my %pm;
 
     @ignore{qw(Makefile.PL test.pl t)} = (1,1,1);
 
@@ -1402,6 +1451,7 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
        next unless $self->libscan($name);
        if (-d $name){
            next if -l $name; # We do not support symlinks at all
+            next if $self->{NORECURS};
            $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
        } elsif ($name =~ /\.xs\z/){
            my($c); ($c = $name) =~ s/\.xs\z/.c/;
@@ -1489,6 +1539,7 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
             }
             return if /\#/;
             return if /~$/;    # emacs temp files
+            return if /,v$/;   # RCS files
 
            my $path   = $File::Find::name;
             my $prefix = $self->{INST_LIBDIR};
@@ -1590,7 +1641,7 @@ sub init_dirscan {        # --- File and Directory Lists (.xs .pm .pod etc)
            my($manpagename) = $name;
            $manpagename =~ s/\.p(od|m|l)\z//;
            # everything below lib is ok
-           if($self->{PARENT_NAME} && $manpagename !~ s!^\W*lib\W+!!s) {
+           unless($manpagename =~ s!^\W*lib\W+!!s) {
                $manpagename = $self->catfile(
                                 split(/::/,$self->{PARENT_NAME}),$manpagename
                                );
@@ -1842,7 +1893,7 @@ usually solves this kind of problem.
 Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
 OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, SHELL, NOOP,
 FIRST_MAKEFILE, MAKEFILE_OLD, NOECHO, RM_F, RM_RF, TEST_F,
-TOUCH, CP, MV, CHMOD, UMASK_NULL
+TOUCH, CP, MV, CHMOD, UMASK_NULL, ECHO, ECHO_N
 
 =cut
 
@@ -1903,6 +1954,7 @@ sub init_others { # --- Initialize Other Attributes
     $self->{SHELL}              ||= $Config{sh} || '/bin/sh';
 
     $self->{ECHO}       ||= 'echo';
+    $self->{ECHO_N}     ||= 'echo -n';
     $self->{RM_F}       ||= "rm -f";
     $self->{RM_RF}      ||= "rm -rf";
     $self->{TOUCH}      ||= "touch";
@@ -1967,15 +2019,14 @@ sub init_INST {
     }
 
     my @parentdir = split(/::/, $self->{PARENT_NAME});
-    $self->{INST_LIBDIR} = $self->catdir($self->{INST_LIB},@parentdir);
-    $self->{INST_ARCHLIBDIR} = $self->catdir($self->{INST_ARCHLIB},
-                                                  @parentdir);
-    $self->{INST_AUTODIR} = $self->catdir($self->{INST_LIB},'auto',
-                                               $self->{FULLEXT});
-    $self->{INST_ARCHAUTODIR} = $self->catdir($self->{INST_ARCHLIB},
-                                                   'auto',$self->{FULLEXT});
+    $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_SCRIPT} ||= $self->catdir($Curdir,'blib','script');
+    $self->{INST_SCRIPT}  ||= $self->catdir($Curdir,'blib','script');
 
     $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
     $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
@@ -1997,15 +2048,15 @@ sub init_INSTALL {
 
     $self->init_lib2arch;
 
-    if( $Config{usevendorprefix} ) {
-        $Config_Override{installvendorman1dir} =
-          $self->catdir($Config{vendorprefixexp}, 'man', 'man1');
-        $Config_Override{installvendorman3dir} =
-          $self->catdir($Config{vendorprefixexp}, 'man', 'man3');
-    }
-    else {
-        $Config_Override{installvendorman1dir} = '';
-        $Config_Override{installvendorman3dir} = '';
+    # Initialize installvendorman*dir if necessary
+    foreach my $num (1, 3) {
+        my $k = 'installvendorman'.$num.'dir';
+
+        unless ($Config{$k}) {
+            $Config_Override{$k} = $Config{usevendorprefix} ?
+                  $self->catdir($Config{vendorprefixexp}, 'man', "man$num") :
+                  '';
+        }
     }
 
     my $iprefix = $Config{installprefixexp} || $Config{installprefix} || 
@@ -2045,12 +2096,6 @@ sub init_INSTALL {
         $self->{VENDORPREFIX} ||= $vprefix;
     }
 
-    # Add DESTDIR.
-    $self->{DESTDIR} ||= '';
-    foreach my $prefix (qw(PREFIX PERLPREFIX SITEPREFIX VENDORPREFIX)) {
-        $self->{$prefix} = '$(DESTDIR)'.$self->{$prefix};
-    }
-
     my $arch    = $Config{archname};
     my $version = $Config{version};
 
@@ -2448,13 +2493,13 @@ doc__install : doc_site_install
 pure_perl_install ::
        $(NOECHO) $(MOD_INSTALL) \
                read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
-               $(INST_LIB) $(INSTALLPRIVLIB) \
-               $(INST_ARCHLIB) $(INSTALLARCHLIB) \
-               $(INST_BIN) $(INSTALLBIN) \
-               $(INST_SCRIPT) $(INSTALLSCRIPT) \
-               $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
-               $(INST_MAN3DIR) $(INSTALLMAN3DIR)
+               write }.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
+               $(INST_LIB) $(DESTINSTALLPRIVLIB) \
+               $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
+               $(INST_BIN) $(DESTINSTALLBIN) \
+               $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+               $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
+               $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
        $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
                }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
 
@@ -2462,59 +2507,59 @@ pure_perl_install ::
 pure_site_install ::
        $(NOECHO) $(MOD_INSTALL) \
                read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
-               $(INST_LIB) $(INSTALLSITELIB) \
-               $(INST_ARCHLIB) $(INSTALLSITEARCH) \
-               $(INST_BIN) $(INSTALLSITEBIN) \
-               $(INST_SCRIPT) $(INSTALLSCRIPT) \
-               $(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) \
-               $(INST_MAN3DIR) $(INSTALLSITEMAN3DIR)
+               write }.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
+               $(INST_LIB) $(DESTINSTALLSITELIB) \
+               $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
+               $(INST_BIN) $(DESTINSTALLSITEBIN) \
+               $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+               $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
+               $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
        $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
                }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
 
 pure_vendor_install ::
        $(NOECHO) $(MOD_INSTALL) \
                read }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
-               write }.$self->catfile('$(INSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{ \
-               $(INST_LIB) $(INSTALLVENDORLIB) \
-               $(INST_ARCHLIB) $(INSTALLVENDORARCH) \
-               $(INST_BIN) $(INSTALLVENDORBIN) \
-               $(INST_SCRIPT) $(INSTALLSCRIPT) \
-               $(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) \
-               $(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR)
+               write }.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{ \
+               $(INST_LIB) $(DESTINSTALLVENDORLIB) \
+               $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
+               $(INST_BIN) $(DESTINSTALLVENDORBIN) \
+               $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+               $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
+               $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
 
 doc_perl_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
+       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
        -$(NOECHO) $(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLPRIVLIB)" \
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+               >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
 
 doc_site_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(INSTALLSITEARCH)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(INSTALLSITEARCH)
+       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
        -$(NOECHO) $(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLSITELIB)" \
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLSITEARCH)','perllocal.pod').q{
+               >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
 
 doc_vendor_install ::
-       $(NOECHO) $(ECHO) Appending installation info to $(INSTALLVENDORARCH)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(INSTALLVENDORARCH)
+       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
        -$(NOECHO) $(DOC_INSTALL) \
                "Module" "$(NAME)" \
                "installed into" "$(INSTALLVENDORLIB)" \
                LINKTYPE "$(LINKTYPE)" \
                VERSION "$(VERSION)" \
                EXE_FILES "$(EXE_FILES)" \
-               >> }.$self->catfile('$(INSTALLVENDORARCH)','perllocal.pod').q{
+               >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
 
 };
 
@@ -2554,14 +2599,21 @@ sub installbin {
        $fromto{$from}=$to;
     }
     @to   = values %fromto;
+
+    my $fixin;
+    if( $Is_Win32 ) {
+        $fixin = $self->{PERL_CORE} ? '$(PERLRUN) ../../win32/bin/pl2bat.pl'
+                                    : 'pl2bat.bat';
+    }
+    else {
+        $fixin = q{$(PERLRUN) "-MExtUtils::MY" -e "MY->fixin(shift)"};
+    }
+
     push(@m, qq{
 EXE_FILES = @{$self->{EXE_FILES}}
 
-} . ($Is_Win32
-  ? q{FIXIN = pl2bat.bat
-} : q{FIXIN = $(PERLRUN) "-MExtUtils::MY" \
-    -e "MY->fixin(shift)"
-}).qq{
+FIXIN = $fixin
+
 pure_all :: @to
        \$(NOECHO) \$(NOOP)
 
@@ -2671,7 +2723,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
        $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
        $(NOECHO) $(PERLRUNINST) \
                Makefile.PL DIR=}, $dir, q{ \
-               FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
+               MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
                MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
 
        foreach (@ARGV){
@@ -2856,14 +2908,14 @@ $tmp/perlmain.c: $makefilename}, q{
 
     push @m, q{
 doc_inst_perl:
-       $(NOECHO) $(ECHO) Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
-       -$(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
+       $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
+       -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
        -$(NOECHO) $(DOC_INSTALL) \
                "Perl binary" "$(MAP_TARGET)" \
                MAP_STATIC "$(MAP_STATIC)" \
                MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
                MAP_LIBPERL "$(MAP_LIBPERL)" \
-               >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+               >> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
 
 };
 
@@ -2871,7 +2923,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) }.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{
 
 clean :: map_clean
 
@@ -2899,9 +2951,9 @@ $(OBJECT) : $(FIRST_MAKEFILE)
 ' if $self->{OBJECT};
 
     push @m, q{
-# We take a very conservative approach here, but it\'s worth it.
+# We take a very conservative approach here, but it's worth it.
 # We move Makefile to Makefile.old here to avoid gnu make looping.
-$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) $(VERSION_FROM)
+$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
        $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
        $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
        $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
@@ -3022,8 +3074,7 @@ sub parse_version {
        $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
        next if $inpod || /^\s*#/;
        chop;
-       # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
-       next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
+       next unless /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
        my $eval = qq{
            package ExtUtils::MakeMaker::_version;
            no strict;
@@ -3060,10 +3111,26 @@ sub pasthru {
     my($sep) = $Is_VMS ? ',' : '';
     $sep .= "\\\n\t";
 
-    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
-       push @pasthru, "$key=\"\$($key)\"";
+    foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE INC DEFINE)) {
+       if ($key eq 'INC' && defined(my $inc = $self->{INC})) {
+           # For INC we need to prepend parent directory but
+           # only iff the parent directory is not absolute.
+           my ($o, $i) = $Is_VMS ? ('/Include=', 'i') : ('-I', '');
+           my $newinc = '';
+           foreach (grep { /\S/ } parse_line(qr/\s*(?$i)$o/, 1, $inc)) {
+               s/^"(.+)"$/$1/o;
+               my $dir = File::Spec->file_name_is_absolute($_) ? $_ : File::Spec->catdir(File::Spec->updir, $_);
+               $dir = qq["$dir"] if $dir =~ / /;
+               $newinc .= " $o$dir";
+           }
+           push @pasthru, "INC=\"$newinc\"";
+       } else {
+           push @pasthru, "$key=\"\$($key)\"";
+       }
     }
 
+    # PASTHRU_DEFINE and PASTHRU_INC are defined explicitly
+    # by extensions wanting to do really complex things.
     foreach $key (qw(DEFINE INC)) {
        push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
     }
@@ -3135,10 +3202,8 @@ PERL_HDRS = \
        $(PERL_INC)/nostdio.h           \
        $(PERL_INC)/op.h                \
        $(PERL_INC)/opcode.h            \
-       $(PERL_INC)/opnames.h           \
        $(PERL_INC)/patchlevel.h        \
        $(PERL_INC)/perl.h              \
-       $(PERL_INC)/perlapi.h           \
        $(PERL_INC)/perlio.h            \
        $(PERL_INC)/perlsdio.h          \
        $(PERL_INC)/perlsfio.h          \
@@ -3155,9 +3220,7 @@ PERL_HDRS = \
        $(PERL_INC)/thrdvar.h           \
        $(PERL_INC)/thread.h            \
        $(PERL_INC)/unixish.h           \
-       $(PERL_INC)/utf8.h              \
-       $(PERL_INC)/util.h              \
-       $(PERL_INC)/warnings.h
+       $(PERL_INC)/util.h
 
 $(OBJECT) : $(PERL_HDRS)
 } if $self->{OBJECT};
@@ -3369,6 +3432,8 @@ sub prefixify {
     my $path = $self->{uc $var} || 
                $Config_Override{lc $var} || $Config{lc $var} || '';
 
+    $rprefix .= '/' if $sprefix =~ m|/$|;
+
     print STDERR "  prefixify $var => $path\n" if $Verbose >= 2;
     print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
 
@@ -3451,7 +3516,7 @@ realclean purge ::  clean realclean_subdirs
         push(@m, "     \$(RM_F) \$(INST_STATIC)\n");
     }
 
-    my @files = ();
+    my @files = values %{$self->{PM}};
     push @files, $attribs{FILES} if $attribs{FILES};
     push @files, '$(FIRST_MAKEFILE)', '$(MAKEFILE_OLD)';
 
@@ -3539,7 +3604,8 @@ sub oneliner {
     $cmd =~ s{^\n+}{};
     $cmd =~ s{\n+$}{};
 
-    $cmd = $self->quote_literal($cmd);
+    my @cmds = split /\n/, $cmd;
+    $cmd = join " \n\t-e ", map $self->quote_literal($_), @cmds;
     $cmd = $self->escape_newlines($cmd);
 
     $switches = join ' ', @$switches;
@@ -3783,7 +3849,7 @@ test :: \$(TEST_TYPE)
         push(@m, map("\t\$(NOECHO) cd $_ && \$(TEST_F) \$(FIRST_MAKEFILE) && \$(MAKE) test \$(PASTHRU)\n", @{$self->{DIR}}));
     }
 
-    push(@m, "\t\$(NOECHO) $(ECHO) 'No tests defined for \$(NAME) extension.'\n")
+    push(@m, "\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n")
        unless $tests or -f "test.pl" or @{$self->{DIR}};
     push(@m, "\n");
 
@@ -3861,7 +3927,8 @@ sub tools_other {
     my @m;
 
     for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH 
-                      UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP ECHO
+                      UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP 
+                      ECHO ECHO_N
                       UNINST VERBINST
                       MOD_INSTALL DOC_INSTALL UNINSTALL
                       WARN_IF_OLD_PACKLIST
@@ -3892,7 +3959,8 @@ sub tool_xsubpp {
         }
     }
 
-    my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
+    my $tmdir   = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
+    my(@tmdeps) = $self->catfile($tmdir,'typemap');
     if( $self->{TYPEMAPS} ){
        my $typemap;
        foreach $typemap (@{$self->{TYPEMAPS}}){
@@ -3911,27 +3979,11 @@ sub tool_xsubpp {
     }
 
 
-    my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
-
-    # What are the correct thresholds for version 1 && 2 Paul?
-    if ( $xsubpp_version > 1.923 ){
-       $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
-    } else {
-       if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
-           print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
-       Your version of xsubpp is $xsubpp_version and cannot handle this.
-       Please upgrade to a more recent version of xsubpp.
-};
-       } else {
-           $self->{XSPROTOARG} = "";
-       }
-    }
-
-    my $xsubpp = "xsubpp";
+    $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
 
     return qq{
 XSUBPPDIR = $xsdir
-XSUBPP = \$(XSUBPPDIR)/$xsubpp
+XSUBPP = \$(XSUBPPDIR)/xsubpp
 XSPROTOARG = $self->{XSPROTOARG}
 XSUBPPDEPS = @tmdeps \$(XSUBPP)
 XSUBPPARGS = @tmargs
@@ -3939,61 +3991,6 @@ XSUBPP_EXTRA_ARGS =
 };
 };
 
-sub xsubpp_version
-{
-    my($self,$xsubpp) = @_;
-    return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
-
-    my ($version) ;
-
-    # try to figure out the version number of the xsubpp on the system
-
-    # first try the -v flag, introduced in 1.921 & 2.000a2
-
-    return "" unless $self->needs_linking;
-
-    my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v 2>&1};
-    print "Running $command\n" if $Verbose >= 2;
-    $version = `$command` ;
-    warn "Running '$command' exits with status " . ($?>>8) if $?;
-    chop $version ;
-
-    return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
-
-    # nope, then try something else
-
-    my $counter = '000';
-    my ($file) = 'temp' ;
-    $counter++ while -e "$file$counter"; # don't overwrite anything
-    $file .= $counter;
-
-    open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
-    print F <<EOM ;
-MODULE = fred PACKAGE = fred
-
-int
-fred(a)
-        int     a;
-EOM
-
-    close F ;
-
-    $command = "$self->{PERL} $xsubpp $file 2>&1";
-    print "Running $command\n" if $Verbose >= 2;
-    my $text = `$command` ;
-    warn "Running '$command' exits with status " . ($?>>8) if $?;
-    unlink $file ;
-
-    # gets 1.2 -> 1.92 and 2.000a1
-    return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
-
-    # it is either 1.0 or 1.1
-    return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
-
-    # none of the above, so 1.0
-    return $Xsubpp_Version = "1.0" ;
-}
-
 
 =item all_target