This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
SvUPGRADE doesn't return false.
[perl5.git] / installperl
index 63a8d66..04ae476 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     require 5.004;
-    chdir '..' if !-d 'lib' and -d '..\lib';
+    chdir '..' if !-d 'lib' and -d '../lib';
     @INC = 'lib';
     $ENV{PERL5LIB} = 'lib';
 }
@@ -103,6 +103,7 @@ Usage $0: [switches]
             name.
   -p        Don't install the pod files. [This will break use diagnostics;]
   -netware  Install correctly on a Netware server.
+  -destdir  Prefix installation directories by this string.
 EOT
        exit;
     }
@@ -128,7 +129,7 @@ close SCRIPTS;
 
 if ($scr_ext) { @scripts = map { "$_$scr_ext" } @scripts; }
 
-my @pods = $nopods ? () : (<pod/*.pod>);
+my @pods = $nopods ? () : (<pod/*.pod>, 'x2p/a2p.pod');
 
 # Specify here any .pm files that are actually architecture-dependent.
 # (Those included with XS extensions under ext/ are automatically
@@ -251,6 +252,9 @@ else {
                                " some tests failed! (Installing anyway.)\n";
 } #if (!$Is_NetWare)
 
+# This will be used to store the packlist
+my $packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
+
 if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin) {
     my $perldll;
 
@@ -265,6 +269,7 @@ if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin) {
                safe_unlink("$installbin/$_");
                copy("$_", "$installbin/$_");
                chmod(0755, "$installbin/$_");
+               $packlist->{"$installbin/$_"} = { type => 'file' };
            };
            open (LD2, ">$installbin/ld2");
            print LD2 <<SHELL;
@@ -301,14 +306,15 @@ SHELL
     safe_unlink("$installbin/$perldll");
     copy("$perldll", "$installbin/$perldll");
     chmod(0755, "$installbin/$perldll");
+    $packlist->{"$installbin/$perldll"} = { type => 'file' };
 } # if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin)
 
-# This will be used to store the packlist
-my $packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
-
 # First we install the version-numbered executables.
 
 if ($Is_VMS) {
+    safe_unlink("$installbin/perl_setup.com");
+    copy("perl_setup.com", "$installbin/perl_setup.com");
+    chmod(0755, "$installbin/perl_setup.com");
     safe_unlink("$installbin/$dbg$perl$exe_ext");
     copy("$dbg$perl$exe_ext", "$installbin/$dbg$perl$exe_ext");
     chmod(0755, "$installbin/$dbg$perl$exe_ext");
@@ -316,9 +322,12 @@ if ($Is_VMS) {
     copy("$dbg${perl}shr$exe_ext", "$installbin/$dbg${perl}shr$exe_ext");
     chmod(0755, "$installbin/$dbg${perl}shr$exe_ext");
     if ($ndbg) {
-       safe_unlink("$installbin/$ndbg$perl$exe_ext");
-       copy("$ndbg$perl$exe_ext", "$installbin/$ndbg$perl$exe_ext");
-       chmod(0755, "$installbin/$ndbg$perl$exe_ext");
+        safe_unlink("$installbin/$ndbg$perl$exe_ext");
+        copy("$ndbg$perl$exe_ext", "$installbin/$ndbg$perl$exe_ext");
+        chmod(0755, "$installbin/$ndbg$perl$exe_ext");
+       safe_unlink("$installbin/${dbg}a2p$exe_ext");
+       copy("x2p/${dbg}a2p$exe_ext", "$installbin/${dbg}a2p$exe_ext");
+       chmod(0755, "$installbin/${dbg}a2p$exe_ext");
     }
 }
 elsif ($^O eq 'mpeix') {
@@ -397,7 +406,7 @@ if ($Is_VMS) {  # We did core file selection during build
 }
 else {
     # [als] hard-coded 'libperl' name... not good!
-    @corefiles = <*.h libperl*.*>;
+    @corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
 
     # AIX needs perl.exp installed as well.
     push(@corefiles,'perl.exp') if $^O eq 'aix';
@@ -439,7 +448,7 @@ if (! $versiononly && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VM
        link("$installbin/$perl_verbase$ver$exe_ext",
                "$installbin/$perl$exe_ext");
     }
-    link("$installbin/s$perl_verbase$ver$exe_ext",
+    link("$installbin/$perl_verbase$ver$exe_ext",
            "$installbin/suid$perl$exe_ext")
       if $d_dosuid;
 }
@@ -497,7 +506,7 @@ if ($Config{installusrbinperl} && $Config{installusrbinperl} eq 'define' &&
 }
 
 # Make links to ordinary names if installbin directory isn't current directory.
-if (!$Is_NetWare) {
+if (!$Is_NetWare && $dbg eq '') {
     if (! samepath($installbin, 'x2p')) {
        my $base = 'a2p';
        $base .= $ver if $versiononly;
@@ -720,14 +729,16 @@ sub link {
        $packlist->{$xto} = { from => $xfrom, type => 'link' };
     };
     if ($@) {
-       warn $@;
+       warn "Replacing link() with File::Copy::copy(): $@";
        print $verbose ? "  cp $from $xto\n" : "  $xto\n" unless $silent;
        print "  creating new version of $xto\n"
                 if $Is_VMS and -e $to and !$silent;
-       File::Copy::copy($from, $to)
-           ? $success++
-           : warn "Couldn't copy $from to $to: $!\n"
-         unless $nonono;
+       unless ($nonono or File::Copy::copy($from, $to) and ++$success) {
+           # Might have been that F::C::c can't overwrite the target
+           warn "Couldn't copy $from to $to: $!\n"
+               unless -f $to and (chmod(0666, $to), unlink $to)
+                       and File::Copy::copy($from, $to) and ++$success;
+       }
        $packlist->{$xto} = { type => 'file' };
     }
     $success;
@@ -750,9 +761,12 @@ sub copy {
     $xto =~ s/^\Q$destdir\E// if $destdir;
     print $verbose ? "  cp $from $xto\n" : "  $xto\n" unless $silent;
     print "  creating new version of $xto\n" if $Is_VMS and -e $to and !$silent;
-    File::Copy::copy($from, $to)
-       || warn "Couldn't copy $from to $to: $!\n"
-      unless $nonono;
+    unless ($nonono or File::Copy::copy($from, $to)) {
+       # Might have been that F::C::c can't overwrite the target
+       warn "Couldn't copy $from to $to: $!\n"
+           unless -f $to and (chmod(0666, $to), unlink $to)
+                  and File::Copy::copy($from, $to);
+    }
     $packlist->{$xto} = { type => 'file' };
 }
 
@@ -780,7 +794,7 @@ sub installlib {
     my $name = $_;
 
     # Ignore version control directories.
-    if (($name eq 'CVS' or $name eq 'RCS' or $name eq '.svn') and -d $name) {
+    if ($name =~ /^(?:CVS|RCS|SCCS|\.svn)\z/ and -d $name) {
        $File::Find::prune = 1;
        return;
     }
@@ -789,8 +803,13 @@ sub installlib {
     # .exists files, .PL files, and test files.
     return if $name =~ m{\.orig$|\.rej$|~$|^#.+#$|,v$|^\.exists|\.PL$|\.plc$|\.t$|^test\.pl$} ||
              $dir  =~ m{/t(?:/|$)};
-    # ignore the cpan script in lib/CPAN/bin (installed later with other utils)
-    return if $name eq 'cpan';
+    # ignore the cpan script in lib/CPAN/bin, the instmodsh and xsubpp
+    # scripts in lib/ExtUtils, and the prove script in lib/Test/Harness
+    # as well as the corelist script from lib/Module/CoreList/bin
+    # (they're installed later with other utils)
+    return if $name =~ /^(?:cpan|instmodsh|prove|corelist)\z/;
+    # ignore the Makefiles
+    return if $name =~ /^makefile$/i;
     # ignore the test extensions
     return if $dir =~ m{ext/XS/(?:APItest|Typemap)/};
 
@@ -799,7 +818,8 @@ sub installlib {
     my $installlib = $installprivlib;
     if ($dir =~ /^auto/ ||
          ($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1}) ||
-         ($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare))
+         ($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare)) ||
+         $name eq 'Config_heavy.pl'
        ) {
        $installlib = $installarchlib;
        return unless $do_installarchlib;