1 package ExtUtils::Install;
5 use vars qw(@ISA @EXPORT $VERSION $MUST_REBOOT %Config);
7 $VERSION = eval $VERSION;
11 use Config qw(%Config);
14 use ExtUtils::Packlist;
15 use File::Basename qw(dirname);
16 use File::Compare qw(compare);
18 use File::Find qw(find);
24 @EXPORT = ('install','uninstall','pm_to_blib', 'install_default');
28 ExtUtils::Install - install files from here to there
32 use ExtUtils::Install;
34 install({ 'blib/lib' => 'some/install/dir' } );
38 pm_to_blib({ 'lib/Foo/Bar.pm' => 'blib/lib/Foo/Bar.pm' });
42 Handles the installing and uninstalling of perl modules, scripts, man
45 Both install() and uninstall() are specific to the way
46 ExtUtils::MakeMaker handles the installation and deinstallation of
47 perl modules. They are not designed as general purpose tools.
49 On some operating systems such as Win32 installation may not be possible
50 until after a reboot has occured. This can have varying consequences:
51 removing an old DLL does not impact programs using the new one, but if
52 a new DLL cannot be installed properly until reboot then anything
53 depending on it must wait. The package variable
55 $ExtUtils::Install::MUST_REBOOT
57 is used to store this status.
59 If this variable is true then such an operation has occured and
60 anything depending on this module cannot proceed until a reboot
63 If this value is defined but false then such an operation has
64 ocurred, but should not impact later operations.
70 Wrapper to chmod() for debugging and error trapping.
74 Warns about something only once.
78 Dies with a special message.
84 my $Is_VMS = $^O eq 'VMS';
85 my $Is_MacPerl = $^O eq 'MacOS';
86 my $Is_Win32 = $^O eq 'MSWin32';
87 my $Is_cygwin = $^O eq 'cygwin';
88 my $CanMoveAtBoot = ($Is_Win32 || $Is_cygwin);
90 # *note* CanMoveAtBoot is only incidentally the same condition as below
91 # this needs not hold true in the future.
92 my $Has_Win32API_File = ($Is_Win32 || $Is_cygwin)
93 ? (eval {require Win32API::File; 1} || 0)
97 my $Inc_uninstall_warn_handler;
99 # install relative to here
101 my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT};
103 my $Curdir = File::Spec->curdir;
104 my $Updir = File::Spec->updir;
107 return join "\n",'!' x 72,@_,'!' x 72,'';
113 my $msg=_estr "WARNING: $first",@_;
114 warn $msg unless $warned{$msg}++;
119 my $msg=_estr "ERROR: $first",@_;
125 my ( $mode, $item, $verbose )=@_;
127 if (chmod $mode, $item) {
128 print "chmod($mode, $item)\n" if $verbose > 1;
131 _warnonce "WARNING: Failed chmod($mode, $item): $err\n"
138 =item _move_file_at_boot( $file, $target, $moan )
140 OS-Specific, Win32/Cygwin
142 Schedules a file to be moved/renamed/deleted at next boot.
143 $file should be a filespec of an existing file
144 $target should be a ref to an array if the file is to be deleted
145 otherwise it should be a filespec for a rename. If the file is existing
148 Sets $MUST_REBOOT to 0 to indicate a deletion operation has occured
149 and sets it to 1 to indicate that a move operation has been requested.
151 returns 1 on success, on failure if $moan is false errors are fatal.
152 If $moan is true then returns 0 on error and warns instead of dies.
160 sub _move_file_at_boot { #XXX OS-SPECIFIC
161 my ( $file, $target, $moan )= @_;
162 Carp::confess("Panic: Can't _move_file_at_boot on this platform!")
163 unless $CanMoveAtBoot;
165 my $descr= ref $target
166 ? "'$file' for deletion"
167 : "'$file' for installation as '$target'";
169 if ( ! $Has_Win32API_File ) {
172 "Cannot schedule $descr at reboot.",
173 "Try installing Win32API::File to allow operations on locked files",
174 "to be scheduled during reboot. Or try to perform the operation by",
175 "hand yourself. (You may need to close other perl processes first)"
177 if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) }
180 my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT();
181 $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING()
184 _chmod( 0666, $file );
185 _chmod( 0666, $target ) unless ref $target;
187 if (Win32API::File::MoveFileEx( $file, $target, $opts )) {
188 $MUST_REBOOT ||= ref $target ? 0 : 1;
192 "MoveFileEx $descr at reboot failed: $^E",
193 "You may try to perform the operation by hand yourself. ",
194 "(You may need to close other perl processes first).",
196 if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) }
204 =item _unlink_or_rename( $file, $tryhard, $installing )
206 OS-Specific, Win32/Cygwin
208 Tries to get a file out of the way by unlinking it or renaming it. On
209 some OS'es (Win32 based) DLL files can end up locked such that they can
210 be renamed but not deleted. Likewise sometimes a file can be locked such
211 that it cant even be renamed or changed except at reboot. To handle
212 these cases this routine finds a tempfile name that it can either rename
213 the file out of the way or use as a proxy for the install so that the
214 rename can happen later (at reboot).
216 $file : the file to remove.
217 $tryhard : should advanced tricks be used for deletion
218 $installing : we are not merely deleting but we want to overwrite
220 When $tryhard is not true if the unlink fails its fatal. When $tryhard
221 is true then the file is attempted to be renamed. The renamed file is
222 then scheduled for deletion. If the rename fails then $installing
223 governs what happens. If it is false the failure is fatal. If it is true
224 then an attempt is made to schedule installation at boot using a
225 temporary file to hold the new file. If this fails then a fatal error is
226 thrown, if it succeeds it returns the temporary file name (which will be
227 a derivative of the original in the same directory) so that the caller can
228 use it to install under. In all other cases of success returns $file.
229 On failure throws a fatal error.
237 sub _unlink_or_rename { #XXX OS-SPECIFIC
238 my ( $file, $tryhard, $installing )= @_;
240 _chmod( 0666, $file );
245 _choke("Cannot unlink '$file': $!")
246 unless $CanMoveAtBoot && $tryhard;
249 ++$tmp while -e "$file.$tmp";
252 warn "WARNING: Unable to unlink '$file': $error\n",
253 "Going to try to rename it to '$tmp'.\n";
255 if ( rename $file, $tmp ) {
256 warn "Rename succesful. Scheduling '$tmp'\nfor deletion at reboot.\n";
257 # when $installing we can set $moan to true.
258 # IOW, if we cant delete the renamed file at reboot its
259 # not the end of the world. The other cases are more serious
260 # and need to be fatal.
261 _move_file_at_boot( $tmp, [], $installing );
263 } elsif ( $installing ) {
264 _warnonce("Rename failed: $!. Scheduling '$tmp'\nfor".
265 " installation as '$file' at reboot.\n");
266 _move_file_at_boot( $tmp, $file );
269 _choke("Rename failed:$!", "Cannot procede.");
283 install(\%from_to, $verbose, $dont_execute, $uninstall_shadows, $skip);
285 Copies each directory tree of %from_to to its corresponding value
286 preserving timestamps and permissions.
288 There are two keys with a special meaning in the hash: "read" and
289 "write". These contain packlist files. After the copying is done,
290 install() will write the list of target files to $from_to{write}. If
291 $from_to{read} is given the contents of this file will be merged into
292 the written file. The read and the written file may be identical, but
293 on AFS it is quite likely that people are installing to a different
294 directory than the one where the files later appear.
296 If $verbose is true, will print out each file removed. Default is
297 false. This is "make install VERBINST=1". $verbose values going
298 up to 5 show increasingly more diagnostics output.
300 If $dont_execute is true it will only print what it was going to do
301 without actually doing it. Default is false.
303 If $uninstall_shadows is true any differing versions throughout @INC
304 will be uninstalled. This is "make install UNINST=1"
306 As of 1.37_02 install() supports the use of a list of patterns to filter
307 out files that shouldn't be installed. If $skip is omitted or undefined
308 then install will try to read the list from INSTALL.SKIP in the CWD.
309 This file is a list of regular expressions and is just like the
310 MANIFEST.SKIP file used by L<ExtUtils::Manifest>.
312 A default site INSTALL.SKIP may be provided by setting then environment
313 variable EU_INSTALL_SITE_SKIPFILE, this will only be used when there
314 isn't a distribution specific INSTALL.SKIP. If the environment variable
315 EU_INSTALL_IGNORE_SKIP is true then no install file filtering will be
318 If $skip is undefined then the skip file will be autodetected and used if it
319 is found. If $skip is a reference to an array then it is assumed
320 the array contains the list of patterns, if $skip is a true non reference it is
321 assumed to be the filename holding the list of patterns, any other value of
322 $skip is taken to mean that no install filtering should occur.
329 =item _get_install_skip
331 Handles loading the INSTALL.SKIP file. Returns an array of patterns to use.
337 sub _get_install_skip {
338 my ( $skip, $verbose )= @_;
339 if ($ENV{EU_INSTALL_IGNORE_SKIP}) {
340 print "EU_INSTALL_IGNORE_SKIP is set, ignore skipfile settings\n"
344 if ( ! defined $skip ) {
345 print "Looking for install skip list\n"
347 for my $file ( 'INSTALL.SKIP', $ENV{EU_INSTALL_SITE_SKIPFILE} ) {
349 print "\tChecking for $file\n"
357 if ($skip && !ref $skip) {
358 print "Reading skip patterns from '$skip'.\n"
360 if (open my $fh,$skip ) {
364 next if /^\s*(?:#|$)/;
365 print "\tSkip pattern: $_\n" if $verbose>3;
370 warn "Can't read skip file:'$skip':$!\n";
373 } elsif ( UNIVERSAL::isa($skip,'ARRAY') ) {
374 print "Using array for skip list\n"
377 print "No skip list found.\n"
381 warn "Got @{[0+@$skip]} skip patterns.\n"
386 =item _have_write_access
388 Abstract a -w check that tries to use POSIX::access() if possible.
395 sub _have_write_access {
397 if (!defined $has_posix) {
398 $has_posix=eval "local $^W; require POSIX; 1" || 0;
401 return POSIX::access($dir, POSIX::W_OK());
409 =item _can_write_dir(C<$dir>)
411 Checks whether a given directory is writable, taking account
412 the possibility that the directory might not exist and would have to
415 Returns a list, containing: C<($writable, $determined_by, @create)>
417 C<$writable> says whether whether the directory is (hypothetically) writable
419 C<$determined_by> is the directory the status was determined from. It will be
420 either the C<$dir>, or one of its parents.
422 C<@create> is a list of directories that would probably have to be created
423 to make the requested directory. It may not actually be correct on
424 relative paths with C<..> in them. But for our purposes it should work ok
432 unless defined $dir and length $dir;
434 my ($vol, $dirs, $file) = File::Spec->splitpath(File::Spec->rel2abs($dir),1);
435 my @dirs = File::Spec->splitdir($dirs);
439 $dir = File::Spec->catdir($vol,@dirs);
440 next if ( $dir eq $path );
445 if ( _have_write_access($dir) ) {
456 =item _mkpath($dir,$show,$mode,$verbose,$fake)
458 Wrapper around File::Path::mkpath() to handle errors.
460 If $verbose is true and >1 then additional diagnostics will be produced, also
461 this will force $show to true.
463 If $fake is true then the directory will not be created but a check will be
464 made to see whether it would be possible to write to the directory, or that
465 it would be possible to create the directory.
467 If $fake is not true dies if the directory can not be created or is not
473 my ($dir,$show,$mode,$verbose,$fake)=@_;
474 if ( $verbose && $verbose > 1 && ! -d $dir) {
476 printf "mkpath(%s,%d,%#o)\n", $dir, $show, $mode;
479 if ( ! eval { File::Path::mkpath($dir,$show,$mode); 1 } ) {
480 _choke("Can't create '$dir'","$@");
484 my ($can,$root,@make)=_can_write_dir($dir);
487 "Can't create '$dir'",
488 $root ? "Do not have write permissions on '$root'"
496 } elsif ($show and $fake) {
497 print "$_\n" for @make;
501 =item _copy($from,$to,$verbose,$fake)
503 Wrapper around File::Copy::copy to handle errors.
505 If $verbose is true and >1 then additional dignostics will be emitted.
507 If $fake is true then the copy will not actually occur.
509 Dies if the copy fails.
515 my ( $from, $to, $verbose, $nonono)=@_;
516 if ($verbose && $verbose>1) {
517 printf "copy(%s,%s)\n", $from, $to;
520 File::Copy::copy($from,$to)
521 or Carp::croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" );
527 Wrapper around chdir to catch errors.
529 If not called in void context returns the cwd from before the chdir.
538 if (defined wantarray) {
542 or _choke("Couldn't chdir to '$dir': $!");
550 sub install { #XXX OS-SPECIFIC
551 my($from_to,$verbose,$nonono,$inc_uninstall,$skip) = @_;
555 $skip= _get_install_skip($skip,$verbose);
557 my(%from_to) = %$from_to;
558 my(%pack, $dir, %warned);
559 my($packlist) = ExtUtils::Packlist->new();
562 for (qw/read write/) {
563 $pack{$_}=$from_to{$_};
566 my $tmpfile = install_rooted_file($pack{"read"});
567 $packlist->read($tmpfile) if (-f $tmpfile);
572 MOD_INSTALL: foreach my $source (sort keys %from_to) {
573 #copy the tree to the target directory without altering
574 #timestamp and permission and remember for the .packlist
575 #file. The packlist file contains the absolute paths of the
576 #install locations. AFS users may call this a bug. We'll have
577 #to reconsider how to add the means to satisfy AFS users also.
579 #October 1997: we want to install .pm files into archlib if
580 #there are any files in arch. So we depend on having ./blib/arch
583 my $targetroot = install_rooted_dir($from_to{$source});
585 my $blib_lib = File::Spec->catdir('blib', 'lib');
586 my $blib_arch = File::Spec->catdir('blib', 'arch');
587 if ($source eq $blib_lib and
588 exists $from_to{$blib_arch} and
589 directory_not_empty($blib_arch)
591 $targetroot = install_rooted_dir($from_to{$blib_arch});
592 print "Files found in $blib_arch: installing files in $blib_lib into architecture dependent library tree\n";
595 next unless -d $source;
597 # 5.5.3's File::Find missing no_chdir option
599 # File::Find seems to always be Unixy except on MacPerl :(
600 my $current_directory= $Is_MacPerl ? $Curdir : '.';
602 my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9];
607 return if $origfile eq ".exists";
608 my $targetdir = File::Spec->catdir($targetroot, $File::Find::dir);
609 my $targetfile = File::Spec->catfile($targetdir, $origfile);
610 my $sourcedir = File::Spec->catdir($source, $File::Find::dir);
611 my $sourcefile = File::Spec->catfile($sourcedir, $origfile);
613 for my $pat (@$skip) {
614 if ( $sourcefile=~/$pat/ ) {
615 print "Skipping $targetfile (filtered)\n"
620 # we have to do this for back compat with old File::Finds
621 # and because the target is relative
622 my $save_cwd = _chdir($cwd);
624 if ( -f $targetfile && -s _ == $size) {
625 # We have a good chance, we can skip this one
626 $diff = compare($sourcefile, $targetfile);
630 $check_dirs{$targetdir}++
631 unless -w $targetfile;
634 [ $diff, $File::Find::dir, $origfile,
635 $mode, $size, $atime, $mtime,
636 $targetdir, $targetfile, $sourcedir, $sourcefile,
639 #restore the original directory we were in when File::Find
640 #called us so that it doesnt get horribly confused.
642 }, $current_directory );
646 foreach my $targetdir (sort keys %check_dirs) {
647 _mkpath( $targetdir, 0, 0755, $verbose, $nonono );
649 foreach my $found (@found_files) {
650 my ($diff, $ffd, $origfile, $mode, $size, $atime, $mtime,
651 $targetdir, $targetfile, $sourcedir, $sourcefile)= @$found;
653 my $realtarget= $targetfile;
655 if (-f $targetfile) {
656 print "_unlink_or_rename($targetfile)\n" if $verbose>1;
657 $targetfile= _unlink_or_rename( $targetfile, 'tryhard', 'install' )
659 } elsif ( ! -d $targetdir ) {
660 _mkpath( $targetdir, 0, 0755, $verbose, $nonono );
662 print "Installing $targetfile\n";
663 _copy( $sourcefile, $targetfile, $verbose, $nonono, );
665 print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
666 utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
669 $mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
671 if $realtarget ne $targetfile;
672 _chmod( $mode, $targetfile, $verbose );
674 print "Skipping $targetfile (unchanged)\n" if $verbose;
677 if ( $inc_uninstall ) {
678 inc_uninstall($sourcefile,$ffd, $verbose,
680 $realtarget ne $targetfile ? $realtarget : "");
683 # Record the full pathname.
684 $packlist->{$targetfile}++;
687 if ($pack{'write'}) {
688 $dir = install_rooted_dir(dirname($pack{'write'}));
689 _mkpath( $dir, 0, 0755, $verbose, $nonono );
690 print "Writing $pack{'write'}\n";
691 $packlist->write(install_rooted_file($pack{'write'})) unless $nonono;
694 _do_cleanup($verbose);
701 Standardize finish event for after another instruction has occured.
702 Handles converting $MUST_REBOOT to a die for instance.
711 die _estr "Operation not completed! ",
712 "You must reboot to complete the installation.",
714 } elsif (defined $MUST_REBOOT & $verbose) {
715 warn _estr "Installation will be completed at the next reboot.\n",
716 "However it is not necessary to reboot immediately.\n";
722 =item install_rooted_file( $file )
724 Returns $file, or catfile($INSTALL_ROOT,$file) if $INSTALL_ROOT
727 =item install_rooted_dir( $dir )
729 Returns $dir, or catdir($INSTALL_ROOT,$dir) if $INSTALL_ROOT
737 sub install_rooted_file {
738 if (defined $INSTALL_ROOT) {
739 File::Spec->catfile($INSTALL_ROOT, $_[0]);
746 sub install_rooted_dir {
747 if (defined $INSTALL_ROOT) {
748 File::Spec->catdir($INSTALL_ROOT, $_[0]);
756 =item forceunlink( $file, $tryhard )
758 Tries to delete a file. If $tryhard is true then we will use whatever
759 devious tricks we can to delete the file. Currently this only applies to
760 Win32 in that it will try to use Win32API::File to schedule a delete at
761 reboot. A wrapper for _unlink_or_rename().
769 my ( $file, $tryhard )= @_; #XXX OS-SPECIFIC
770 _unlink_or_rename( $file, $tryhard );
775 =item directory_not_empty( $dir )
777 Returns 1 if there is an .exists file somewhere in a directory tree.
778 Returns 0 if there is not.
784 sub directory_not_empty ($) {
788 return if $_ eq ".exists";
790 $File::Find::prune++;
798 =item B<install_default> I<DISCOURAGED>
801 install_default($fullext);
803 Calls install() with arguments to copy a module from blib/ to the
804 default site installation location.
806 $fullext is the name of the module converted to a directory
807 (ie. Foo::Bar would be Foo/Bar). If $fullext is not specified, it
808 will attempt to read it from @ARGV.
810 This is primarily useful for install scripts.
812 B<NOTE> This function is not really useful because of the hard-coded
813 install location with no way to control site vs core vs vendor
814 directories and the strange way in which the module name is given.
815 Consider its use discouraged.
819 sub install_default {
820 @_ < 2 or Carp::croak("install_default should be called with 0 or 1 argument");
821 my $FULLEXT = @_ ? shift : $ARGV[0];
822 defined $FULLEXT or die "Do not know to where to write install log";
823 my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib");
824 my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch");
825 my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin');
826 my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script');
827 my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1');
828 my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3');
830 read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
831 write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
832 $INST_LIB => (directory_not_empty($INST_ARCHLIB)) ?
833 $Config{installsitearch} :
834 $Config{installsitelib},
835 $INST_ARCHLIB => $Config{installsitearch},
836 $INST_BIN => $Config{installbin} ,
837 $INST_SCRIPT => $Config{installscript},
838 $INST_MAN1DIR => $Config{installman1dir},
839 $INST_MAN3DIR => $Config{installman3dir},
846 uninstall($packlist_file);
847 uninstall($packlist_file, $verbose, $dont_execute);
849 Removes the files listed in a $packlist_file.
851 If $verbose is true, will print out each file removed. Default is
854 If $dont_execute is true it will only print what it was going to do
855 without actually doing it. Default is false.
860 my($fil,$verbose,$nonono) = @_;
864 die _estr "ERROR: no packlist file found: '$fil'"
866 # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
867 # require $my_req; # Hairy, but for the first
868 my ($packlist) = ExtUtils::Packlist->new($fil);
869 foreach (sort(keys(%$packlist))) {
871 print "unlink $_\n" if $verbose;
872 forceunlink($_,'tryhard') unless $nonono;
874 print "unlink $fil\n" if $verbose;
875 forceunlink($fil, 'tryhard') unless $nonono;
876 _do_cleanup($verbose);
881 =item inc_uninstall($filepath,$libdir,$verbose,$nonono,$ignore)
883 Remove shadowed files. If $ignore is true then it is assumed to hold
884 a filename to ignore. This is used to prevent spurious warnings from
885 occuring when doing an install at reboot.
892 my($filepath,$libdir,$verbose,$nonono,$ignore) = @_;
895 my $file = (File::Spec->splitpath($filepath))[2];
898 my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'}
899 ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
901 foreach $dir (@INC, @PERL_ENV_LIB, @Config{qw(archlibexp
905 my $canonpath = File::Spec->canonpath($dir);
906 next if $canonpath eq $Curdir;
907 next if $seen_dir{$canonpath}++;
908 my $targetfile = File::Spec->catfile($canonpath,$libdir,$file);
909 next unless -f $targetfile;
911 # The reason why we compare file's contents is, that we cannot
912 # know, which is the file we just installed (AFS). So we leave
913 # an identical file in place
915 if ( -f $targetfile && -s _ == -s $filepath) {
916 # We have a good chance, we can skip this one
917 $diff = compare($filepath,$targetfile);
921 print "#$file and $targetfile differ\n" if $diff && $verbose > 1;
923 next if !$diff or $targetfile eq $ignore;
926 $Inc_uninstall_warn_handler ||= ExtUtils::Install::Warn->new();
927 $libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier.
928 $Inc_uninstall_warn_handler->add(
929 File::Spec->catfile($libdir, $file),
933 # if not verbose, we just say nothing
935 print "Unlinking $targetfile (shadowing?)\n" if $verbose;
936 forceunlink($targetfile,'tryhard');
943 =item run_filter($cmd,$src,$dest)
945 Filter $src using $cmd into $dest.
952 my ($cmd, $src, $dest) = @_;
954 open(CMD, "|$cmd >$dest") || die "Cannot fork: $!";
955 open(SRC, $src) || die "Cannot open $src: $!";
958 while (my $len = sysread(SRC, $buf, $sz)) {
959 syswrite(CMD, $buf, $len);
962 close CMD or die "Filter command '$cmd' failed for $src";
968 pm_to_blib(\%from_to, $autosplit_dir);
969 pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd);
971 Copies each key of %from_to to its corresponding value efficiently.
972 Filenames with the extension .pm are autosplit into the $autosplit_dir.
973 Any destination directories are created.
975 $filter_cmd is an optional shell command to run each .pm file through
976 prior to splitting and copying. Input is the contents of the module,
977 output the new module contents.
979 You can have an environment variable PERL_INSTALL_ROOT set which will
980 be prepended as a directory to each installed file (and directory).
985 my($fromto,$autodir,$pm_filter) = @_;
987 _mkpath($autodir,0,0755);
988 while(my($from, $to) = each %$fromto) {
989 if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
990 print "Skip $to (unchanged)\n";
994 # When a pm_filter is defined, we need to pre-process the source first
995 # to determine whether it has changed or not. Therefore, only perform
996 # the comparison check when there's no filter to be ran.
999 my $need_filtering = defined $pm_filter && length $pm_filter &&
1002 if (!$need_filtering && 0 == compare($from,$to)) {
1003 print "Skip $to (unchanged)\n";
1007 # we wont try hard here. its too likely to mess things up.
1010 _mkpath(dirname($to),0,0755);
1012 if ($need_filtering) {
1013 run_filter($pm_filter, $from, $to);
1014 print "$pm_filter <$from >$to\n";
1016 _copy( $from, $to );
1017 print "cp $from $to\n";
1019 my($mode,$atime,$mtime) = (stat $from)[2,8,9];
1020 utime($atime,$mtime+$Is_VMS,$to);
1021 _chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to);
1022 next unless $from =~ /\.pm$/;
1023 _autosplit($to,$autodir);
1032 From 1.0307 back, AutoSplit will sometimes leave an open filehandle to
1033 the file being split. This causes problems on systems with mandatory
1034 locking (ie. Windows). So we wrap it and close the filehandle.
1040 sub _autosplit { #XXX OS-SPECIFIC
1041 my $retval = autosplit(@_);
1042 close *AutoSplit::IN if defined *AutoSplit::IN{IO};
1048 package ExtUtils::Install::Warn;
1050 sub new { bless {}, shift }
1053 my($self,$file,$targetfile) = @_;
1054 push @{$self->{$file}}, $targetfile;
1058 unless(defined $INSTALL_ROOT) {
1060 my($file,$i,$plural);
1061 foreach $file (sort keys %$self) {
1062 $plural = @{$self->{$file}} > 1 ? "s" : "";
1063 print "## Differing version$plural of $file found. You might like to\n";
1064 for (0..$#{$self->{$file}}) {
1065 print "rm ", $self->{$file}[$_], "\n";
1069 $plural = $i>1 ? "all those files" : "this file";
1070 my $inst = (_invokant() eq 'ExtUtils::MakeMaker')
1071 ? ( $Config::Config{make} || 'make' ).' install UNINST=1'
1072 : './Build install uninst=1';
1073 print "## Running '$inst' will unlink $plural for you.\n";
1081 Does a heuristic on the stack to see who called us for more intelligent
1082 error messages. Currently assumes we will be called only by Module::Build
1083 or by ExtUtils::MakeMaker.
1092 while (my $file = (caller($frame++))[1]) {
1093 push @stack, (File::Spec->splitpath($file))[2];
1097 my $top = pop @stack;
1098 if ($top =~ /^Build/i || exists($INC{'Module/Build.pm'})) {
1099 $builder = 'Module::Build';
1101 $builder = 'ExtUtils::MakeMaker';
1113 =item B<PERL_INSTALL_ROOT>
1115 Will be prepended to each install path.
1117 =item B<EU_INSTALL_IGNORE_SKIP>
1119 Will prevent the automatic use of INSTALL.SKIP as the install skip file.
1121 =item B<EU_INSTALL_SITE_SKIPFILE>
1123 If there is no INSTALL.SKIP file in the make directory then this value
1124 can be used to provide a default.
1130 Original author lost in the mists of time. Probably the same as Makemaker.
1132 Production release currently maintained by demerphq C<yves at cpan.org>
1134 Send bug reports via http://rt.cpan.org/. Please send your
1135 generated Makefile along with your report.
1139 This program is free software; you can redistribute it and/or
1140 modify it under the same terms as Perl itself.
1142 See L<http://www.perl.com/perl/misc/Artistic.html>