perl/install_lib.pl
<<
>>
Prefs
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.