]> git.ipfire.org Git - thirdparty/openssl.git/blame - util/process_docs.pl
Following the license change, modify the boilerplates in util/, tools/
[thirdparty/openssl.git] / util / process_docs.pl
CommitLineData
2bc57c88 1#! /usr/bin/env perl
83cf7abf 2# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
2bc57c88 3#
9059ab42 4# Licensed under the Apache License 2.0 (the "License"). You may not use
2bc57c88
RL
5# this file except in compliance with the License. You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
9use strict;
10use warnings;
11
12use File::Spec::Functions;
13use File::Basename;
14use File::Copy;
15use File::Path;
8d2214c0
RL
16use FindBin;
17use lib "$FindBin::Bin/perl";
18use OpenSSL::Glob;
2bc57c88
RL
19use Getopt::Long;
20use Pod::Usage;
21
22use lib '.';
23use configdata;
24
ee2c1a25
RL
25# We know we are in the 'util' directory and that our perl modules are
26# in util/perl
27use lib catdir(dirname($0), "perl");
28use OpenSSL::Util::Pod;
29
2bc57c88
RL
30my %options = ();
31GetOptions(\%options,
b608fabf 32 'sourcedir=s@', # Source directories
99d63d46 33 'section=i@', # Subdirectories to look through,
2bc57c88
RL
34 # with associated section numbers
35 'destdir=s', # Destination directory
36 #'in=s@', # Explicit files to process (ignores sourcedir)
2bc57c88 37 'type=s', # The result type, 'man' or 'html'
579a6745
RL
38 'suffix:s', # Suffix to add to the extension.
39 # Only used with type=man
2bc57c88
RL
40 'remove', # To remove files rather than writing them
41 'dry-run|n', # Only output file names on STDOUT
42 'debug|D+',
43 );
44
99d63d46
RS
45unless ($options{section}) {
46 $options{section} = [ 1, 3, 5, 7 ];
2bc57c88
RL
47}
48unless ($options{sourcedir}) {
b608fabf
RL
49 $options{sourcedir} = [ catdir($config{sourcedir}, "doc"),
50 catdir($config{builddir}, "doc") ];
2bc57c88 51}
99d63d46 52pod2usage(1) unless ( defined $options{section}
2bc57c88
RL
53 && defined $options{sourcedir}
54 && defined $options{destdir}
55 && defined $options{type}
56 && ($options{type} eq 'man'
57 || $options{type} eq 'html') );
579a6745
RL
58pod2usage(1) if ( $options{type} eq 'html'
59 && defined $options{suffix} );
2bc57c88
RL
60
61if ($options{debug}) {
62 print STDERR "DEBUG: options:\n";
b608fabf
RL
63 foreach (sort @{$options{sourcedir}}) {
64 print STDERR "DEBUG: --sourcedir = $_\n";
65 }
2bc57c88
RL
66 print STDERR "DEBUG: --destdir = $options{destdir}\n"
67 if defined $options{destdir};
68 print STDERR "DEBUG: --type = $options{type}\n"
69 if defined $options{type};
579a6745
RL
70 print STDERR "DEBUG: --suffix = $options{suffix}\n"
71 if defined $options{suffix};
99d63d46
RS
72 foreach (sort @{$options{section}}) {
73 print STDERR "DEBUG: --section = $_\n";
2bc57c88
RL
74 }
75 print STDERR "DEBUG: --remove = $options{remove}\n"
76 if defined $options{remove};
77 print STDERR "DEBUG: --debug = $options{debug}\n"
78 if defined $options{debug};
79 print STDERR "DEBUG: --dry-run = $options{\"dry-run\"}\n"
80 if defined $options{"dry-run"};
81}
82
83my $symlink_exists = eval { symlink("",""); 1 };
84
99d63d46
RS
85foreach my $section (sort @{$options{section}}) {
86 my $subdir = "man$section";
b608fabf
RL
87 my @podsourcedirs = map { catfile($_, $subdir); } @{$options{sourcedir}};
88 my @podglobs = map { catfile($_, "*.pod"); } @podsourcedirs;
2bc57c88 89
b608fabf 90 foreach my $podfile (map { glob $_ } @podglobs) {
2bc57c88
RL
91 my $podname = basename($podfile, ".pod");
92 my $podpath = catfile($podfile);
ee2c1a25
RL
93 my %podinfo = extract_pod_info($podpath,
94 { debug => $options{debug},
95 section => $section });
96 my @podfiles = grep { $_ ne $podname } @{$podinfo{names}};
2bc57c88
RL
97
98 my $updir = updir();
99 my $name = uc $podname;
579a6745 100 my $suffix = { man => ".$podinfo{section}".($options{suffix} // ""),
2bc57c88
RL
101 html => ".html" } -> {$options{type}};
102 my $generate = { man => "pod2man --name=$name --section=$podinfo{section} --center=OpenSSL --release=$config{version} \"$podpath\"",
6439e343 103 html => "pod2html \"--podroot=$options{sourcedir}\" --htmldir=$updir --podpath=man1:man3:man5:man7 \"--infile=$podpath\" \"--title=$podname\" --quiet"
2bc57c88
RL
104 } -> {$options{type}};
105 my $output_dir = catdir($options{destdir}, "man$podinfo{section}");
106 my $output_file = $podname . $suffix;
107 my $output_path = catfile($output_dir, $output_file);
108
109 if (! $options{remove}) {
110 my @output;
111 print STDERR "DEBUG: Processing, using \"$generate\"\n"
112 if $options{debug};
113 unless ($options{"dry-run"}) {
114 @output = `$generate`;
c2e1ec49 115 map { s|href="http://man\.he\.net/(man\d/[^"]+)(?:\.html)?"|href="../$1.html"|g; } @output
2bc57c88 116 if $options{type} eq "html";
8d483b2d
RL
117 if ($options{type} eq "man") {
118 # Because some *roff parsers are more strict than others,
119 # multiple lines in the NAME section must be merged into
120 # one.
121 my $in_name = 0;
122 my $name_line = "";
123 my @newoutput = ();
124 foreach (@output) {
125 if ($in_name) {
126 if (/^\.SH "/) {
127 $in_name = 0;
128 push @newoutput, $name_line."\n";
129 } else {
130 chomp (my $x = $_);
131 $name_line .= " " if $name_line;
132 $name_line .= $x;
133 next;
134 }
135 }
136 if (/^\.SH +"NAME" *$/) {
137 $in_name = 1;
138 }
139 push @newoutput, $_;
140 }
141 @output = @newoutput;
142 }
2bc57c88
RL
143 }
144 print STDERR "DEBUG: Done processing\n" if $options{debug};
145
146 if (! -d $output_dir) {
147 print STDERR "DEBUG: Creating directory $output_dir\n" if $options{debug};
148 unless ($options{"dry-run"}) {
149 mkpath $output_dir
150 or die "Trying to create directory $output_dir: $!\n";
151 }
152 }
153 print STDERR "DEBUG: Writing $output_path\n" if $options{debug};
154 unless ($options{"dry-run"}) {
155 open my $output_fh, '>', $output_path
156 or die "Trying to write to $output_path: $!\n";
157 foreach (@output) {
158 print $output_fh $_;
159 }
160 close $output_fh;
161 }
162 print STDERR "DEBUG: Done writing $output_path\n" if $options{debug};
163 } else {
164 print STDERR "DEBUG: Removing $output_path\n" if $options{debug};
165 unless ($options{"dry-run"}) {
166 while (unlink $output_path) {}
167 }
168 }
169 print "$output_path\n";
170
171 foreach (@podfiles) {
172 my $link_file = $_ . $suffix;
173 my $link_path = catfile($output_dir, $link_file);
174 if (! $options{remove}) {
175 if ($symlink_exists) {
176 print STDERR "DEBUG: Linking $link_path -> $output_file\n"
177 if $options{debug};
178 unless ($options{"dry-run"}) {
179 symlink $output_file, $link_path;
180 }
181 } else {
182 print STDERR "DEBUG: Copying $output_path to link_path\n"
183 if $options{debug};
184 unless ($options{"dry-run"}) {
185 copy $output_path, $link_path;
186 }
187 }
188 } else {
189 print STDERR "DEBUG: Removing $link_path\n" if $options{debug};
190 unless ($options{"dry-run"}) {
191 while (unlink $link_path) {}
192 }
193 }
194 print "$link_path -> $output_path\n";
195 }
196 }
197}
198
199__END__
200
201=pod
202
203=head1 NAME
204
205process_docs.pl - A script to process OpenSSL docs
206
207=head1 SYNOPSIS
208
209B<process_docs.pl>
210[B<--sourcedir>=I<dir>]
211B<--destdir>=I<dir>
212B<--type>=B<man>|B<html>
579a6745 213[B<--suffix>=I<suffix>]
2bc57c88
RL
214[B<--remove>]
215[B<--dry-run>|B<-n>]
216[B<--debug>|B<-D>]
217
218=head1 DESCRIPTION
219
220This script looks for .pod files in the subdirectories 'apps', 'crypto'
221and 'ssl' under the given source directory.
222
223The OpenSSL configuration data file F<configdata.pm> I<must> reside in
224the current directory, I<or> perl must have the directory it resides in
225in its inclusion array. For the latter variant, a call like this would
226work:
227
228 perl -I../foo util/process_docs.pl {options ...}
229
230=head1 OPTIONS
231
232=over 4
233
234=item B<--sourcedir>=I<dir>
235
236Top directory where the source files are found.
237
238=item B<--destdir>=I<dir>
239
240Top directory where the resulting files should end up
241
242=item B<--type>=B<man>|B<html>
243
244Type of output to produce. Currently supported are man pages and HTML files.
245
579a6745
RL
246=item B<--suffix>=I<suffix>
247
248A suffix added to the extension. Only valid with B<--type>=B<man>
249
2bc57c88
RL
250=item B<--remove>
251
252Instead of writing the files, remove them.
253
254=item B<--dry-run>|B<-n>
255
256Do not perform any file writing, directory creation or file removal.
257
258=item B<--debug>|B<-D>
259
260Print extra debugging output.
261
262=back
263
264=head1 COPYRIGHT
265
83cf7abf 266Copyright 2013-2018 The OpenSSL Project Authors. All Rights Reserved.
2bc57c88 267
9059ab42 268Licensed under the Apache License 2.0 (the "License"). You may not use
2bc57c88
RL
269this file except in compliance with the License. You can obtain a copy
270in the file LICENSE in the source distribution or at
271https://www.openssl.org/source/license.html
272
273=cut