| #! /usr/bin/env perl | 
 | # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. | 
 | # | 
 | # Licensed under the OpenSSL license (the "License").  You may not use | 
 | # this file except in compliance with the License.  You can obtain a copy | 
 | # in the file LICENSE in the source distribution or at | 
 | # https://www.openssl.org/source/license.html | 
 |  | 
 | use strict; | 
 | use warnings; | 
 |  | 
 | use File::Spec::Functions; | 
 | use File::Basename; | 
 | use File::Copy; | 
 | use File::Path; | 
 | use if $^O ne "VMS", 'File::Glob' => qw/glob/; | 
 | use Getopt::Long; | 
 | use Pod::Usage; | 
 |  | 
 | use lib '.'; | 
 | use configdata; | 
 |  | 
 | # We know we are in the 'util' directory and that our perl modules are | 
 | # in util/perl | 
 | use lib catdir(dirname($0), "perl"); | 
 | use OpenSSL::Util::Pod; | 
 |  | 
 | my %options = (); | 
 | GetOptions(\%options, | 
 |            'sourcedir=s',       # Source directory | 
 |            'section=i@',        # Subdirectories to look through, | 
 |                                 # with associated section numbers | 
 |            'destdir=s',         # Destination directory | 
 |            #'in=s@',             # Explicit files to process (ignores sourcedir) | 
 |            'type=s',            # The result type, 'man' or 'html' | 
 |            'remove',            # To remove files rather than writing them | 
 |            'dry-run|n',         # Only output file names on STDOUT | 
 |            'debug|D+', | 
 |           ); | 
 |  | 
 | unless ($options{section}) { | 
 |     $options{section} = [ 1, 3, 5, 7 ]; | 
 | } | 
 | unless ($options{sourcedir}) { | 
 |     $options{sourcedir} = catdir($config{sourcedir}, "doc"); | 
 | } | 
 | pod2usage(1) unless ( defined $options{section} | 
 |                       && defined $options{sourcedir} | 
 |                       && defined $options{destdir} | 
 |                       && defined $options{type} | 
 |                       && ($options{type} eq 'man' | 
 |                           || $options{type} eq 'html') ); | 
 |  | 
 | if ($options{debug}) { | 
 |     print STDERR "DEBUG: options:\n"; | 
 |     print STDERR "DEBUG:   --sourcedir = $options{sourcedir}\n" | 
 |         if defined $options{sourcedir}; | 
 |     print STDERR "DEBUG:   --destdir   = $options{destdir}\n" | 
 |         if defined $options{destdir}; | 
 |     print STDERR "DEBUG:   --type      = $options{type}\n" | 
 |         if defined $options{type}; | 
 |     foreach (sort @{$options{section}}) { | 
 |         print STDERR "DEBUG:   --section   = $_\n"; | 
 |     } | 
 |     print STDERR "DEBUG:   --remove    = $options{remove}\n" | 
 |         if defined $options{remove}; | 
 |     print STDERR "DEBUG:   --debug     = $options{debug}\n" | 
 |         if defined $options{debug}; | 
 |     print STDERR "DEBUG:   --dry-run   = $options{\"dry-run\"}\n" | 
 |         if defined $options{"dry-run"}; | 
 | } | 
 |  | 
 | my $symlink_exists = eval { symlink("",""); 1 }; | 
 |  | 
 | foreach my $section (sort @{$options{section}}) { | 
 |     my $subdir = "man$section"; | 
 |     my $podsourcedir = catfile($options{sourcedir}, $subdir); | 
 |     my $podglob = catfile($podsourcedir, "*.pod"); | 
 |  | 
 |     foreach my $podfile (glob $podglob) { | 
 |         my $podname = basename($podfile, ".pod"); | 
 |         my $podpath = catfile($podfile); | 
 |         my %podinfo = extract_pod_info($podpath, | 
 |                                        { debug => $options{debug}, | 
 |                                          section => $section }); | 
 |         my @podfiles = grep { $_ ne $podname } @{$podinfo{names}}; | 
 |  | 
 |         my $updir = updir(); | 
 |         my $name = uc $podname; | 
 |         my $suffix = { man  => ".$podinfo{section}", | 
 |                        html => ".html" } -> {$options{type}}; | 
 |         my $generate = { man  => "pod2man --name=$name --section=$podinfo{section} --center=OpenSSL --release=$config{version} \"$podpath\"", | 
 |                          html => "pod2html \"--podroot=$options{sourcedir}\" --htmldir=$updir --podpath=man1:man3:man5:man7 \"--infile=$podpath\" \"--title=$podname\"" | 
 |                          } -> {$options{type}}; | 
 |         my $output_dir = catdir($options{destdir}, "man$podinfo{section}"); | 
 |         my $output_file = $podname . $suffix; | 
 |         my $output_path = catfile($output_dir, $output_file); | 
 |  | 
 |         if (! $options{remove}) { | 
 |             my @output; | 
 |             print STDERR "DEBUG: Processing, using \"$generate\"\n" | 
 |                 if $options{debug}; | 
 |             unless ($options{"dry-run"}) { | 
 |                 @output = `$generate`; | 
 |                 map { s|href="http://man\.he\.net/(man\d/[^"]+)(?:\.html)?"|href="../$1.html"|g; } @output | 
 |                     if $options{type} eq "html"; | 
 |             } | 
 |             print STDERR "DEBUG: Done processing\n" if $options{debug}; | 
 |  | 
 |             if (! -d $output_dir) { | 
 |                 print STDERR "DEBUG: Creating directory $output_dir\n" if $options{debug}; | 
 |                 unless ($options{"dry-run"}) { | 
 |                     mkpath $output_dir | 
 |                         or die "Trying to create directory $output_dir: $!\n"; | 
 |                 } | 
 |             } | 
 |             print STDERR "DEBUG: Writing $output_path\n" if $options{debug}; | 
 |             unless ($options{"dry-run"}) { | 
 |                 open my $output_fh, '>', $output_path | 
 |                     or die "Trying to write to $output_path: $!\n"; | 
 |                 foreach (@output) { | 
 |                     print $output_fh $_; | 
 |                 } | 
 |                 close $output_fh; | 
 |             } | 
 |             print STDERR "DEBUG: Done writing $output_path\n" if $options{debug}; | 
 |         } else { | 
 |             print STDERR "DEBUG: Removing $output_path\n" if $options{debug}; | 
 |             unless ($options{"dry-run"}) { | 
 |                 while (unlink $output_path) {} | 
 |             } | 
 |         } | 
 |         print "$output_path\n"; | 
 |  | 
 |         foreach (@podfiles) { | 
 |             my $link_file = $_ . $suffix; | 
 |             my $link_path = catfile($output_dir, $link_file); | 
 |             if (! $options{remove}) { | 
 |                 if ($symlink_exists) { | 
 |                     print STDERR "DEBUG: Linking $link_path -> $output_file\n" | 
 |                         if $options{debug}; | 
 |                     unless ($options{"dry-run"}) { | 
 |                         symlink $output_file, $link_path; | 
 |                     } | 
 |                 } else { | 
 |                     print STDERR "DEBUG: Copying $output_path to link_path\n" | 
 |                         if $options{debug}; | 
 |                     unless ($options{"dry-run"}) { | 
 |                         copy $output_path, $link_path; | 
 |                     } | 
 |                 } | 
 |             } else { | 
 |                 print STDERR "DEBUG: Removing $link_path\n" if $options{debug}; | 
 |                 unless ($options{"dry-run"}) { | 
 |                     while (unlink $link_path) {} | 
 |                 } | 
 |             } | 
 |             print "$link_path -> $output_path\n"; | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | __END__ | 
 |  | 
 | =pod | 
 |  | 
 | =head1 NAME | 
 |  | 
 | process_docs.pl - A script to process OpenSSL docs | 
 |  | 
 | =head1 SYNOPSIS | 
 |  | 
 | B<process_docs.pl> | 
 | [B<--sourcedir>=I<dir>] | 
 | B<--destdir>=I<dir> | 
 | B<--type>=B<man>|B<html> | 
 | [B<--remove>] | 
 | [B<--dry-run>|B<-n>] | 
 | [B<--debug>|B<-D>] | 
 |  | 
 | =head1 DESCRIPTION | 
 |  | 
 | This script looks for .pod files in the subdirectories 'apps', 'crypto' | 
 | and 'ssl' under the given source directory. | 
 |  | 
 | The OpenSSL configuration data file F<configdata.pm> I<must> reside in | 
 | the current directory, I<or> perl must have the directory it resides in | 
 | in its inclusion array.  For the latter variant, a call like this would | 
 | work: | 
 |  | 
 |  perl -I../foo util/process_docs.pl {options ...} | 
 |  | 
 | =head1 OPTIONS | 
 |  | 
 | =over 4 | 
 |  | 
 | =item B<--sourcedir>=I<dir> | 
 |  | 
 | Top directory where the source files are found. | 
 |  | 
 | =item B<--destdir>=I<dir> | 
 |  | 
 | Top directory where the resulting files should end up | 
 |  | 
 | =item B<--type>=B<man>|B<html> | 
 |  | 
 | Type of output to produce.  Currently supported are man pages and HTML files. | 
 |  | 
 | =item B<--remove> | 
 |  | 
 | Instead of writing the files, remove them. | 
 |  | 
 | =item B<--dry-run>|B<-n> | 
 |  | 
 | Do not perform any file writing, directory creation or file removal. | 
 |  | 
 | =item B<--debug>|B<-D> | 
 |  | 
 | Print extra debugging output. | 
 |  | 
 | =back | 
 |  | 
 | =head1 COPYRIGHT | 
 |  | 
 | Copyright 2013-2016 The OpenSSL Project Authors. All Rights Reserved. | 
 |  | 
 | Licensed under the OpenSSL license (the "License").  You may not use | 
 | this file except in compliance with the License.  You can obtain a copy | 
 | in the file LICENSE in the source distribution or at | 
 | https://www.openssl.org/source/license.html | 
 |  | 
 | =cut |