xref: /openbsd-src/gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL (revision c0dd97bfcad3dab6c31ec12b9de1274fd2d2f993)
1#!/usr/bin/perl
2#
3# Special wrapper script to generate the actual pod2man script.  This is
4# required for proper start-up code on non-UNIX platforms, and is used inside
5# Perl core.
6
7use 5.006;
8use strict;
9use warnings;
10
11use Config qw(%Config);
12use Cwd qw(cwd);
13use File::Basename qw(basename dirname);
14
15# List explicitly here the variables you want Configure to generate.
16# Metaconfig only looks for shell variables, so you have to mention them as if
17# they were shell variables, not %Config entries.  Thus you write
18#  $startperl
19# to ensure Configure will look for $Config{startperl}.
20
21# This forces PL files to create target in same directory as PL file.
22# This is so that make depend always knows where to find PL derivatives.
23chdir(dirname($0)) or die "Cannot change directories: $!\n";
24my $file = basename($0, '.PL');
25if ($^O eq 'VMS') {
26    $file .= '.com';
27}
28
29# Create the generated script.
30## no critic (InputOutput::RequireBriefOpen)
31## no critic (InputOutput::RequireCheckedSyscalls)
32open(my $out, '>', $file) or die "Cannot create $file: $!\n";
33print "Extracting $file (with variable substitutions)\n";
34## use critic
35
36# In this section, Perl variables will be expanded during extraction.  You can
37# use $Config{...} to use Configure variables.
38print {$out} <<"PREAMBLE" or die "Cannot write to $file: $!\n";
39$Config{startperl}
40    eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
41        if \$running_under_some_shell;
42PREAMBLE
43
44# In the following, Perl variables are not expanded during extraction.
45print {$out} <<'SCRIPT_BODY' or die "Cannot write to $file: $!\n";
46
47# pod2man -- Convert POD data to formatted *roff input.
48#
49# Copyright 1999, 2000, 2001, 2004, 2006, 2008, 2010, 2012, 2013, 2014, 2015,
50#     2016 Russ Allbery <rra@cpan.org>
51#
52# This program is free software; you may redistribute it and/or modify it
53# under the same terms as Perl itself.
54
55use 5.006;
56use strict;
57use warnings;
58
59use Getopt::Long qw(GetOptions);
60use Pod::Man ();
61use Pod::Usage qw(pod2usage);
62
63use strict;
64
65# Clean up $0 for error reporting.
66$0 =~ s%.*/%%;
67
68# Insert -- into @ARGV before any single dash argument to hide it from
69# Getopt::Long; we want to interpret it as meaning stdin.
70my $stdin;
71@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
72
73# Parse our options, trying to retain backward compatibility with pod2man but
74# allowing short forms as well.  --lax is currently ignored.
75my %options;
76Getopt::Long::config ('bundling_override');
77GetOptions (\%options, 'center|c=s', 'date|d=s', 'errors=s', 'fixed=s',
78            'fixedbold=s', 'fixeditalic=s', 'fixedbolditalic=s', 'help|h',
79            'lax|l', 'name|n=s', 'nourls', 'official|o', 'quotes|q=s',
80            'release|r=s', 'section|s=s', 'stderr', 'verbose|v', 'utf8|u')
81    or exit 1;
82pod2usage (0) if $options{help};
83
84# Official sets --center, but don't override things explicitly set.
85if ($options{official} && !defined $options{center}) {
86    $options{center} = 'Perl Programmers Reference Guide';
87}
88
89# Verbose is only our flag, not a Pod::Man flag.
90my $verbose = $options{verbose};
91delete $options{verbose};
92
93# This isn't a valid Pod::Man option and is only accepted for backward
94# compatibility.
95delete $options{lax};
96
97# If neither stderr nor errors is set, default to errors = die.
98if (!defined $options{stderr} && !defined $options{errors}) {
99    $options{errors} = 'die';
100}
101
102# Initialize and run the formatter, pulling a pair of input and output off at
103# a time.  For each file, we check whether the document was completely empty
104# and, if so, will remove the created file and exit with a non-zero exit
105# status.
106my $parser = Pod::Man->new (%options);
107my $status = 0;
108my @files;
109do {
110    @files = splice (@ARGV, 0, 2);
111    print "  $files[1]\n" if $verbose;
112    $parser->parse_from_file (@files);
113    if ($parser->{CONTENTLESS}) {
114        $status = 1;
115        warn "$0: unable to format $files[0]\n";
116        if (defined ($files[1]) and $files[1] ne '-') {
117            unlink $files[1] unless (-s $files[1]);
118        }
119    }
120} while (@ARGV);
121exit $status;
122
123__END__
124
125=for stopwords
126en em --stderr stderr --utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris
127URL troff troff-specific formatters uppercased Christiansen --nourls UTC
128prepend
129
130=head1 NAME
131
132pod2man - Convert POD data to formatted *roff input
133
134=head1 SYNOPSIS
135
136pod2man [B<--center>=I<string>] [B<--date>=I<string>] [B<--errors>=I<style>]
137    [B<--fixed>=I<font>] [B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
138    [B<--fixedbolditalic>=I<font>] [B<--name>=I<name>] [B<--nourls>]
139    [B<--official>] [B<--quotes>=I<quotes>] [B<--release>=I<version>]
140    [B<--section>=I<manext>] [B<--stderr>] [B<--utf8>] [B<--verbose>]
141    [I<input> [I<output>] ...]
142
143pod2man B<--help>
144
145=head1 DESCRIPTION
146
147B<pod2man> is a front-end for Pod::Man, using it to generate *roff input
148from POD source.  The resulting *roff code is suitable for display on a
149terminal using nroff(1), normally via man(1), or printing using troff(1).
150
151I<input> is the file to read for POD source (the POD can be embedded in
152code).  If I<input> isn't given, it defaults to C<STDIN>.  I<output>, if
153given, is the file to which to write the formatted output.  If I<output>
154isn't given, the formatted output is written to C<STDOUT>.  Several POD
155files can be processed in the same B<pod2man> invocation (saving module
156load and compile times) by providing multiple pairs of I<input> and
157I<output> files on the command line.
158
159B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can
160be used to set the headers and footers to use; if not given, Pod::Man will
161assume various defaults.  See below or L<Pod::Man> for details.
162
163B<pod2man> assumes that your *roff formatters have a fixed-width font
164named C<CW>.  If yours is called something else (like C<CR>), use
165B<--fixed> to specify it.  This generally only matters for troff output
166for printing.  Similarly, you can set the fonts used for bold, italic, and
167bold italic fixed-width output.
168
169Besides the obvious pod conversions, Pod::Man, and therefore pod2man also
170takes care of formatting func(), func(n), and simple variable references
171like $foo or @bar so you don't have to use code escapes for them; complex
172expressions like C<$fred{'stuff'}> will still need to be escaped, though.
173It also translates dashes that aren't used as hyphens into en dashes, makes
174long dashes--like this--into proper em dashes, fixes "paired quotes," and
175takes care of several other troff-specific tweaks.  See L<Pod::Man> for
176complete information.
177
178=head1 OPTIONS
179
180=over 4
181
182=item B<-c> I<string>, B<--center>=I<string>
183
184Sets the centered page header for the C<.TH> macro to I<string>.  The
185default is "User Contributed Perl Documentation", but also see
186B<--official> below.
187
188=item B<-d> I<string>, B<--date>=I<string>
189
190Set the left-hand footer string for the C<.TH> macro to I<string>.  By
191default, the modification date of the input file will be used, or the
192current date if input comes from C<STDIN>, and will be based on UTC (so
193that the output will be reproducible regardless of local time zone).
194
195=item B<--errors>=I<style>
196
197Set the error handling style.  C<die> says to throw an exception on any
198POD formatting error.  C<stderr> says to report errors on standard error,
199but not to throw an exception.  C<pod> says to include a POD ERRORS
200section in the resulting documentation summarizing the errors.  C<none>
201ignores POD errors entirely, as much as possible.
202
203The default is C<die>.
204
205=item B<--fixed>=I<font>
206
207The fixed-width font to use for verbatim text and code.  Defaults to
208C<CW>.  Some systems may want C<CR> instead.  Only matters for troff(1)
209output.
210
211=item B<--fixedbold>=I<font>
212
213Bold version of the fixed-width font.  Defaults to C<CB>.  Only matters
214for troff(1) output.
215
216=item B<--fixeditalic>=I<font>
217
218Italic version of the fixed-width font (actually, something of a misnomer,
219since most fixed-width fonts only have an oblique version, not an italic
220version).  Defaults to C<CI>.  Only matters for troff(1) output.
221
222=item B<--fixedbolditalic>=I<font>
223
224Bold italic (probably actually oblique) version of the fixed-width font.
225Pod::Man doesn't assume you have this, and defaults to C<CB>.  Some
226systems (such as Solaris) have this font available as C<CX>.  Only matters
227for troff(1) output.
228
229=item B<-h>, B<--help>
230
231Print out usage information.
232
233=item B<-l>, B<--lax>
234
235No longer used.  B<pod2man> used to check its input for validity as a
236manual page, but this should now be done by L<podchecker(1)> instead.
237Accepted for backward compatibility; this option no longer does anything.
238
239=item B<-n> I<name>, B<--name>=I<name>
240
241Set the name of the manual page for the C<.TH> macro to I<name>.  Without
242this option, the manual name is set to the uppercased base name of the
243file being converted unless the manual section is 3, in which case the
244path is parsed to see if it is a Perl module path.  If it is, a path like
245C<.../lib/Pod/Man.pm> is converted into a name like C<Pod::Man>.  This
246option, if given, overrides any automatic determination of the name.
247
248Although one does not have to follow this convention, be aware that the
249convention for UNIX man pages for commands is for the man page title to be
250in all-uppercase, even if the command isn't.
251
252This option is probably not useful when converting multiple POD files at
253once.
254
255When converting POD source from standard input, this option is required,
256since there's otherwise no way to know what to use as the name of the
257manual page.
258
259=item B<--nourls>
260
261Normally, LZ<><> formatting codes with a URL but anchor text are formatted
262to show both the anchor text and the URL.  In other words:
263
264    L<foo|http://example.com/>
265
266is formatted as:
267
268    foo <http://example.com/>
269
270This flag, if given, suppresses the URL when anchor text is given, so this
271example would be formatted as just C<foo>.  This can produce less
272cluttered output in cases where the URLs are not particularly important.
273
274=item B<-o>, B<--official>
275
276Set the default header to indicate that this page is part of the standard
277Perl release, if B<--center> is not also given.
278
279=item B<-q> I<quotes>, B<--quotes>=I<quotes>
280
281Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
282I<quotes> is a single character, it is used as both the left and right
283quote.  Otherwise, it is split in half, and the first half of the string
284is used as the left quote and the second is used as the right quote.
285
286I<quotes> may also be set to the special value C<none>, in which case no
287quote marks are added around CE<lt>> text (but the font is still changed for
288troff output).
289
290=item B<-r> I<version>, B<--release>=I<version>
291
292Set the centered footer for the C<.TH> macro to I<version>.  By default,
293this is set to the version of Perl you run B<pod2man> under.  Setting this
294to the empty string will cause some *roff implementations to use the
295system default value.
296
297Note that some system C<an> macro sets assume that the centered footer
298will be a modification date and will prepend something like "Last
299modified: ".  If this is the case for your target system, you may want to
300set B<--release> to the last modified date and B<--date> to the version
301number.
302
303=item B<-s> I<string>, B<--section>=I<string>
304
305Set the section for the C<.TH> macro.  The standard section numbering
306convention is to use 1 for user commands, 2 for system calls, 3 for
307functions, 4 for devices, 5 for file formats, 6 for games, 7 for
308miscellaneous information, and 8 for administrator commands.  There is a lot
309of variation here, however; some systems (like Solaris) use 4 for file
310formats, 5 for miscellaneous information, and 7 for devices.  Still others
311use 1m instead of 8, or some mix of both.  About the only section numbers
312that are reliably consistent are 1, 2, and 3.
313
314By default, section 1 will be used unless the file ends in C<.pm>, in
315which case section 3 will be selected.
316
317=item B<--stderr>
318
319By default, B<pod2man> dies if any errors are detected in the POD input.
320If B<--stderr> is given and no B<--errors> flag is present, errors are
321sent to standard error, but B<pod2man> does not abort.  This is equivalent
322to C<--errors=stderr> and is supported for backward compatibility.
323
324=item B<-u>, B<--utf8>
325
326By default, B<pod2man> produces the most conservative possible *roff
327output to try to ensure that it will work with as many different *roff
328implementations as possible.  Many *roff implementations cannot handle
329non-ASCII characters, so this means all non-ASCII characters are converted
330either to a *roff escape sequence that tries to create a properly accented
331character (at least for troff output) or to C<X>.
332
333This option says to instead output literal UTF-8 characters.  If your
334*roff implementation can handle it, this is the best output format to use
335and avoids corruption of documents containing non-ASCII characters.
336However, be warned that *roff source with literal UTF-8 characters is not
337supported by many implementations and may even result in segfaults and
338other bad behavior.
339
340Be aware that, when using this option, the input encoding of your POD
341source should be properly declared unless it's US-ASCII.  Pod::Simple will
342attempt to guess the encoding and may be successful if it's Latin-1 or
343UTF-8, but it will warn, which by default results in a B<pod2man> failure.
344Use the C<=encoding> command to declare the encoding.  See L<perlpod(1)>
345for more information.
346
347=item B<-v>, B<--verbose>
348
349Print out the name of each output file as it is being generated.
350
351=back
352
353=head1 EXIT STATUS
354
355As long as all documents processed result in some output, even if that
356output includes errata (a C<POD ERRORS> section generated with
357C<--errors=pod>), B<pod2man> will exit with status 0.  If any of the
358documents being processed do not result in an output document, B<pod2man>
359will exit with status 1.  If there are syntax errors in a POD document
360being processed and the error handling style is set to the default of
361C<die>, B<pod2man> will abort immediately with exit status 255.
362
363=head1 DIAGNOSTICS
364
365If B<pod2man> fails with errors, see L<Pod::Man> and L<Pod::Simple> for
366information about what those errors might mean.
367
368=head1 EXAMPLES
369
370    pod2man program > program.1
371    pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3
372    pod2man --section=7 note.pod > note.7
373
374If you would like to print out a lot of man page continuously, you probably
375want to set the C and D registers to set contiguous page numbering and
376even/odd paging, at least on some versions of man(7).
377
378    troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ...
379
380To get index entries on C<STDERR>, turn on the F register, as in:
381
382    troff -man -rF1 perl.1
383
384The indexing merely outputs messages via C<.tm> for each major page,
385section, subsection, item, and any C<XE<lt>E<gt>> directives.  See
386L<Pod::Man> for more details.
387
388=head1 BUGS
389
390Lots of this documentation is duplicated from L<Pod::Man>.
391
392=head1 SEE ALSO
393
394L<Pod::Man>, L<Pod::Simple>, L<man(1)>, L<nroff(1)>, L<perlpod(1)>,
395L<podchecker(1)>, L<perlpodstyle(1)>, L<troff(1)>, L<man(7)>
396
397The man page documenting the an macro set may be L<man(5)> instead of
398L<man(7)> on your system.
399
400The current version of this script is always available from its web site at
401L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
402Perl core distribution as of 5.6.0.
403
404=head1 AUTHOR
405
406Russ Allbery <rra@cpan.org>, based I<very> heavily on the original
407B<pod2man> by Larry Wall and Tom Christiansen.
408
409=head1 COPYRIGHT AND LICENSE
410
411Copyright 1999, 2000, 2001, 2004, 2006, 2008, 2010, 2012, 2013, 2014,
4122015, 2016 Russ Allbery <rra@cpan.org>
413
414This program is free software; you may redistribute it and/or modify it
415under the same terms as Perl itself.
416
417=cut
418SCRIPT_BODY
419
420# Finish the generation of the script.
421close($out) or die "Cannot close $file: $!\n";
422chmod(0755, $file) or die "Cannot reset permissions for $file: $!\n";
423if ($Config{'eunicefix'} ne q{:}) {
424    exec("$Config{'eunicefix'} $file");
425}
426