1#!perl 2 3# Initialisation code and subroutines shared between installperl and installman 4# Probably installhtml needs to join the club. 5 6use strict; 7use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare 8 %opts $packlist); 9use subs qw(unlink link chmod); 10 11use Config; 12BEGIN { 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 24perl without this. 25OS 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"}; 32 delete $INC{"Config_git.pl"}; 33 # You never saw us. We weren't here. 34 35 require Config; 36 Config->import; 37 } 38} 39 40if ($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 51sub 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 67sub 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 103sub 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 114sub 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); 123 ($dev1 == $dev2 && $ino1 == $ino2); 124 } 125 else { 126 1; 127 } 128} 129 1301; 131