perl/installperl
<<
>>
Prefs
   1#!./perl -w
   2
   3BEGIN {
   4    require 5.004;
   5    chdir '..' if !-d 'lib' and -d '../lib';
   6    @INC = 'lib';
   7    $ENV{PERL5LIB} = 'lib';
   8
   9    # This needs to be at BEGIN time, before any use of Config
  10    require './install_lib.pl';
  11}
  12
  13use strict;
  14use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare
  15            %opts $packlist);
  16my ($dostrip, $versiononly, $force,
  17    $otherperls, $archname, $nwinstall, $nopods);
  18# Not sure how easy it would be to refactor to remove the need for local $depth
  19# below
  20use vars qw /$depth/;
  21
  22BEGIN {
  23    if ($Is_VMS) { eval 'use VMS::Filespec;' }
  24}
  25
  26my $scr_ext = ($Is_VMS ? '.Com' : $Is_W32 ? '.bat' : '');
  27
  28use File::Find;
  29use File::Compare;
  30use File::Copy ();
  31use File::Path ();
  32use ExtUtils::Packlist;
  33use Cwd;
  34
  35if ($Is_NetWare) {
  36    $Is_W32 = 0;
  37    $scr_ext = '.pl';
  38}
  39
  40# override the ones in the rest of the script
  41sub mkpath {
  42    File::Path::mkpath(@_) unless $opts{notify};
  43}
  44
  45my $mainperldir = "/usr/bin";
  46my $exe_ext = $Config{exe_ext};
  47
  48# Allow "make install PERLNAME=something_besides_perl":
  49my $perl = defined($ENV{PERLNAME}) ? $ENV{PERLNAME} : 'perl';
  50
  51# This is the base used for versioned names, like "perl5.6.0".
  52# It's separate because a common use of $PERLNAME is to install
  53# perl as "perl5", if that's used as base for versioned files you
  54# get "perl55.6.0".
  55my $perl_verbase = defined($ENV{PERLNAME_VERBASE})
  56                    ? $ENV{PERLNAME_VERBASE}
  57                    : $perl;
  58my $dbg = '';
  59my $ndbg = '';
  60if ( $Is_VMS ) {
  61    if ( defined $Config{usevmsdebug} ) {
  62        if ( $Config{usevmsdebug} eq 'define' ) {
  63            $dbg = 'dbg';
  64            $ndbg = 'ndbg';
  65        }
  66    }
  67}
  68
  69$otherperls = 1;
  70# This little hack simplifies making the code after the comment "Fetch some
  71# frequently-used items from %Config" warning free. With $opts{destdir} always
  72# defined, it's also possible to make the s/\Q$opts{destdir}\E unconditional.
  73
  74$opts{destdir} = '';
  75# Consider refactoring this to use Getopt::Long once Getopt::Long's planned
  76# feature is implemented, to distinguish + and - options.
  77while (@ARGV) {
  78    $opts{notify} = 1 if $ARGV[0] eq '-n';
  79    $dostrip = 1 if $ARGV[0] eq '-s';
  80    $versiononly = 1 if $ARGV[0] eq '-v';
  81    $versiononly = 0 if $ARGV[0] eq '+v';
  82    $opts{silent} = 1 if $ARGV[0] eq '-S';
  83    $otherperls = 0 if $ARGV[0] eq '-o';
  84    $force = 1 if $ARGV[0] eq '-f';
  85    $opts{verbose} = 1 if $ARGV[0] eq '-V' || $ARGV [0] eq '-n';
  86    $archname = 1 if $ARGV[0] eq '-A';
  87    $nwinstall = 1 if $ARGV[0] eq '-netware';
  88    $nopods = 1 if $ARGV[0] eq '-p';
  89    $opts{destdir} = $1 if $ARGV[0] =~ /^-?-destdir=(.*)$/;
  90    if ($ARGV[0] eq '-?' or $ARGV[0] =~ /^-?-h/) {
  91        print <<"EOT";
  92Usage $0: [switches]
  93  -n        Don't actually run any commands; just print them.
  94  -s        Run strip on installed binaries.
  95  -v        Only install perl as a binary with the version number in the name.
  96            (Override whatever config.sh says)
  97  +v        Install perl as "perl" and as a binary with the version number in
  98            the name.  (Override whatever config.sh says)
  99  -S        Silent mode.
 100  -f        Force installation (don't check if same version is there)
 101  -o        Skip checking for other copies of perl in your PATH.
 102  -V        Verbose mode.
 103  -A        Also install perl with the architecture's name in the perl binary's
 104            name.
 105  -p        Don't install the pod files. [This will break use diagnostics;]
 106  -netware  Install correctly on a Netware server.
 107  -destdir  Prefix installation directories by this string.
 108EOT
 109        exit;
 110    }
 111    shift;
 112}
 113
 114$versiononly = 1 if $Config{versiononly} && !defined $versiononly;
 115my (@scripts, @tolink);
 116open SCRIPTS, "utils.lst" or die "Can't open utils.lst: $!";
 117while (<SCRIPTS>) {
 118    next if /^#/;
 119    s/\s*#\s*pod\s*=.*//; # install script regardless of pod location
 120    next if /a2p/; # a2p is binary, to be installed separately
 121    chomp;
 122    if (/(\S*)\s*#\s*link\s*=\s*(\S*)/) {
 123        push @scripts, $1;
 124        push @tolink, [$1, $2];
 125    } else {
 126        push @scripts, $_;
 127    }
 128}
 129close SCRIPTS;
 130
 131if ($scr_ext) { @scripts = map { "$_$scr_ext" } @scripts; }
 132
 133my @pods = $nopods ? () : (<pod/*.pod>, 'x2p/a2p.pod');
 134
 135# Specify here any .pm files that are actually architecture-dependent.
 136# (Those included with XS extensions under ext/ are automatically
 137# added later.)
 138# Now that the default privlib has the full perl version number included,
 139# we no longer have to play the trick of sticking version-specific .pm
 140# files under the archlib directory.
 141my %archpms = (
 142    Config => 1,
 143    lib => 1,
 144    Cwd => 1,
 145);
 146
 147if ($^O eq 'dos') {
 148    push(@scripts,'djgpp/fixpmain');
 149    $archpms{config} = $archpms{filehand} = 1;
 150}
 151
 152if ((-e "testcompile") && (defined($ENV{'COMPILE'}))) {
 153    push(@scripts, map("$_.exe", @scripts));
 154}
 155
 156# Exclude nonxs extensions that are not architecture dependent
 157my @nonxs = grep(!/^Errno$/, split(' ', $Config{'nonxs_ext'}));
 158
 159find(sub {
 160    if (($File::Find::name =~ m{^ext\b(.*)/([^/]+)\.pm$}) &&
 161        ! grep { (my $dir = $_) =~ s/\//-/g;
 162                 $File::Find::name =~ /^ext\/$dir/ } @nonxs)
 163    {
 164        my($path, $modname) = ($1,$2);
 165
 166        # Change hypenated name like Filter-Util-Call to nested
 167        # directory name Filter/Util/Call
 168        $path =~ s{-}{/}g;
 169
 170        # strip to optional "/lib", or remove trailing component
 171        $path =~ s{.*/lib\b}{} or $path =~ s{/[^/]*$}{};
 172
 173        # strip any leading /
 174        $path =~ s{^/}{};
 175
 176        # reconstitute canonical module name
 177        $modname = "$path/$modname" if length $path;
 178
 179        # remember it
 180        $archpms{$modname} = 1;
 181    }
 182}, 'ext');
 183
 184# print "[$_]\n" for sort keys %archpms;
 185
 186my $ver = $Config{version};
 187my $release = substr($],0,3);   # Not used currently.
 188my $patchlevel = substr($],3,2);
 189die "Patchlevel of perl ($patchlevel)",
 190    "and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
 191        if $patchlevel != $Config{'PERL_VERSION'};
 192
 193# Fetch some frequently-used items from %Config
 194my $installbin = "$opts{destdir}$Config{installbin}";
 195my $installscript = "$opts{destdir}$Config{installscript}";
 196my $installprivlib = "$opts{destdir}$Config{installprivlib}";
 197my $installarchlib = "$opts{destdir}$Config{installarchlib}";
 198my $installsitelib = "$opts{destdir}$Config{installsitelib}";
 199my $installsitearch = "$opts{destdir}$Config{installsitearch}";
 200my $installman1dir = "$opts{destdir}$Config{installman1dir}";
 201my $man1ext = $Config{man1ext};
 202my $libperl = $Config{libperl};
 203# Shared library and dynamic loading suffixes.
 204my $so = $Config{so};
 205my $dlext = $Config{dlext};
 206my $dlsrc = $Config{dlsrc};
 207if ($^O eq 'os390') {
 208    my $pwd;
 209    chomp($pwd=`pwd`);
 210    my $archlibexp = $Config{archlibexp};
 211    my $usedl = $Config{usedl};
 212    if ($usedl eq 'define') {
 213        `./$^X -pibak -e 's{$pwd\/libperl.x}{$archlibexp/CORE/libperl.x}' lib/Config.pm`;
 214    }
 215}
 216
 217if ($nwinstall) {
 218    # This is required only if we are installing on a NetWare server
 219    $installscript = $Config{installnwscripts};
 220    $installprivlib = $Config{installnwlib};
 221    $installarchlib = $Config{installnwlib};
 222    $installsitelib = $Config{installnwlib};
 223}
 224
 225my $d_dosuid = $Config{d_dosuid};
 226my $binexp = $Config{binexp};
 227
 228if ($Is_VMS) {  # Hang in there until File::Spec hits the big time
 229    foreach ( \$installbin,     \$installscript,  \$installprivlib,
 230              \$installarchlib, \$installsitelib, \$installsitearch,
 231              \$installman1dir ) {
 232        $$_ = unixify($$_);  $$_ =~ s:/$::;
 233    }
 234}
 235
 236# Do some quick sanity checks.
 237
 238if (!$opts{notify} && $d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 239
 240   $installbin          || die "No installbin directory in config.sh\n";
 241-d $installbin          || mkpath($installbin, $opts{verbose}, 0777);
 242-d $installbin          || $opts{notify} || die "$installbin is not a directory\n";
 243-w $installbin          || $opts{notify} || die "$installbin is not writable by you\n"
 244        unless $installbin =~ m#^/afs/# || $opts{notify};
 245
 246if (!$Is_NetWare) {
 247if (!$Is_VMS) {
 248-x 'perl' . $exe_ext    || die "perl isn't executable!\n";
 249}
 250else {
 251-x $ndbg . 'perl' . $exe_ext    || die "${ndbg}perl$exe_ext isn't executable!\n";
 252    if ($dbg) {
 253        -x $dbg . 'perl' . $exe_ext     || die "${dbg}perl$exe_ext isn't executable!\n";
 254    }
 255}
 256-x 'suidperl' . $exe_ext|| die "suidperl isn't executable!\n" if $d_dosuid;
 257
 258-f 't/rantests'         || $Is_W32
 259                        || warn "WARNING: You've never run 'make test' or",
 260                                " some tests failed! (Installing anyway.)\n";
 261} #if (!$Is_NetWare)
 262
 263# This will be used to store the packlist
 264$packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
 265
 266if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin) {
 267    my $perldll;
 268
 269    if ($Is_Cygwin) {
 270        $perldll = $libperl;
 271    } else {
 272        $perldll = 'perl5'.$Config{patchlevel}.'.'.$dlext;
 273    }
 274
 275    if ($dlsrc ne "dl_none.xs") {
 276        -f $perldll || die "No perl DLL built\n";
 277    }
 278
 279    # Install the DLL
 280    safe_unlink("$installbin/$perldll");
 281    copy("$perldll", "$installbin/$perldll");
 282    chmod(0755, "$installbin/$perldll");
 283    $packlist->{"$installbin/$perldll"} = { type => 'file' };
 284} # if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin)
 285
 286# First we install the version-numbered executables.
 287
 288if ($Is_VMS) {
 289    safe_unlink("$installbin/perl_setup.com");
 290    copy("perl_setup.com", "$installbin/perl_setup.com");
 291    chmod(0755, "$installbin/perl_setup.com");
 292    safe_unlink("$installbin/$dbg$perl$exe_ext");
 293    copy("$dbg$perl$exe_ext", "$installbin/$dbg$perl$exe_ext");
 294    chmod(0755, "$installbin/$dbg$perl$exe_ext");
 295    safe_unlink("$installbin/$dbg${perl}shr$exe_ext");
 296    copy("$dbg${perl}shr$exe_ext", "$installbin/$dbg${perl}shr$exe_ext");
 297    chmod(0755, "$installbin/$dbg${perl}shr$exe_ext");
 298    if ($ndbg) {
 299        safe_unlink("$installbin/$ndbg$perl$exe_ext");
 300        copy("$ndbg$perl$exe_ext", "$installbin/$ndbg$perl$exe_ext");
 301        chmod(0755, "$installbin/$ndbg$perl$exe_ext");
 302        safe_unlink("$installbin/${dbg}a2p$exe_ext");
 303        copy("x2p/${dbg}a2p$exe_ext", "$installbin/${dbg}a2p$exe_ext");
 304        chmod(0755, "$installbin/${dbg}a2p$exe_ext");
 305    }
 306}
 307elsif ($^O eq 'mpeix') {
 308    # MPE lacks hard links and requires that executables with special
 309    # capabilities reside in the MPE namespace.
 310    safe_unlink("$installbin/perl$ver$exe_ext", $Config{perlpath});
 311    # Install the primary executable into the MPE namespace as perlpath.
 312    copy("perl$exe_ext", $Config{perlpath});
 313    chmod(0755, $Config{perlpath});
 314    # Create a backup copy with the version number.
 315    link($Config{perlpath}, "$installbin/perl$ver$exe_ext");
 316}
 317elsif ($^O ne 'dos') {
 318    if (!$Is_NetWare) {
 319        safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
 320        copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
 321        strip("$installbin/$perl_verbase$ver$exe_ext");
 322        chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
 323    }
 324    else {
 325        # If installing onto a NetWare server
 326        if ($nwinstall) {
 327            # Copy perl.nlm, echo.nlm, type.nlm, a2p.nlm & cgi2perl.nlm
 328            mkpath($Config{installnwsystem}, 1, 0777);
 329            copy("netware\\".$ENV{'MAKE_TYPE'}."\\perl.nlm", $Config{installnwsystem});
 330            copy("netware\\testnlm\\echo\\echo.nlm", $Config{installnwsystem});
 331            copy("netware\\testnlm\\type\\type.nlm", $Config{installnwsystem});
 332            copy("x2p\\a2p.nlm", $Config{installnwsystem});
 333            chmod(0755, "$Config{installnwsystem}\\perl.nlm");
 334            mkpath($Config{installnwlcgi}, 1, 0777);
 335            copy("lib\\auto\\cgi2perl\\cgi2perl.nlm", $Config{installnwlcgi});
 336        }
 337    } #if (!$Is_NetWare)
 338}
 339else {
 340    safe_unlink("$installbin/$perl.exe");
 341    copy("perl.exe", "$installbin/$perl.exe");
 342}
 343
 344safe_unlink("$installbin/s$perl_verbase$ver$exe_ext");
 345if ($d_dosuid) {
 346    copy("suidperl$exe_ext", "$installbin/s$perl_verbase$ver$exe_ext");
 347    chmod(04711, "$installbin/s$perl_verbase$ver$exe_ext");
 348}
 349
 350# Install library files.
 351
 352my ($do_installarchlib, $do_installprivlib) = (0, 0);
 353my $vershort = ($Is_Cygwin and !$Config{usedevel}) ? substr($ver,0,-2) : $ver;
 354
 355mkpath($installprivlib, $opts{verbose}, 0777);
 356mkpath($installarchlib, $opts{verbose}, 0777);
 357mkpath($installsitelib, $opts{verbose}, 0777) if ($installsitelib);
 358mkpath($installsitearch, $opts{verbose}, 0777) if ($installsitearch);
 359
 360if (chdir "lib") {
 361    $do_installarchlib = ! samepath($installarchlib, '.');
 362    $do_installprivlib = ! samepath($installprivlib, '.');
 363    $do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$vershort/);
 364
 365    if ($do_installarchlib || $do_installprivlib) {
 366        find(\&installlib, '.');
 367    }
 368    chdir ".." || die "Can't cd back to source directory: $!\n";
 369}
 370else {
 371    warn "Can't cd to lib to install lib files: $!\n";
 372}
 373
 374# Install header files and libraries.
 375mkpath("$installarchlib/CORE", $opts{verbose}, 0777);
 376my @corefiles;
 377if ($Is_VMS) {  # We did core file selection during build
 378    my $coredir = "lib/$Config{archname}/$ver/CORE";
 379    $coredir =~ tr/./_/;
 380    map { s|^$coredir/||i; } @corefiles = <$coredir/*.*>;
 381}
 382elsif ($Is_Cygwin) { # On Cygwin symlink it to CORE to make Makefile happy
 383    @corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
 384    my $coredll = "$installarchlib/CORE/$libperl";
 385    safe_unlink($coredll);
 386    ( $Config{'d_link'} eq 'define' &&
 387      eval {
 388          CORE::link("$installbin/$libperl", $coredll);
 389          $packlist->{$coredll} = { from => "$installbin/$libperl",
 390                                    type => 'link' };
 391      }
 392    ) ||
 393    eval {
 394        symlink("$installbin/$libperl", $coredll);
 395        $packlist->{$coredll} = { from => "$installbin/$libperl",
 396                                  type => 'link' };
 397    } ||
 398    ( copy("$installbin/$libperl", $coredll) &&
 399      push(@corefiles, $coredll)
 400    )
 401} else {
 402    # [als] hard-coded 'libperl' name... not good!
 403    @corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
 404
 405    # AIX needs perl.exp installed as well.
 406    push(@corefiles,'perl.exp') if $^O eq 'aix';
 407    if ($^O eq 'mpeix') {
 408        # MPE needs mpeixish.h installed as well.
 409        mkpath("$installarchlib/CORE/mpeix", $opts{verbose}, 0777);
 410        push(@corefiles,'mpeix/mpeixish.h');
 411    }
 412    # If they have built sperl.o...
 413    push(@corefiles,'sperl.o') if -f 'sperl.o';
 414}
 415foreach my $file (@corefiles) {
 416    # HP-UX (at least) needs to maintain execute permissions
 417    # on dynamically-loadable libraries. So we do it for all.
 418    if (copy_if_diff($file,"$installarchlib/CORE/$file")) {
 419        if ($file =~ /\.(\Q$so\E|\Q$dlext\E)$/) {
 420            strip("-S", "$installarchlib/CORE/$file") if $^O =~ /^(rhapsody|darwin)$/;
 421            chmod(0555, "$installarchlib/CORE/$file");
 422        } else {
 423            chmod(0444, "$installarchlib/CORE/$file");
 424        }
 425    }
 426}
 427
 428# Install main perl executables
 429# Make links to ordinary names if installbin directory isn't current directory.
 430
 431if (! $versiononly && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS && ! $Is_NetWare) {
 432    safe_unlink("$installbin/$perl$exe_ext", "$installbin/suid$perl$exe_ext");
 433    if ($^O eq 'mpeix') {
 434        # MPE doesn't support hard links, so use a symlink.
 435        # We don't want another cloned copy.
 436        symlink($Config{perlpath}, "$installbin/perl$exe_ext");
 437    } elsif ($^O eq 'vos') {
 438        # VOS doesn't support hard links, so use a symlink.
 439        symlink("$installbin/$perl_verbase$ver$exe_ext",
 440                "$installbin/$perl$exe_ext");
 441    } else {
 442        link("$installbin/$perl_verbase$ver$exe_ext",
 443                "$installbin/$perl$exe_ext");
 444    }
 445    link("$installbin/$perl_verbase$ver$exe_ext",
 446            "$installbin/suid$perl$exe_ext")
 447      if $d_dosuid;
 448}
 449
 450# For development purposes it can be very useful to have multiple perls
 451# build for different "architectures" (eg threading or not) simultaneously.
 452if ($archname && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS) {
 453    my $archperl = "$perl_verbase$ver-$Config{archname}$exe_ext";
 454    safe_unlink("$installbin/$archperl");
 455    if ($^O eq 'mpeix') {
 456        # MPE doesn't support hard links, so use a symlink.
 457        # We don't want another cloned copy.
 458        symlink($Config{perlpath}, "$installbin/$archperl");
 459    } elsif ($^O eq 'vos') {
 460        # VOS doesn't support hard links, so use a symlink.
 461        symlink("$installbin/$perl_verbase$ver$exe_ext",
 462                "$installbin/$archperl");
 463    } else {
 464        link("$installbin/$perl_verbase$ver$exe_ext", "$installbin/$archperl");
 465    }
 466}
 467
 468# Offer to install perl in a "standard" location
 469
 470my $mainperl_is_instperl = 0;
 471
 472if ($Config{installusrbinperl} && $Config{installusrbinperl} eq 'define' &&
 473    !$versiononly && !$opts{notify} && !$Is_W32 && !$Is_NetWare && !$Is_VMS && -t STDIN && -t STDERR
 474        && -w $mainperldir && ! samepath($mainperldir, $installbin)) {
 475    my($usrbinperl)     = "$mainperldir/$perl$exe_ext";
 476    my($instperl)       = "$installbin/$perl$exe_ext";
 477    my($expinstperl)    = "$binexp/$perl$exe_ext";
 478
 479    # First make sure $usrbinperl is not already the same as the perl we
 480    # just installed.
 481    if (-x $usrbinperl) {
 482        # Try to be clever about mainperl being a symbolic link
 483        # to binexp/perl if binexp and installbin are different.
 484        $mainperl_is_instperl =
 485            samepath($usrbinperl, $instperl) ||
 486            samepath($usrbinperl, $expinstperl) ||
 487             (($binexp ne $installbin) &&
 488              (-l $usrbinperl) &&
 489              ((readlink $usrbinperl) eq $expinstperl));
 490    }
 491    if (! $mainperl_is_instperl) {
 492        unlink($usrbinperl);
 493        ( $Config{'d_link'} eq 'define' &&
 494          eval { CORE::link $instperl, $usrbinperl } )  ||
 495        eval { symlink $expinstperl, $usrbinperl }      ||
 496        copy($instperl, $usrbinperl);
 497
 498        $mainperl_is_instperl = 1;
 499    }
 500}
 501
 502# Make links to ordinary names if installbin directory isn't current directory.
 503if (!$Is_NetWare && $dbg eq '') {
 504    if (! samepath($installbin, 'x2p')) {
 505        my $base = 'a2p';
 506        $base .= $ver if $versiononly;
 507        safe_unlink("$installbin/$base$exe_ext");
 508        copy("x2p/a2p$exe_ext", "$installbin/$base$exe_ext");
 509        strip("$installbin/$base$exe_ext");
 510        chmod(0755, "$installbin/$base$exe_ext");
 511    }
 512}
 513
 514# cppstdin is just a script, but it is architecture-dependent, so
 515# it can't safely be shared.  Place it in $installbin.
 516# Note that Configure doesn't build cppstin if it isn't needed, so
 517# we skip this if cppstdin doesn't exist.
 518if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
 519    safe_unlink("$installbin/cppstdin");
 520    copy("cppstdin", "$installbin/cppstdin");
 521    chmod(0755, "$installbin/cppstdin");
 522}
 523
 524sub script_alias {
 525    my ($installscript, $orig, $alias, $scr_ext) = @_;
 526
 527    safe_unlink("$installscript/$alias$scr_ext");
 528    if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
 529        copy("$installscript/$orig$scr_ext",
 530             "$installscript/$alias$scr_ext");
 531    } elsif ($^O eq 'vos') {
 532        symlink("$installscript/$orig$scr_ext",
 533                "$installscript/$alias$scr_ext");
 534    } else {
 535        link("$installscript/$orig$scr_ext",
 536             "$installscript/$alias$scr_ext");
 537    }
 538}
 539
 540# Install scripts.
 541mkpath($installscript, $opts{verbose}, 0777);
 542if ($versiononly) {
 543    for (@scripts) {
 544        (my $base = $_) =~ s#.*/##;
 545        $base .= $ver;
 546        copy($_,    "$installscript/$base");
 547        chmod(0755, "$installscript/$base");
 548    }
 549
 550    for (@tolink) {
 551        my ($from, $to) = map { "$_$ver" } @$_;
 552        (my $frbase = $from) =~ s#.*/##;
 553        (my $tobase = $to) =~ s#.*/##;
 554        script_alias($installscript, $frbase, $tobase, $scr_ext);
 555    }
 556} else {
 557    for (@scripts) {
 558        (my $base = $_) =~ s#.*/##;
 559        copy($_, "$installscript/$base");
 560        chmod(0755, "$installscript/$base");
 561    }
 562
 563    for (@tolink) {
 564        my ($from, $to) = @$_;
 565        (my $frbase = $from) =~ s#.*/##;
 566        (my $tobase = $to) =~ s#.*/##;
 567        script_alias($installscript, $frbase, $tobase, $scr_ext);
 568    }
 569}
 570
 571# Install pod pages.  Where? I guess in $installprivlib/pod
 572# ($installprivlib/pods for cygwin).
 573
 574my $pod = ($Is_Cygwin || $Is_Darwin || $Is_VMS || $Is_W32) ? 'pods' : 'pod';
 575if ( !$versiononly || ($installprivlib =~ m/\Q$vershort/)) {
 576    mkpath("${installprivlib}/$pod", $opts{verbose}, 0777);
 577
 578    # If Perl 5.003's perldiag.pod is there, rename it.
 579    if (open POD, "${installprivlib}/$pod/perldiag.pod") {
 580        read POD, $_, 4000;
 581        close POD;
 582        # Some of Perl 5.003's diagnostic messages ended with periods.
 583        if (/^=.*\.$/m) {
 584            my ($from, $to) = ("${installprivlib}/$pod/perldiag.pod",
 585                               "${installprivlib}/$pod/perldiag-5.003.pod");
 586            print "  rename $from $to";
 587            rename($from, $to)
 588                or warn "Couldn't rename $from to $to: $!\n"
 589                unless $opts{notify};
 590        }
 591    }
 592
 593    for (@pods) {
 594        # $_ is a name like  pod/perl.pod
 595        (my $base = $_) =~ s#.*/##;
 596        copy_if_diff($_, "${installprivlib}/$pod/${base}");
 597    }
 598
 599}
 600
 601# Check to make sure there aren't other perls around in installer's
 602# path.  This is probably UNIX-specific.  Check all absolute directories
 603# in the path except for where public executables are supposed to live.
 604# Also skip $mainperl if the user opted to have it be a link to the
 605# installed perl.
 606
 607if (!$versiononly && $otherperls) {
 608    my ($path, @path);
 609    my $dirsep = ($Is_OS2 || $Is_W32 || $Is_NetWare) ? ';' : ':' ;
 610    ($path = $ENV{"PATH"}) =~ s:\\:/:g ;
 611    @path = split(/$dirsep/, $path);
 612    if ($Is_VMS) {
 613        my $i = 0;
 614        while (exists $ENV{'DCL$PATH' . $i}) {
 615            my $dir = unixpath($ENV{'DCL$PATH' . $i});  $dir =~ s-/$--;
 616            push(@path,$dir);
 617        }
 618    }
 619    my @otherperls;
 620    my %otherperls;
 621    for (@path) {
 622        next unless m,^/,;
 623        # Use &samepath here because some systems have other dirs linked
 624        # to $mainperldir (like SunOS)
 625        next unless -d;
 626        next if samepath($_, $binexp);
 627        next if samepath($_, cwd());
 628        next if ($mainperl_is_instperl && samepath($_, $mainperldir));
 629        my $otherperl = "$_/$perl$exe_ext";
 630        next if $otherperls{$otherperl}++;
 631        push(@otherperls, $otherperl)
 632            if (-x $otherperl && ! -d $otherperl);
 633    }
 634    if (@otherperls) {
 635        warn "\nWarning: $perl appears in your path in the following " .
 636            "locations beyond where\nwe just installed it:\n";
 637        for (@otherperls) {
 638            warn "    ", $_, "\n";
 639        }
 640        warn "\n";
 641    }
 642
 643}
 644
 645$packlist->write() unless $opts{notify};
 646print "  Installation complete\n" if $opts{verbose};
 647
 648exit 0;
 649
 650###############################################################################
 651
 652# If these are needed elsewhere, move them into install_lib.pl rather than
 653# copying them.
 654
 655sub yn {
 656    my($prompt) = @_;
 657    my($answer);
 658    my($default) = $prompt =~ m/\[([yn])\]\s*$/i;
 659    print STDERR $prompt;
 660    chop($answer = <STDIN>);
 661    $answer = $default if $answer =~ m/^\s*$/;
 662    ($answer =~ m/^[yY]/);
 663}
 664
 665sub safe_unlink {
 666    return if $opts{notify} or $Is_VMS;
 667    my @names = @_;
 668    foreach my $name (@names) {
 669        next unless -e $name;
 670        chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_NetWare);
 671        print "  unlink $name\n" if $opts{verbose};
 672        next if CORE::unlink($name);
 673        warn "Couldn't unlink $name: $!\n";
 674        if ($! =~ /busy/i) {
 675            print "  mv $name $name.old\n" if $opts{verbose};
 676            safe_rename($name, "$name.old")
 677                or warn "Couldn't rename $name: $!\n";
 678        }
 679    }
 680}
 681
 682sub safe_rename {
 683    my($from,$to) = @_;
 684    if (-f $to and not unlink($to)) {
 685        my($i);
 686        for ($i = 1; $i < 50; $i++) {
 687            last if rename($to, "$to.$i");
 688        }
 689        warn("Cannot rename to `$to.$i': $!"), return 0
 690           if $i >= 50; # Give up!
 691    }
 692    link($from,$to) || return 0;
 693    unlink($from);
 694}
 695
 696sub copy {
 697    my($from,$to) = @_;
 698
 699    my $xto = $to;
 700    $xto =~ s/^\Q$opts{destdir}\E//;
 701    print $opts{verbose} ? "  cp $from $xto\n" : "  $xto\n"
 702        unless $opts{silent};
 703    print "  creating new version of $xto\n"
 704        if $Is_VMS and -e $to and !$opts{silent};
 705    unless ($opts{notify} or File::Copy::copy($from, $to)) {
 706        # Might have been that F::C::c can't overwrite the target
 707        warn "Couldn't copy $from to $to: $!\n"
 708            unless -f $to and (chmod(0666, $to), unlink $to)
 709                   and File::Copy::copy($from, $to);
 710    }
 711    $packlist->{$xto} = { type => 'file' };
 712}
 713
 714sub installlib {
 715    my $dir = $File::Find::dir;
 716    $dir =~ s#^\.(?![^/])/?##;
 717    local($depth) = $dir ? "lib/$dir" : "lib";
 718
 719    my $name = $_;
 720
 721    # Ignore version control directories.
 722    if ($name =~ /^(?:CVS|RCS|SCCS|\.svn)\z/ and -d $name) {
 723        $File::Find::prune = 1;
 724        return;
 725    }
 726
 727    # ignore patch backups, RCS files, emacs backup & temp files and the
 728    # .exists files, .PL files, and test files.
 729    return if $name =~ m{\.orig$|\.rej$|~$|^#.+#$|,v$|^\.exists|\.PL$|\.plc$|\.t$|^test\.pl$|^dbm_filter_util.pl$} ||
 730              $dir  =~ m{/t(?:/|$)};
 731    # ignore the cpan script in lib/CPAN/bin, the instmodsh and xsubpp
 732    # scripts in lib/ExtUtils, the prove script in lib/Test/Harness,
 733    # the corelist script from lib/Module/CoreList/bin and ptar* in
 734    # lib/Archive/Tar/bin, the config_data script in lib/Module/Build/scripts
 735    # (they're installed later with other utils)
 736    return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|cpan2dist|cpanp|cpanp-run-perl|ptardiff|config_data)\z/;
 737    # ignore the Makefiles
 738    return if $name =~ /^makefile$/i;
 739    # ignore the test extensions
 740    return if $dir =~ m{\bXS/(?:APItest|Typemap)\b};
 741    return if $name =~ m{\b(?:APItest|Typemap)\.pm$};
 742    # ignore the demo files
 743    return if $dir =~ /\b(?:demos?|eg)\b/;
 744
 745    # ignore READMEs, MANIFESTs, INSTALL docs, META.ymls and change logs.
 746    # Changes.e2x and README.e2x are needed by enc2xs.
 747    return if $name =~ m{^(?:README(?:\.\w+)?)$} && $name ne 'README.e2x';
 748    return if $name =~ m{^(?:MANIFEST|META\.yml)$};
 749    return if $name =~ m{^(?:INSTALL|TODO|BUGS|CREDITS)$}i;
 750    return if $name =~ m{^change(?:s|log)(?:\.libnet)?$}i;
 751    return if $name =~ m{^(?:SIGNATURE|PAUSE200\d\.pub)$}; # CPAN files
 752    return if $name =~ m{^(?:NOTES|PATCHING)$}; # ExtUtils files
 753
 754    # if using a shared perl library then ignore:
 755    # - static library files [of statically linked extensions];
 756    # - import library files and export library files (only present on Win32
 757    #   anyway?) and empty bootstrap files [of dynamically linked extensions].
 758    return if $Config{useshrplib} eq 'true' and
 759             ($name =~ /$Config{_a}$/ or $name =~ /\.exp$/ or ($name =~ /\.bs$/ and -z $name));
 760
 761    $name = "$dir/$name" if $dir ne '';
 762
 763    return if $name eq 'ExtUtils/XSSymSet.pm' and !$Is_VMS;
 764
 765    my $installlib = $installprivlib;
 766    if ($dir =~ /^auto\// ||
 767          ($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1}) ||
 768          ($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare)) ||
 769          $name=~/^Config_(heavy|git)\.pl\z/
 770       ) {
 771        $installlib = $installarchlib;
 772        return unless $do_installarchlib;
 773    } else {
 774        return unless $do_installprivlib;
 775    }
 776
 777    if (-f $_) {
 778        if (/\.(?:al|ix)$/ && !($dir =~ m[^auto/(.*)$])) {
 779            $installlib = $installprivlib;
 780            #We're installing *.al and *.ix files into $installprivlib,
 781            #but we have to delete old *.al and *.ix files from the 5.000
 782            #distribution:
 783            #This might not work because $archname might have changed.
 784            unlink("$installarchlib/$name");
 785        }
 786        my $xname = "$installlib/$name";
 787        $xname =~ s/^\Q$opts{destdir}\E//;
 788        $packlist->{$xname} = { type => 'file' };
 789        if ($force || compare($_, "$installlib/$name") || $opts{notify}) {
 790            unlink("$installlib/$name");
 791            mkpath("$installlib/$dir", $opts{verbose}, 0777);
 792            # HP-UX (at least) needs to maintain execute permissions
 793            # on dynamically-loaded libraries.
 794            if ($Is_NetWare && !$nwinstall) {
 795                # Don't copy .nlp,.nlm files, doesn't make sense on Windows and also
 796                # if copied will give problems when building new extensions.
 797                # Has to be copied if we are installing on a NetWare server and hence
 798                # the check !$nwinstall
 799                if (!(/\.(?:nlp|nlm|bs)$/)) {
 800                    copy_if_diff($_, "$installlib/$name")
 801                        and chmod($name =~ /\.(so|$dlext)$/o ? 0555 : 0444,
 802                                  "$installlib/$name");
 803                }
 804           } else {
 805                if (copy_if_diff($_, "$installlib/$name")) {
 806                    if ($name =~ /\.(so|$dlext)$/o) {
 807                        strip("-S", "$installlib/$name") if $^O =~ /^(rhapsody|darwin)$/;
 808                        chmod(0555, "$installlib/$name");
 809                    } else {
 810                        strip("-S", "$installlib/$name")
 811                            if ($name =~ /\.a$/o and $^O =~ /^(rhapsody|darwin)$/);
 812                        chmod(0444, "$installlib/$name");
 813                    }
 814                }
 815            } #if ($Is_NetWare)
 816        }
 817    }
 818}
 819
 820# Copy $from to $to, only if $from is different than $to.
 821# Also preserve modification times for .a libraries.
 822# On some systems, if you do
 823#   ranlib libperl.a
 824#   cp libperl.a /usr/local/lib/perl5/archlib/CORE/libperl.a
 825# and then try to link against the installed libperl.a, you might
 826# get an error message to the effect that the symbol table is older
 827# than the library.
 828# Return true if copying occurred.
 829
 830sub copy_if_diff {
 831    my($from,$to)=@_;
 832    return 1 if (($^O eq 'VMS') && (-d $from));
 833    my $xto = $to;
 834    $xto =~ s/^\Q$opts{destdir}\E//;
 835    my $perlpodbadsymlink;
 836    if ($from =~ m!^pod/perl[\w-]+\.pod$! &&
 837        -l $from &&
 838        ! -e $from) {
 839        # Some Linux implementations have problems traversing over
 840        # multiple symlinks (when going over NFS?) and fail to read
 841        # the symlink target.  Combine this with the fact that some
 842        # of the pod files (the perl$OS.pod) are symlinks (to ../README.$OS),
 843        # and you end up with those pods not getting installed.
 844        $perlpodbadsymlink = 1;
 845    }
 846    -f $from || $perlpodbadsymlink || warn "$0: $from not found";
 847    $packlist->{$xto} = { type => 'file' };
 848    if ($force || compare($from, $to) || $opts{notify}) {
 849        safe_unlink($to);   # In case we don't have write permissions.
 850        if ($opts{notify}) {
 851            $from = $depth . "/" . $from if $depth;
 852        }
 853        if ($perlpodbadsymlink && $from =~ m!^pod/perl(.+)\.pod$!) {
 854            $from = "README.$1";
 855        }
 856        copy($from, $to);
 857        # Restore timestamps if it's a .a library or for OS/2.
 858        if (!$opts{notify} && ($Is_OS2 || $to =~ /\.a$/)) {
 859            my ($atime, $mtime) = (stat $from)[8,9];
 860            utime $atime, $mtime, $to;
 861        }
 862        1;
 863    }
 864}
 865
 866sub strip
 867{
 868    my(@args) = @_;
 869
 870    return unless $dostrip;
 871
 872    my @opts;
 873    while (@args && $args[0] =~ /^(-\w+)$/) {
 874        push @opts, shift @args;
 875    }
 876
 877    foreach my $file (@args) {
 878        if (-f $file) {
 879            if ($opts{verbose}) {
 880                print "  strip " . join(' ', @opts);
 881                print " " if (@opts);
 882                print "$file\n";
 883            }
 884            system("strip", @opts, $file);
 885        } else {
 886            print "# file '$file' skipped\n" if $opts{verbose};
 887        }
 888    }
 889}
 890
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.