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