This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate Memoize 0.64. Few tweaks were required in
[perl5.git] / installperl
1 #!./perl
2
3 BEGIN {
4     require 5.004;
5     chdir '..' if !-d 'lib' and -d '..\lib';
6     @INC = 'lib';
7     $ENV{PERL5LIB} = 'lib';
8 }
9
10 use strict;
11 my ($Is_VMS, $Is_W32, $Is_OS2, $Is_Cygwin, $nonono, $dostrip,
12     $versiononly, $silent, $verbose, $otherperls, $archname,$Is_NetWare, $nwinstall);
13 use vars qw /$depth/;
14
15 BEGIN {
16     $Is_VMS = $^O eq 'VMS';
17     $Is_W32 = $^O eq 'MSWin32';
18     $Is_OS2 = $^O eq 'os2';
19     $Is_Cygwin = $^O eq 'cygwin';
20     if ($Is_VMS) { eval 'use VMS::Filespec;' }
21 }
22
23 my $scr_ext = ($Is_VMS ? '.Com' : $Is_W32 ? '.bat' : '');
24
25 use File::Find;
26 use File::Compare;
27 use File::Copy ();
28 use File::Path ();
29 use ExtUtils::Packlist;
30 use Config;
31 use subs qw(unlink link chmod);
32
33 $Is_NetWare = $Config{osname} eq 'NetWare';
34 if ($Is_NetWare) {
35         $Is_W32 = 0;
36         $scr_ext = '.pl';
37 }
38
39 # override the ones in the rest of the script
40 sub mkpath {
41     File::Path::mkpath(@_) unless $nonono;
42 }
43
44 my $mainperldir = "/usr/bin";
45 my $exe_ext = $Config{exe_ext};
46
47 # Allow ``make install PERLNAME=something_besides_perl'':
48 my $perl = defined($ENV{PERLNAME}) ? $ENV{PERLNAME} : 'perl';
49
50 # This is the base used for versioned names, like "perl5.6.0".
51 # It's separate because a common use of $PERLNAME is to install
52 # perl as "perl5", if that's used as base for versioned files you
53 # get "perl55.6.0".
54 my $perl_verbase = defined($ENV{PERLNAME_VERBASE})
55                     ? $ENV{PERLNAME_VERBASE}
56                     : $perl;
57
58 $otherperls = 1;
59 while (@ARGV) {
60     $nonono = 1 if $ARGV[0] eq '-n';
61     $dostrip = 1 if $ARGV[0] eq '-s';
62     $versiononly = 1 if $ARGV[0] eq '-v';
63     $versiononly = 0 if $ARGV[0] eq '+v';
64     $silent = 1 if $ARGV[0] eq '-S';
65     $otherperls = 0 if $ARGV[0] eq '-o';
66     $verbose = 1 if $ARGV[0] eq '-V' || $ARGV [0] eq '-n';
67     $archname = 1 if $ARGV[0] eq '-A';
68         $nwinstall = 1 if $ARGV[0] eq '-netware';
69     shift;
70 }
71
72 $versiononly = 1 if $Config{versiononly} && !defined $versiononly;
73 my (@scripts, @tolink);
74 open SCRIPTS, "utils.lst" or die "Can't open utils.lst: $!";
75 while (<SCRIPTS>) {
76     next if /^#/;
77     next if /#\s*pod\s*=/; # Binary programs need separate treatment
78     chomp;
79     if (/(\S*)\s*#\s*link\s*=\s*(\S*)/) {
80         push @scripts, $1;
81         push @tolink, [$1, $2];
82     } else {
83         push @scripts, $_;
84     }
85 }
86 close SCRIPTS;
87
88 if ($scr_ext) { @scripts = map { "$_$scr_ext" } @scripts; }
89
90 my @pods = (<pod/*.pod>);
91
92 # Specify here any .pm files that are actually architecture-dependent.
93 # (Those included with XS extensions under ext/ are automatically
94 # added later.)
95 # Now that the default privlib has the full perl version number included,
96 # we no longer have to play the trick of sticking version-specific .pm 
97 # files under the archlib directory.
98 my %archpms = (
99     Config => 1, 
100     lib => 1, 
101 );
102
103 if ($^O eq 'dos') {
104     push(@scripts,'djgpp/fixpmain');
105     $archpms{config} = $archpms{filehand} = 1;
106 }
107
108 if ((-e "testcompile") && (defined($ENV{'COMPILE'})))
109 {
110         push(@scripts, map("$_.exe", @scripts));
111 }
112
113 find(sub {
114         if ("$File::Find::dir/$_" =~ m{^ext\b(.*)/([^/]+)\.pm$}) {
115             my($path, $modname) = ($1,$2);
116
117             # strip trailing component first
118             $path =~ s{/[^/]*$}{};
119
120             # strip optional "/lib";
121             $path =~ s{/lib\b}{};
122
123             # strip any leading /
124             $path =~ s{^/}{};
125
126             # reconstitute canonical module name
127             $modname = "$path/$modname" if length $path;
128
129             # remember it
130             $archpms{$modname} = 1;
131         }
132     }, 'ext');
133
134 # print "[$_]\n" for sort keys %archpms;
135
136 my $ver = $Config{version};
137 my $release = substr($],0,3);   # Not used currently.
138 my $patchlevel = substr($],3,2);
139 die "Patchlevel of perl ($patchlevel)",
140     "and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
141         if $patchlevel != $Config{'PERL_VERSION'};
142
143 # Fetch some frequently-used items from %Config
144 my $installbin = $Config{installbin};
145 my $installscript = $Config{installscript};
146 my $installprivlib = $Config{installprivlib};
147 my $installarchlib = $Config{installarchlib};
148 my $installsitelib = $Config{installsitelib};
149 my $installsitearch = $Config{installsitearch};
150 my $installman1dir = $Config{installman1dir};
151 my $man1ext = $Config{man1ext};
152 my $libperl = $Config{libperl};
153 # Shared library and dynamic loading suffixes.
154 my $so = $Config{so};
155 my $dlext = $Config{dlext};
156 my $dlsrc = $Config{dlsrc};
157 if ($^O eq 'os390') {
158     my $pwd;
159     chomp($pwd=`pwd`);
160     my $archlibexp = $Config{archlibexp};
161     my $usedl = $Config{usedl};
162     if ($usedl eq 'define') {
163         `./$^X -pibak -e 's{$pwd\/libperl.x}{$archlibexp/CORE/libperl.x}' lib/Config.pm`;
164     }
165 }
166
167 if ($nwinstall) {
168         # This is required only if we are installing on a NetWare server
169         $installscript = $Config{installnwscripts};
170         $installprivlib = $Config{installnwlib};
171         $installarchlib = $Config{installnwlib};
172         $installsitelib = $Config{installnwlib};
173 }
174
175 my $d_dosuid = $Config{d_dosuid};
176 my $binexp = $Config{binexp};
177
178 if ($Is_VMS) {  # Hang in there until File::Spec hits the big time
179     foreach ( \$installbin,     \$installscript,  \$installprivlib,
180               \$installarchlib, \$installsitelib, \$installsitearch,
181               \$installman1dir ) {
182       $$_ = unixify($$_);  $$_ =~ s:/$::;
183     }
184 }
185
186 # Do some quick sanity checks.
187
188 if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
189
190    $installbin          || die "No installbin directory in config.sh\n";
191 -d $installbin          || mkpath($installbin, $verbose, 0777);
192 -d $installbin          || $nonono || die "$installbin is not a directory\n";
193 -w $installbin          || $nonono || die "$installbin is not writable by you\n"
194         unless $installbin =~ m#^/afs/# || $nonono;
195
196 if (!$Is_NetWare) {
197 -x 'perl' . $exe_ext    || die "perl isn't executable!\n";
198 -x 'suidperl' . $exe_ext|| die "suidperl isn't executable!\n" if $d_dosuid;
199
200 -f 't/rantests'         || $Is_W32
201                         || warn "WARNING: You've never run 'make test' or",
202                                 " some tests failed! (Installing anyway.)\n";
203 } #if (!$Is_NetWare)
204
205 if (($Is_W32 and ! $Is_NetWare)  or $Is_Cygwin) {
206   my $perldll;
207
208   if ($Is_Cygwin) {
209     $perldll = $libperl;
210     $perldll =~ s/(\..*)?$/.$dlext/;
211     if ($Config{useshrplib} eq 'true') {
212       # install ld2 and perlld as well
213       foreach ('ld2', 'perlld') {
214         safe_unlink("$installbin/$_");
215         copy("$_", "$installbin/$_");
216         chmod(0755, "$installbin/$_");
217       };
218     };
219   } else {
220     $perldll = 'perl57.' . $dlext;
221   }
222
223   if ($dlsrc ne "dl_none.xs") {
224     -f $perldll || die "No perl DLL built\n";
225   }
226   # Install the DLL
227
228   safe_unlink("$installbin/$perldll");
229   copy("$perldll", "$installbin/$perldll");
230   chmod(0755, "$installbin/$perldll");
231    
232 } # if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin)
233
234 # This will be used to store the packlist
235 my $packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
236
237 # First we install the version-numbered executables.
238
239 if ($Is_VMS) {
240     safe_unlink("$installbin/$perl$exe_ext");
241     copy("perl$exe_ext", "$installbin/$perl$exe_ext");
242     chmod(0755, "$installbin/$perl$exe_ext");
243     safe_unlink("$installbin/${perl}shr$exe_ext");
244     copy("perlshr$exe_ext", "$installbin/${perl}shr$exe_ext");
245     chmod(0755, "$installbin/${perl}shr$exe_ext");
246 }
247 elsif ($^O eq 'mpeix') {
248     # MPE lacks hard links and requires that executables with special
249     # capabilities reside in the MPE namespace.
250     safe_unlink("$installbin/perl$ver$exe_ext", $Config{perlpath});
251     # Install the primary executable into the MPE namespace as perlpath.
252     copy("perl$exe_ext", $Config{perlpath});
253     chmod(0755, $Config{perlpath});
254     # Create a backup copy with the version number.
255     link($Config{perlpath}, "$installbin/perl$ver$exe_ext");
256 }
257 elsif ($^O ne 'dos') {
258         if (!$Is_NetWare) {
259                 safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
260                 copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
261                 strip("$installbin/$perl_verbase$ver$exe_ext");
262                 chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
263         }
264         else {
265                 # If installing onto a NetWare server
266                 if ($nwinstall) {
267                         # Copy perl.nlm, echo.nlm, type.nlm, a2p.nlm & cgi2perl.nlm
268                         mkpath($Config{installnwsystem}, 1, 0777);
269                         copy("netware\\".$ENV{'MAKE_TYPE'}."\\perl.nlm", $Config{installnwsystem});
270                         copy("netware\\testnlm\\echo\\echo.nlm", $Config{installnwsystem});
271                         copy("netware\\testnlm\\type\\type.nlm", $Config{installnwsystem});
272                         copy("x2p\\a2p.nlm", $Config{installnwsystem});
273                         chmod(0755, "$Config{installnwsystem}\\perl.nlm");
274                         mkpath($Config{installnwlcgi}, 1, 0777);
275                         copy("lib\\auto\\cgi2perl\\cgi2perl.nlm", $Config{installnwlcgi});
276                 }
277         } #if (!$Is_NetWare)
278 }
279 else {
280     safe_unlink("$installbin/$perl.exe");
281     copy("perl.exe", "$installbin/$perl.exe");
282 }
283
284 safe_unlink("$installbin/s$perl_verbase$ver$exe_ext");
285 if ($d_dosuid) {
286     copy("suidperl$exe_ext", "$installbin/s$perl_verbase$ver$exe_ext");
287     chmod(04711, "$installbin/s$perl_verbase$ver$exe_ext");
288 }
289
290 # Install library files.
291
292 my ($do_installarchlib, $do_installprivlib) = (0, 0);
293     
294 mkpath($installprivlib, $verbose, 0777);
295 mkpath($installarchlib, $verbose, 0777);
296 mkpath($installsitelib, $verbose, 0777) if ($installsitelib);
297 mkpath($installsitearch, $verbose, 0777) if ($installsitearch);
298
299 if (chdir "lib") {
300     $do_installarchlib = ! samepath($installarchlib, '.');
301     $do_installprivlib = ! samepath($installprivlib, '.');
302     $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$ver/);
303
304     if ($do_installarchlib || $do_installprivlib) {
305         find(\&installlib, '.');
306     }
307     chdir ".." || die "Can't cd back to source directory: $!\n";
308 }
309 else {
310     warn "Can't cd to lib to install lib files: $!\n";
311 }
312
313 # Install header files and libraries.
314 mkpath("$installarchlib/CORE", $verbose, 0777);
315 my @corefiles;
316 if ($Is_VMS) {  # We did core file selection during build
317     my $coredir = "lib/$Config{archname}/$ver/CORE";
318     $coredir =~ tr/./_/;
319     map { s|^$coredir/||i; } @corefiles = <$coredir/*.*>;
320 }
321 else {
322     # [als] hard-coded 'libperl' name... not good!
323     @corefiles = <*.h libperl*.*>;
324
325     # AIX needs perl.exp installed as well.
326     push(@corefiles,'perl.exp') if $^O eq 'aix';
327     if ($^O eq 'mpeix') {
328         # MPE needs mpeixish.h installed as well.
329         mkpath("$installarchlib/CORE/mpeix", $verbose, 0777);
330         push(@corefiles,'mpeix/mpeixish.h');
331     }
332     # If they have built sperl.o...
333     push(@corefiles,'sperl.o') if -f 'sperl.o';
334 }
335 foreach my $file (@corefiles) {
336     # HP-UX (at least) needs to maintain execute permissions
337     # on dynamically-loadable libraries. So we do it for all.
338     if (copy_if_diff($file,"$installarchlib/CORE/$file")) {
339         if ($file =~ /\.(\Q$so\E|\Q$dlext\E)$/) {
340             chmod(0555, "$installarchlib/CORE/$file");
341             strip("-S", "$installarchlib/CORE/$file") if $^O =~ /^(rhapsody|darwin)$/;
342         } else {
343             chmod(0444, "$installarchlib/CORE/$file");
344         }
345     }
346 }
347
348 # Install main perl executables
349 # Make links to ordinary names if installbin directory isn't current directory.
350
351 if (! $versiononly && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS && ! $Is_NetWare) {
352     safe_unlink("$installbin/$perl$exe_ext", "$installbin/suid$perl$exe_ext");
353     if ($^O eq 'mpeix') {
354         # MPE doesn't support hard links, so use a symlink.
355         # We don't want another cloned copy.
356         symlink($Config{perlpath}, "$installbin/perl$exe_ext");
357     } else {
358         link("$installbin/$perl_verbase$ver$exe_ext",
359                 "$installbin/$perl$exe_ext");
360     }
361     link("$installbin/s$perl_verbase$ver$exe_ext",
362             "$installbin/suid$perl$exe_ext") 
363       if $d_dosuid;
364 }
365
366 # For development purposes it can be very useful to have multiple perls
367 # build for different "architectures" (eg threading or not) simultaneously.
368 if ($archname && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS) {
369     my $archperl = "$perl_verbase$ver-$Config{archname}$exe_ext";
370     safe_unlink("$installbin/$archperl");
371     if ($^O eq 'mpeix') {
372         # MPE doesn't support hard links, so use a symlink.
373         # We don't want another cloned copy.
374         symlink($Config{perlpath}, "$installbin/$archperl");
375     } else {
376         link("$installbin/$perl_verbase$ver$exe_ext",
377                 "$installbin/$archperl");
378     }
379 }
380
381 # Offer to install perl in a "standard" location
382
383 my $mainperl_is_instperl = 0;
384
385 if ($Config{installusrbinperl} && $Config{installusrbinperl} eq 'define' &&
386     !$versiononly && !$nonono && !$Is_W32 && !$Is_NetWare && !$Is_VMS && -t STDIN && -t STDERR
387         && -w $mainperldir && ! samepath($mainperldir, $installbin)) {
388     my($usrbinperl)     = "$mainperldir/$perl$exe_ext";
389     my($instperl)       = "$installbin/$perl$exe_ext";
390     my($expinstperl)    = "$binexp/$perl$exe_ext";
391
392     # First make sure $usrbinperl is not already the same as the perl we
393     # just installed.
394     if (-x $usrbinperl) {
395         # Try to be clever about mainperl being a symbolic link
396         # to binexp/perl if binexp and installbin are different.
397         $mainperl_is_instperl =
398             samepath($usrbinperl, $instperl) ||
399             samepath($usrbinperl, $expinstperl) ||
400              (($binexp ne $installbin) &&
401               (-l $usrbinperl) &&
402               ((readlink $usrbinperl) eq $expinstperl));
403     }
404     if ((! $mainperl_is_instperl) &&
405         (yn("Many scripts expect perl to be installed as $usrbinperl.\n" . 
406              "Do you wish to have $usrbinperl be the same as\n" .
407              "$expinstperl? [y] ")))
408     {
409         unlink($usrbinperl);
410         ( $Config{'d_link'} eq 'define' &&
411           eval { CORE::link $instperl, $usrbinperl } )  ||
412         eval { symlink $expinstperl, $usrbinperl }      ||
413         copy($instperl, $usrbinperl);
414
415         $mainperl_is_instperl = 1;
416     }
417 }
418
419 # Make links to ordinary names if installbin directory isn't current directory.
420 if (!$Is_NetWare) {
421         if (!$versiononly && ! samepath($installbin, 'x2p')) {
422                 safe_unlink("$installbin/a2p$exe_ext");
423                 copy("x2p/a2p$exe_ext", "$installbin/a2p$exe_ext");
424                 chmod(0755, "$installbin/a2p$exe_ext");
425         }
426 }
427
428 # cppstdin is just a script, but it is architecture-dependent, so
429 # it can't safely be shared.  Place it in $installbin.
430 # Note that Configure doesn't build cppstin if it isn't needed, so
431 # we skip this if cppstdin doesn't exist.
432 if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
433     safe_unlink("$installbin/cppstdin");
434     copy("cppstdin", "$installbin/cppstdin");
435     chmod(0755, "$installbin/cppstdin");
436 }
437
438 sub script_alias {
439     my ($installscript, $orig, $alias, $scr_ext) = @_;
440
441     safe_unlink("$installscript/$alias$scr_ext");
442     if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
443         copy("$installscript/$orig$scr_ext",
444              "$installscript/$alias$scr_ext"); 
445     } else {
446         link("$installscript/$orig$scr_ext",
447              "$installscript/$alias$scr_ext");
448     }
449 }
450
451 # Install scripts.
452 mkpath($installscript, $verbose, 0777);
453 if ($versiononly) {
454     for (@scripts) {
455         (my $base = $_) =~ s#.*/##;
456         $base .= $ver;
457         copy($_,    "$installscript/$base");
458         chmod(0755, "$installscript/$base");
459     }
460
461     for (@tolink) { 
462         my ($from, $to) = map { "$_$ver" } @$_;
463         (my $frbase = $from) =~ s#.*/##;
464         (my $tobase = $to) =~ s#.*/##;
465         script_alias($installscript, $frbase, $tobase, $scr_ext);
466     }
467 } else {
468     for (@scripts) {
469         (my $base = $_) =~ s#.*/##;
470         copy($_, "$installscript/$base");
471         chmod(0755, "$installscript/$base");
472     }
473
474     for (@tolink) { 
475         my ($from, $to) = @$_;
476         (my $frbase = $from) =~ s#.*/##;
477         (my $tobase = $to) =~ s#.*/##;
478         script_alias($installscript, $frbase, $tobase, $scr_ext);
479     }
480 }
481
482 # Install pod pages.  Where? I guess in $installprivlib/pod
483 # ($installprivlib/pods for cygwin).
484
485 my $pod = $Is_Cygwin ? 'pods' : 'pod';
486 if ( !$versiononly || ($installprivlib =~ m/\Q$ver/)) {
487     mkpath("${installprivlib}/$pod", $verbose, 0777);
488
489     # If Perl 5.003's perldiag.pod is there, rename it.
490     if (open POD, "${installprivlib}/$pod/perldiag.pod") {
491         read POD, $_, 4000;
492         close POD;
493         # Some of Perl 5.003's diagnostic messages ended with periods.
494         if (/^=.*\.$/m) {
495             my ($from, $to) = ("${installprivlib}/$pod/perldiag.pod",
496                                "${installprivlib}/$pod/perldiag-5.003.pod");
497             print "  rename $from $to";
498             rename($from, $to)
499                 or warn "Couldn't rename $from to $to: $!\n"
500                 unless $nonono;
501         }
502     }
503
504     for (@pods) {
505         # $_ is a name like  pod/perl.pod
506         (my $base = $_) =~ s#.*/##;
507         copy_if_diff($_, "${installprivlib}/$pod/${base}");
508     }
509
510 }
511
512 # Check to make sure there aren't other perls around in installer's
513 # path.  This is probably UNIX-specific.  Check all absolute directories
514 # in the path except for where public executables are supposed to live.
515 # Also skip $mainperl if the user opted to have it be a link to the
516 # installed perl.
517
518 if (!$versiononly && $otherperls) {
519     my ($path, @path);
520     my $dirsep = ($Is_OS2 || $Is_W32 || $Is_NetWare) ? ';' : ':' ;
521     ($path = $ENV{"PATH"}) =~ s:\\:/:g ;
522     @path = split(/$dirsep/, $path);
523     if ($Is_VMS) {
524         my $i = 0;
525         while (exists $ENV{'DCL$PATH' . $i}) {
526             my $dir = unixpath($ENV{'DCL$PATH' . $i});  $dir =~ s-/$--;
527             push(@path,$dir);
528         }
529     }
530     my @otherperls;
531     my %otherperls;
532     for (@path) {
533         next unless m,^/,;
534         # Use &samepath here because some systems have other dirs linked
535         # to $mainperldir (like SunOS)
536         next if samepath($_, $binexp);
537         next if ($mainperl_is_instperl && samepath($_, $mainperldir));
538         my $otherperl = "$_/$perl$exe_ext";
539         next if $otherperls{$otherperl}++;
540         push(@otherperls, $otherperl)
541             if (-x $otherperl && ! -d $otherperl);
542     }
543     if (@otherperls) {
544         warn "\nWarning: $perl appears in your path in the following " .
545             "locations beyond where\nwe just installed it:\n";
546         for (@otherperls) {
547             warn "    ", $_, "\n";
548         }
549         warn "\n";
550     }
551
552 }
553
554 $packlist->write() unless $nonono;
555 print "  Installation complete\n" if $verbose;
556
557 exit 0;
558
559 ###############################################################################
560
561 sub yn {
562     my($prompt) = @_;
563     my($answer);
564     my($default) = $prompt =~ m/\[([yn])\]\s*$/i;
565     print STDERR $prompt;
566     chop($answer = <STDIN>);
567     $answer = $default if $answer =~ m/^\s*$/;
568     ($answer =~ m/^[yY]/);
569 }
570
571 sub unlink {
572     my(@names) = @_;
573     my($cnt) = 0;
574
575     return scalar(@names) if $Is_VMS;
576
577     foreach my $name (@names) {
578         next unless -e $name;
579         chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare);
580         print "  unlink $name\n" if $verbose;
581         ( CORE::unlink($name) and ++$cnt 
582           or warn "Couldn't unlink $name: $!\n" ) unless $nonono;
583     }
584     return $cnt;
585 }
586
587 sub safe_unlink {
588     return if $nonono or $Is_VMS;
589     my @names = @_;
590     foreach my $name (@names) {
591         next unless -e $name;
592         chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_NetWare);
593         print "  unlink $name\n" if $verbose;
594         next if CORE::unlink($name);
595         warn "Couldn't unlink $name: $!\n";
596         if ($! =~ /busy/i) {
597             print "  mv $name $name.old\n" if $verbose;
598             safe_rename($name, "$name.old")
599                 or warn "Couldn't rename $name: $!\n";
600         }
601     }
602 }
603
604 sub safe_rename {
605     my($from,$to) = @_;
606     if (-f $to and not unlink($to)) {
607         my($i);
608         for ($i = 1; $i < 50; $i++) {
609             last if rename($to, "$to.$i");
610         }
611         warn("Cannot rename to `$to.$i': $!"), return 0 
612            if $i >= 50; # Give up!
613     }
614     link($from,$to) || return 0;
615     unlink($from);
616 }
617
618 sub link {
619     my($from,$to) = @_;
620     my($success) = 0;
621
622     print $verbose ? "  ln $from $to\n" : "  $to\n" unless $silent;
623     eval {
624         CORE::link($from, $to)
625             ? $success++
626             : ($from =~ m#^/afs/# || $to =~ m#^/afs/#)
627               ? die "AFS"  # okay inside eval {}
628               : die "Couldn't link $from to $to: $!\n"
629           unless $nonono;
630         $packlist->{$to} = { from => $from, type => 'link' };
631     };
632     if ($@) {
633         warn $@;
634         print $verbose ? "  cp $from $to\n" : "  $to\n" unless $silent;
635         print "  creating new version of $to\n"
636                  if $Is_VMS and -e $to and !$silent;
637         File::Copy::copy($from, $to)
638             ? $success++
639             : warn "Couldn't copy $from to $to: $!\n"
640           unless $nonono;
641         $packlist->{$to} = { type => 'file' };
642     }
643     $success;
644 }
645
646 sub chmod {
647     my($mode,$name) = @_;
648
649     return if ($^O eq 'dos');
650     printf "  chmod %o %s\n", $mode, $name if $verbose;
651     CORE::chmod($mode,$name)
652         || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name)
653       unless $nonono;
654 }
655
656 sub copy {
657     my($from,$to) = @_;
658
659     print $verbose ? "  cp $from $to\n" : "  $to\n" unless $silent;
660     print "  creating new version of $to\n" if $Is_VMS and -e $to and !$silent;
661     File::Copy::copy($from, $to)
662         || warn "Couldn't copy $from to $to: $!\n"
663       unless $nonono;
664     $packlist->{$to} = { type => 'file' };
665 }
666
667 sub samepath {
668     my($p1, $p2) = @_;
669
670     return (lc($p1) eq lc($p2)) if ($Is_W32 || $Is_NetWare);
671
672     if ($p1 ne $p2) {
673         my($dev1, $ino1, $dev2, $ino2);
674         ($dev1, $ino1) = stat($p1);
675         ($dev2, $ino2) = stat($p2);
676         ($dev1 == $dev2 && $ino1 == $ino2);
677     }
678     else {
679         1;
680     }
681 }
682
683 sub installlib {
684     my $dir = $File::Find::dir;
685     $dir =~ s#^\.(?![^/])/?##;
686     local($depth) = $dir ? "lib/$dir" : "lib";
687
688     my $name = $_;
689
690     # Ignore RCS and CVS directories.
691     if (($name eq 'CVS' or $name eq 'RCS') and -d $name) {
692         $File::Find::prune = 1;
693         return;
694     }
695     
696     # ignore patch backups, RCS files, emacs backup & temp files and the
697     # .exists files, and .PL files.
698     return if $name =~ m{\.orig$|~$|^#.+#$|,v$|^\.exists|\.PL$};
699
700     $name = "$dir/$name" if $dir ne '';
701
702     my $installlib = $installprivlib;
703     if ($dir =~ /^auto/ ||
704           ($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1}) ||
705           ($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare))
706        ) {
707         $installlib = $installarchlib;
708         return unless $do_installarchlib;
709     } else {
710         return unless $do_installprivlib;
711     }
712
713     if (-f $_) {
714         if (/\.(?:al|ix)$/ && !($dir =~ m[^auto/(.*)$] && $archpms{$1})) {
715             $installlib = $installprivlib;
716             #We're installing *.al and *.ix files into $installprivlib,
717             #but we have to delete old *.al and *.ix files from the 5.000
718             #distribution:
719             #This might not work because $archname might have changed.
720             unlink("$installarchlib/$name");
721         }
722         $packlist->{"$installlib/$name"} = { type => 'file' };
723         if (compare($_, "$installlib/$name") || $nonono) {
724             unlink("$installlib/$name");
725             mkpath("$installlib/$dir", $verbose, 0777);
726             # HP-UX (at least) needs to maintain execute permissions
727             # on dynamically-loaded libraries.
728                 if ($Is_NetWare && !$nwinstall) {
729                         # Don't copy .nlp,.nlm files, doesn't make sense on Windows and also
730                         # if copied will give problems when building new extensions.
731                         # Has to be copied if we are installing on a NetWare server and hence
732                         # the check !$nwinstall
733                         if (!(/\.(?:nlp|nlm|bs)$/)) {
734                                 copy_if_diff($_, "$installlib/$name")
735                                 and chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
736                            "$installlib/$name");
737                         }
738                 } else {
739                         copy_if_diff($_, "$installlib/$name")
740                         and chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
741                            "$installlib/$name");
742                 } #if ($Is_NetWare)         
743         }
744     }
745 }
746
747 # Copy $from to $to, only if $from is different than $to.
748 # Also preserve modification times for .a libraries.
749 # On some systems, if you do
750 #   ranlib libperl.a
751 #   cp libperl.a /usr/local/lib/perl5/archlib/CORE/libperl.a
752 # and then try to link against the installed libperl.a, you might
753 # get an error message to the effect that the symbol table is older
754 # than the library.
755 # Return true if copying occurred.
756
757 sub copy_if_diff {
758     my($from,$to)=@_;
759     return 1 if (($^O eq 'VMS') && (-d $from));
760     -f $from || warn "$0: $from not found";
761     $packlist->{$to} = { type => 'file' };
762     if (compare($from, $to) || $nonono) {
763         safe_unlink($to);   # In case we don't have write permissions.
764         if ($nonono) {
765             $from = $depth . "/" . $from if $depth;
766         }
767         copy($from, $to);
768         # Restore timestamps if it's a .a library or for OS/2.
769         if (!$nonono && ($Is_OS2 || $to =~ /\.a$/)) {
770             my ($atime, $mtime) = (stat $from)[8,9];
771             utime $atime, $mtime, $to;
772         }
773         1;
774     }
775 }
776
777 sub strip
778 {
779     my(@args) = @_;
780
781     return unless $dostrip;
782
783     my @opts;
784     while (@args && $args[0] =~ /^(-\w+)$/) {
785         push @opts, shift @args;
786     }
787
788     foreach my $file (@args) {
789         if (-f $file) {
790             print "  strip $file\n" if $verbose;
791             system("strip", @opts, $file);
792         } else {
793             print "# file '$file' skipped\n" if $verbose;
794         }
795     }
796 }
797