1b8851fccSafresh1# Build instructions for podlators.
2b8851fccSafresh1#
3b8851fccSafresh1# We need to use ExtUtils::MakeMaker since this module is part of Perl core,
4b8851fccSafresh1# which only supports that build method, and because it is a dependency of
5b8851fccSafresh1# other build systems like Module::Build.
6b8851fccSafresh1#
7*e0680481Safresh1# Copyright 1999-2001, 2008, 2010, 2012, 2014-2016, 2018-2019, 2022
8b8851fccSafresh1#     Russ Allbery <rra@cpan.org>
9b8851fccSafresh1#
10b8851fccSafresh1# This program is free software; you may redistribute it and/or modify it
11b8851fccSafresh1# under the same terms as Perl itself.
12b46d8ef2Safresh1#
13b46d8ef2Safresh1# SPDX-License-Identifier: GPL-1.0-or-later OR Artistic-1.0-Perl
14b8851fccSafresh1
1556d68f1eSafresh1use 5.008;
16b8851fccSafresh1use strict;
17b8851fccSafresh1use warnings;
18b8851fccSafresh1
19b8851fccSafresh1use Config;
20b8851fccSafresh1use ExtUtils::MakeMaker;
21b8851fccSafresh1use File::Spec;
22b8851fccSafresh1
23b46d8ef2Safresh1# Determine the version of the distribution so that we can construct the
24b46d8ef2Safresh1# provides metadata that unfortunately ExtUtils::MakeMaker does not build.
25b46d8ef2Safresh1# This is a very simple $VERSION parser, since it only has to handle the
26b46d8ef2Safresh1# syntax Pod::Man uses.
27b46d8ef2Safresh1#
28b46d8ef2Safresh1# Returns: Distribution version as a string
29b46d8ef2Safresh1sub dist_version {
30b46d8ef2Safresh1    open(my $fh, '<', File::Spec->catfile('lib', 'Pod', 'Man.pm'))
31b46d8ef2Safresh1      or die "$0: cannot open lib/Pod/Man.pm: $!\n";
32b46d8ef2Safresh1    while (defined(my $line = <$fh>)) {
33*e0680481Safresh1        if ($line =~ m{ \A (?:our \s+)? \$VERSION \s+ = \s+ '([^\']+)' }xms) {
34b46d8ef2Safresh1            close($fh) or die "$0: cannot close lib/Pod/Man.pm\n";
35b46d8ef2Safresh1            return $1;
36b46d8ef2Safresh1        }
37b46d8ef2Safresh1    }
38b46d8ef2Safresh1    close($fh) or die "$0: cannot close lib/Pod/Man.pm\n";
39b46d8ef2Safresh1    die "$0: cannot find version in lib/Pod/Man.pm\n";
40b46d8ef2Safresh1}
41b46d8ef2Safresh1
42b8851fccSafresh1# Generate full paths for scripts distributed in the bin directory.  Appends
43b8851fccSafresh1# the .com extension to scripts on VMS, unless they already have the .PL
44b8851fccSafresh1# extension.
45b8851fccSafresh1#
46b8851fccSafresh1# @scripts - List of script names
47b8851fccSafresh1#
48b8851fccSafresh1# Returns: (Array) List of relative paths from top of distribution
49b8851fccSafresh1#          (Scalar) Space-separated relative paths from top of distribution
50b8851fccSafresh1sub scripts {
51b8851fccSafresh1    my (@scripts) = @_;
52b8851fccSafresh1    my @paths = map { File::Spec->catfile('scripts', $_) } @scripts;
53b8851fccSafresh1    if ($^O eq 'VMS') {
54b8851fccSafresh1        @paths = map { m{ [.] PL \z }xms ? $_ : $_ . '.com' } @paths;
55b8851fccSafresh1    }
56b8851fccSafresh1    return wantarray ? @paths : join(q{ }, @paths);
57b8851fccSafresh1}
58b8851fccSafresh1
59b8851fccSafresh1# Generate an association between a source file and a destination man page for
60b8851fccSafresh1# non-module man pages.  ExtUtils::MakeMaker only really understands how to
61b8851fccSafresh1# generate man pages for modules, so we need to help it for the script man
62b8851fccSafresh1# pages and (particularly) the perlpodstyle man page.
63b8851fccSafresh1#
64b8851fccSafresh1# $directory - Directory containing the file
65b8851fccSafresh1# $file      - File containing POD in that directory
66b8851fccSafresh1#
67b8851fccSafresh1# Returns: The path to the file with POD and the output man page, as a pair
68b8851fccSafresh1sub man1pod {
69b8851fccSafresh1    my ($directory, $file) = @_;
70b8851fccSafresh1
71b8851fccSafresh1    # Build the base name of the file by stripping any *.pod or *.PL suffix.
72b8851fccSafresh1    my $basename = $file;
73b8851fccSafresh1    $basename =~ s{ [.] (?: pod | PL ) \z }{}xms;
74b8851fccSafresh1
75b8851fccSafresh1    # Determine the output file name for the generated man page.
76b8851fccSafresh1    my $outname = $basename . q{.} . $Config{man1ext};
77b8851fccSafresh1    my $outpath = File::Spec->catfile(qw(blib man1), $outname);
78b8851fccSafresh1    return (File::Spec->catfile($directory, $file), $outpath);
79b8851fccSafresh1}
80b8851fccSafresh1
81b8851fccSafresh1# The hash of all the metadata.  This will be modified before WriteMakefile to
82b8851fccSafresh1# remove keys not supported by the local version of ExtUtils::MakeMaker.
83b46d8ef2Safresh1my $dist_version = dist_version();
84b8851fccSafresh1my %metadata = (
85*e0680481Safresh1    #<<<
86b8851fccSafresh1    NAME             => 'Pod',
87b8851fccSafresh1    DISTNAME         => 'podlators',
88b8851fccSafresh1    ABSTRACT         => 'Convert POD data to various other formats',
89b8851fccSafresh1    AUTHOR           => 'Russ Allbery <rra@cpan.org>',
90b8851fccSafresh1    LICENSE          => 'perl_5',
91b8851fccSafresh1    EXE_FILES        => [scripts('pod2text', 'pod2man')],
92b8851fccSafresh1    VERSION_FROM     => 'lib/Pod/Man.pm',
93*e0680481Safresh1    MIN_PERL_VERSION => '5.010',
94*e0680481Safresh1    #>>>
95b8851fccSafresh1
96b8851fccSafresh1    # Use *.PL files to generate the driver scripts so that we get the correct
97b8851fccSafresh1    # invocation of Perl on non-UNIX platforms.
98b8851fccSafresh1    PL_FILES => {
99b8851fccSafresh1        scripts('pod2man.PL', 'pod2man'), scripts('pod2text.PL', 'pod2text'),
100b8851fccSafresh1    },
101b8851fccSafresh1
102b8851fccSafresh1    # Override the files that generate section 1 man pages.
103b8851fccSafresh1    MAN1PODS => {
104b8851fccSafresh1        man1pod('scripts', 'pod2man.PL'),
105b8851fccSafresh1        man1pod('scripts', 'pod2text.PL'),
106b8851fccSafresh1
107b8851fccSafresh1        # Perl core uses a separate copy in the top-level pod directory.
108b8851fccSafresh1        ($ENV{PERL_CORE} ? () : man1pod('pod', 'perlpodstyle.pod')),
109b8851fccSafresh1    },
110b8851fccSafresh1
111b8851fccSafresh1    # Clean some additional files.
112b8851fccSafresh1    clean => { FILES => File::Spec->catdir('t', 'tmp') },
113b8851fccSafresh1    realclean => { FILES => scalar(scripts('pod2text', 'pod2man')) },
114b8851fccSafresh1
115b8851fccSafresh1    # Dependencies on other modules.
116*e0680481Safresh1    PREREQ_PM => { 'Pod::Simple' => 3.26 },
117b8851fccSafresh1
118b8851fccSafresh1    # Older versions of ExtUtils::MakeMaker don't pick up nested test
119b8851fccSafresh1    # directories by default.
120b8851fccSafresh1    test => { TESTS => 't/*/*.t' },
121b8851fccSafresh1
122b8851fccSafresh1    # For older versions of Perl, we have to force installation into the Perl
123b8851fccSafresh1    # module directories since site modules did not take precedence over core
124b8851fccSafresh1    # modules.
125b8851fccSafresh1    INSTALLDIRS => $] lt '5.011' ? 'perl' : 'site',
126b8851fccSafresh1
127b8851fccSafresh1    # Additional metadata.
128b8851fccSafresh1    META_ADD => {
129b8851fccSafresh1        'meta-spec' => { version => 2 },
130b46d8ef2Safresh1        provides => {
131b46d8ef2Safresh1            'Pod::Man' => {
132b46d8ef2Safresh1                file => 'lib/Pod/Man.pm',
133b46d8ef2Safresh1                version => $dist_version,
134b46d8ef2Safresh1            },
135b46d8ef2Safresh1            'Pod::ParseLink' => {
136b46d8ef2Safresh1                file => 'lib/Pod/ParseLink.pm',
137b46d8ef2Safresh1                version => $dist_version,
138b46d8ef2Safresh1            },
139b46d8ef2Safresh1            'Pod::Text' => {
140b46d8ef2Safresh1                file => 'lib/Pod/Text.pm',
141b46d8ef2Safresh1                version => $dist_version,
142b46d8ef2Safresh1            },
143b46d8ef2Safresh1            'Pod::Text::Color' => {
144b46d8ef2Safresh1                file => 'lib/Pod/Text/Color.pm',
145b46d8ef2Safresh1                version => $dist_version,
146b46d8ef2Safresh1            },
147b46d8ef2Safresh1            'Pod::Text::Overstrike' => {
148b46d8ef2Safresh1                file => 'lib/Pod/Text/Overstrike.pm',
149b46d8ef2Safresh1                version => $dist_version,
150b46d8ef2Safresh1            },
151b46d8ef2Safresh1            'Pod::Text::Termcap' => {
152b46d8ef2Safresh1                file => 'lib/Pod/Text/Termcap.pm',
153b46d8ef2Safresh1                version => $dist_version,
154b46d8ef2Safresh1            },
155b46d8ef2Safresh1        },
156b8851fccSafresh1        resources => {
157b8851fccSafresh1            bugtracker => {
158*e0680481Safresh1                web => 'https://github.com/rra/podlators/issues',
159b8851fccSafresh1            },
160b46d8ef2Safresh1            homepage => 'https://www.eyrie.org/~eagle/software/podlators/',
161b8851fccSafresh1            repository => {
162b46d8ef2Safresh1                url => 'https://github.com/rra/podlators.git',
163b8851fccSafresh1                web => 'https://github.com/rra/podlators',
164b8851fccSafresh1                type => 'git',
165b8851fccSafresh1            },
166b8851fccSafresh1        },
167b8851fccSafresh1    },
168b8851fccSafresh1);
169b8851fccSafresh1
170b8851fccSafresh1# Remove keys that aren't supported by this version of ExtUtils::MakeMaker.
171b8851fccSafresh1# This hash maps keys to the minimum supported version.
172b8851fccSafresh1my %supported = (
173b8851fccSafresh1    LICENSE => 6.31,
174b8851fccSafresh1    META_ADD => 6.46,
175b8851fccSafresh1    MIN_PERL_VERSION => 6.48,
176b8851fccSafresh1);
177b8851fccSafresh1for my $key (keys(%supported)) {
178b8851fccSafresh1    if ($ExtUtils::MakeMaker::VERSION < $supported{$key}) {
179b8851fccSafresh1        delete $metadata{$key};
180b8851fccSafresh1    }
181b8851fccSafresh1}
182b8851fccSafresh1
183b8851fccSafresh1# Generate the actual Makefile.  Pick an arbitrary module to pull the version
184b8851fccSafresh1# from, since they should all have the same version.
185b8851fccSafresh1WriteMakefile(%metadata);
186