Digital UNIX hints
[p5sagit/p5-mst-13.2.git] / installperl
index a9082df..d4cb711 100755 (executable)
@@ -1,6 +1,7 @@
 #!./perl
 BEGIN { @INC=('./lib', '../lib') }
 use File::Find;
+use File::Compare;
 use File::Path ();
 use Config;
 use subs qw(unlink rename link chmod);
@@ -23,12 +24,20 @@ while (@ARGV) {
 umask 022;
 
 @scripts = qw( utils/c2ph utils/h2ph utils/h2xs
-               utils/perlbug utils/perldoc utils/pl2pm
+               utils/perlbug utils/perldoc utils/pl2pm utils/splain
                x2p/s2p x2p/find2perl
                pod/pod2man pod/pod2html pod/pod2latex pod/pod2text);
 
 @pods = (<pod/*.pod>);
 
+%archpms = (Config => 1, FileHandle => 1, overload => 1);
+find(sub {
+       if ("$File::Find::dir/$_" =~ m{^ext/[^/]+/(.*)\.pm$}) {
+           (my $pm = $1) =~ s{^lib/}{};
+           $archpms{$pm} = 1;
+       }
+    }, 'ext');
+
 $ver = $];
 $release = substr($ver,0,3);   # Not used presently.
 $patchlevel = substr($ver,3,2);
@@ -73,6 +82,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) {
@@ -158,15 +168,19 @@ 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
 
 $mainperl_is_instperl = 0;
 
-if (-w $mainperldir && ! &samepath($mainperldir, $installbin) && !$nonono) {
+if (!$nonono && -t STDIN && -t STDERR
+       && -w $mainperldir && ! &samepath($mainperldir, $installbin)) {
     local($usrbinperl) = "$mainperldir/perl$exe_ext";
     local($instperl)   = "$installbin/perl$exe_ext";
     local($expinstperl)        = "$binexp/perl$exe_ext";
@@ -178,6 +192,7 @@ if (-w $mainperldir && ! &samepath($mainperldir, $installbin) && !$nonono) {
        # to binexp/perl if binexp and installbin are different.
        $mainperl_is_instperl =
            &samepath($usrbinperl, $instperl) ||
+           &samepath($usrbinperl, $expinstperl) ||
             (($binexp ne $installbin) &&
              (-l $usrbinperl) &&
              ((readlink $usrbinperl) eq $expinstperl));
@@ -343,7 +358,8 @@ 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 =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1})) {
         $installlib = $installarchlib;
        return unless $do_installarchlib;
     } else {
@@ -359,19 +375,14 @@ sub installlib {
            #This might not work because $archname might have changed.
            &unlink("$installarchlib/$name");
        }
-       system "cmp", "-s", $_, "$installlib/$name";
-       if ($? || $nonono) {
+       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);
@@ -386,11 +397,11 @@ 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 ($? || $nonono) {
+    if (compare($from, $to) || $nonono) {
        my ($atime, $mtime);
        unlink($to);   # In case we don't have write permissions.
         if ($nonono) {
@@ -402,5 +413,6 @@ sub cp_if_diff {
            ($atime, $mtime) = (stat $from)[8,9];
            utime $atime, $mtime, $to;
        }
+       1;
     }
 }