#!/usr/bin/perl
use warnings;
use strict;
# This program generates a 'Build.PL' file for the distribution from
# information in 'META.yml'.
use YAML qw( LoadFile );
my $meta = LoadFile('META.yml');
my $scripts;
my %extra_files;
{
open my $manifest, '<', 'MANIFEST'
or die "$0: error opening 'MANIFEST': $!\n";
my @scripts;
while (<$manifest>) {
push @scripts, $1
if m!^(bin/[^/\s]+)$!;
$extra_files{$1} = $1
if m!^(lib/.*\.(\w+))$! && $2 ne 'pm';
}
$scripts = join ' ', @scripts;
}
my $requires = module_map(%{$meta->{requires}});
my $build_requires = module_map(%{$meta->{build_requires}});
my $recommends = module_map(
map { map { %{$_->{requires}} } values %$_ }
@{$meta->{optional_features}},
);
my $extra_files = module_map(%extra_files);
open my $build, '>', 'Build.PL'
or die "$0: error opening 'Build.PL' for writing: $!\n";
print $build <<EOF;
#!/usr/bin/perl
use warnings;
use strict;
require 5.8.0;
# Automatically generated by $0
use Module::Build;
# Override the 'distmeta' action so that Module::Build won't delete
# my nice hand-crafted 'META.yml' file.
my \$class = Module::Build->subclass(
class => 'Daizu::Keep::Meta::Yml',
code => q(
sub ACTION_distmeta { \$_[0]->{metafile} = 'META.yml' }
),
);
my \$build = \$class->new(
module_name => '$meta->{name}',
dist_version => '$meta->{version}',
dist_abstract => '$meta->{abstract}',
dist_author => '$meta->{author}[0]',
license => '$meta->{license}',
requires => {
$requires,
},
build_requires => {
$build_requires,
},
recommends => {
$recommends,
},
dynamic_config => $meta->{dynamic_config},
script_files => [qw[ $scripts ]],
extra_files => {
$extra_files,
},
);
\$build->add_build_element('extra');
\$build->create_build_script;
EOF
close $build
or die "$0: error closing 'Build.PL': $!\n";
sub module_map
{
my (%modules) = @_;
return join ",\n ",
map { "'$_' => '$modules{$_}'" }
sort
keys %modules;
}
# vi:ts=4 sw=4 expandtab