This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
UNIVERSAL.pm and import methods (tests)
[perl5.git] / installperl
index ee2c07c..9686bfb 100755 (executable)
@@ -1,15 +1,21 @@
 #!./perl
-BEGIN { @INC=('./lib', '../lib') }
+
+BEGIN {
+    require 5.004;
+    @INC = 'lib';
+    $ENV{PERL5LIB} = 'lib';
+}
+
 use File::Find;
 use File::Compare;
+use File::Copy ();
 use File::Path ();
 use Config;
-use subs qw(unlink rename link chmod);
+use subs qw(unlink link chmod);
 
 # override the ones in the rest of the script
-sub mkpath
-{
-  File::Path::mkpath(@_) unless $nonono;
+sub mkpath {
+    File::Path::mkpath(@_) unless $nonono;
 }
 
 $mainperldir = "/usr/bin";
@@ -80,14 +86,14 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 
 # First we install the version-numbered executables.
 
-&safe_unlink("$installbin/perl$ver$exe_ext");
-&cmd("cp perl$exe_ext $installbin/perl$ver$exe_ext");
-&chmod(0755, "$installbin/perl$ver$exe_ext");
+safe_unlink("$installbin/perl$ver$exe_ext");
+copy("perl$exe_ext", "$installbin/perl$ver$exe_ext");
+chmod(0755, "$installbin/perl$ver$exe_ext");
 
-&safe_unlink("$installbin/sperl$ver$exe_ext");
+safe_unlink("$installbin/sperl$ver$exe_ext");
 if ($d_dosuid) {
-    &cmd("cp suidperl$exe_ext $installbin/sperl$ver$exe_ext");
-    &chmod(04711, "$installbin/sperl$ver$exe_ext");
+    copy("suidperl$exe_ext", "$installbin/sperl$ver$exe_ext");
+    chmod(04711, "$installbin/sperl$ver$exe_ext");
 }
 
 # Install library files.
@@ -100,8 +106,8 @@ mkpath($installsitelib, 1, 0777) if ($installsitelib);
 mkpath($installsitearch, 1, 0777) if ($installsitearch);
 
 if (chdir "lib") {
-    $do_installarchlib = ! &samepath($installarchlib, '.');
-    $do_installprivlib = ! &samepath($installprivlib, '.');
+    $do_installarchlib = ! samepath($installarchlib, '.');
+    $do_installprivlib = ! samepath($installprivlib, '.');
     $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$]/);
 
     if ($do_installarchlib || $do_installprivlib) {
@@ -123,8 +129,8 @@ push(@corefiles,'sperl.o') if -f 'sperl.o';
 foreach $file (@corefiles) {
     # HP-UX (at least) needs to maintain execute permissions
     # on dynamically-loaded libraries.
-    cp_if_diff($file,"$installarchlib/CORE/$file")
-       and &chmod($file =~ /^\.(so|$dlext)$/ ? 0555 : 0444,
+    copy_if_diff($file,"$installarchlib/CORE/$file")
+       and chmod($file =~ /^\.(so|$dlext)$/ ? 0555 : 0444,
                   "$installarchlib/CORE/$file");
 }
 
@@ -133,7 +139,7 @@ foreach $file (@corefiles) {
 $mainperl_is_instperl = 0;
 
 if (!$versiononly && !$nonono && -t STDIN && -t STDERR
-       && -w $mainperldir && ! &samepath($mainperldir, $installbin)) {
+       && -w $mainperldir && ! samepath($mainperldir, $installbin)) {
     local($usrbinperl) = "$mainperldir/perl$exe_ext";
     local($instperl)   = "$installbin/perl$exe_ext";
     local($expinstperl)        = "$binexp/perl$exe_ext";
@@ -144,48 +150,48 @@ if (!$versiononly && !$nonono && -t STDIN && -t STDERR
        # Try to be clever about mainperl being a symbolic link
        # to binexp/perl if binexp and installbin are different.
        $mainperl_is_instperl =
-           &samepath($usrbinperl, $instperl) ||
-           &samepath($usrbinperl, $expinstperl) ||
+           samepath($usrbinperl, $instperl) ||
+           samepath($usrbinperl, $expinstperl) ||
             (($binexp ne $installbin) &&
              (-l $usrbinperl) &&
              ((readlink $usrbinperl) eq $expinstperl));
     }
     if ((! $mainperl_is_instperl) &&
-       (&yn("Many scripts expect perl to be installed as $usrbinperl.\n" . 
+       (yn("Many scripts expect perl to be installed as $usrbinperl.\n" . 
             "Do you wish to have $usrbinperl be the same as\n" .
             "$expinstperl? [y] ")))
     {  
        unlink($usrbinperl);
        eval { CORE::link $instperl, $usrbinperl } ||
            eval { symlink $expinstperl, $usrbinperl } ||
-               cmd("cp $instperl $usrbinperl");
+               copy($instperl, $usrbinperl);
        $mainperl_is_instperl = 1;
     }
 }
 
 # Make links to ordinary names if installbin directory isn't current directory.
 
-if (! $versiononly && ! &samepath($installbin, '.')) {
-    &safe_unlink("$installbin/perl$exe_ext", "$installbin/suidperl$exe_ext");
-    &link("$installbin/perl$ver$exe_ext", "$installbin/perl$exe_ext");
-    &link("$installbin/sperl$ver$exe_ext", "$installbin/suidperl$exe_ext") 
+if (! $versiononly && ! samepath($installbin, '.')) {
+    safe_unlink("$installbin/perl$exe_ext", "$installbin/suidperl$exe_ext");
+    link("$installbin/perl$ver$exe_ext", "$installbin/perl$exe_ext");
+    link("$installbin/sperl$ver$exe_ext", "$installbin/suidperl$exe_ext") 
       if $d_dosuid;
 }
 
-if (!$versiononly && ! &samepath($installbin, 'x2p')) {
-    &safe_unlink("$installbin/a2p$exe_ext");
-    &cmd("cp x2p/a2p$exe_ext $installbin/a2p$exe_ext");
-    &chmod(0755, "$installbin/a2p$exe_ext");
+if (!$versiononly && ! samepath($installbin, 'x2p')) {
+    safe_unlink("$installbin/a2p$exe_ext");
+    copy("x2p/a2p$exe_ext", "$installbin/a2p$exe_ext");
+    chmod(0755, "$installbin/a2p$exe_ext");
 }
 
 # cppstdin is just a script, but it is architecture-dependent, so
 # it can't safely be shared.  Place it in $installbin.
 # Note that Configure doesn't build cppstin if it isn't needed, so
 # we skip this if cppstdin doesn't exist.
-if (! $versiononly && (-f cppstdin) && (! &samepath($installbin, '.'))) {
-    &safe_unlink("$installbin/cppstdin");
-    &cmd("cp cppstdin $installbin/cppstdin");
-    &chmod(0755, "$installbin/cppstdin");
+if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
+    safe_unlink("$installbin/cppstdin");
+    copy("cppstdin", "$installbin/cppstdin");
+    chmod(0755, "$installbin/cppstdin");
 }
 
 # Install scripts.
@@ -194,25 +200,51 @@ mkpath($installscript, 1, 0777);
 
 if (! $versiononly) {
     for (@scripts) {
-        &cmd("cp $_ $installscript");
-        s#.*/##; &chmod(0755, "$installscript/$_");
+       (my $base = $_) =~ s#.*/##;
+       copy($_, "$installscript/$base");
+       chmod(0755, "$installscript/$base");
     }
 }
 
 # pstruct should be a link to c2ph
 
 if (! $versiononly) {
-    &safe_unlink("$installscript/pstruct");
-    &link("$installscript/c2ph","$installscript/pstruct");
+    safe_unlink("$installscript/pstruct");
+    link("$installscript/c2ph","$installscript/pstruct");
 }
 
 # Install pod pages.  Where? I guess in $installprivlib/pod.
 
-if (! ($versiononly && !($installprivlib =~ m/\Q$]/))) {
+if (! $versiononly || !($installprivlib =~ m/\Q$]/)) {
     mkpath("${installprivlib}/pod", 1, 0777);
+
+    # If Perl 5.003's perldiag.pod is there, rename it.
+    if (open POD, "${installprivlib}/pod/perldiag.pod") {
+       read POD, $_, 4000;
+       close POD;
+       # Some of Perl 5.003's diagnostic messages ended with periods.
+       if (/^=.*\.$/m) {
+           my ($from, $to) = ("${installprivlib}/pod/perldiag.pod",
+                              "${installprivlib}/pod/perldiag-5.003.pod");
+           print STDERR "  rename $from $to";
+           rename($from, $to)
+               or warn "Couldn't rename $from to $to: $!\n"
+               unless $nonono;
+       }
+    }
+
     foreach $file (@pods) {
        # $file is a name like  pod/perl.pod
-       cp_if_diff($file, "${installprivlib}/${file}");
+       copy_if_diff($file, "${installprivlib}/${file}");
+    }
+
+    # Link perldiag.pod into archlib
+    my ($from, $to) = ("${installprivlib}/pod/perldiag.pod",
+                      "${installarchlib}/pod/perldiag.pod");
+    if (compare($from, $to) || $nonono) {
+       mkpath("${installarchlib}/pod", 1, 0777);
+       unlink($to);
+       link($from, $to);
     }
 }
 
@@ -232,8 +264,8 @@ if (!$versiononly) {
        next unless m,^/,;
        # Use &samepath here because some systems have other dirs linked
        # to $mainperldir (like SunOS)
-       next if &samepath($_, $binexp);
-       next if ($mainperl_is_instperl && &samepath($_, $mainperldir));
+       next if samepath($_, $binexp);
+       next if ($mainperl_is_instperl && samepath($_, $mainperldir));
        push(@otherperls, "$_/perl$exe_ext")
            if (-x "$_/perl$exe_ext" && ! -d "$_/perl$exe_ext");
     }
@@ -279,37 +311,28 @@ sub unlink {
 }
 
 sub safe_unlink {
-    local(@names) = @_;
-
+    return if $nonono;
+    local @names = @_;
     foreach $name (@names) {
        next unless -e $name;
-       next if $nonono;
        chmod 0777, $name if $^O eq 'os2';
        print STDERR "  unlink $name\n";
        next if CORE::unlink($name);
        warn "Couldn't unlink $name: $!\n";
        if ($! =~ /busy/i) {
            print STDERR "  mv $name $name.old\n";
-           &rename($name, "$name.old") || warn "Couldn't rename $name: $!\n";
+           safe_rename($name, "$name.old")
+               or warn "Couldn't rename $name: $!\n";
        }
     }
 }
 
-sub cmd {
-    local($cmd) = @_;
-    print STDERR "  $cmd\n";
-    unless ($nonono) {
-       system $cmd;
-       warn "Command failed!!!\n" if $?;
-    }
-}
-
-sub rename {
+sub safe_rename {
     local($from,$to) = @_;
     if (-f $to and not unlink($to)) {
        my($i);
        for ($i = 1; $i < 50; $i++) {
-           last if CORE::rename($to, "$to.$i");
+           last if rename($to, "$to.$i");
        }
        warn("Cannot rename to `$to.$i': $!"), return 0 
           if $i >= 50; # Give up!
@@ -324,11 +347,18 @@ sub link {
 
     print STDERR "  ln $from $to\n";
     eval {
-      CORE::link($from,$to) ? $success++ : warn "Couldn't link $from to $to: $!\n" unless $nonono;
+       CORE::link($from, $to)
+           ? $success++
+           : ($from =~ m#^/afs/# || $to =~ m#^/afs/#)
+             ? die "AFS"  # okay inside eval {}
+             : warn "Couldn't link $from to $to: $!\n"
+         unless $nonono;
     };
     if ($@) {
-      system( $cp, $from, $to )==0 ? $success++ :
-       warn "Couldn't copy $from to $to: $!\n" unless $nonono;
+       File::Copy::copy($from, $to)
+           ? $success++
+           : warn "Couldn't copy $from to $to: $!\n"
+         unless $nonono;
     }
     $success;
 }
@@ -337,8 +367,18 @@ sub chmod {
     local($mode,$name) = @_;
 
     printf STDERR "  chmod %o %s\n", $mode, $name;
-    CORE::chmod($mode,$name) || warn sprintf("Couldn't chmod %o %s: $!\n",$mode,$name)
-       unless $nonono;
+    CORE::chmod($mode,$name)
+       || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name)
+      unless $nonono;
+}
+
+sub copy {
+    my($from,$to) = @_;
+
+    print STDERR "  cp $from $to\n";
+    File::Copy::copy($from, $to)
+       || warn "Couldn't copy $from to $to: $!\n"
+      unless $nonono;
 }
 
 sub samepath {
@@ -377,21 +417,21 @@ sub installlib {
     }
 
     if (-f $_) {
-       if (/\.al$/ || /\.ix$/) {
+       if (/\.(?:al|ix)$/ && !($dir =~ m[^auto/(.*)$] && $archpms{$1})) {
            $installlib = $installprivlib;
            #We're installing *.al and *.ix files into $installprivlib,
            #but we have to delete old *.al and *.ix files from the 5.000
            #distribution:
            #This might not work because $archname might have changed.
-           &unlink("$installarchlib/$name");
+           unlink("$installarchlib/$name");
        }
        if (compare($_, "$installlib/$name") || $nonono) {
-           &unlink("$installlib/$name");
+           unlink("$installlib/$name");
            mkpath("$installlib/$dir", 1, 0777);
            # HP-UX (at least) needs to maintain execute permissions
            # on dynamically-loaded libraries.
-           cp_if_diff($_, "$installlib/$name")
-               and &chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
+           copy_if_diff($_, "$installlib/$name")
+               and chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
                           "$installlib/$name");
        }
     } elsif (-d $_) {
@@ -408,19 +448,19 @@ sub installlib {
 # get an error message to the effect that the symbol table is older
 # than the library.
 # Return true if copying occurred.
-sub cp_if_diff {
+
+sub copy_if_diff {
     my($from,$to)=@_;
     -f $from || die "$0: $from not found";
     if (compare($from, $to) || $nonono) {
-       my ($atime, $mtime);
-       unlink($to);   # In case we don't have write permissions.
+       safe_unlink($to);   # In case we don't have write permissions.
         if ($nonono) {
             $from = $depth . "/" . $from if $depth;
         }
-       cmd("cp $from $to");
-       # Restore timestamps if it's a .a library.
-       if ($to =~ /\.a$/ or $^O eq 'os2') {    # For binary install
-           ($atime, $mtime) = (stat $from)[8,9];
+       copy($from, $to);
+       # Restore timestamps if it's a .a library or for OS/2.
+       if (!$nonono && ($^O eq 'os2' || $to =~ /\.a$/)) {
+           my ($atime, $mtime) = (stat $from)[8,9];
            utime $atime, $mtime, $to;
        }
        1;