perl/install_lib.pl

206 lines
4.8 KiB
Perl

#!perl
# Initialisation code and subroutines shared between installperl and installman
# Probably installhtml needs to join the club.
use strict;
use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare $Is_AmigaOS
%opts $packlist);
use subs qw(unlink link chmod);
require File::Path;
require File::Copy;
BEGIN {
require Config;
if ($Config::Config{userelocatableinc}) {
# This might be a considered a hack. Need to get information about the
# configuration from Config.pm *before* Config.pm expands any .../
# prefixes.
#
# So we set $^X to pretend that we're the already installed perl, so
# Config.pm does its ... expansion off that location.
my $location = $Config::Config{initialinstalllocation};
die <<'OS' unless defined $location;
$Config{initialinstalllocation} is not defined - can't install a relocatable
perl without this.
OS
$^X = "$location/perl";
# And then remove all trace of ever having loaded Config.pm, so that
# it will reload with the revised $^X
undef %Config::;
delete $INC{"Config.pm"};
delete $INC{"Config_heavy.pl"};
delete $INC{"Config_git.pl"};
# You never saw us. We weren't here.
require Config;
}
Config->import;
}
if ($Config{d_umask}) {
umask(022); # umasks like 077 aren't that useful for installations
}
$Is_VMS = $^O eq 'VMS';
$Is_W32 = $^O eq 'MSWin32';
$Is_OS2 = $^O eq 'os2';
$Is_Cygwin = $^O eq 'cygwin';
$Is_Darwin = $^O eq 'darwin';
$Is_NetWare = $Config{osname} eq 'NetWare';
$Is_AmigaOS = $^O eq 'amigaos';
sub unlink {
my(@names) = @_;
my($cnt) = 0;
return scalar(@names) if $Is_VMS;
foreach my $name (@names) {
next unless -e $name;
chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare || $Is_AmigaOS);
print " unlink $name\n" if $opts{verbose};
( CORE::unlink($name) and ++$cnt
or warn "Couldn't unlink $name: $!\n" ) unless $opts{notify};
}
return $cnt;
}
sub link {
my($from,$to) = @_;
my($success) = 0;
my $xfrom = $from;
$xfrom =~ s/^\Q$opts{destdir}\E// if $opts{destdir};
my $xto = $to;
$xto =~ s/^\Q$opts{destdir}\E// if $opts{destdir};
print $opts{verbose} ? " ln $xfrom $xto\n" : " $xto\n"
unless $opts{silent};
my $link = $Is_AmigaOS ? \&CORE::symlink : \&CORE::link;
eval {
$link->($from, $to)
? $success++
: ($from =~ m#^/afs/# || $to =~ m#^/afs/#)
? die "AFS" # okay inside eval {}
: die "Couldn't link $from to $to: $!\n"
unless $opts{notify};
$packlist->{$xto} = { from => $xfrom, type => 'link' };
};
if ($@) {
warn "Replacing link() with File::Copy::copy(): $@";
print $opts{verbose} ? " cp $from $xto\n" : " $xto\n"
unless $opts{silent};
print " creating new version of $xto\n"
if $Is_VMS and -e $to and !$opts{silent};
unless ($opts{notify} or File::Copy::copy($from, $to) and ++$success) {
# Might have been that F::C::c can't overwrite the target
warn "Couldn't copy $from to $to: $!\n"
unless -f $to and (chmod(0666, $to), unlink $to)
and File::Copy::copy($from, $to) and ++$success;
}
$packlist->{$xto} = { type => 'file' };
}
$success;
}
sub chmod {
my($mode,$name) = @_;
return if ($^O eq 'dos');
printf " chmod %o %s\n", $mode, $name if $opts{verbose};
CORE::chmod($mode,$name)
|| warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name)
unless $opts{notify};
}
sub samepath {
my($p1, $p2) = @_;
return (lc($p1) eq lc($p2)) if ($Is_W32 || $Is_NetWare);
return 1
if $p1 eq $p2;
my ($dev1, $ino1) = stat $p1;
return 0
unless defined $dev1;
my ($dev2, $ino2) = stat $p2;
return $dev1 == $dev2 && $ino1 == $ino2;
}
sub safe_rename {
my($from,$to) = @_;
if (-f $to and not unlink($to)) {
my($i);
for ($i = 1; $i < 50; $i++) {
last if rename($to, "$to.$i");
}
warn("Cannot rename to '$to.$i': $!"), return 0
if $i >= 50; # Give up!
}
link($from,$to) || return 0;
unlink($from);
}
sub mkpath {
File::Path::mkpath(shift , $opts{verbose}, 0777) unless $opts{notify};
}
sub unixtoamiga
{
my $unixpath = shift;
my @parts = split("/",$unixpath);
my $isdir = 0;
$isdir = 1 if substr($unixpath,-1) eq "/";
my $first = 1;
my $amigapath = "";
my $i = 0;
for($i = 0; $i <= $#parts;$i++)
{
next if $parts[$i] eq ".";
if($parts[$i] eq "..")
{
$parts[$i] = "/";
}
if($i == 0)
{
if($parts[$i] eq "")
{
$amigapath .= $parts[$i + 1] . ":";
$i++;
next;
}
}
$amigapath .= $parts[$i];
if($i != $#parts)
{
$amigapath .= "/" unless $parts[$i] eq "/" ;
}
else
{
if($isdir)
{
$amigapath .= "/" unless $parts[$i] eq "/" ;
}
}
}
return $amigapath;
}
sub amigaprotect
{
my ($file,$bits) = @_;
print "PROTECT: File $file\n";
system("PROTECT $file $bits")
unless $opts{notify};
}
1;