ecpg: Output dir, source dir, stamp file argument for preproc/*.pl

This is in preparation for building postgres with meson / ninja.

When building with meson, commands are run at the root of the build tree. Add
an option to put build output into the appropriate place. This can be utilized
by src/tools/msvc/ for a minor simplification, which also provides some
coverage for the new option.

Add option to generate a timestamp for check_rules.pl, so that proper
dependencies on it having been run can be generated.

Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Discussion: https://postgr.es/m/5e216522-ba3c-f0e6-7f97-5276d0270029@enterprisedb.com
pull/94/head
Andres Freund 3 years ago
parent 7c3c2cb9ae
commit db0a272d12
  1. 4
      src/interfaces/ecpg/preproc/Makefile
  2. 24
      src/interfaces/ecpg/preproc/check_rules.pl
  3. 31
      src/interfaces/ecpg/preproc/parse.pl
  4. 5
      src/tools/msvc/Solution.pm

@ -65,8 +65,8 @@ preproc.h: preproc.c
preproc.c: BISONFLAGS += -d preproc.c: BISONFLAGS += -d
preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type
$(PERL) $(srcdir)/parse.pl $(srcdir) < $< > $@ $(PERL) $(srcdir)/parse.pl --srcdir $(srcdir) --parser $< --output $@
$(PERL) $(srcdir)/check_rules.pl $(srcdir) $< $(PERL) $(srcdir)/check_rules.pl --srcdir $(srcdir) --parser $<
# generate keyword headers # generate keyword headers
c_kwlist_d.h: c_kwlist.h $(GEN_KEYWORDLIST_DEPS) c_kwlist_d.h: c_kwlist.h $(GEN_KEYWORDLIST_DEPS)

@ -19,16 +19,20 @@
use strict; use strict;
use warnings; use warnings;
no warnings 'uninitialized'; no warnings 'uninitialized';
use Getopt::Long;
my $srcdir = '.';
my $parser = '../../../backend/parser/gram.y';
my $stamp = '';
my $verbose = 0; my $verbose = 0;
if ($ARGV[0] eq '-v')
{
$verbose = shift;
}
my $path = shift || '.';
my $parser = shift || '../../../backend/parser/gram.y';
my $filename = $path . "/ecpg.addons"; GetOptions(
'srcdir=s' => \$srcdir,
'parser=s' => \$parser,
'stamp=s' => \$stamp,
'verbose' => \$verbose,) or die "wrong arguments";
my $filename = "$srcdir/ecpg.addons";
if ($verbose) if ($verbose)
{ {
print "parser: $parser\n"; print "parser: $parser\n";
@ -188,4 +192,10 @@ if ($verbose)
print "$cc rules checked\n"; print "$cc rules checked\n";
} }
if ($stamp)
{
open my $stampfh, '>', $stamp or die $!;
close $stampfh;
}
exit $ret; exit $ret;

@ -15,9 +15,20 @@
use strict; use strict;
use warnings; use warnings;
no warnings 'uninitialized'; no warnings 'uninitialized';
use Getopt::Long;
my $path = shift @ARGV; my $srcdir = '.';
$path = "." unless $path; my $outfile = '';
my $parser = '';
GetOptions(
'srcdir=s' => \$srcdir,
'output=s' => \$outfile,
'parser=s' => \$parser,) or die "wrong arguments";
# open parser / output file early, to raise errors early
open(our $parserfh, '<', $parser) or die "could not open parser file $parser";
open(our $outfh, '>', $outfile) or die "could not open output file $outfile";
my $copymode = 0; my $copymode = 0;
my $brace_indent = 0; my $brace_indent = 0;
@ -128,15 +139,17 @@ dump_buffer('tokens');
dump_buffer('types'); dump_buffer('types');
dump_buffer('ecpgtype'); dump_buffer('ecpgtype');
dump_buffer('orig_tokens'); dump_buffer('orig_tokens');
print '%%', "\n"; print $outfh '%%', "\n";
print 'prog: statements;', "\n"; print $outfh 'prog: statements;', "\n";
dump_buffer('rules'); dump_buffer('rules');
include_file('trailer', 'ecpg.trailer'); include_file('trailer', 'ecpg.trailer');
dump_buffer('trailer'); dump_buffer('trailer');
close($parserfh);
sub main sub main
{ {
line: while (<>) line: while (<$parserfh>)
{ {
if (/ERRCODE_FEATURE_NOT_SUPPORTED/) if (/ERRCODE_FEATURE_NOT_SUPPORTED/)
{ {
@ -442,7 +455,7 @@ sub main
sub include_file sub include_file
{ {
my ($buffer, $filename) = @_; my ($buffer, $filename) = @_;
my $full = "$path/$filename"; my $full = "$srcdir/$filename";
open(my $fh, '<', $full) or die; open(my $fh, '<', $full) or die;
while (<$fh>) while (<$fh>)
{ {
@ -498,9 +511,9 @@ sub add_to_buffer
sub dump_buffer sub dump_buffer
{ {
my ($buffer) = @_; my ($buffer) = @_;
print '/* ', $buffer, ' */', "\n"; print $outfh '/* ', $buffer, ' */', "\n";
my $ref = $buff{$buffer}; my $ref = $buff{$buffer};
print @$ref; print $outfh @$ref;
return; return;
} }
@ -652,7 +665,7 @@ sub dump_line
sub preload_addons sub preload_addons
{ {
my $filename = $path . "/ecpg.addons"; my $filename = $srcdir . "/ecpg.addons";
open(my $fh, '<', $filename) or die; open(my $fh, '<', $filename) or die;
# there may be multiple lines starting ECPG: and then multiple lines of code. # there may be multiple lines starting ECPG: and then multiple lines of code.

@ -746,9 +746,8 @@ sub GenerateFiles
'src/backend/parser/gram.y')) 'src/backend/parser/gram.y'))
{ {
print "Generating preproc.y...\n"; print "Generating preproc.y...\n";
chdir('src/interfaces/ecpg/preproc'); my $ecpg = 'src/interfaces/ecpg';
system('perl parse.pl < ../../../backend/parser/gram.y > preproc.y'); system("perl $ecpg/preproc/parse.pl --srcdir $ecpg/preproc --parser src/backend/parser/gram.y --output $ecpg/preproc/preproc.y");
chdir('../../../..');
} }
unless (-f "src/port/pg_config_paths.h") unless (-f "src/port/pg_config_paths.h")

Loading…
Cancel
Save