291 changes: 104 additions & 187 deletions Makefile.PL
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
BEGIN { push @INC, '.' unless $INC[-1] eq '.' }
use inc::Module::Install 1.06;
use strict;
use warnings;

# to deal wuth x.y.z versions properly
configure_requires 'ExtUtils::MakeMaker' => '6.54';

perl_version '5.008001';

my $deps = {
requires => {
use ExtUtils::MakeMaker;
use File::ShareDir::Install;
do './maint/Makefile.PL.include' or die $@
unless -f 'META.yml';
my $eumm_version = eval $ExtUtils::MakeMaker::VERSION;

my %eumm_args = (
NAME => 'SQL::Translator',
ABSTRACT => 'SQL DDL transformations and more',
VERSION_FROM => 'lib/SQL/Translator.pm',
LICENSE => 'perl',
MIN_PERL_VERSION => '5.008001',
CONFIGURE_REQUIRES => {
'ExtUtils::MakeMaker' => '6.54', # to deal with x.y.z versions properly
'File::ShareDir::Install' => '0',
},
TEST_REQUIRES => {
'JSON::MaybeXS' => '1.003003',
'YAML' => '0.66',
'XML::Writer' => '0.500',
'Test::More' => '0.88',
'Test::Differences' => '0',
'Test::Exception' => '0.31',
'Text::ParseWords' => '0',
},
PREREQ_PM => {
'Digest::SHA' => '0',
'Carp::Clan' => '0',
'Parse::RecDescent' => '1.967009',
Expand All @@ -21,186 +37,87 @@ my $deps = {
'Try::Tiny' => '0.04',
'Scalar::Util' => '0',
},
recommends => {
'Template' => '2.20',
'GD' => '0',
'GraphViz' => '0',
'Graph::Directed' => '0',
'Spreadsheet::ParseExcel' => '0.41',
'Text::RecordParser' => '0.02',
'XML::LibXML' => '1.69',
realclean => {
FILES => 't/data/roundtrip_autogen.yaml'
},
test_requires => {
'JSON::MaybeXS' => '1.003003',
'YAML' => '0.66',
'XML::Writer' => '0.500',
'Test::More' => '0.88',
'Test::Differences' => '0',
'Test::Exception' => '0.31',
'Text::ParseWords' => '0',
},
};


name 'SQL-Translator';
author 'Ken Youens-Clark <kclark@cpan.org>';
abstract 'SQL DDL transformations and more';
license 'perl';

resources repository => 'https://github.com/dbsrgits/sql-translator/';
resources bugtracker => 'https://rt.cpan.org/NoAuth/Bugs.html?Dist=SQL-Translator';
resources Ratings => 'http://cpanratings.perl.org/d/SQL-Translator';
resources IRC => 'irc://irc.perl.org/#sql-translator';

Meta->{values}{x_authority} = 'cpan:JROBINSON';

all_from 'lib/SQL/Translator.pm';

for my $type (qw/requires recommends test_requires/) {
no strict qw/refs/;
my $f = \&$type;
for my $mod (sort keys %{$deps->{$type} || {} }) {
$f->($mod, $deps->{$type}{$mod});
}
}

install_script (qw|
script/sqlt-diagram
script/sqlt-diff
script/sqlt-diff-old
script/sqlt-dumper
script/sqlt-graph
script/sqlt
|);

install_share();

tests_recursive ();

if ($Module::Install::AUTHOR) {
my @missing_plugins;
for my $plugin (qw(AuthorTests ReadmeFromPod)) {
unless (eval "require Module::Install::$plugin; 1") {
push @missing_plugins, "Module::Install::$plugin";
chomp(my $err = $@);
$missing_plugins[-1] .= " ($err)"
unless $err =~ m{^Can't locate Module/Install/$plugin\.pm in \@INC};
}
}
die "\nYou need to install the following modules to run this Makefile.PL in author mode:\n\n", join("\n", @missing_plugins), "\n\n"
if @missing_plugins;

recursive_author_tests (qw/xt/);
readme_from('lib/SQL/Translator.pm');
}

auto_install();

if ($Module::Install::AUTHOR) {
_recompile_grammars();
_recreate_rt_source();
}

WriteAll();

sub _recompile_grammars {
return; # disabled until RT#74593 is resolved

require File::Spec;

my $compiled_parser_dir = File::Spec->catdir(qw/
share PrecompiledParsers Parse RecDescent DDL SQLT
/);

# Currently consider only single-name parsers containing a grammar marker
# This is somewhat fragile, but better than loading all kinds of parsers
# to some of which we may not even have the deps
my $parser_libdir = 'lib/SQL/Translator/Parser';
for my $parser_fn (glob "$parser_libdir/*.pm") {
die "$parser_fn does not look like a readable file\n"
unless ( -f $parser_fn and -r $parser_fn );

my ($type) = $parser_fn =~ /^\Q$parser_libdir\E\/(.+)\.pm$/i
or die "$parser_fn not named in expected format\n";

my $parser_source = do { local (@ARGV, $/) = $parser_fn; <> };
next unless $parser_source =~ /\$GRAMMAR.+?END_OF_GRAMMAR/s;


my $precomp_parser_fn = File::Spec->catfile($compiled_parser_dir, "$type.pm");

next if (
-f $precomp_parser_fn
and
(stat($parser_fn))[9] <= (stat($precomp_parser_fn))[9]
);


print "Precompiling parser for $type\n";

require $parser_fn;
require Parse::RecDescent;

Parse::RecDescent->Precompile(
do {
no strict 'refs';
${"SQL::Translator::Parser::${type}::GRAMMAR"}
|| die "No \$GRAMMAR global found in SQL::Translator::Parser::$type ($parser_fn)\n"
EXE_FILES => [ qw|
script/sqlt-diagram
script/sqlt-diff
script/sqlt-diff-old
script/sqlt-dumper
script/sqlt-graph
script/sqlt
| ],
META_MERGE => {
"meta-spec" => { version => 2 },
dynamic_config => 0,
resources => {
bugtracker => {
web => 'https://rt.cpan.org/NoAuth/Bugs.html?Dist=SQL-Translator',
mailto => 'bug-SQL-Translator@rt.cpan.org',
},
"Parse::RecDescent::DDL::SQLT::$type"
);

rename( "$type.pm", $precomp_parser_fn )
or die "Unable to move $type.pm to $compiled_parser_dir: $!\n";
}

}

sub _recreate_rt_source {
my $base_xml = "t/data/roundtrip.xml";
my $autogen_yaml = "t/data/roundtrip_autogen.yaml";

print "Updating $autogen_yaml\n";

unlink $autogen_yaml;

eval {

use lib 'lib';

require SQL::Translator;
require SQL::Translator::Parser::XML;

open (my $fh, '>', $autogen_yaml) or die "$autogen_yaml: $!\n";
repository => {
type => 'git',
url => 'git@github.com/dbsrgits/sql-translator.git',
web => 'https://github.com/dbsrgits/sql-translator/',
},
license => [ 'http://dev.perl.org/licenses/' ],
x_IRC => 'irc://irc.perl.org/#sql-translator',
x_Ratings => 'http://cpanratings.perl.org/d/SQL-Translator',
},
x_authority => 'cpan:JROBINSON',
no_index => {
directory => [qw(maint share xt)],
},
prereqs => {
runtime => {
recommends => {
'Template' => '2.20',
'GD' => '0',
'GraphViz' => '0',
'Graph::Directed' => '0',
'Spreadsheet::ParseExcel' => '0.41',
'Text::RecordParser' => '0.02',
'XML::LibXML' => '1.69',
},
},
develop => {
requires => {
'Template' => '2.20',
'GD' => '0',
'GraphViz' => '0',
'Graph::Directed' => '0',
'Spreadsheet::ParseExcel' => '0.41',
'Text::RecordParser' => '0.02',
'XML::LibXML' => '1.69',
'Test::EOL' => '1.1',
'Test::NoTabs' => '1.1',
'Software::LicenseUtils' => '0', # for Distar
},
},
},
},
);

my $tr = SQL::Translator->new;
my $yaml = $tr->translate (
parser => 'XML',
file => $base_xml,
producer => 'YAML',
) or die sprintf ("Unable to translate %s to YAML: %s\n",
$base_xml,
$tr->error || 'error unknown'
);
install_share 'share';

print $fh $yaml;
close $fh;
sub _move_to {
my ($hash, $fromkey, $tokey) = @_;
$hash->{$tokey} = {
%{ $hash->{$tokey} || {} },
%{ delete($hash->{$fromkey}) || {} },
};

if ($@) {
die <<EOE;
=========================================================================
=============== WARNING !!! =================
=========================================================================
Unable to update the roundtrip schema (attempt triggered by AUTHOR mode).
Aborting Makefile generation, please fix the errors indicated below
(typically by installing the missing modules).
-------------------------------------------------------------------------
$@
EOE
}
}
delete $eumm_args{META_MERGE} if $eumm_version < 6.45_01;
delete $eumm_args{CONFIGURE_REQUIRES}
if $eumm_version < 6.51_03; # too late to use so just delete
_move_to(\%eumm_args, 'TEST_REQUIRES', 'BUILD_REQUIRES')
if $eumm_version < 6.63_03;
_move_to(\%eumm_args, 'BUILD_REQUIRES', 'PREREQ_PM')
if $eumm_version < 6.55_01;
$eumm_args{NO_MYMETA} = 1
if $eumm_version >= 6.57_02 and $eumm_version < 6.57_07;
WriteMakefile(%eumm_args);

package MY;
use File::ShareDir::Install qw(postamble);
122 changes: 122 additions & 0 deletions maint/Makefile.PL.include
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
BEGIN { -e 'Distar' or system("git clone git://git.shadowcat.co.uk/p5sagit/Distar.git") }
use lib 'Distar/lib';
use Distar 0.001;

author 'Ken Youens-Clark <kclark@cpan.org>';
manifest_include 'script' => qr/.+/;
manifest_include 't/data' => qr/.+/;
manifest_include 'share' => qr/.+/;
manifest_include '' => qr/\A(?:AUTHORS)\z/;

# eval so can generate deps for cpanm --installdeps .
eval {
_recompile_grammars();
_recreate_rt_source();
};
print "Got errors:\n\n$@" if $@;

sub _recompile_grammars {
return; # disabled until RT#74593 is resolved

require File::Spec;

my $compiled_parser_dir = File::Spec->catdir(qw/
share PrecompiledParsers Parse RecDescent DDL SQLT
/);

# Currently consider only single-name parsers containing a grammar marker
# This is somewhat fragile, but better than loading all kinds of parsers
# to some of which we may not even have the deps
my $parser_libdir = 'lib/SQL/Translator/Parser';
for my $parser_fn (glob "$parser_libdir/*.pm") {
die "$parser_fn does not look like a readable file\n"
unless ( -f $parser_fn and -r $parser_fn );

my ($type) = $parser_fn =~ /^\Q$parser_libdir\E\/(.+)\.pm$/i
or die "$parser_fn not named in expected format\n";

my $parser_source = do { local (@ARGV, $/) = $parser_fn; <> };
next unless $parser_source =~ /\$GRAMMAR.+?END_OF_GRAMMAR/s;


my $precomp_parser_fn = File::Spec->catfile($compiled_parser_dir, "$type.pm");

next if (
-f $precomp_parser_fn
and
(stat($parser_fn))[9] <= (stat($precomp_parser_fn))[9]
);


print "Precompiling parser for $type\n";

require $parser_fn;
require Parse::RecDescent;

Parse::RecDescent->Precompile(
do {
no strict 'refs';
${"SQL::Translator::Parser::${type}::GRAMMAR"}
|| die "No \$GRAMMAR global found in SQL::Translator::Parser::$type ($parser_fn)\n"
},
"Parse::RecDescent::DDL::SQLT::$type"
);

rename( "$type.pm", $precomp_parser_fn )
or die "Unable to move $type.pm to $compiled_parser_dir: $!\n";
}

}

sub _recreate_rt_source {
my $base_xml = "t/data/roundtrip.xml";
my $autogen_yaml = "t/data/roundtrip_autogen.yaml";

print "Updating $autogen_yaml\n";

unlink $autogen_yaml;

eval {

use lib 'lib';

require SQL::Translator;
require SQL::Translator::Parser::XML;

open (my $fh, '>', $autogen_yaml) or die "$autogen_yaml: $!\n";

my $tr = SQL::Translator->new;
my $yaml = $tr->translate (
parser => 'XML',
file => $base_xml,
producer => 'YAML',
) or die sprintf ("Unable to translate %s to YAML: %s\n",
$base_xml,
$tr->error || 'error unknown'
);

print $fh $yaml;
close $fh;
};

if ($@) {
die <<EOE;
=========================================================================
=============== WARNING !!! =================
=========================================================================
Unable to update the roundtrip schema (attempt triggered by AUTHOR mode).
Continuing Makefile generation, but please fix the errors indicated below
(typically by installing the missing modules).
-------------------------------------------------------------------------
$@
EOE
}
}

# vim: ft=perl et sts=2 sw=2 tw=0:

1;