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");
170 for (@ARCHPODS) { s/$/.pod/ }
171 @ARCHPODS{@ARCHPODS} = ();
173 for (@pods) { s/$/.pod/ }
177 open(MANI, "../MANIFEST") || die "$0: opening ../MANIFEST failed: $!";
179 if (m!^pod/([^.]+\.pod)\s+!i) {
184 @MANIPODS{@MANIPODS} = ();
186 open(PERLPOD, "perl.pod") || die "$0: opening perl.pod failed: $!\n";
188 if (/^For ease of access, /../^\(If you're intending /) {
189 if (/^\s+(perl\w*)\s+\w/) {
190 push @PERLPODS, "$1.pod";
195 die "$0: could not find the pod listing of perl.pod\n"
197 @PERLPODS{@PERLPODS} = ();
199 # Cross-check against ourselves
200 # Cross-check against the MANIFEST
201 # Cross-check against the perl.pod
203 foreach my $i (sort keys %PODS) {
204 warn "$0: $i exists but is unknown by buildtoc\n"
205 unless exists $pods{$i};
206 warn "$0: $i exists but is unknown by ../MANIFEST\n"
207 if !exists $MANIPODS{$i} && !exists $ARCHPODS{$i};
208 warn "$0: $i exists but is unknown by perl.pod\n"
209 unless exists $PERLPODS{$i};
211 foreach my $i (sort keys %pods) {
212 warn "$0: $i is known by buildtoc but does not exist\n"
213 unless exists $PODS{$i};
215 foreach my $i (sort keys %MANIPODS) {
216 warn "$0: $i is known by ../MANIFEST but does not exist\n"
217 unless exists $PODS{$i};
219 foreach my $i (sort keys %PERLPODS) {
220 warn "$0: $i is known by perl.pod but does not exist\n"
221 unless exists $PODS{$i};
224 # We are ready to rock.
225 open(OUT, ">perltoc.pod") || die "$0: creating perltoc.pod failed: $!";
230 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
234 perltoc - perl documentation table of contents
238 This page provides a brief table of contents for the rest of the Perl
239 documentation set. It is meant to be scanned quickly or grepped
240 through to locate the proper section you're looking for.
242 =head1 BASIC DOCUMENTATION
249 find \&getpods => qw(../lib ../ext);
253 # Skip .pm files that have corresponding .pod files, and Functions.pm.
254 return if /(.*)\.pm$/ && -f "$1.pod";
255 my $file = $File::Find::name;
256 return if $file eq '../lib/Pod/Functions.pm'; # Used only by pod itself
258 die "tut $name" if $file =~ /TUT/;
259 unless (open (F, "< $_\0")) {
260 warn "bogus <$file>: $!";
261 system "ls", "-l", $file;
265 while ($line = <F>) {
266 if ($line =~ /^=head1\s+NAME\b/) {
267 push @modpods, $file;
268 #warn "GOOD $file\n";
272 warn "$0: $file: cannot find =head1 NAME\n";
277 die "no pods" unless @modpods;
280 #($name) = /(\w+)\.p(m|od)$/;
281 $name = path2modname($_);
282 if ($name =~ /^[a-z]/) {
285 if ($done{$name}++) {
286 # warn "already did $_\n";
290 push @modname, $name;
294 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
298 =head1 PRAGMA DOCUMENTATION
302 podset(sort @pragmata);
304 ($_= <<EOPOD2B) =~ s/^\t//gm && output($_);
308 =head1 MODULE DOCUMENTATION
312 podset( @modules[ sort { $modname[$a] cmp $modname[$b] } 0 .. $#modules ] );
314 ($_= <<EOPOD2B) =~ s/^\t//gm;
317 =head1 AUXILIARY DOCUMENTATION
319 Here should be listed all the extra programs' documentation, but they
320 don't all have manual pages yet:
346 Larry Wall <F<larry\@wall.org>>, with the help of oodles
352 output "\n"; # flush $LINE
359 if (s/^=head1 (NAME)\s*/=head2 /) {
360 $pod = path2modname($ARGV);
362 output "\n \n\n=head2 ";
364 if ( /^\s*$pod\b/ ) {
365 s/$pod\.pm/$pod/; # '.pm' in NAME !?
373 if (s/^=head1 (.*)/=item $1/) {
375 output "=over\n\n" unless $inhead1;
377 output $_; nl(); next;
379 if (s/^=head2 (.*)/=item $1/) {
381 output "=over\n\n" unless $inhead2;
383 output $_; nl(); next;
385 if (s/^=item ([^=].*)/$1/) {
386 next if $pod eq 'perldiag';
387 s/^\s*\*\s*$// && next;
392 next if $pod eq 'perlmodlib' && /^ftp:/;
393 ##print "=over\n\n" unless $initem;
394 output ", " if $initem;
400 if (s/^=cut\s*\n//) {
419 output "\n\n=back\n\n";
427 output "\n\n=back\n\n";
435 ##print "\n\n=back\n\n";
444 my $NEWLINE; # how many newlines have we seen recently
445 my $LINE; # what remains to be printed
448 for (split /(\n)/, shift) {
451 print OUT wrap('', '', $LINE);
459 elsif (/\S/ && length) {