stop $foo =~ /(bar)/g skipping copy
[perl.git] / install_lib.pl
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"};
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
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);
123         ($dev1 ~~ $dev2 && $ino1 ~~ $ino2);
124     }
125     else {
126         1;
127     }
128 }
129
130 1;