[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 package ExtUtils::Install; 2 use 5.00503; 3 use strict; 4 5 use vars qw(@ISA @EXPORT $VERSION $MUST_REBOOT %Config); 6 $VERSION = '1.44'; 7 $VERSION = eval $VERSION; 8 9 use AutoSplit; 10 use Carp (); 11 use Config qw(%Config); 12 use Cwd qw(cwd); 13 use Exporter; 14 use ExtUtils::Packlist; 15 use File::Basename qw(dirname); 16 use File::Compare qw(compare); 17 use File::Copy; 18 use File::Find qw(find); 19 use File::Path; 20 use File::Spec; 21 22 23 @ISA = ('Exporter'); 24 @EXPORT = ('install','uninstall','pm_to_blib', 'install_default'); 25 26 =head1 NAME 27 28 ExtUtils::Install - install files from here to there 29 30 =head1 SYNOPSIS 31 32 use ExtUtils::Install; 33 34 install({ 'blib/lib' => 'some/install/dir' } ); 35 36 uninstall($packlist); 37 38 pm_to_blib({ 'lib/Foo/Bar.pm' => 'blib/lib/Foo/Bar.pm' }); 39 40 =head1 DESCRIPTION 41 42 Handles the installing and uninstalling of perl modules, scripts, man 43 pages, etc... 44 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. 48 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 54 55 $ExtUtils::Install::MUST_REBOOT 56 57 is used to store this status. 58 59 If this variable is true then such an operation has occured and 60 anything depending on this module cannot proceed until a reboot 61 has occured. 62 63 If this value is defined but false then such an operation has 64 ocurred, but should not impact later operations. 65 66 =begin _private 67 68 =item _chmod($$;$) 69 70 Wrapper to chmod() for debugging and error trapping. 71 72 =item _warnonce(@) 73 74 Warns about something only once. 75 76 =item _choke(@) 77 78 Dies with a special message. 79 80 =end _private 81 82 =cut 83 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); 89 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) 94 : 0; 95 96 97 my $Inc_uninstall_warn_handler; 98 99 # install relative to here 100 101 my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT}; 102 103 my $Curdir = File::Spec->curdir; 104 my $Updir = File::Spec->updir; 105 106 sub _estr(@) { 107 return join "\n",'!' x 72,@_,'!' x 72,''; 108 } 109 110 {my %warned; 111 sub _warnonce(@) { 112 my $first=shift; 113 my $msg=_estr "WARNING: $first",@_; 114 warn $msg unless $warned{$msg}++; 115 }} 116 117 sub _choke(@) { 118 my $first=shift; 119 my $msg=_estr "ERROR: $first",@_; 120 Carp::croak($msg); 121 } 122 123 124 sub _chmod($$;$) { 125 my ( $mode, $item, $verbose )=@_; 126 $verbose ||= 0; 127 if (chmod $mode, $item) { 128 print "chmod($mode, $item)\n" if $verbose > 1; 129 } else { 130 my $err="$!"; 131 _warnonce "WARNING: Failed chmod($mode, $item): $err\n" 132 if -e $item; 133 } 134 } 135 136 =begin _private 137 138 =item _move_file_at_boot( $file, $target, $moan ) 139 140 OS-Specific, Win32/Cygwin 141 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 146 it will be replaced. 147 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. 150 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. 153 154 =end _private 155 156 =cut 157 158 159 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; 164 165 my $descr= ref $target 166 ? "'$file' for deletion" 167 : "'$file' for installation as '$target'"; 168 169 if ( ! $Has_Win32API_File ) { 170 171 my @msg=( 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)" 176 ); 177 if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } 178 return 0; 179 } 180 my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT(); 181 $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING() 182 unless ref $target; 183 184 _chmod( 0666, $file ); 185 _chmod( 0666, $target ) unless ref $target; 186 187 if (Win32API::File::MoveFileEx( $file, $target, $opts )) { 188 $MUST_REBOOT ||= ref $target ? 0 : 1; 189 return 1; 190 } else { 191 my @msg=( 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).", 195 ); 196 if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } 197 } 198 return 0; 199 } 200 201 202 =begin _private 203 204 =item _unlink_or_rename( $file, $tryhard, $installing ) 205 206 OS-Specific, Win32/Cygwin 207 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). 215 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 219 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. 230 231 =end _private 232 233 =cut 234 235 236 237 sub _unlink_or_rename { #XXX OS-SPECIFIC 238 my ( $file, $tryhard, $installing )= @_; 239 240 _chmod( 0666, $file ); 241 unlink $file 242 and return $file; 243 my $error="$!"; 244 245 _choke("Cannot unlink '$file': $!") 246 unless $CanMoveAtBoot && $tryhard; 247 248 my $tmp= "AAA"; 249 ++$tmp while -e "$file.$tmp"; 250 $tmp= "$file.$tmp"; 251 252 warn "WARNING: Unable to unlink '$file': $error\n", 253 "Going to try to rename it to '$tmp'.\n"; 254 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 ); 262 return $file; 263 } elsif ( $installing ) { 264 _warnonce("Rename failed: $!. Scheduling '$tmp'\nfor". 265 " installation as '$file' at reboot.\n"); 266 _move_file_at_boot( $tmp, $file ); 267 return $tmp; 268 } else { 269 _choke("Rename failed:$!", "Cannot procede."); 270 } 271 272 } 273 274 275 276 =head2 Functions 277 278 =over 4 279 280 =item B<install> 281 282 install(\%from_to); 283 install(\%from_to, $verbose, $dont_execute, $uninstall_shadows, $skip); 284 285 Copies each directory tree of %from_to to its corresponding value 286 preserving timestamps and permissions. 287 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. 295 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. 299 300 If $dont_execute is true it will only print what it was going to do 301 without actually doing it. Default is false. 302 303 If $uninstall_shadows is true any differing versions throughout @INC 304 will be uninstalled. This is "make install UNINST=1" 305 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>. 311 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 316 performed. 317 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. 323 324 325 =cut 326 327 =begin _private 328 329 =item _get_install_skip 330 331 Handles loading the INSTALL.SKIP file. Returns an array of patterns to use. 332 333 =cut 334 335 336 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" 341 if $verbose>2; 342 return []; 343 } 344 if ( ! defined $skip ) { 345 print "Looking for install skip list\n" 346 if $verbose>2; 347 for my $file ( 'INSTALL.SKIP', $ENV{EU_INSTALL_SITE_SKIPFILE} ) { 348 next unless $file; 349 print "\tChecking for $file\n" 350 if $verbose>2; 351 if (-e $file) { 352 $skip= $file; 353 last; 354 } 355 } 356 } 357 if ($skip && !ref $skip) { 358 print "Reading skip patterns from '$skip'.\n" 359 if $verbose; 360 if (open my $fh,$skip ) { 361 my @patterns; 362 while (<$fh>) { 363 chomp; 364 next if /^\s*(?:#|$)/; 365 print "\tSkip pattern: $_\n" if $verbose>3; 366 push @patterns, $_; 367 } 368 $skip= \@patterns; 369 } else { 370 warn "Can't read skip file:'$skip':$!\n"; 371 $skip=[]; 372 } 373 } elsif ( UNIVERSAL::isa($skip,'ARRAY') ) { 374 print "Using array for skip list\n" 375 if $verbose>2; 376 } elsif ($verbose) { 377 print "No skip list found.\n" 378 if $verbose>1; 379 $skip= []; 380 } 381 warn "Got @{[0+@$skip]} skip patterns.\n" 382 if $verbose>3; 383 return $skip 384 } 385 386 =item _have_write_access 387 388 Abstract a -w check that tries to use POSIX::access() if possible. 389 390 =cut 391 392 393 { 394 my $has_posix; 395 sub _have_write_access { 396 my $dir=shift; 397 if (!defined $has_posix) { 398 $has_posix=eval "local $^W; require POSIX; 1" || 0; 399 } 400 if ($has_posix) { 401 return POSIX::access($dir, POSIX::W_OK()); 402 } else { 403 return -w $dir; 404 } 405 } 406 } 407 408 409 =item _can_write_dir(C<$dir>) 410 411 Checks whether a given directory is writable, taking account 412 the possibility that the directory might not exist and would have to 413 be created first. 414 415 Returns a list, containing: C<($writable, $determined_by, @create)> 416 417 C<$writable> says whether whether the directory is (hypothetically) writable 418 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. 421 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 425 426 =cut 427 428 429 sub _can_write_dir { 430 my $dir=shift; 431 return 432 unless defined $dir and length $dir; 433 434 my ($vol, $dirs, $file) = File::Spec->splitpath(File::Spec->rel2abs($dir),1); 435 my @dirs = File::Spec->splitdir($dirs); 436 my $path=''; 437 my @make; 438 while (@dirs) { 439 $dir = File::Spec->catdir($vol,@dirs); 440 next if ( $dir eq $path ); 441 if ( ! -e $dir ) { 442 unshift @make,$dir; 443 next; 444 } 445 if ( _have_write_access($dir) ) { 446 return 1,$dir,@make 447 } else { 448 return 0,$dir,@make 449 } 450 } continue { 451 pop @dirs; 452 } 453 return 0; 454 } 455 456 =item _mkpath($dir,$show,$mode,$verbose,$fake) 457 458 Wrapper around File::Path::mkpath() to handle errors. 459 460 If $verbose is true and >1 then additional diagnostics will be produced, also 461 this will force $show to true. 462 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. 466 467 If $fake is not true dies if the directory can not be created or is not 468 writable. 469 470 =cut 471 472 sub _mkpath { 473 my ($dir,$show,$mode,$verbose,$fake)=@_; 474 if ( $verbose && $verbose > 1 && ! -d $dir) { 475 $show= 1; 476 printf "mkpath(%s,%d,%#o)\n", $dir, $show, $mode; 477 } 478 if (!$fake) { 479 if ( ! eval { File::Path::mkpath($dir,$show,$mode); 1 } ) { 480 _choke("Can't create '$dir'","$@"); 481 } 482 483 } 484 my ($can,$root,@make)=_can_write_dir($dir); 485 if (!$can) { 486 my @msg=( 487 "Can't create '$dir'", 488 $root ? "Do not have write permissions on '$root'" 489 : "Unknown Error" 490 ); 491 if ($fake) { 492 _warnonce @msg; 493 } else { 494 _choke @msg; 495 } 496 } elsif ($show and $fake) { 497 print "$_\n" for @make; 498 } 499 } 500 501 =item _copy($from,$to,$verbose,$fake) 502 503 Wrapper around File::Copy::copy to handle errors. 504 505 If $verbose is true and >1 then additional dignostics will be emitted. 506 507 If $fake is true then the copy will not actually occur. 508 509 Dies if the copy fails. 510 511 =cut 512 513 514 sub _copy { 515 my ( $from, $to, $verbose, $nonono)=@_; 516 if ($verbose && $verbose>1) { 517 printf "copy(%s,%s)\n", $from, $to; 518 } 519 if (!$nonono) { 520 File::Copy::copy($from,$to) 521 or Carp::croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" ); 522 } 523 } 524 525 =item _chdir($from) 526 527 Wrapper around chdir to catch errors. 528 529 If not called in void context returns the cwd from before the chdir. 530 531 dies on error. 532 533 =cut 534 535 sub _chdir { 536 my ($dir)= @_; 537 my $ret; 538 if (defined wantarray) { 539 $ret= cwd; 540 } 541 chdir $dir 542 or _choke("Couldn't chdir to '$dir': $!"); 543 return $ret; 544 } 545 546 =end _private 547 548 =cut 549 550 sub install { #XXX OS-SPECIFIC 551 my($from_to,$verbose,$nonono,$inc_uninstall,$skip) = @_; 552 $verbose ||= 0; 553 $nonono ||= 0; 554 555 $skip= _get_install_skip($skip,$verbose); 556 557 my(%from_to) = %$from_to; 558 my(%pack, $dir, %warned); 559 my($packlist) = ExtUtils::Packlist->new(); 560 561 local(*DIR); 562 for (qw/read write/) { 563 $pack{$_}=$from_to{$_}; 564 delete $from_to{$_}; 565 } 566 my $tmpfile = install_rooted_file($pack{"read"}); 567 $packlist->read($tmpfile) if (-f $tmpfile); 568 my $cwd = cwd(); 569 my @found_files; 570 my %check_dirs; 571 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. 578 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 581 #hardcoded here. 582 583 my $targetroot = install_rooted_dir($from_to{$source}); 584 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) 590 ){ 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"; 593 } 594 595 next unless -d $source; 596 _chdir($source); 597 # 5.5.3's File::Find missing no_chdir option 598 # XXX OS-SPECIFIC 599 # File::Find seems to always be Unixy except on MacPerl :( 600 my $current_directory= $Is_MacPerl ? $Curdir : '.'; 601 find(sub { 602 my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9]; 603 604 return if !-f _; 605 my $origfile = $_; 606 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); 612 613 for my $pat (@$skip) { 614 if ( $sourcefile=~/$pat/ ) { 615 print "Skipping $targetfile (filtered)\n" 616 if $verbose>1; 617 return; 618 } 619 } 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); 623 my $diff = 0; 624 if ( -f $targetfile && -s _ == $size) { 625 # We have a good chance, we can skip this one 626 $diff = compare($sourcefile, $targetfile); 627 } else { 628 $diff++; 629 } 630 $check_dirs{$targetdir}++ 631 unless -w $targetfile; 632 633 push @found_files, 634 [ $diff, $File::Find::dir, $origfile, 635 $mode, $size, $atime, $mtime, 636 $targetdir, $targetfile, $sourcedir, $sourcefile, 637 638 ]; 639 #restore the original directory we were in when File::Find 640 #called us so that it doesnt get horribly confused. 641 _chdir($save_cwd); 642 }, $current_directory ); 643 _chdir($cwd); 644 } 645 646 foreach my $targetdir (sort keys %check_dirs) { 647 _mkpath( $targetdir, 0, 0755, $verbose, $nonono ); 648 } 649 foreach my $found (@found_files) { 650 my ($diff, $ffd, $origfile, $mode, $size, $atime, $mtime, 651 $targetdir, $targetfile, $sourcedir, $sourcefile)= @$found; 652 653 my $realtarget= $targetfile; 654 if ($diff) { 655 if (-f $targetfile) { 656 print "_unlink_or_rename($targetfile)\n" if $verbose>1; 657 $targetfile= _unlink_or_rename( $targetfile, 'tryhard', 'install' ) 658 unless $nonono; 659 } elsif ( ! -d $targetdir ) { 660 _mkpath( $targetdir, 0, 0755, $verbose, $nonono ); 661 } 662 print "Installing $targetfile\n"; 663 _copy( $sourcefile, $targetfile, $verbose, $nonono, ); 664 #XXX OS-SPECIFIC 665 print "utime($atime,$mtime,$targetfile)\n" if $verbose>1; 666 utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1; 667 668 669 $mode = 0444 | ( $mode & 0111 ? 0111 : 0 ); 670 $mode = $mode | 0222 671 if $realtarget ne $targetfile; 672 _chmod( $mode, $targetfile, $verbose ); 673 } else { 674 print "Skipping $targetfile (unchanged)\n" if $verbose; 675 } 676 677 if ( $inc_uninstall ) { 678 inc_uninstall($sourcefile,$ffd, $verbose, 679 $nonono, 680 $realtarget ne $targetfile ? $realtarget : ""); 681 } 682 683 # Record the full pathname. 684 $packlist->{$targetfile}++; 685 } 686 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; 692 } 693 694 _do_cleanup($verbose); 695 } 696 697 =begin _private 698 699 =item _do_cleanup 700 701 Standardize finish event for after another instruction has occured. 702 Handles converting $MUST_REBOOT to a die for instance. 703 704 =end _private 705 706 =cut 707 708 sub _do_cleanup { 709 my ($verbose) = @_; 710 if ($MUST_REBOOT) { 711 die _estr "Operation not completed! ", 712 "You must reboot to complete the installation.", 713 "Sorry."; 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"; 717 } 718 } 719 720 =begin _undocumented 721 722 =item install_rooted_file( $file ) 723 724 Returns $file, or catfile($INSTALL_ROOT,$file) if $INSTALL_ROOT 725 is defined. 726 727 =item install_rooted_dir( $dir ) 728 729 Returns $dir, or catdir($INSTALL_ROOT,$dir) if $INSTALL_ROOT 730 is defined. 731 732 =end _undocumented 733 734 =cut 735 736 737 sub install_rooted_file { 738 if (defined $INSTALL_ROOT) { 739 File::Spec->catfile($INSTALL_ROOT, $_[0]); 740 } else { 741 $_[0]; 742 } 743 } 744 745 746 sub install_rooted_dir { 747 if (defined $INSTALL_ROOT) { 748 File::Spec->catdir($INSTALL_ROOT, $_[0]); 749 } else { 750 $_[0]; 751 } 752 } 753 754 =begin _undocumented 755 756 =item forceunlink( $file, $tryhard ) 757 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(). 762 763 =end _undocumented 764 765 =cut 766 767 768 sub forceunlink { 769 my ( $file, $tryhard )= @_; #XXX OS-SPECIFIC 770 _unlink_or_rename( $file, $tryhard ); 771 } 772 773 =begin _undocumented 774 775 =item directory_not_empty( $dir ) 776 777 Returns 1 if there is an .exists file somewhere in a directory tree. 778 Returns 0 if there is not. 779 780 =end _undocumented 781 782 =cut 783 784 sub directory_not_empty ($) { 785 my($dir) = @_; 786 my $files = 0; 787 find(sub { 788 return if $_ eq ".exists"; 789 if (-f) { 790 $File::Find::prune++; 791 $files = 1; 792 } 793 }, $dir); 794 return $files; 795 } 796 797 798 =item B<install_default> I<DISCOURAGED> 799 800 install_default(); 801 install_default($fullext); 802 803 Calls install() with arguments to copy a module from blib/ to the 804 default site installation location. 805 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. 809 810 This is primarily useful for install scripts. 811 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. 816 817 =cut 818 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'); 829 install({ 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}, 840 },1,0,0); 841 } 842 843 844 =item B<uninstall> 845 846 uninstall($packlist_file); 847 uninstall($packlist_file, $verbose, $dont_execute); 848 849 Removes the files listed in a $packlist_file. 850 851 If $verbose is true, will print out each file removed. Default is 852 false. 853 854 If $dont_execute is true it will only print what it was going to do 855 without actually doing it. Default is false. 856 857 =cut 858 859 sub uninstall { 860 my($fil,$verbose,$nonono) = @_; 861 $verbose ||= 0; 862 $nonono ||= 0; 863 864 die _estr "ERROR: no packlist file found: '$fil'" 865 unless -f $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))) { 870 chomp; 871 print "unlink $_\n" if $verbose; 872 forceunlink($_,'tryhard') unless $nonono; 873 } 874 print "unlink $fil\n" if $verbose; 875 forceunlink($fil, 'tryhard') unless $nonono; 876 _do_cleanup($verbose); 877 } 878 879 =begin _undocumented 880 881 =item inc_uninstall($filepath,$libdir,$verbose,$nonono,$ignore) 882 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. 886 887 =end _undocumented 888 889 =cut 890 891 sub inc_uninstall { 892 my($filepath,$libdir,$verbose,$nonono,$ignore) = @_; 893 my($dir); 894 $ignore||=""; 895 my $file = (File::Spec->splitpath($filepath))[2]; 896 my %seen_dir = (); 897 898 my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'} 899 ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || ''; 900 901 foreach $dir (@INC, @PERL_ENV_LIB, @Config{qw(archlibexp 902 privlibexp 903 sitearchexp 904 sitelibexp)}) { 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; 910 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 914 my $diff = 0; 915 if ( -f $targetfile && -s _ == -s $filepath) { 916 # We have a good chance, we can skip this one 917 $diff = compare($filepath,$targetfile); 918 } else { 919 $diff++; 920 } 921 print "#$file and $targetfile differ\n" if $diff && $verbose > 1; 922 923 next if !$diff or $targetfile eq $ignore; 924 if ($nonono) { 925 if ($verbose) { 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), 930 $targetfile 931 ); 932 } 933 # if not verbose, we just say nothing 934 } else { 935 print "Unlinking $targetfile (shadowing?)\n" if $verbose; 936 forceunlink($targetfile,'tryhard'); 937 } 938 } 939 } 940 941 =begin _undocumented 942 943 =item run_filter($cmd,$src,$dest) 944 945 Filter $src using $cmd into $dest. 946 947 =end _undocumented 948 949 =cut 950 951 sub run_filter { 952 my ($cmd, $src, $dest) = @_; 953 local(*CMD, *SRC); 954 open(CMD, "|$cmd >$dest") || die "Cannot fork: $!"; 955 open(SRC, $src) || die "Cannot open $src: $!"; 956 my $buf; 957 my $sz = 1024; 958 while (my $len = sysread(SRC, $buf, $sz)) { 959 syswrite(CMD, $buf, $len); 960 } 961 close SRC; 962 close CMD or die "Filter command '$cmd' failed for $src"; 963 } 964 965 966 =item B<pm_to_blib> 967 968 pm_to_blib(\%from_to, $autosplit_dir); 969 pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd); 970 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. 974 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. 978 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). 981 982 =cut 983 984 sub pm_to_blib { 985 my($fromto,$autodir,$pm_filter) = @_; 986 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"; 991 next; 992 } 993 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. 997 # -- RAM, 03/01/2001 998 999 my $need_filtering = defined $pm_filter && length $pm_filter && 1000 $from =~ /\.pm$/; 1001 1002 if (!$need_filtering && 0 == compare($from,$to)) { 1003 print "Skip $to (unchanged)\n"; 1004 next; 1005 } 1006 if (-f $to){ 1007 # we wont try hard here. its too likely to mess things up. 1008 forceunlink($to); 1009 } else { 1010 _mkpath(dirname($to),0,0755); 1011 } 1012 if ($need_filtering) { 1013 run_filter($pm_filter, $from, $to); 1014 print "$pm_filter <$from >$to\n"; 1015 } else { 1016 _copy( $from, $to ); 1017 print "cp $from $to\n"; 1018 } 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); 1024 } 1025 } 1026 1027 1028 =begin _private 1029 1030 =item _autosplit 1031 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. 1035 1036 =end _private 1037 1038 =cut 1039 1040 sub _autosplit { #XXX OS-SPECIFIC 1041 my $retval = autosplit(@_); 1042 close *AutoSplit::IN if defined *AutoSplit::IN{IO}; 1043 1044 return $retval; 1045 } 1046 1047 1048 package ExtUtils::Install::Warn; 1049 1050 sub new { bless {}, shift } 1051 1052 sub add { 1053 my($self,$file,$targetfile) = @_; 1054 push @{$self->{$file}}, $targetfile; 1055 } 1056 1057 sub DESTROY { 1058 unless(defined $INSTALL_ROOT) { 1059 my $self = shift; 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"; 1066 $i++; 1067 } 1068 } 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"; 1074 } 1075 } 1076 1077 =begin _private 1078 1079 =item _invokant 1080 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. 1084 1085 =end _private 1086 1087 =cut 1088 1089 sub _invokant { 1090 my @stack; 1091 my $frame = 0; 1092 while (my $file = (caller($frame++))[1]) { 1093 push @stack, (File::Spec->splitpath($file))[2]; 1094 } 1095 1096 my $builder; 1097 my $top = pop @stack; 1098 if ($top =~ /^Build/i || exists($INC{'Module/Build.pm'})) { 1099 $builder = 'Module::Build'; 1100 } else { 1101 $builder = 'ExtUtils::MakeMaker'; 1102 } 1103 return $builder; 1104 } 1105 1106 1107 =back 1108 1109 =head1 ENVIRONMENT 1110 1111 =over 4 1112 1113 =item B<PERL_INSTALL_ROOT> 1114 1115 Will be prepended to each install path. 1116 1117 =item B<EU_INSTALL_IGNORE_SKIP> 1118 1119 Will prevent the automatic use of INSTALL.SKIP as the install skip file. 1120 1121 =item B<EU_INSTALL_SITE_SKIPFILE> 1122 1123 If there is no INSTALL.SKIP file in the make directory then this value 1124 can be used to provide a default. 1125 1126 =back 1127 1128 =head1 AUTHOR 1129 1130 Original author lost in the mists of time. Probably the same as Makemaker. 1131 1132 Production release currently maintained by demerphq C<yves at cpan.org> 1133 1134 Send bug reports via http://rt.cpan.org/. Please send your 1135 generated Makefile along with your report. 1136 1137 =head1 LICENSE 1138 1139 This program is free software; you can redistribute it and/or 1140 modify it under the same terms as Perl itself. 1141 1142 See L<http://www.perl.com/perl/misc/Artistic.html> 1143 1144 1145 =cut 1146 1147 1;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |