Commit | Line | Data |
---|---|---|
9e6fc21f NC |
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 | ||
11 | use Config; | |
12 | BEGIN { | |
13 | if ($Config{userelocatableinc}) { | |
14 | # This might be a considered a hack. Need to get information about the | |
15 | # configuration from Config.pm *before* Config.pm expands any .../ | |
16 | # prefixes. | |
17 | # | |
18 | # So we set $^X to pretend that we're the already installed perl, so | |
19 | # Config.pm doesits ... expansion off that location. | |
20 | ||
21 | my $location = $Config{initialinstalllocation}; | |
22 | die <<'OS' unless defined $location; | |
23 | $Config{initialinstalllocation} is not defined - can't install a relocatable | |
24 | perl without this. | |
25 | OS | |
26 | $^X = "$location/perl"; | |
27 | # And then remove all trace of ever having loaded Config.pm, so that | |
28 | # it will reload with the revised $^X | |
29 | undef %Config::; | |
30 | delete $INC{"Config.pm"}; | |
31 | delete $INC{"Config_heavy.pl"}; | |
46807d8e | 32 | delete $INC{"Config_git.pl"}; |
9e6fc21f NC |
33 | # You never saw us. We weren't here. |
34 | ||
35 | require Config; | |
36 | Config->import; | |
37 | } | |
38 | } | |
39 | ||
40 | if ($Config{d_umask}) { | |
41 | umask(022); # umasks like 077 aren't that useful for installations | |
42 | } | |
43 | ||
44 | $Is_VMS = $^O eq 'VMS'; | |
45 | $Is_W32 = $^O eq 'MSWin32'; | |
46 | $Is_OS2 = $^O eq 'os2'; | |
47 | $Is_Cygwin = $^O eq 'cygwin'; | |
48 | $Is_Darwin = $^O eq 'darwin'; | |
49 | $Is_NetWare = $Config{osname} eq 'NetWare'; | |
50 | ||
51 | sub unlink { | |
52 | my(@names) = @_; | |
53 | my($cnt) = 0; | |
54 | ||
55 | return scalar(@names) if $Is_VMS; | |
56 | ||
57 | foreach my $name (@names) { | |
58 | next unless -e $name; | |
59 | chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare); | |
60 | print " unlink $name\n" if $opts{verbose}; | |
61 | ( CORE::unlink($name) and ++$cnt | |
62 | or warn "Couldn't unlink $name: $!\n" ) unless $opts{notify}; | |
63 | } | |
64 | return $cnt; | |
65 | } | |
66 | ||
67 | sub link { | |
68 | my($from,$to) = @_; | |
69 | my($success) = 0; | |
70 | ||
71 | my $xfrom = $from; | |
72 | $xfrom =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
73 | my $xto = $to; | |
74 | $xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir}; | |
75 | print $opts{verbose} ? " ln $xfrom $xto\n" : " $xto\n" | |
76 | unless $opts{silent}; | |
77 | eval { | |
78 | CORE::link($from, $to) | |
79 | ? $success++ | |
80 | : ($from =~ m#^/afs/# || $to =~ m#^/afs/#) | |
81 | ? die "AFS" # okay inside eval {} | |
82 | : die "Couldn't link $from to $to: $!\n" | |
83 | unless $opts{notify}; | |
84 | $packlist->{$xto} = { from => $xfrom, type => 'link' }; | |
85 | }; | |
86 | if ($@) { | |
87 | warn "Replacing link() with File::Copy::copy(): $@"; | |
88 | print $opts{verbose} ? " cp $from $xto\n" : " $xto\n" | |
89 | unless $opts{silent}; | |
90 | print " creating new version of $xto\n" | |
91 | if $Is_VMS and -e $to and !$opts{silent}; | |
92 | unless ($opts{notify} or File::Copy::copy($from, $to) and ++$success) { | |
93 | # Might have been that F::C::c can't overwrite the target | |
94 | warn "Couldn't copy $from to $to: $!\n" | |
95 | unless -f $to and (chmod(0666, $to), unlink $to) | |
96 | and File::Copy::copy($from, $to) and ++$success; | |
97 | } | |
98 | $packlist->{$xto} = { type => 'file' }; | |
99 | } | |
100 | $success; | |
101 | } | |
102 | ||
103 | sub chmod { | |
104 | my($mode,$name) = @_; | |
105 | ||
106 | return if ($^O eq 'dos'); | |
107 | printf " chmod %o %s\n", $mode, $name if $opts{verbose}; | |
108 | CORE::chmod($mode,$name) | |
109 | || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name) | |
110 | unless $opts{notify}; | |
111 | } | |
112 | ||
113 | ||
114 | sub samepath { | |
115 | my($p1, $p2) = @_; | |
116 | ||
117 | return (lc($p1) eq lc($p2)) if ($Is_W32 || $Is_NetWare); | |
118 | ||
119 | if ($p1 ne $p2) { | |
120 | my($dev1, $ino1, $dev2, $ino2); | |
121 | ($dev1, $ino1) = stat($p1); | |
122 | ($dev2, $ino2) = stat($p2); | |
4c3ca3f4 | 123 | ($dev1 ~~ $dev2 && $ino1 ~~ $ino2); |
9e6fc21f NC |
124 | } |
125 | else { | |
126 | 1; | |
127 | } | |
128 | } | |
129 | ||
130 | 1; |