xref: /openbsd-src/gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL (revision d59bb9942320b767f2a19aaa7690c8c6e30b724c)
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 --no-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<--no-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
326This option allows B<pod2man> to output literal UTF-8 characters.
327On OpenBSD, it is enabled by default and can be disabled with
328B<--no-utf8>, in which case non-ASCII characters are converted
329either to *roff escape sequences or to C<X>.
330
331Be aware that, when using this option, the input encoding of your POD
332source should be properly declared unless it's US-ASCII.  Pod::Simple will
333attempt to guess the encoding and may be successful if it's Latin-1 or
334UTF-8, but it will warn, which by default results in a B<pod2man> failure.
335Use the C<=encoding> command to declare the encoding.  See L<perlpod(1)>
336for more information.
337
338=item B<-v>, B<--verbose>
339
340Print out the name of each output file as it is being generated.
341
342=back
343
344=head1 EXIT STATUS
345
346As long as all documents processed result in some output, even if that
347output includes errata (a C<POD ERRORS> section generated with
348C<--errors=pod>), B<pod2man> will exit with status 0.  If any of the
349documents being processed do not result in an output document, B<pod2man>
350will exit with status 1.  If there are syntax errors in a POD document
351being processed and the error handling style is set to the default of
352C<die>, B<pod2man> will abort immediately with exit status 255.
353
354=head1 DIAGNOSTICS
355
356If B<pod2man> fails with errors, see L<Pod::Man> and L<Pod::Simple> for
357information about what those errors might mean.
358
359=head1 EXAMPLES
360
361    pod2man program > program.1
362    pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3
363    pod2man --section=7 note.pod > note.7
364
365If you would like to print out a lot of man page continuously, you probably
366want to set the C and D registers to set contiguous page numbering and
367even/odd paging, at least on some versions of man(7).
368
369    troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ...
370
371To get index entries on C<STDERR>, turn on the F register, as in:
372
373    troff -man -rF1 perl.1
374
375The indexing merely outputs messages via C<.tm> for each major page,
376section, subsection, item, and any C<XE<lt>E<gt>> directives.  See
377L<Pod::Man> for more details.
378
379=head1 BUGS
380
381Lots of this documentation is duplicated from L<Pod::Man>.
382
383=head1 SEE ALSO
384
385L<Pod::Man>, L<Pod::Simple>, L<man(1)>, L<nroff(1)>, L<perlpod(1)>,
386L<podchecker(1)>, L<perlpodstyle(1)>, L<troff(1)>, L<man(7)>
387
388The man page documenting the an macro set may be L<man(5)> instead of
389L<man(7)> on your system.
390
391The current version of this script is always available from its web site at
392L<http://www.eyrie.org/~eagle/software/podlators/>.  It is also part of the
393Perl core distribution as of 5.6.0.
394
395=head1 AUTHOR
396
397Russ Allbery <rra@cpan.org>, based I<very> heavily on the original
398B<pod2man> by Larry Wall and Tom Christiansen.
399
400=head1 COPYRIGHT AND LICENSE
401
402Copyright 1999, 2000, 2001, 2004, 2006, 2008, 2010, 2012, 2013, 2014,
4032015, 2016 Russ Allbery <rra@cpan.org>
404
405This program is free software; you may redistribute it and/or modify it
406under the same terms as Perl itself.
407
408=cut
409SCRIPT_BODY
410
411# Finish the generation of the script.
412close($out) or die "Cannot close $file: $!\n";
413chmod(0755, $file) or die "Cannot reset permissions for $file: $!\n";
414if ($Config{'eunicefix'} ne q{:}) {
415    exec("$Config{'eunicefix'} $file");
416}
417