This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make installperl quieter; only shared libraries need 0555
[perl5.git] / installperl
index 5632824..05f77f6 100755 (executable)
@@ -1,10 +1,17 @@
 #!./perl
 BEGIN { @INC=('./lib', '../lib') }
 use File::Find;
-use File::Path qw(mkpath);
+use File::Compare;
+use File::Path ();
 use Config;
 use subs qw(unlink rename link chmod);
 
+# override the ones in the rest of the script
+sub mkpath
+{
+  File::Path::mkpath(@_) unless $nonono;
+}
+
 $mainperldir = "/usr/bin";
 $exe_ext = $Config{exe_ext};
 
@@ -16,15 +23,11 @@ while (@ARGV) {
 
 umask 022;
 
-@scripts = qw( utils/c2ph utils/h2ph utils/h2xs utils/pstruct
-               utils/perlbug utils/perldoc
+@scripts = qw( utils/c2ph utils/h2ph utils/h2xs
+               utils/perlbug utils/perldoc utils/pl2pm utils/splain
                x2p/s2p x2p/find2perl
                pod/pod2man pod/pod2html pod/pod2latex pod/pod2text);
 
-# pod documentation now handled by separate installman script.
-# These two are archaic leftovers.
-@manpages = qw(x2p/a2p.man x2p/s2p.man);
-
 @pods = (<pod/*.pod>);
 
 $ver = $];
@@ -57,8 +60,8 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 
    $installbin         || die "No installbin directory in config.sh\n";
 -d $installbin         || mkpath($installbin, 1, 0777);
--d $installbin         || die "$installbin is not a directory\n";
--w $installbin         || die "$installbin is not writable by you\n"
+-d $installbin         || $nonono || die "$installbin is not a directory\n";
+-w $installbin         || $nonono || die "$installbin is not writable by you\n"
        unless $installbin =~ m#^/afs/# || $nonono;
 
 -x 'perl' . $exe_ext   || die "perl isn't executable!\n";
@@ -71,6 +74,7 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 
 &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/sperl$ver$exe_ext");
 if ($d_dosuid) {
@@ -114,6 +118,11 @@ for (@scripts) {
     s#.*/##; &chmod(0755, "$installscript/$_");
 }
 
+# pstruct should be a link to c2ph
+
+&safe_unlink("$installscript/pstruct");
+&link("$installscript/c2ph","$installscript/pstruct");
+
 # Install pod pages.  Where? I guess in $installprivlib/pod.
 mkpath("${installprivlib}/pod", 1, 0777);
 foreach $file (@pods) {
@@ -121,30 +130,6 @@ foreach $file (@pods) {
     cp_if_diff($file, "${installprivlib}/${file}");
 }
 
-# Install old man pages.
-
-if ($installman1dir ne '') {
-    mkpath($installman1dir, 1, 0777);
-
-    if (! &samepath($installman1dir, '.')) {
-       for (@manpages) {
-           ($new = $_) =~ s/man$/$man1ext/;
-           $new =~ s#.*/##;
-           print STDERR "  Installing $installman1dir/$new\n";
-           next if $nonono;
-           open(MI,$_) || warn "Can't open $_: $!\n";
-           open(MO,">$installman1dir/$new") || 
-                   warn "Can't install $installman1dir/$new: $!\n";
-           print MO ".ds RP Release $release Patchlevel $patchlevel\n";
-           while (<MI>) {
-               print MO;
-           }
-           close MI;
-           close MO;
-       }
-    }
-}
-
 # Install library files.
 
 $do_installarchlib = $do_installprivlib = 0;
@@ -175,8 +160,11 @@ push(@corefiles,'perl.exp') if $^O eq 'aix';
 # If they have built sperl.o...
 push(@corefiles,'sperl.o') if -f 'sperl.o';
 foreach $file (@corefiles) {
-    cp_if_diff($file,"$installarchlib/CORE/$file");
-    &chmod($file =~ /^libperl/ ? 0555 : 0444,"$installarchlib/CORE/$file");
+    # 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,
+                  "$installarchlib/CORE/$file");
 }
 
 # Offer to install perl in a "standard" location
@@ -184,27 +172,30 @@ foreach $file (@corefiles) {
 $mainperl_is_instperl = 0;
 
 if (-w $mainperldir && ! &samepath($mainperldir, $installbin) && !$nonono) {
-    # First make sure $mainperldir/perl is not already the same as
-    # the perl we just installed
-    if (-x "$mainperldir/perl$exe_ext") {
+    local($usrbinperl) = "$mainperldir/perl$exe_ext";
+    local($instperl)   = "$installbin/perl$exe_ext";
+    local($expinstperl)        = "$binexp/perl$exe_ext";
+
+    # First make sure $usrbinperl is not already the same as the perl we
+    # just installed.
+    if (-x $usrbinperl) {
        # Try to be clever about mainperl being a symbolic link
        # to binexp/perl if binexp and installbin are different.
        $mainperl_is_instperl =
-           &samepath("$mainperldir/perl$exe_ext", "$installbin/perl$exe_ext") ||
+           &samepath($usrbinperl, $instperl) ||
             (($binexp ne $installbin) &&
-             (-l "$mainperldir/perl$exe_ext") &&
-             ((readlink "$mainperldir/perl$exe_ext") eq "$binexp/perl$exe_ext"));
+             (-l $usrbinperl) &&
+             ((readlink $usrbinperl) eq $expinstperl));
     }
     if ((! $mainperl_is_instperl) &&
-       (&yn("Many scripts expect perl to be installed as " .
-            "$mainperldir/perl.\n" . 
-            "Do you wish to have $mainperldir/perl be the same as\n" .
-            "$binexp/perl? [y] ")))
+       (&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("$mainperldir/perl$exe_ext");
-       CORE::link("$installbin/perl$exe_ext", "$mainperldir/perl$exe_ext") ||
-           symlink("$binexp/perl$exe_ext", "$mainperldir/perl$exe_ext") ||
-               cmd("cp $installbin/perl$exe_ext $mainperldir$exe_ext");
+       unlink($usrbinperl);
+       eval { CORE::link $instperl, $usrbinperl } ||
+           eval { symlink $expinstperl, $usrbinperl } ||
+               cmd("cp $instperl $usrbinperl");
        $mainperl_is_instperl = 1;
     }
 }
@@ -347,6 +338,7 @@ sub samepath {
 sub installlib {
     my $dir = $File::Find::dir;
     $dir =~ s#^\.(?![^/])/?##;
+    local($depth) = $dir ? "lib/$dir" : "lib";
 
     my $name = $_;
     
@@ -356,7 +348,7 @@ sub installlib {
     $name = "$dir/$name" if $dir ne '';
 
     my $installlib = $installprivlib;
-    if ((substr($dir, 0, 4) eq 'auto') || ($name eq 'Config.pm')) {
+    if ($dir =~ /^auto/ || $name =~ /^(Config|FileHandle|Safe)\.pm$/) {
         $installlib = $installarchlib;
        return unless $do_installarchlib;
     } else {
@@ -372,19 +364,14 @@ sub installlib {
            #This might not work because $archname might have changed.
            &unlink("$installarchlib/$name");
        }
-       system "cmp", "-s", $_, "$installlib/$name";
-       if ($?) {
+       if (compare($_, "$installlib/$name") || $nonono) {
            &unlink("$installlib/$name");
            mkpath("$installlib/$dir", 1, 0777);
-           cp_if_diff($_, "$installlib/$name");
            # HP-UX (at least) needs to maintain execute permissions
            # on dynamically-loaded libraries.
-           if ($name =~ /\.(so|$dlext)$/o) {
-               &chmod(0555, "$installlib/$name");
-           }
-           else {
-               &chmod(0444, "$installlib/$name");
-           }
+           cp_if_diff($_, "$installlib/$name")
+               and &chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
+                          "$installlib/$name");
        }
     } elsif (-d $_) {
        mkpath("$installlib/$name", 1, 0777);
@@ -399,18 +386,22 @@ sub installlib {
 # and then try to link against the installed libperl.a, you might
 # 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 {
     my($from,$to)=@_;
     -f $from || die "$0: $from not found";
-    system "cmp", "-s", $from, $to;
-    if ($?) {
+    if (compare($from, $to) || $nonono) {
        my ($atime, $mtime);
        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$/) {
+       if ($to =~ /\.a$/ or $^O eq 'os2') {    # For binary install
            ($atime, $mtime) = (stat $from)[8,9];
            utime $atime, $mtime, $to;
        }
+       1;
     }
 }