Mercurial > repo
comparison perl-5.22.2/install_lib.pl @ 8045:a16537d2fe07
<xfix> tar xf perl-5.22.2.tar.gz # Ah, whatever, I\'m doing it anyway
author | HackBot |
---|---|
date | Sat, 14 May 2016 14:54:38 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
8044:711c038a7dce | 8045:a16537d2fe07 |
---|---|
1 #!perl | |
2 | |
3 # Initialisation code and subroutines shared between installperl and installman | |
4 # Probably installhtml needs to join the club. | |
5 | |
6 use strict; | |
7 use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare | |
8 %opts $packlist); | |
9 use subs qw(unlink link chmod); | |
10 require File::Path; | |
11 require File::Copy; | |
12 | |
13 BEGIN { | |
14 require Config; | |
15 if ($Config::Config{userelocatableinc}) { | |
16 # This might be a considered a hack. Need to get information about the | |
17 # configuration from Config.pm *before* Config.pm expands any .../ | |
18 # prefixes. | |
19 # | |
20 # So we set $^X to pretend that we're the already installed perl, so | |
21 # Config.pm does its ... expansion off that location. | |
22 | |
23 my $location = $Config::Config{initialinstalllocation}; | |
24 die <<'OS' unless defined $location; | |
25 $Config{initialinstalllocation} is not defined - can't install a relocatable | |
26 perl without this. | |
27 OS | |
28 $^X = "$location/perl"; | |
29 # And then remove all trace of ever having loaded Config.pm, so that | |
30 # it will reload with the revised $^X | |
31 undef %Config::; | |
32 delete $INC{"Config.pm"}; | |
33 delete $INC{"Config_heavy.pl"}; | |
34 delete $INC{"Config_git.pl"}; | |
35 # You never saw us. We weren't here. | |
36 | |
37 require Config; | |
38 } | |
39 Config->import; | |
40 } | |
41 | |
42 if ($Config{d_umask}) { | |
43 umask(022); # umasks like 077 aren't that useful for installations | |
44 } | |
45 | |
46 $Is_VMS = $^O eq 'VMS'; | |
47 $Is_W32 = $^O eq 'MSWin32'; | |
48 $Is_OS2 = $^O eq 'os2'; | |
49 $Is_Cygwin = $^O eq 'cygwin'; | |
50 $Is_Darwin = $^O eq 'darwin'; | |
51 $Is_NetWare = $Config{osname} eq 'NetWare'; | |
52 | |
53 sub unlink { | |
54 my(@names) = @_; | |
55 my($cnt) = 0; | |
56 | |
57 return scalar(@names) if $Is_VMS; | |
58 | |
59 foreach my $name (@names) { | |
60 next unless -e $name; | |
61 chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare); | |
62 print " unlink $name\n" if $opts{verbose}; | |
63 ( CORE::unlink($name) and ++$cnt | |
64 or warn "Couldn't unlink $name: $!\n" ) unless $opts{notify}; | |
65 } | |
66 return $cnt; | |
67 } | |
68 | |
69 sub link { | |
70 my($from,$to) = @_; | |
71 my($success) = 0; | |
72 | |
73 my $xfrom = $from; | |
74 $xfrom =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
75 my $xto = $to; | |
76 $xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
77 print $opts{verbose} ? " ln $xfrom $xto\n" : " $xto\n" | |
78 unless $opts{silent}; | |
79 eval { | |
80 CORE::link($from, $to) | |
81 ? $success++ | |
82 : ($from =~ m#^/afs/# || $to =~ m#^/afs/#) | |
83 ? die "AFS" # okay inside eval {} | |
84 : die "Couldn't link $from to $to: $!\n" | |
85 unless $opts{notify}; | |
86 $packlist->{$xto} = { from => $xfrom, type => 'link' }; | |
87 }; | |
88 if ($@) { | |
89 warn "Replacing link() with File::Copy::copy(): $@"; | |
90 print $opts{verbose} ? " cp $from $xto\n" : " $xto\n" | |
91 unless $opts{silent}; | |
92 print " creating new version of $xto\n" | |
93 if $Is_VMS and -e $to and !$opts{silent}; | |
94 unless ($opts{notify} or File::Copy::copy($from, $to) and ++$success) { | |
95 # Might have been that F::C::c can't overwrite the target | |
96 warn "Couldn't copy $from to $to: $!\n" | |
97 unless -f $to and (chmod(0666, $to), unlink $to) | |
98 and File::Copy::copy($from, $to) and ++$success; | |
99 } | |
100 $packlist->{$xto} = { type => 'file' }; | |
101 } | |
102 $success; | |
103 } | |
104 | |
105 sub chmod { | |
106 my($mode,$name) = @_; | |
107 | |
108 return if ($^O eq 'dos'); | |
109 printf " chmod %o %s\n", $mode, $name if $opts{verbose}; | |
110 CORE::chmod($mode,$name) | |
111 || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name) | |
112 unless $opts{notify}; | |
113 } | |
114 | |
115 sub samepath { | |
116 my($p1, $p2) = @_; | |
117 | |
118 return (lc($p1) eq lc($p2)) if ($Is_W32 || $Is_NetWare); | |
119 | |
120 return 1 | |
121 if $p1 eq $p2; | |
122 | |
123 my ($dev1, $ino1) = stat $p1; | |
124 return 0 | |
125 unless defined $dev1; | |
126 my ($dev2, $ino2) = stat $p2; | |
127 | |
128 return $dev1 == $dev2 && $ino1 == $ino2; | |
129 } | |
130 | |
131 sub safe_rename { | |
132 my($from,$to) = @_; | |
133 if (-f $to and not unlink($to)) { | |
134 my($i); | |
135 for ($i = 1; $i < 50; $i++) { | |
136 last if rename($to, "$to.$i"); | |
137 } | |
138 warn("Cannot rename to '$to.$i': $!"), return 0 | |
139 if $i >= 50; # Give up! | |
140 } | |
141 link($from,$to) || return 0; | |
142 unlink($from); | |
143 } | |
144 | |
145 sub mkpath { | |
146 File::Path::mkpath(shift , $opts{verbose}, 0777) unless $opts{notify}; | |
147 } | |
148 | |
149 1; |