1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
BEGIN { -e 'Distar' or system("git clone https://github.com/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;
|