[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 package ExtUtils::Manifest; 2 3 require Exporter; 4 use Config; 5 use File::Basename; 6 use File::Copy 'copy'; 7 use File::Find; 8 use File::Spec; 9 use Carp; 10 use strict; 11 12 use vars qw($VERSION @ISA @EXPORT_OK 13 $Is_MacOS $Is_VMS 14 $Debug $Verbose $Quiet $MANIFEST $DEFAULT_MSKIP); 15 16 $VERSION = '1.51_01'; 17 @ISA=('Exporter'); 18 @EXPORT_OK = qw(mkmanifest 19 manicheck filecheck fullcheck skipcheck 20 manifind maniread manicopy maniadd 21 ); 22 23 $Is_MacOS = $^O eq 'MacOS'; 24 $Is_VMS = $^O eq 'VMS'; 25 require VMS::Filespec if $Is_VMS; 26 27 $Debug = $ENV{PERL_MM_MANIFEST_DEBUG} || 0; 28 $Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ? 29 $ENV{PERL_MM_MANIFEST_VERBOSE} : 1; 30 $Quiet = 0; 31 $MANIFEST = 'MANIFEST'; 32 33 $DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" ); 34 35 36 =head1 NAME 37 38 ExtUtils::Manifest - utilities to write and check a MANIFEST file 39 40 =head1 SYNOPSIS 41 42 use ExtUtils::Manifest qw(...funcs to import...); 43 44 mkmanifest(); 45 46 my @missing_files = manicheck; 47 my @skipped = skipcheck; 48 my @extra_files = filecheck; 49 my($missing, $extra) = fullcheck; 50 51 my $found = manifind(); 52 53 my $manifest = maniread(); 54 55 manicopy($read,$target); 56 57 maniadd({$file => $comment, ...}); 58 59 60 =head1 DESCRIPTION 61 62 =head2 Functions 63 64 ExtUtils::Manifest exports no functions by default. The following are 65 exported on request 66 67 =over 4 68 69 =item mkmanifest 70 71 mkmanifest(); 72 73 Writes all files in and below the current directory to your F<MANIFEST>. 74 It works similar to 75 76 find . > MANIFEST 77 78 All files that match any regular expression in a file F<MANIFEST.SKIP> 79 (if it exists) are ignored. 80 81 Any existing F<MANIFEST> file will be saved as F<MANIFEST.bak>. Lines 82 from the old F<MANIFEST> file is preserved, including any comments 83 that are found in the existing F<MANIFEST> file in the new one. 84 85 =cut 86 87 sub _sort { 88 return sort { lc $a cmp lc $b } @_; 89 } 90 91 sub mkmanifest { 92 my $manimiss = 0; 93 my $read = (-r 'MANIFEST' && maniread()) or $manimiss++; 94 $read = {} if $manimiss; 95 local *M; 96 my $bakbase = $MANIFEST; 97 $bakbase =~ s/\./_/g if $Is_VMS; # avoid double dots 98 rename $MANIFEST, "$bakbase.bak" unless $manimiss; 99 open M, ">$MANIFEST" or die "Could not open $MANIFEST: $!"; 100 my $skip = _maniskip(); 101 my $found = manifind(); 102 my($key,$val,$file,%all); 103 %all = (%$found, %$read); 104 $all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files' 105 if $manimiss; # add new MANIFEST to known file list 106 foreach $file (_sort keys %all) { 107 if ($skip->($file)) { 108 # Policy: only remove files if they're listed in MANIFEST.SKIP. 109 # Don't remove files just because they don't exist. 110 warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file}; 111 next; 112 } 113 if ($Verbose){ 114 warn "Added to $MANIFEST: $file\n" unless exists $read->{$file}; 115 } 116 my $text = $all{$file}; 117 $file = _unmacify($file); 118 my $tabs = (5 - (length($file)+1)/8); 119 $tabs = 1 if $tabs < 1; 120 $tabs = 0 unless $text; 121 print M $file, "\t" x $tabs, $text, "\n"; 122 } 123 close M; 124 } 125 126 # Geez, shouldn't this use File::Spec or File::Basename or something? 127 # Why so careful about dependencies? 128 sub clean_up_filename { 129 my $filename = shift; 130 $filename =~ s|^\./||; 131 $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS; 132 return $filename; 133 } 134 135 136 =item manifind 137 138 my $found = manifind(); 139 140 returns a hash reference. The keys of the hash are the files found 141 below the current directory. 142 143 =cut 144 145 sub manifind { 146 my $p = shift || {}; 147 my $found = {}; 148 149 my $wanted = sub { 150 my $name = clean_up_filename($File::Find::name); 151 warn "Debug: diskfile $name\n" if $Debug; 152 return if -d $_; 153 154 if( $Is_VMS ) { 155 $name =~ s#(.*)\.$#\L$1#; 156 $name = uc($name) if $name =~ /^MANIFEST(\.SKIP)?$/i; 157 } 158 $found->{$name} = ""; 159 }; 160 161 # We have to use "$File::Find::dir/$_" in preprocess, because 162 # $File::Find::name is unavailable. 163 # Also, it's okay to use / here, because MANIFEST files use Unix-style 164 # paths. 165 find({wanted => $wanted}, 166 $Is_MacOS ? ":" : "."); 167 168 return $found; 169 } 170 171 172 =item manicheck 173 174 my @missing_files = manicheck(); 175 176 checks if all the files within a C<MANIFEST> in the current directory 177 really do exist. If C<MANIFEST> and the tree below the current 178 directory are in sync it silently returns an empty list. 179 Otherwise it returns a list of files which are listed in the 180 C<MANIFEST> but missing from the directory, and by default also 181 outputs these names to STDERR. 182 183 =cut 184 185 sub manicheck { 186 return _check_files(); 187 } 188 189 190 =item filecheck 191 192 my @extra_files = filecheck(); 193 194 finds files below the current directory that are not mentioned in the 195 C<MANIFEST> file. An optional file C<MANIFEST.SKIP> will be 196 consulted. Any file matching a regular expression in such a file will 197 not be reported as missing in the C<MANIFEST> file. The list of any 198 extraneous files found is returned, and by default also reported to 199 STDERR. 200 201 =cut 202 203 sub filecheck { 204 return _check_manifest(); 205 } 206 207 208 =item fullcheck 209 210 my($missing, $extra) = fullcheck(); 211 212 does both a manicheck() and a filecheck(), returning then as two array 213 refs. 214 215 =cut 216 217 sub fullcheck { 218 return [_check_files()], [_check_manifest()]; 219 } 220 221 222 =item skipcheck 223 224 my @skipped = skipcheck(); 225 226 lists all the files that are skipped due to your C<MANIFEST.SKIP> 227 file. 228 229 =cut 230 231 sub skipcheck { 232 my($p) = @_; 233 my $found = manifind(); 234 my $matches = _maniskip(); 235 236 my @skipped = (); 237 foreach my $file (_sort keys %$found){ 238 if (&$matches($file)){ 239 warn "Skipping $file\n"; 240 push @skipped, $file; 241 next; 242 } 243 } 244 245 return @skipped; 246 } 247 248 249 sub _check_files { 250 my $p = shift; 251 my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0); 252 my $read = maniread() || {}; 253 my $found = manifind($p); 254 255 my(@missfile) = (); 256 foreach my $file (_sort keys %$read){ 257 warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug; 258 if ($dosnames){ 259 $file = lc $file; 260 $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge; 261 $file =~ s=((\w|-)+)=substr ($1,0,8)=ge; 262 } 263 unless ( exists $found->{$file} ) { 264 warn "No such file: $file\n" unless $Quiet; 265 push @missfile, $file; 266 } 267 } 268 269 return @missfile; 270 } 271 272 273 sub _check_manifest { 274 my($p) = @_; 275 my $read = maniread() || {}; 276 my $found = manifind($p); 277 my $skip = _maniskip(); 278 279 my @missentry = (); 280 foreach my $file (_sort keys %$found){ 281 next if $skip->($file); 282 warn "Debug: manicheck checking from disk $file\n" if $Debug; 283 unless ( exists $read->{$file} ) { 284 my $canon = $Is_MacOS ? "\t" . _unmacify($file) : ''; 285 warn "Not in $MANIFEST: $file$canon\n" unless $Quiet; 286 push @missentry, $file; 287 } 288 } 289 290 return @missentry; 291 } 292 293 294 =item maniread 295 296 my $manifest = maniread(); 297 my $manifest = maniread($manifest_file); 298 299 reads a named C<MANIFEST> file (defaults to C<MANIFEST> in the current 300 directory) and returns a HASH reference with files being the keys and 301 comments being the values of the HASH. Blank lines and lines which 302 start with C<#> in the C<MANIFEST> file are discarded. 303 304 =cut 305 306 sub maniread { 307 my ($mfile) = @_; 308 $mfile ||= $MANIFEST; 309 my $read = {}; 310 local *M; 311 unless (open M, $mfile){ 312 warn "Problem opening $mfile: $!"; 313 return $read; 314 } 315 local $_; 316 while (<M>){ 317 chomp; 318 next if /^\s*#/; 319 320 my($file, $comment) = /^(\S+)\s*(.*)/; 321 next unless $file; 322 323 if ($Is_MacOS) { 324 $file = _macify($file); 325 $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge; 326 } 327 elsif ($Is_VMS) { 328 require File::Basename; 329 my($base,$dir) = File::Basename::fileparse($file); 330 # Resolve illegal file specifications in the same way as tar 331 $dir =~ tr/./_/; 332 my(@pieces) = split(/\./,$base); 333 if (@pieces > 2) { $base = shift(@pieces) . '.' . join('_',@pieces); } 334 my $okfile = "$dir$base"; 335 warn "Debug: Illegal name $file changed to $okfile\n" if $Debug; 336 $file = $okfile; 337 $file = lc($file) unless $file =~ /^MANIFEST(\.SKIP)?$/; 338 } 339 340 $read->{$file} = $comment; 341 } 342 close M; 343 $read; 344 } 345 346 # returns an anonymous sub that decides if an argument matches 347 sub _maniskip { 348 my @skip ; 349 my $mfile = "$MANIFEST.SKIP"; 350 _check_mskip_directives($mfile) if -f $mfile; 351 local(*M, $_); 352 open M, $mfile or open M, $DEFAULT_MSKIP or return sub {0}; 353 while (<M>){ 354 chomp; 355 s/\r//; 356 next if /^#/; 357 next if /^\s*$/; 358 push @skip, _macify($_); 359 } 360 close M; 361 return sub {0} unless (scalar @skip > 0); 362 363 my $opts = $Is_VMS ? '(?i)' : ''; 364 365 # Make sure each entry is isolated in its own parentheses, in case 366 # any of them contain alternations 367 my $regex = join '|', map "(?:$_)", @skip; 368 369 return sub { $_[0] =~ qr{$opts$regex} }; 370 } 371 372 # checks for the special directives 373 # #!include_default 374 # #!include /path/to/some/manifest.skip 375 # in a custom MANIFEST.SKIP for, for including 376 # the content of, respectively, the default MANIFEST.SKIP 377 # and an external manifest.skip file 378 sub _check_mskip_directives { 379 my $mfile = shift; 380 local (*M, $_); 381 my @lines = (); 382 my $flag = 0; 383 unless (open M, $mfile) { 384 warn "Problem opening $mfile: $!"; 385 return; 386 } 387 while (<M>) { 388 if (/^#!include_default\s*$/) { 389 if (my @default = _include_mskip_file()) { 390 push @lines, @default; 391 warn "Debug: Including default MANIFEST.SKIP\n" if $Debug; 392 $flag++; 393 } 394 next; 395 } 396 if (/^#!include\s+(.*)\s*$/) { 397 my $external_file = $1; 398 if (my @external = _include_mskip_file($external_file)) { 399 push @lines, @external; 400 warn "Debug: Including external $external_file\n" if $Debug; 401 $flag++; 402 } 403 next; 404 } 405 push @lines, $_; 406 } 407 close M; 408 return unless $flag; 409 my $bakbase = $mfile; 410 $bakbase =~ s/\./_/g if $Is_VMS; # avoid double dots 411 rename $mfile, "$bakbase.bak"; 412 warn "Debug: Saving original $mfile as $bakbase.bak\n" if $Debug; 413 unless (open M, ">$mfile") { 414 warn "Problem opening $mfile: $!"; 415 return; 416 } 417 print M $_ for (@lines); 418 close M; 419 return; 420 } 421 422 # returns an array containing the lines of an external 423 # manifest.skip file, if given, or $DEFAULT_MSKIP 424 sub _include_mskip_file { 425 my $mskip = shift || $DEFAULT_MSKIP; 426 unless (-f $mskip) { 427 warn qq{Included file "$mskip" not found - skipping}; 428 return; 429 } 430 local (*M, $_); 431 unless (open M, $mskip) { 432 warn "Problem opening $mskip: $!"; 433 return; 434 } 435 my @lines = (); 436 push @lines, "\n#!start included $mskip\n"; 437 push @lines, $_ while <M>; 438 close M; 439 push @lines, "#!end included $mskip\n\n"; 440 return @lines; 441 } 442 443 =item manicopy 444 445 manicopy(\%src, $dest_dir); 446 manicopy(\%src, $dest_dir, $how); 447 448 Copies the files that are the keys in %src to the $dest_dir. %src is 449 typically returned by the maniread() function. 450 451 manicopy( maniread(), $dest_dir ); 452 453 This function is useful for producing a directory tree identical to the 454 intended distribution tree. 455 456 $how can be used to specify a different methods of "copying". Valid 457 values are C<cp>, which actually copies the files, C<ln> which creates 458 hard links, and C<best> which mostly links the files but copies any 459 symbolic link to make a tree without any symbolic link. C<cp> is the 460 default. 461 462 =cut 463 464 sub manicopy { 465 my($read,$target,$how)=@_; 466 croak "manicopy() called without target argument" unless defined $target; 467 $how ||= 'cp'; 468 require File::Path; 469 require File::Basename; 470 471 $target = VMS::Filespec::unixify($target) if $Is_VMS; 472 File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755); 473 foreach my $file (keys %$read){ 474 if ($Is_MacOS) { 475 if ($file =~ m!:!) { 476 my $dir = _maccat($target, $file); 477 $dir =~ s/[^:]+$//; 478 File::Path::mkpath($dir,1,0755); 479 } 480 cp_if_diff($file, _maccat($target, $file), $how); 481 } else { 482 $file = VMS::Filespec::unixify($file) if $Is_VMS; 483 if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not? 484 my $dir = File::Basename::dirname($file); 485 $dir = VMS::Filespec::unixify($dir) if $Is_VMS; 486 File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755); 487 } 488 cp_if_diff($file, "$target/$file", $how); 489 } 490 } 491 } 492 493 sub cp_if_diff { 494 my($from, $to, $how)=@_; 495 -f $from or carp "$0: $from not found"; 496 my($diff) = 0; 497 local(*F,*T); 498 open(F,"< $from\0") or die "Can't read $from: $!\n"; 499 if (open(T,"< $to\0")) { 500 local $_; 501 while (<F>) { $diff++,last if $_ ne <T>; } 502 $diff++ unless eof(T); 503 close T; 504 } 505 else { $diff++; } 506 close F; 507 if ($diff) { 508 if (-e $to) { 509 unlink($to) or confess "unlink $to: $!"; 510 } 511 STRICT_SWITCH: { 512 best($from,$to), last STRICT_SWITCH if $how eq 'best'; 513 cp($from,$to), last STRICT_SWITCH if $how eq 'cp'; 514 ln($from,$to), last STRICT_SWITCH if $how eq 'ln'; 515 croak("ExtUtils::Manifest::cp_if_diff " . 516 "called with illegal how argument [$how]. " . 517 "Legal values are 'best', 'cp', and 'ln'."); 518 } 519 } 520 } 521 522 sub cp { 523 my ($srcFile, $dstFile) = @_; 524 my ($access,$mod) = (stat $srcFile)[8,9]; 525 526 copy($srcFile,$dstFile); 527 utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile; 528 _manicopy_chmod($srcFile, $dstFile); 529 } 530 531 532 sub ln { 533 my ($srcFile, $dstFile) = @_; 534 return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95()); 535 link($srcFile, $dstFile); 536 537 unless( _manicopy_chmod($srcFile, $dstFile) ) { 538 unlink $dstFile; 539 return; 540 } 541 1; 542 } 543 544 # 1) Strip off all group and world permissions. 545 # 2) Let everyone read it. 546 # 3) If the owner can execute it, everyone can. 547 sub _manicopy_chmod { 548 my($srcFile, $dstFile) = @_; 549 550 my $perm = 0444 | (stat $srcFile)[2] & 0700; 551 chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $dstFile ); 552 } 553 554 # Files that are often modified in the distdir. Don't hard link them. 555 my @Exceptions = qw(MANIFEST META.yml SIGNATURE); 556 sub best { 557 my ($srcFile, $dstFile) = @_; 558 559 my $is_exception = grep $srcFile =~ /$_/, @Exceptions; 560 if ($is_exception or !$Config{d_link} or -l $srcFile) { 561 cp($srcFile, $dstFile); 562 } else { 563 ln($srcFile, $dstFile) or cp($srcFile, $dstFile); 564 } 565 } 566 567 sub _macify { 568 my($file) = @_; 569 570 return $file unless $Is_MacOS; 571 572 $file =~ s|^\./||; 573 if ($file =~ m|/|) { 574 $file =~ s|/+|:|g; 575 $file = ":$file"; 576 } 577 578 $file; 579 } 580 581 sub _maccat { 582 my($f1, $f2) = @_; 583 584 return "$f1/$f2" unless $Is_MacOS; 585 586 $f1 .= ":$f2"; 587 $f1 =~ s/([^:]:):/$1/g; 588 return $f1; 589 } 590 591 sub _unmacify { 592 my($file) = @_; 593 594 return $file unless $Is_MacOS; 595 596 $file =~ s|^:||; 597 $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge; 598 $file =~ y|:|/|; 599 600 $file; 601 } 602 603 604 =item maniadd 605 606 maniadd({ $file => $comment, ...}); 607 608 Adds an entry to an existing F<MANIFEST> unless its already there. 609 610 $file will be normalized (ie. Unixified). B<UNIMPLEMENTED> 611 612 =cut 613 614 sub maniadd { 615 my($additions) = shift; 616 617 _normalize($additions); 618 _fix_manifest($MANIFEST); 619 620 my $manifest = maniread(); 621 my @needed = grep { !exists $manifest->{$_} } keys %$additions; 622 return 1 unless @needed; 623 624 open(MANIFEST, ">>$MANIFEST") or 625 die "maniadd() could not open $MANIFEST: $!"; 626 627 foreach my $file (_sort @needed) { 628 my $comment = $additions->{$file} || ''; 629 printf MANIFEST "%-40s %s\n", $file, $comment; 630 } 631 close MANIFEST or die "Error closing $MANIFEST: $!"; 632 633 return 1; 634 } 635 636 637 # Sometimes MANIFESTs are missing a trailing newline. Fix this. 638 sub _fix_manifest { 639 my $manifest_file = shift; 640 641 open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!"; 642 643 # Yes, we should be using seek(), but I'd like to avoid loading POSIX 644 # to get SEEK_* 645 my @manifest = <MANIFEST>; 646 close MANIFEST; 647 648 unless( $manifest[-1] =~ /\n\z/ ) { 649 open MANIFEST, ">>$MANIFEST" or die "Could not open $MANIFEST: $!"; 650 print MANIFEST "\n"; 651 close MANIFEST; 652 } 653 } 654 655 656 # UNIMPLEMENTED 657 sub _normalize { 658 return; 659 } 660 661 662 =back 663 664 =head2 MANIFEST 665 666 A list of files in the distribution, one file per line. The MANIFEST 667 always uses Unix filepath conventions even if you're not on Unix. This 668 means F<foo/bar> style not F<foo\bar>. 669 670 Anything between white space and an end of line within a C<MANIFEST> 671 file is considered to be a comment. Any line beginning with # is also 672 a comment. 673 674 # this a comment 675 some/file 676 some/other/file comment about some/file 677 678 679 =head2 MANIFEST.SKIP 680 681 The file MANIFEST.SKIP may contain regular expressions of files that 682 should be ignored by mkmanifest() and filecheck(). The regular 683 expressions should appear one on each line. Blank lines and lines 684 which start with C<#> are skipped. Use C<\#> if you need a regular 685 expression to start with a C<#>. 686 687 For example: 688 689 # Version control files and dirs. 690 \bRCS\b 691 \bCVS\b 692 ,v$ 693 \B\.svn\b 694 695 # Makemaker generated files and dirs. 696 ^MANIFEST\. 697 ^Makefile$ 698 ^blib/ 699 ^MakeMaker-\d 700 701 # Temp, old and emacs backup files. 702 ~$ 703 \.old$ 704 ^#.*#$ 705 ^\.# 706 707 If no MANIFEST.SKIP file is found, a default set of skips will be 708 used, similar to the example above. If you want nothing skipped, 709 simply make an empty MANIFEST.SKIP file. 710 711 In one's own MANIFEST.SKIP file, certain directives 712 can be used to include the contents of other MANIFEST.SKIP 713 files. At present two such directives are recognized. 714 715 =over 4 716 717 =item #!include_default 718 719 This inserts the contents of the default MANIFEST.SKIP file 720 721 =item #!include /Path/to/another/manifest.skip 722 723 This inserts the contents of the specified external file 724 725 =back 726 727 The included contents will be inserted into the MANIFEST.SKIP 728 file in between I<#!start included /path/to/manifest.skip> 729 and I<#!end included /path/to/manifest.skip> markers. 730 The original MANIFEST.SKIP is saved as MANIFEST.SKIP.bak. 731 732 =head2 EXPORT_OK 733 734 C<&mkmanifest>, C<&manicheck>, C<&filecheck>, C<&fullcheck>, 735 C<&maniread>, and C<&manicopy> are exportable. 736 737 =head2 GLOBAL VARIABLES 738 739 C<$ExtUtils::Manifest::MANIFEST> defaults to C<MANIFEST>. Changing it 740 results in both a different C<MANIFEST> and a different 741 C<MANIFEST.SKIP> file. This is useful if you want to maintain 742 different distributions for different audiences (say a user version 743 and a developer version including RCS). 744 745 C<$ExtUtils::Manifest::Quiet> defaults to 0. If set to a true value, 746 all functions act silently. 747 748 C<$ExtUtils::Manifest::Debug> defaults to 0. If set to a true value, 749 or if PERL_MM_MANIFEST_DEBUG is true, debugging output will be 750 produced. 751 752 =head1 DIAGNOSTICS 753 754 All diagnostic output is sent to C<STDERR>. 755 756 =over 4 757 758 =item C<Not in MANIFEST:> I<file> 759 760 is reported if a file is found which is not in C<MANIFEST>. 761 762 =item C<Skipping> I<file> 763 764 is reported if a file is skipped due to an entry in C<MANIFEST.SKIP>. 765 766 =item C<No such file:> I<file> 767 768 is reported if a file mentioned in a C<MANIFEST> file does not 769 exist. 770 771 =item C<MANIFEST:> I<$!> 772 773 is reported if C<MANIFEST> could not be opened. 774 775 =item C<Added to MANIFEST:> I<file> 776 777 is reported by mkmanifest() if $Verbose is set and a file is added 778 to MANIFEST. $Verbose is set to 1 by default. 779 780 =back 781 782 =head1 ENVIRONMENT 783 784 =over 4 785 786 =item B<PERL_MM_MANIFEST_DEBUG> 787 788 Turns on debugging 789 790 =back 791 792 =head1 SEE ALSO 793 794 L<ExtUtils::MakeMaker> which has handy targets for most of the functionality. 795 796 =head1 AUTHOR 797 798 Andreas Koenig C<andreas.koenig@anima.de> 799 800 Maintained by Michael G Schwern C<schwern@pobox.com> within the 801 ExtUtils-MakeMaker package and, as a separate CPAN package, by 802 Randy Kobes C<r.kobes@uwinnipeg.ca>. 803 804 =cut 805 806 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 |