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