Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 836 lines (734 sloc) 28.12 kb
#!./perl -w
BEGIN {
chdir '..' if !-d 'lib' and -d '../lib';
@INC = 'lib';
$ENV{PERL5LIB} = 'lib';
# This needs to be at BEGIN time, before any use of Config
# install_lib itself loads and imports Config into main::
require './install_lib.pl';
}
use strict;
use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $Is_Darwin $Is_NetWare
%opts $packlist);
my $versiononly;
BEGIN {
if ($Is_VMS) { eval 'use VMS::Filespec;' }
}
my $scr_ext = ($Is_VMS ? '.Com' : $Is_W32 ? '.bat' : '');
use File::Find;
use File::Compare;
use File::Copy ();
use ExtUtils::Packlist;
use Cwd;
# nogetopt_compat to disable treating +v as meaning -v
use Getopt::Long qw(:config nogetopt_compat no_auto_abbrev noignorecase);
require './Porting/pod_lib.pl';
if ($Is_NetWare) {
$Is_W32 = 0;
$scr_ext = '.pl';
}
my $mainperldir = "/usr/bin";
my $exe_ext = $Config{exe_ext};
# Allow "make install PERLNAME=something_besides_perl":
my $perl = defined($ENV{PERLNAME}) ? $ENV{PERLNAME} : 'perl';
# This is the base used for versioned names, like "perl5.6.0".
# It's separate because a common use of $PERLNAME is to install
# perl as "perl5", if that's used as base for versioned files you
# get "perl55.6.0".
my $perl_verbase = defined($ENV{PERLNAME_VERBASE})
? $ENV{PERLNAME_VERBASE}
: $perl;
my $dbg = '';
my $ndbg = '';
if ( $Is_VMS ) {
if ( defined $Config{usevmsdebug} ) {
if ( $Config{usevmsdebug} eq 'define' ) {
$dbg = 'dbg';
$ndbg = 'ndbg';
}
}
}
# This little hack simplifies making the code after the comment "Fetch some
# frequently-used items from %Config" warning free. With $opts{destdir} always
# defined, it's also possible to make the s/\Q$opts{destdir}\E unconditional.
$opts{destdir} = '';
{
my $usage = 0;
if (!GetOptions(\%opts, 'notify|n', 'strip|s', 'silent|S',
'skip-otherperls|o', 'force|f', 'verbose|V', 'archname|A',
'netware', 'nopods|p', 'destdir:s', 'help|h|?',
'versiononly|v' => \$versiononly, '<>' => sub {
if ($_[0] eq '+v') {
$versiononly = 0;
} else {
# Any other unknown argument is going to be an error
$usage = 1;
}
},
)) {
$usage = 1;
}
$opts{verbose} ||= $opts{notify};
if ($usage || $opts{help}) {
print <<"EOT";
Usage $0: [switches]
-n Don't actually run any commands; just print them.
-s Run strip on installed binaries.
-v Only install perl as a binary with the version number in the name.
(Override whatever config.sh says)
+v Install perl as "perl" and as a binary with the version number in
the name. (Override whatever config.sh says)
-S Silent mode.
-f Force installation (don't check if same version is there)
-o Skip checking for other copies of perl in your PATH.
-V Verbose mode.
-A Also install perl with the architecture's name in the perl binary's
name.
-p Don't install the pod files. [This will break use diagnostics;]
-netware Install correctly on a Netware server.
-destdir Prefix installation directories by this string.
-h Display this help message.
EOT
exit $usage;
}
}
$versiononly = 1 if $Config{versiononly} && !defined $versiononly;
my (@scripts, @tolink);
open SCRIPTS, "utils.lst" or die "Can't open utils.lst: $!";
while (<SCRIPTS>) {
next if /^#/;
next if /a2p/; # a2p is binary, to be installed separately
chomp;
if (/(\S*)\s*#\s*link\s*=\s*(\S*)/) {
push @scripts, $1;
push @tolink, [$1, $2];
} else {
push @scripts, $_;
}
}
close SCRIPTS;
if ($scr_ext) { @scripts = map { "$_$scr_ext" } @scripts; }
# Specify here any .pm files that are actually architecture-dependent.
# (Those included with XS extensions under ext/ are automatically
# added later.)
# Now that the default privlib has the full perl version number included,
# we no longer have to play the trick of sticking version-specific .pm
# files under the archlib directory.
my %archpms = (
Config => 1,
lib => 1,
);
if ($^O eq 'dos') {
push(@scripts,'djgpp/fixpmain');
$archpms{config} = $archpms{filehand} = 1;
}
if ((-e "testcompile") && (defined($ENV{'COMPILE'}))) {
push(@scripts, map("$_.exe", @scripts));
}
# Exclude nonxs extensions that are not architecture dependent
my @nonxs = grep(!/^Errno$/, split(' ', $Config{'nonxs_ext'}));
my @ext_dirs = qw(cpan dist ext);
foreach my $ext_dir (@ext_dirs) {
find(sub {
if (($File::Find::name =~ m{^$ext_dir\b(.*)/([^/]+)\.pm$}) &&
! grep { (my $dir = $_) =~ s/\//-/g;
$File::Find::name =~ /^$ext_dir\/$dir\// } @nonxs)
{
my($path, $modname) = ($1,$2);
# Change hyphenated name like Filter-Util-Call to nested
# directory name Filter/Util/Call
$path =~ s{-}{/}g;
# strip to optional "/lib", or remove trailing component
$path =~ s{.*/lib\b}{} or $path =~ s{/[^/]*$}{};
# strip any leading /
$path =~ s{^/}{};
# reconstitute canonical module name
$modname = "$path/$modname" if length $path;
# remember it
$archpms{$modname} = 1;
}
}, $ext_dir);
}
# print "[$_]\n" for sort keys %archpms;
my $ver = $Config{version};
my $release = substr($],0,3); # Not used currently.
my $patchlevel = substr($],3,2);
die "Patchlevel of perl ($patchlevel)",
"and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
if $patchlevel != $Config{'PERL_VERSION'};
# Fetch some frequently-used items from %Config
my $installbin = "$opts{destdir}$Config{installbin}";
my $installscript = "$opts{destdir}$Config{installscript}";
my $installprivlib = "$opts{destdir}$Config{installprivlib}";
my $installarchlib = "$opts{destdir}$Config{installarchlib}";
my $installsitelib = "$opts{destdir}$Config{installsitelib}";
my $installsitearch = "$opts{destdir}$Config{installsitearch}";
my $installman1dir = "$opts{destdir}$Config{installman1dir}";
my $man1ext = $Config{man1ext};
my $libperl = $Config{libperl};
# Shared library and dynamic loading suffixes.
my $so = $Config{so};
my $dlext = $Config{dlext};
my $dlsrc = $Config{dlsrc};
if ($^O eq 'os390') {
my $pwd;
chomp($pwd=`pwd`);
my $archlibexp = $Config{archlibexp};
my $usedl = $Config{usedl};
if ($usedl eq 'define') {
`./$^X -pibak -e 's{$pwd\/libperl.x}{$archlibexp/CORE/libperl.x}' lib/Config.pm`;
}
}
if ($opts{netware}) {
# This is required only if we are installing on a NetWare server
$installscript = $Config{installnwscripts};
$installprivlib = $Config{installnwlib};
$installarchlib = $Config{installnwlib};
$installsitelib = $Config{installnwlib};
}
my $binexp = $Config{binexp};
if ($Is_VMS) { # Hang in there until File::Spec hits the big time
foreach ( \$installbin, \$installscript, \$installprivlib,
\$installarchlib, \$installsitelib, \$installsitearch,
\$installman1dir ) {
$$_ = unixify($$_); $$_ =~ s:/$::;
}
}
# Do some quick sanity checks.
$installbin || die "No installbin directory in config.sh\n";
-d $installbin || mkpath($installbin);
-d $installbin || $opts{notify} || die "$installbin is not a directory\n";
-w $installbin || $opts{notify} || die "$installbin is not writable by you\n"
unless $installbin =~ m#^/afs/# || $opts{notify};
if (!$Is_NetWare) {
if (!$Is_VMS) {
-x 'perl' . $exe_ext || die "perl isn't executable!\n";
}
else {
-x $ndbg . 'perl' . $exe_ext || die "${ndbg}perl$exe_ext isn't executable!\n";
if ($dbg) {
-x $dbg . 'perl' . $exe_ext || die "${dbg}perl$exe_ext isn't executable!\n";
}
}
-f 't/rantests' || $Is_W32
|| warn "WARNING: You've never run 'make test' or",
" some tests failed! (Installing anyway.)\n";
} #if (!$Is_NetWare)
# This will be used to store the packlist
$packlist = ExtUtils::Packlist->new("$installarchlib/.packlist");
if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin) {
my $perldll;
if ($Is_Cygwin) {
$perldll = $libperl;
} else {
$perldll = 'perl5'.$Config{patchlevel}.'.'.$dlext;
}
if ($dlsrc ne "dl_none.xs") {
-f $perldll || die "No perl DLL built\n";
}
# Install the DLL
safe_unlink("$installbin/$perldll");
copy("$perldll", "$installbin/$perldll");
chmod(0755, "$installbin/$perldll");
$packlist->{"$Config{installbin}/$perldll"} = { type => 'file' };
} # if (($Is_W32 and ! $Is_NetWare) or $Is_Cygwin)
# First we install the version-numbered executables.
if ($Is_VMS) {
safe_unlink("$installbin/perl_setup.com");
copy("perl_setup.com", "$installbin/perl_setup.com");
chmod(0755, "$installbin/perl_setup.com");
safe_unlink("$installbin/$dbg$perl$exe_ext");
copy("$dbg$perl$exe_ext", "$installbin/$dbg$perl$exe_ext");
chmod(0755, "$installbin/$dbg$perl$exe_ext");
safe_unlink("$installbin/$dbg${perl}shr$exe_ext");
copy("$dbg${perl}shr$exe_ext", "$installbin/$dbg${perl}shr$exe_ext");
chmod(0755, "$installbin/$dbg${perl}shr$exe_ext");
if ($ndbg) {
safe_unlink("$installbin/$ndbg$perl$exe_ext");
copy("$ndbg$perl$exe_ext", "$installbin/$ndbg$perl$exe_ext");
chmod(0755, "$installbin/$ndbg$perl$exe_ext");
safe_unlink("$installbin/${dbg}a2p$exe_ext");
copy("x2p/${dbg}a2p$exe_ext", "$installbin/${dbg}a2p$exe_ext");
chmod(0755, "$installbin/${dbg}a2p$exe_ext");
}
}
elsif ($^O ne 'dos') {
if (!$Is_NetWare) {
safe_unlink("$installbin/$perl_verbase$ver$exe_ext");
copy("perl$exe_ext", "$installbin/$perl_verbase$ver$exe_ext");
strip("$installbin/$perl_verbase$ver$exe_ext");
chmod(0755, "$installbin/$perl_verbase$ver$exe_ext");
}
else {
# If installing onto a NetWare server
if ($opts{netware}) {
# Copy perl.nlm, echo.nlm, type.nlm, a2p.nlm & cgi2perl.nlm
mkpath($Config{installnwsystem});
copy("netware\\".$ENV{'MAKE_TYPE'}."\\perl.nlm", $Config{installnwsystem});
copy("netware\\testnlm\\echo\\echo.nlm", $Config{installnwsystem});
copy("netware\\testnlm\\type\\type.nlm", $Config{installnwsystem});
copy("x2p\\a2p.nlm", $Config{installnwsystem});
chmod(0755, "$Config{installnwsystem}\\perl.nlm");
mkpath($Config{installnwlcgi});
copy("lib\\auto\\cgi2perl\\cgi2perl.nlm", $Config{installnwlcgi});
}
} #if (!$Is_NetWare)
}
else {
safe_unlink("$installbin/$perl.exe");
copy("perl.exe", "$installbin/$perl.exe");
}
# Install library files.
my $do_installarchlib = !samepath($installarchlib, 'lib');
my $do_installprivlib = !samepath($installprivlib, 'lib');
my $vershort = ($Is_Cygwin and !$Config{usedevel}) ? substr($ver,0,-2) : $ver;
$do_installprivlib = 0 if $versiononly && !($installprivlib =~ m/\Q$vershort/);
mkpath($installprivlib);
mkpath($installarchlib);
mkpath($installsitelib, $opts{verbose}, 0777) if ($installsitelib);
mkpath($installsitearch, $opts{verbose}, 0777) if ($installsitearch);
if (-d 'lib') {
find({no_chdir => 1, wanted => \&installlib}, 'lib')
if $do_installarchlib || $do_installprivlib;
}
else {
warn "Can't install lib files - 'lib/' does not exist";
}
# Install header files and libraries.
mkpath("$installarchlib/CORE");
my @corefiles;
if ($Is_VMS) { # We did core file selection during build
my $coredir = "lib/$Config{archname}/$ver/CORE";
$coredir =~ tr/./_/;
map { s|^$coredir/||i; } @corefiles = <$coredir/*.*>;
}
elsif ($Is_Cygwin) { # On Cygwin symlink it to CORE to make Makefile happy
@corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
my $coredll = "$installarchlib/CORE/$libperl";
my $instcoredll = "$Config{installarchlib}/CORE/$libperl";
safe_unlink($coredll);
( $Config{'d_link'} eq 'define' &&
eval {
CORE::link("$installbin/$libperl", $coredll);
$packlist->{$instcoredll} = { from => "$Config{installbin}/$libperl",
type => 'link' };
}
) ||
eval {
symlink("$installbin/$libperl", $coredll);
$packlist->{$instcoredll} = { from => "$Config{installbin}/$libperl",
type => 'link' };
} ||
( copy("$installbin/$libperl", $coredll) &&
push(@corefiles, $instcoredll)
)
} else {
# [als] hard-coded 'libperl' name... not good!
@corefiles = <*.h libperl*.* perl*$Config{lib_ext}>;
# AIX needs perl.exp installed as well.
push(@corefiles,'perl.exp') if $^O eq 'aix';
}
foreach my $file (@corefiles) {
# HP-UX (at least) needs to maintain execute permissions
# on dynamically-loadable libraries. So we do it for all.
if (copy_if_diff($file,"$installarchlib/CORE/$file")) {
if ($file =~ /\.(\Q$so\E|\Q$dlext\E)$/) {
strip("-S", "$installarchlib/CORE/$file") if $^O eq 'darwin';
chmod(0555, "$installarchlib/CORE/$file");
} else {
chmod(0444, "$installarchlib/CORE/$file");
}
}
}
# Install main perl executables
# Make links to ordinary names if installbin directory isn't current directory.
if (! $versiononly && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS && ! $Is_NetWare) {
safe_unlink("$installbin/$perl$exe_ext", "$installbin/suid$perl$exe_ext");
if ($^O eq 'vos') {
# VOS doesn't support hard links, so use a symlink.
symlink("$installbin/$perl_verbase$ver$exe_ext",
"$installbin/$perl$exe_ext");
} else {
link("$installbin/$perl_verbase$ver$exe_ext",
"$installbin/$perl$exe_ext");
}
}
# For development purposes it can be very useful to have multiple perls
# build for different "architectures" (eg threading or not) simultaneously.
if ($opts{archname} && ! samepath($installbin, '.') && ($^O ne 'dos') && ! $Is_VMS) {
my $archperl = "$perl_verbase$ver-$Config{archname}$exe_ext";
safe_unlink("$installbin/$archperl");
if ($^O eq 'vos') {
# VOS doesn't support hard links, so use a symlink.
symlink("$installbin/$perl_verbase$ver$exe_ext",
"$installbin/$archperl");
} else {
link("$installbin/$perl_verbase$ver$exe_ext", "$installbin/$archperl");
}
}
# Offer to install perl in a "standard" location
my $mainperl_is_instperl = 0;
if ($Config{installusrbinperl} && $Config{installusrbinperl} eq 'define' &&
!$versiononly && !$opts{notify} && !$Is_W32 && !$Is_NetWare && !$Is_VMS && -t STDIN && -t STDERR
&& -w $mainperldir && ! samepath($mainperldir, $installbin)) {
my($usrbinperl) = "$mainperldir/$perl$exe_ext";
my($instperl) = "$installbin/$perl$exe_ext";
my($expinstperl) = "$binexp/$perl$exe_ext";
# First make sure $usrbinperl is not already the same as the perl we
# just installed.
if (-x $usrbinperl) {
# Try to be clever about mainperl being a symbolic link
# to binexp/perl if binexp and installbin are different.
$mainperl_is_instperl =
samepath($usrbinperl, $instperl) ||
samepath($usrbinperl, $expinstperl) ||
(($binexp ne $installbin) &&
(-l $usrbinperl) &&
((readlink $usrbinperl) eq $expinstperl));
}
if (! $mainperl_is_instperl) {
unlink($usrbinperl);
( $Config{'d_link'} eq 'define' &&
eval { CORE::link $instperl, $usrbinperl } ) ||
eval { symlink $expinstperl, $usrbinperl } ||
copy($instperl, $usrbinperl);
$mainperl_is_instperl = 1;
}
}
# Make links to ordinary names if installbin directory isn't current directory.
if (!$Is_NetWare && $dbg eq '') {
if (! samepath($installbin, 'x2p')) {
my $base = 'a2p';
$base .= $ver if $versiononly;
safe_unlink("$installbin/$base$exe_ext");
copy("x2p/a2p$exe_ext", "$installbin/$base$exe_ext");
strip("$installbin/$base$exe_ext");
chmod(0755, "$installbin/$base$exe_ext");
}
}
# cppstdin is just a script, but it is architecture-dependent, so
# it can't safely be shared. Place it in $installbin.
# Note that Configure doesn't build cppstin if it isn't needed, so
# we skip this if cppstdin doesn't exist.
if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
safe_unlink("$installbin/cppstdin");
copy("cppstdin", "$installbin/cppstdin");
chmod(0755, "$installbin/cppstdin");
}
sub script_alias {
my ($installscript, $orig, $alias, $scr_ext) = @_;
safe_unlink("$installscript/$alias$scr_ext");
if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
copy("$installscript/$orig$scr_ext",
"$installscript/$alias$scr_ext");
} elsif ($^O eq 'vos') {
symlink("$installscript/$orig$scr_ext",
"$installscript/$alias$scr_ext");
} else {
link("$installscript/$orig$scr_ext",
"$installscript/$alias$scr_ext");
}
}
# Install scripts.
mkpath($installscript);
if ($versiononly) {
for (@scripts) {
(my $base = $_) =~ s#.*/##;
$base .= $ver;
copy($_, "$installscript/$base");
chmod(0755, "$installscript/$base");
}
for (@tolink) {
my ($from, $to) = map { "$_$ver" } @$_;
(my $frbase = $from) =~ s#.*/##;
(my $tobase = $to) =~ s#.*/##;
script_alias($installscript, $frbase, $tobase, $scr_ext);
}
} else {
for (@scripts) {
(my $base = $_) =~ s#.*/##;
copy($_, "$installscript/$base");
chmod(0755, "$installscript/$base");
}
for (@tolink) {
my ($from, $to) = @$_;
(my $frbase = $from) =~ s#.*/##;
(my $tobase = $to) =~ s#.*/##;
script_alias($installscript, $frbase, $tobase, $scr_ext);
}
}
# Install pod pages. Where? I guess in $installprivlib/pod
# ($installprivlib/pods for cygwin).
if (!$opts{nopods} && (!$versiononly || ($installprivlib =~ m/\Q$vershort/))) {
my $pod = ($Is_Cygwin || $Is_Darwin || $Is_VMS || $Is_W32) ? 'pods' : 'pod';
mkpath("${installprivlib}/$pod");
for (map {$_->[1]} @{get_pod_metadata()->{master}}) {
# $_ is a name like pod/perl.pod
(my $base = $_) =~ s#.*/##;
copy_if_diff($_, "${installprivlib}/$pod/${base}");
chmod(0644, "${installprivlib}/$pod/${base}");
}
}
# Check to make sure there aren't other perls around in installer's
# path. This is probably UNIX-specific. Check all absolute directories
# in the path except for where public executables are supposed to live.
# Also skip $mainperl if the user opted to have it be a link to the
# installed perl.
if (!$versiononly && !$opts{'skip-otherperls'}) {
my ($path, @path);
my $dirsep = ($Is_OS2 || $Is_W32 || $Is_NetWare) ? ';' : ':' ;
($path = $ENV{"PATH"}) =~ s:\\:/:g ;
@path = split(/$dirsep/, $path);
if ($Is_VMS) {
my $i = 0;
while (exists $ENV{'DCL$PATH' . $i}) {
my $dir = unixpath($ENV{'DCL$PATH' . $i}); $dir =~ s-/$--;
push(@path,$dir);
}
}
my @otherperls;
my %otherperls;
for (@path) {
next unless m,^/,;
# Use &samepath here because some systems have other dirs linked
# to $mainperldir (like SunOS)
next unless -d;
next if samepath($_, $binexp);
next if samepath($_, cwd());
next if ($mainperl_is_instperl && samepath($_, $mainperldir));
my $otherperl = "$_/$perl$exe_ext";
next if $otherperls{$otherperl}++;
push(@otherperls, $otherperl)
if (-x $otherperl && ! -d $otherperl);
}
if (@otherperls) {
warn "\nWarning: $perl appears in your path in the following " .
"locations beyond where\nwe just installed it:\n";
for (@otherperls) {
warn " ", $_, "\n";
}
warn "\n";
}
}
$packlist->write() unless $opts{notify};
print " Installation complete\n" if $opts{verbose};
exit 0;
###############################################################################
# If these are needed elsewhere, move them into install_lib.pl rather than
# copying them.
sub yn {
my($prompt) = @_;
my($answer);
my($default) = $prompt =~ m/\[([yn])\]\s*$/i;
print STDERR $prompt;
chop($answer = <STDIN>);
$answer = $default if $answer =~ m/^\s*$/;
($answer =~ m/^[yY]/);
}
sub safe_unlink {
return if $opts{notify} or $Is_VMS;
my @names = @_;
foreach my $name (@names) {
next unless -e $name;
chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_NetWare);
print " unlink $name\n" if $opts{verbose};
next if CORE::unlink($name);
warn "Couldn't unlink $name: $!\n";
if ($! =~ /busy/i) {
print " mv $name $name.old\n" if $opts{verbose};
safe_rename($name, "$name.old")
or warn "Couldn't rename $name: $!\n";
}
}
}
sub copy {
my($from,$to) = @_;
my $xto = $to;
$xto =~ s/^\Q$opts{destdir}\E//;
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)) {
# 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);
}
$packlist->{$xto} = { type => 'file' };
}
sub installlib {
my $dir = $File::Find::dir;
$dir =~ s!\Alib/?!!;
m!([^/]+)\z!;
my $name = $1;
# This remains ugly, and in need of refactoring.
# $name always starts as the leafname
# $dir is the directory *within* lib
# $name later has $dir pre-pended, to give the relative path in lib/
# which is used to create the path in the target directory.
# $_ was always the filename to use on disk. Adding no_chdir doesn't change
# this, as $_ becomes a pathname, and so still works. However, it's not
# obvious that $_ is needed later, and hence $_ must not be modified.
# Also, many of the regex exclusion tests below are now superfluous, as the
# files in question are either no longer in blead, or now in ext/, dist/ or
# cpan/ and not copied into lib/
# Ignore version control directories.
if ($name =~ /^(?:CVS|RCS|SCCS|\.svn)\z/ and -d $name) {
$File::Find::prune = 1;
return;
}
# ignore patch backups, RCS files, emacs backup & temp files and the
# .exists files, .PL files, and test files.
return if $name =~ m{\.orig$|\.rej$|~$|^#.+#$|,v$|^\.exists|\.PL$|\.plc$|\.t$|^test\.pl$|^dbm_filter_util\.pl$|^filter-util\.pl$|^uupacktool\.pl$|^\.gitignore$} ||
$dir =~ m{/t(?:/|$)};
# ignore the cpan script in lib/CPAN/bin, the instmodsh and xsubpp
# scripts in lib/ExtUtils, the prove script in lib/Test/Harness,
# the corelist script from lib/Module/CoreList/bin and ptar* in
# lib/Archive/Tar/bin, the config_data script in lib/Module/Build/scripts
# and zipdetails in cpan/IO-Compress/bin
# (they're installed later with other utils)
return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|ptardiff|ptargrep|config_data|zipdetails)\z/;
# ignore the Makefiles
return if $name =~ /^makefile$/i;
# ignore the test extensions
return if $dir =~ m{\bXS/(?:APItest|Typemap)\b};
return if $name =~ m{\b(?:APItest|Typemap)\.pm$};
# ignore the build support code
return if $name =~ /\bbuildcustomize\.pl$/;
# ignore the demo files
return if $dir =~ /\b(?:demos?|eg)\b/;
# ignore unneeded unicore files
if ( $dir =~ /^unicore/ ) {
if ( $name =~ /\.txt\z/ ) {
# We can ignore most, but not all .txt files
return unless $name =~ /\A(?:Blocks|SpecialCasing|NamedSequences)\.txt\z/;
}
else {
# TestProp only needed during testing
return if $name =~ /\ATestProp.pl\z/;
# we need version and *.pl files and can skip the rest
return unless $name =~ /\A(?:version|\w+\.p[lm])\z/;
}
}
# ignore READMEs, MANIFESTs, INSTALL docs, META.ymls and change logs.
# Changes.e2x and README.e2x are needed by enc2xs.
return if $name =~ m{^(?:README(?:\.\w+)?)$} && $name ne 'README.e2x';
return if $name =~ m{^(?:MANIFEST|META\.yml)$};
return if $name =~ m{^(?:INSTALL|TODO|BUGS|CREDITS)$}i;
return if $name =~ m{^change(?:s|log)(?:\.libnet)?$}i;
return if $name =~ m{^(?:SIGNATURE|PAUSE200\d\.pub)$}; # CPAN files
return if $name =~ m{^(?:NOTES|PATCHING)$}; # ExtUtils files
# if using a shared perl library then ignore:
# - static library files [of statically linked extensions];
# - import library files and export library files (only present on Win32
# anyway?) and empty bootstrap files [of dynamically linked extensions].
return if $Config{useshrplib} eq 'true' and
($name =~ /$Config{_a}$/ or $name =~ /\.exp$/ or ($name =~ /\.bs$/ and -z $name));
$name = "$dir/$name" if $dir ne '';
# ignore pods that are stand alone documentation from dual life modules.
return if /\.pod\z/ && is_duplicate_pod($_);
return if $name eq 'ExtUtils/XSSymSet.pm' and !$Is_VMS;
my $installlib = $installprivlib;
if ($dir =~ /^auto\// ||
($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1}) ||
($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare)) ||
$name=~/^Config_(heavy|git)\.pl\z/
) {
$installlib = $installarchlib;
return unless $do_installarchlib;
} else {
return unless $do_installprivlib;
}
if ($Is_NetWare && !$opts{netware} && /\.(?:nlp|nlm|bs)$/) {
# Don't copy .nlp,.nlm files, doesn't make sense on Windows and also
# if copied will give problems when building new extensions.
# Has to be copied if we are installing on a NetWare server and
# hence the check !$opts{netware}
return;
}
if (-f $_) {
my $xname = "$installlib/$name";
$xname =~ s/^\Q$opts{destdir}\E//;
$packlist->{$xname} = { type => 'file' };
if ($opts{force} || compare($_, "$installlib/$name") || $opts{notify}) {
unlink("$installlib/$name");
mkpath("$installlib/$dir");
# HP-UX (at least) needs to maintain execute permissions
# on dynamically-loaded libraries.
if (copy_if_diff($_, "$installlib/$name")) {
strip("-S", "$installlib/$name")
if $^O eq 'darwin' and /\.(?:so|$dlext|a)$/;
chmod(/\.(so|$dlext)$/ ? 0555 : 0444, "$installlib/$name");
}
}
}
}
# Copy $from to $to, only if $from is different than $to.
# Also preserve modification times for .a libraries.
# On some systems, if you do
# ranlib libperl.a
# cp libperl.a /usr/local/lib/perl5/archlib/CORE/libperl.a
# and then try to link against the installed libperl.a, you might
# get an error message to the effect that the symbol table is older
# than the library.
# Return true if copying occurred.
sub copy_if_diff {
my($from,$to)=@_;
return 1 if (($^O eq 'VMS') && (-d $from));
my $xto = $to;
$xto =~ s/^\Q$opts{destdir}\E//;
my $perlpodbadsymlink;
if ($from =~ m!^pod/perl[\w-]+\.pod$! &&
-l $from &&
! -e $from) {
# Some Linux implementations have problems traversing over
# multiple symlinks (when going over NFS?) and fail to read
# the symlink target. Combine this with the fact that some
# of the pod files (the perl$OS.pod) are symlinks (to ../README.$OS),
# and you end up with those pods not getting installed.
$perlpodbadsymlink = 1;
}
-f $from || $perlpodbadsymlink || warn "$0: $from not found";
$packlist->{$xto} = { type => 'file' };
if ($opts{force} || compare($from, $to) || $opts{notify}) {
safe_unlink($to); # In case we don't have write permissions.
if ($perlpodbadsymlink && $from =~ m!^pod/perl(.+)\.pod$!) {
$from = "README.$1";
}
copy($from, $to);
# Restore timestamps if it's a .a library or for OS/2.
if (!$opts{notify} && ($Is_OS2 || $to =~ /\.a$/)) {
my ($atime, $mtime) = (stat $from)[8,9];
utime $atime, $mtime, $to;
}
1;
}
}
sub strip
{
my(@args) = @_;
return unless $opts{strip};
my @opts;
while (@args && $args[0] =~ /^(-\w+)$/) {
push @opts, shift @args;
}
foreach my $file (@args) {
if (-f $file) {
if ($opts{verbose}) {
print " strip " . join(' ', @opts);
print " " if (@opts);
print "$file\n";
}
system("strip", @opts, $file);
} else {
print "# file '$file' skipped\n" if $opts{verbose};
}
}
}
# Local variables:
# cperl-indent-level: 4
# indent-tabs-mode: nil
# End:
#
# ex: set ts=8 sts=4 sw=4 et:
Jump to Line
Something went wrong with that request. Please try again.