package ExtUtils::Install;
-use 5.005_64;
+use 5.006_001;
our(@ISA, @EXPORT, $VERSION);
-$VERSION = substr q$Revision: 1.28 $, 10;
-# $Date: 1998/01/25 07:08:24 $
+$VERSION = 1.29;
use Exporter;
use Carp ();
sub install_rooted_file {
if (defined $INSTALL_ROOT) {
- MY->catfile($INSTALL_ROOT, $_[0]);
+ File::Spec->catfile($INSTALL_ROOT, $_[0]);
} else {
$_[0];
}
sub install_rooted_dir {
if (defined $INSTALL_ROOT) {
- MY->catdir($INSTALL_ROOT, $_[0]);
+ File::Spec->catdir($INSTALL_ROOT, $_[0]);
} else {
$_[0];
}
$nonono ||= 0;
use Cwd qw(cwd);
- use ExtUtils::MakeMaker; # to implement a MY class
use ExtUtils::Packlist;
use File::Basename qw(dirname);
use File::Copy qw(copy);
use File::Find qw(find);
use File::Path qw(mkpath);
use File::Compare qw(compare);
+ use File::Spec;
my(%hash) = %$hash;
my(%pack, $dir, $warn_permissions);
$atime,$mtime,$ctime,$blksize,$blocks) = stat;
return unless -f _;
return if $_ eq ".exists";
- my $targetdir = MY->catdir($targetroot, $File::Find::dir);
- my $origfile = $_;
- my $targetfile = MY->catfile($targetdir, $_);
+ my $targetdir = File::Spec->catdir($targetroot, $File::Find::dir);
+ my $targetfile = File::Spec->catfile($targetdir, $_);
my $diff = 0;
if ( -f $targetfile && -s _ == $size) {
} else {
inc_uninstall($_,$File::Find::dir,$verbose,0); # nonono set to 0
}
- $packlist->{$origfile}++;
+ # Record the full pathname.
+ $packlist->{$targetfile}++;
}, ".");
chdir($cwd) or Carp::croak("Couldn't chdir to $cwd: $!");
@_ < 2 or die "install_default should be called with 0 or 1 argument";
my $FULLEXT = @_ ? shift : $ARGV[0];
defined $FULLEXT or die "Do not know to where to write install log";
- my $INST_LIB = MM->catdir(MM->curdir,"blib","lib");
- my $INST_ARCHLIB = MM->catdir(MM->curdir,"blib","arch");
- my $INST_BIN = MM->catdir(MM->curdir,'blib','bin');
- my $INST_SCRIPT = MM->catdir(MM->curdir,'blib','script');
- my $INST_MAN1DIR = MM->catdir(MM->curdir,'blib','man1');
- my $INST_MAN3DIR = MM->catdir(MM->curdir,'blib','man3');
+ my $INST_LIB = File::Spec->catdir(File::Spec->curdir,"blib","lib");
+ my $INST_ARCHLIB = File::Spec->catdir(File::Spec->curdir,"blib","arch");
+ my $INST_BIN = File::Spec->catdir(File::Spec->curdir,'blib','bin');
+ my $INST_SCRIPT = File::Spec->catdir(File::Spec->curdir,'blib','script');
+ my $INST_MAN1DIR = File::Spec->catdir(File::Spec->curdir,'blib','man1');
+ my $INST_MAN3DIR = File::Spec->catdir(File::Spec->curdir,'blib','man3');
install({
read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
sitelibexp)}) {
next if $dir eq ".";
next if $seen_dir{$dir}++;
- my($targetfile) = MY->catfile($dir,$libdir,$file);
+ my($targetfile) = File::Spec->catfile($dir,$libdir,$file);
next unless -f $targetfile;
# The reason why we compare file's contents is, that we cannot
}
}
+sub run_filter {
+ my ($cmd, $src, $dest) = @_;
+ open(my $CMD, "|$cmd >$dest") || die "Cannot fork: $!";
+ open(my $SRC, $src) || die "Cannot open $src: $!";
+ my $buf;
+ my $sz = 1024;
+ while (my $len = sysread($SRC, $buf, $sz)) {
+ syswrite($CMD, $buf, $len);
+ }
+ close $SRC;
+ close $CMD or die "Filter command '$cmd' failed for $src";
+}
+
sub pm_to_blib {
- my($fromto,$autodir) = @_;
+ my($fromto,$autodir,$pm_filter) = @_;
use File::Basename qw(dirname);
use File::Copy qw(copy);
mkpath($autodir,0,0755);
foreach (keys %$fromto) {
- next if -f $fromto->{$_} && -M $fromto->{$_} < -M $_;
- unless (compare($_,$fromto->{$_})){
- print "Skip $fromto->{$_} (unchanged)\n";
+ my $dest = $fromto->{$_};
+ next if -f $dest && -M $dest < -M $_;
+
+ # When a pm_filter is defined, we need to pre-process the source first
+ # to determine whether it has changed or not. Therefore, only perform
+ # the comparison check when there's no filter to be ran.
+ # -- RAM, 03/01/2001
+
+ my $need_filtering = defined $pm_filter && length $pm_filter && /\.pm$/;
+
+ if (!$need_filtering && 0 == compare($_,$dest)) {
+ print "Skip $dest (unchanged)\n";
next;
}
- if (-f $fromto->{$_}){
- forceunlink($fromto->{$_});
+ if (-f $dest){
+ forceunlink($dest);
+ } else {
+ mkpath(dirname($dest),0,0755);
+ }
+ if ($need_filtering) {
+ run_filter($pm_filter, $_, $dest);
+ print "$pm_filter <$_ >$dest\n";
} else {
- mkpath(dirname($fromto->{$_}),0,0755);
+ copy($_,$dest);
+ print "cp $_ $dest\n";
}
- copy($_,$fromto->{$_});
my($mode,$atime,$mtime) = (stat)[2,8,9];
- utime($atime,$mtime+$Is_VMS,$fromto->{$_});
- chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$fromto->{$_});
- print "cp $_ $fromto->{$_}\n";
- next unless /\.pm\z/;
- autosplit($fromto->{$_},$autodir);
+ utime($atime,$mtime+$Is_VMS,$dest);
+ chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$dest);
+ next unless /\.pm$/;
+ autosplit($dest,$autodir);
}
}
pm_to_blib() takes a hashref as the first argument and copies all keys
of the hash to the corresponding values efficiently. Filenames with
the extension pm are autosplit. Second argument is the autosplit
-directory.
+directory. If third argument is not empty, it is taken as a filter command
+to be ran on each .pm file, the output of the command being what is finally
+copied, and the source for auto-splitting.
You can have an environment variable PERL_INSTALL_ROOT set which will
be prepended as a directory to each installed file (and directory).