This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Updates to perlfunc.pod
[perl5.git] / installperl
index c9913ca..1267f49 100755 (executable)
@@ -30,6 +30,14 @@ umask 022;
 
 @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);
@@ -82,54 +90,6 @@ if ($d_dosuid) {
     &chmod(04711, "$installbin/sperl$ver$exe_ext");
 }
 
-exit 0 if $versiononly;
-
-# Make links to ordinary names if installbin directory isn't current directory.
-
-if (! &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 (! &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");
-}
-
-# 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 ((-f cppstdin) && (! &samepath($installbin, '.'))) {
-    &safe_unlink("$installbin/cppstdin");
-    &cmd("cp cppstdin $installbin/cppstdin");
-    &chmod(0755, "$installbin/cppstdin");
-}
-
-# Install scripts.
-
-mkpath($installscript, 1, 0777);
-
-for (@scripts) {
-    &cmd("cp $_ $installscript");
-    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) {
-    # $file is a name like  pod/perl.pod
-    cp_if_diff($file, "${installprivlib}/${file}");
-}
-
 # Install library files.
 
 $do_installarchlib = $do_installprivlib = 0;
@@ -142,6 +102,7 @@ mkpath($installsitearch, 1, 0777) if ($installsitearch);
 if (chdir "lib") {
     $do_installarchlib = ! &samepath($installarchlib, '.');
     $do_installprivlib = ! &samepath($installprivlib, '.');
+    $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$]/);
 
     if ($do_installarchlib || $do_installprivlib) {
        find(\&installlib, '.');
@@ -160,15 +121,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 (!$versiononly && !$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";
@@ -180,6 +145,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));
@@ -197,32 +163,89 @@ if (-w $mainperldir && ! &samepath($mainperldir, $installbin) && !$nonono) {
     }
 }
 
+# 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 $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");
+}
+
+# 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");
+}
+
+# Install scripts.
+
+mkpath($installscript, 1, 0777);
+
+if (! $versiononly) {
+    for (@scripts) {
+        &cmd("cp $_ $installscript");
+        s#.*/##; &chmod(0755, "$installscript/$_");
+    }
+}
+
+# pstruct should be a link to c2ph
+
+if (! $versiononly) {
+    &safe_unlink("$installscript/pstruct");
+    &link("$installscript/c2ph","$installscript/pstruct");
+}
+
+# Install pod pages.  Where? I guess in $installprivlib/pod.
+
+if (! $versiononly && !($installprivlib =~ m/\Q$]/)) {
+    mkpath("${installprivlib}/pod", 1, 0777);
+    foreach $file (@pods) {
+       # $file is a name like  pod/perl.pod
+       cp_if_diff($file, "${installprivlib}/${file}");
+    }
+}
+
 # Check to make sure there aren't other perls around in installer's
 # path.  This is probably UNIX-specific.  Check all absolute directories
 # in the path except for where public executables are supposed to live.
 # Also skip $mainperl if the user opted to have it be a link to the
 # installed perl.
 
-$dirsep = ($^O eq 'os2') ? ';' : ':' ;
-($path = $ENV{"PATH"}) =~ s:\\:/:g ;
-@path = split(/$dirsep/, $path);
-@otherperls = ();
-for (@path) {
-    next unless m,^/,;
-    next if ($_ eq $binexp);
-    # Use &samepath here because some systems have other dirs linked
-    # to $mainperldir (like SunOS)
-    next if ($mainperl_is_instperl && &samepath($_, $mainperldir));
-    push(@otherperls, "$_/perl$exe_ext")
-      if (-x "$_/perl$exe_ext" && ! -d "$_/perl$exe_ext");
-}
-if (@otherperls) {
-    print STDERR "\nWarning: perl appears in your path in the following " .
-       "locations beyond where\nwe just installed it:\n";
-    for (@otherperls) {
-       print STDERR "    ", $_, "\n";
+if (!$versiononly) {
+
+    $dirsep = ($^O eq 'os2') ? ';' : ':' ;
+    ($path = $ENV{"PATH"}) =~ s:\\:/:g ;
+    @path = split(/$dirsep/, $path);
+    @otherperls = ();
+    for (@path) {
+       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));
+       push(@otherperls, "$_/perl$exe_ext")
+           if (-x "$_/perl$exe_ext" && ! -d "$_/perl$exe_ext");
+    }
+    if (@otherperls) {
+       print STDERR "\nWarning: perl appears in your path in the following " .
+           "locations beyond where\nwe just installed it:\n";
+       for (@otherperls) {
+           print STDERR "    ", $_, "\n";
+       }
+       print STDERR "\n";
     }
-    print STDERR "\n";
+
 }
 
 print STDERR "  Installation complete\n";
@@ -345,7 +368,8 @@ sub installlib {
     $name = "$dir/$name" if $dir ne '';
 
     my $installlib = $installprivlib;
-    if ($dir =~ /^auto/ || $name =~ /^(Config|FileHandle|Safe)\.pm$/) {
+    if ($dir =~ /^auto/ ||
+         ($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1})) {
         $installlib = $installarchlib;
        return unless $do_installarchlib;
     } else {
@@ -364,15 +388,11 @@ sub installlib {
        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);
@@ -387,6 +407,7 @@ 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";
@@ -402,5 +423,6 @@ sub cp_if_diff {
            ($atime, $mtime) = (stat $from)[8,9];
            utime $atime, $mtime, $to;
        }
+       1;
     }
 }