4 use File::Basename qw(&basename &dirname);
7 # List explicitly here the variables you want Configure to
8 # generate. Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries. Thus you write
12 # to ensure Configure will look for $Config{startperl}.
14 # This forces PL files to create target in same directory as PL file.
15 # This is so that make depend always knows where to find PL derivatives.
18 ($file = basename($0)) =~ s/\.PL$//;
19 $file =~ s/\.pl$// if ($^O eq 'os2' or $^O eq 'dos'); # "case-forgiving"
20 $file =~ s/\.pl$/.com/ if ($^O eq 'VMS'); # "case-forgiving"
22 open OUT,">$file" or die "Can't create $file: $!";
24 print "Extracting $file (with variable substitutions)\n";
26 # In this section, perl variables will be expanded during extraction.
27 # You can use $Config{...} to use Configure variables.
29 print OUT <<"!GROK!THIS!";
31 eval 'exec perl -S \$0 "\$@"'
35 # In the following, perl variables are not expanded during extraction.
37 print OUT <<'!NO!SUBS!';
42 # !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
43 # This file is autogenerated by buildtoc.PL.
44 # Edit that file and run it to effect changes.
46 # Builds perltoc.pod and sanity checks the list of pods against all
47 # of the MANIFEST, perl.pod, and ourselves.
54 @PODS = glob("*.pod");
59 die "$0: failed to chdir('pod'): $!\n" unless chdir("pod");
222 for (@ARCHPODS) { s/$/.pod/ }
223 @ARCHPODS{@ARCHPODS} = ();
225 for (@CJKPODS) { s/$/.pod/ }
226 @CJKPODS{@CJKPODS} = ();
228 for (@pods) { s/$/.pod/ }
232 open(MANI, "../MANIFEST") || die "$0: opening ../MANIFEST failed: $!";
234 if (m!^pod/([^.]+\.pod)\s+!i) {
239 @MANIPODS{@MANIPODS} = ();
241 open(PERLPOD, "perl.pod") || die "$0: opening perl.pod failed: $!\n";
243 if (/^For ease of access, /../^\(If you're intending /) {
244 if (/^\s+(perl\S*)\s+\w/) {
245 push @PERLPODS, "$1.pod";
250 die "$0: could not find the pod listing of perl.pod\n"
252 @PERLPODS{@PERLPODS} = ();
254 # Delete the CJK because we cannot mix their encodings.
255 delete @PERLPODS{@CJKPODS};
256 delete @PODS{@CJKPODS};
257 delete @pods{@CJKPODS};
259 # Cross-check against ourselves
260 # Cross-check against the MANIFEST
261 # Cross-check against the perl.pod
263 foreach my $i (sort keys %PODS) {
264 warn "$0: $i exists but is unknown by buildtoc\n"
265 unless exists $pods{$i};
266 warn "$0: $i exists but is unknown by ../MANIFEST\n"
267 if !exists $MANIPODS{$i} && !exists $ARCHPODS{$i} && !exists $CJKPODS{$i};
268 warn "$0: $i exists but is unknown by perl.pod\n"
269 unless exists $PERLPODS{$i};
271 foreach my $i (sort keys %pods) {
272 warn "$0: $i is known by buildtoc but does not exist\n"
273 unless exists $PODS{$i};
275 foreach my $i (sort keys %MANIPODS) {
276 warn "$0: $i is known by ../MANIFEST but does not exist\n"
277 unless exists $PODS{$i};
279 foreach my $i (sort keys %PERLPODS) {
280 warn "$0: $i is known by perl.pod but does not exist\n"
281 unless exists $PODS{$i};
284 # We are ready to rock.
285 open(OUT, ">perltoc.pod") || die "$0: creating perltoc.pod failed: $!";
290 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
294 perltoc - perl documentation table of contents
298 This page provides a brief table of contents for the rest of the Perl
299 documentation set. It is meant to be scanned quickly or grepped
300 through to locate the proper section you're looking for.
302 =head1 BASIC DOCUMENTATION
309 find \&getpods => qw(../lib ../ext);
313 my $file = $File::Find::name;
314 return if $file eq '../lib/Pod/Functions.pm'; # Used only by pod itself
315 return if $file =~ m!(?:^|/)t/!;
316 return if $file =~ m!lib/Attribute/Handlers/demo/!;
317 return if $file =~ m!lib/Net/FTP/.+\.pm!; # Hi, Graham! :-)
318 return if $file =~ m!lib/Math/BigInt/t/!;
319 return if $file =~ m!/Devel/PPPort/[Hh]arness|lib/Devel/Harness!i;
320 return if $file =~ m!XS/(?:APItest|Typemap)!;
321 die "tut $name" if $file =~ /TUT/;
322 unless (open (F, "< $_\0")) {
323 warn "bogus <$file>: $!";
324 system "ls", "-l", $file;
328 while ($line = <F>) {
329 if ($line =~ /^=head1\s+NAME\b/) {
330 push @modpods, $file;
331 #warn "GOOD $file\n";
335 warn "$0: $file: cannot find =head1 NAME\n";
340 die "no pods" unless @modpods;
343 #($name) = /(\w+)\.p(m|od)$/;
344 $name = path2modname($_);
345 if ($name =~ /^[a-z]/) {
348 if ($done{$name}++) {
349 # warn "already did $_\n";
353 push @modname, $name;
357 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
361 =head1 PRAGMA DOCUMENTATION
365 podset(sort @pragmata);
367 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
371 =head1 MODULE DOCUMENTATION
375 podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
377 ($_= <<EOPOD2B) =~ s/^\t//gm;
380 =head1 AUXILIARY DOCUMENTATION
382 Here should be listed all the extra programs' documentation, but they
383 don't all have manual pages yet:
409 Larry Wall <F<larry\@wall.org>>, with the help of oodles
415 output "\n"; # flush $LINE
422 if (s/^=head1 (NAME)\s*/=head2 /) {
423 $pod = path2modname($ARGV);
425 output "\n \n\n=head2 ";
427 if ( /^\s*$pod\b/ ) {
428 s/$pod\.pm/$pod/; # '.pm' in NAME !?
436 if (s/^=head1 (.*)/=item $1/) {
438 output "=over 4\n\n" unless $inhead1;
440 output $_; nl(); next;
442 if (s/^=head2 (.*)/=item $1/) {
444 output "=over 4\n\n" unless $inhead2;
446 output $_; nl(); next;
448 if (s/^=item ([^=].*)/$1/) {
449 next if $pod eq 'perldiag';
450 s/^\s*\*\s*$// && next;
455 next if $pod eq 'perlmodlib' && /^ftp:/;
456 ##print "=over 4\n\n" unless $initem;
457 output ", " if $initem;
463 if (s/^=cut\s*\n//) {
482 output "\n\n=back\n\n";
490 output "\n\n=back\n\n";
498 ##print "\n\n=back\n\n";
507 my $NEWLINE; # how many newlines have we seen recently
508 my $LINE; # what remains to be printed
511 for (split /(\n)/, shift) {
514 print OUT wrap('', '', $LINE);
522 elsif (/\S/ && length) {
531 close OUT or die "Can't close $file: $!";
532 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
533 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';