xref: /openbsd/gnu/usr.bin/perl/install_lib.pl (revision 17df1aa7)
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