Upgrade to ExtUtils::CBuilder 0.17
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Install.pm
index 212b7c4..17cb7f1 100644 (file)
@@ -2,7 +2,7 @@ package ExtUtils::Install;
 
 use 5.00503;
 use vars qw(@ISA @EXPORT $VERSION);
-$VERSION = 1.32;
+$VERSION = '1.33_01';
 
 use Exporter;
 use Carp ();
@@ -91,6 +91,9 @@ sub install {
     use File::Path qw(mkpath);
     use File::Compare qw(compare);
 
+    my $win32_special=!$nonono &&
+                      $^O eq 'MSWin32' &&
+                      eval { require Win32API::File; 1 };
     my(%from_to) = %$from_to;
     my(%pack, $dir, $warn_permissions);
     my($packlist) = ExtUtils::Packlist->new();
@@ -169,8 +172,28 @@ sub install {
                $diff++;
            }
 
-           if ($diff){
-               if (-f $targetfile){
+           if ($diff) {
+               if ($win32_special && -f $targetfile && !unlink $targetfile) {
+                   print "Can't remove existing '$targetfile': $!\n";
+                   my $tmp = "AAA";
+                   ++$tmp while -e "$targetfile.$tmp";
+                   $tmp= "$targetfile.$tmp";
+                   if ( rename $targetfile, $tmp ) {
+                       print "However it has been renamed as '$tmp' which ".
+                             "will be removed at next reboot.\n";
+                       Win32API::File::MoveFileEx( $tmp, [],
+                           Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT() )
+                           or die "MoveFileEx/Delete '$tmp' failed: $^E\n";
+                   } else {
+                       print "Installation cannot be completed until you reboot.\n",
+                             "Until then using '$tmp' as the install filename.\n";
+                       Win32API::File::MoveFileEx( $tmp, $targetfile,
+                           Win32API::File::MOVEFILE_REPLACE_EXISTING() |
+                           Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT() )
+                           or die "MoveFileEx/Replace '$tmp' failed: $^E\n";
+                       $targetfile = $tmp;
+                   }
+               } elsif (-f $targetfile) {
                    forceunlink($targetfile) unless $nonono;
                } else {
                    mkpath($targetdir,0,0755) unless $nonono;
@@ -273,12 +296,12 @@ sub install_default {
   @_ < 2 or die "install_default should be called with 0 or 1 argument";
   my $FULLEXT = @_ ? shift : $ARGV[0];
   defined $FULLEXT or die "Do not know to where to write install log";
-  my $INST_LIB = File::Spec->catdir(File::Spec->curdir,"blib","lib");
-  my $INST_ARCHLIB = File::Spec->catdir(File::Spec->curdir,"blib","arch");
-  my $INST_BIN = File::Spec->catdir(File::Spec->curdir,'blib','bin');
-  my $INST_SCRIPT = File::Spec->catdir(File::Spec->curdir,'blib','script');
-  my $INST_MAN1DIR = File::Spec->catdir(File::Spec->curdir,'blib','man1');
-  my $INST_MAN3DIR = File::Spec->catdir(File::Spec->curdir,'blib','man3');
+  my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib");
+  my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch");
+  my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin');
+  my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script');
+  my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1');
+  my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3');
   install({
           read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
           write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
@@ -398,6 +421,7 @@ sub run_filter {
 
 Copies each key of %from_to to its corresponding value efficiently.
 Filenames with the extension .pm are autosplit into the $autosplit_dir.
+Any destination directories are created.
 
 $filter_cmd is an optional shell command to run each .pm file through
 prior to splitting and copying.  Input is the contents of the module,
@@ -416,19 +440,6 @@ sub pm_to_blib {
     use File::Path qw(mkpath);
     use File::Compare qw(compare);
     use AutoSplit;
-    # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
-    # require $my_req; # Hairy, but for the first
-
-    if (!ref($fromto) && -r $fromto)
-     {
-      # Win32 has severe command line length limitations, but
-      # can generate temporary files on-the-fly
-      # so we pass name of file here - eval it to get hash 
-      open(FROMTO,"<$fromto") or die "Cannot open $fromto:$!";
-      my $str = '$fromto = {qw{'.join('',<FROMTO>).'}}';
-      eval $str;
-      close(FROMTO);
-     }
 
     mkpath($autodir,0,0755);
     while(my($from, $to) = each %$fromto) {