diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index ef6d645dee..ec2359810e 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -65,8 +65,8 @@ preproc.h: preproc.c preproc.c: BISONFLAGS += -d 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)/check_rules.pl $(srcdir) $< + $(PERL) $(srcdir)/parse.pl --srcdir $(srcdir) --parser $< --output $@ + $(PERL) $(srcdir)/check_rules.pl --srcdir $(srcdir) --parser $< # generate keyword headers c_kwlist_d.h: c_kwlist.h $(GEN_KEYWORDLIST_DEPS) diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl index 0a3fafc39f..58a755f454 100644 --- a/src/interfaces/ecpg/preproc/check_rules.pl +++ b/src/interfaces/ecpg/preproc/check_rules.pl @@ -19,16 +19,20 @@ use strict; use warnings; no warnings 'uninitialized'; +use Getopt::Long; +my $srcdir = '.'; +my $parser = '../../../backend/parser/gram.y'; +my $stamp = ''; 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) { print "parser: $parser\n"; @@ -188,4 +192,10 @@ if ($verbose) print "$cc rules checked\n"; } +if ($stamp) +{ + open my $stampfh, '>', $stamp or die $!; + close $stampfh; +} + exit $ret; diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index 5ec511fd01..a15f563ad4 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -15,9 +15,20 @@ use strict; use warnings; no warnings 'uninitialized'; +use Getopt::Long; -my $path = shift @ARGV; -$path = "." unless $path; +my $srcdir = '.'; +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 $brace_indent = 0; @@ -128,15 +139,17 @@ dump_buffer('tokens'); dump_buffer('types'); dump_buffer('ecpgtype'); dump_buffer('orig_tokens'); -print '%%', "\n"; -print 'prog: statements;', "\n"; +print $outfh '%%', "\n"; +print $outfh 'prog: statements;', "\n"; dump_buffer('rules'); include_file('trailer', 'ecpg.trailer'); dump_buffer('trailer'); +close($parserfh); + sub main { - line: while (<>) + line: while (<$parserfh>) { if (/ERRCODE_FEATURE_NOT_SUPPORTED/) { @@ -442,7 +455,7 @@ sub main sub include_file { my ($buffer, $filename) = @_; - my $full = "$path/$filename"; + my $full = "$srcdir/$filename"; open(my $fh, '<', $full) or die; while (<$fh>) { @@ -498,9 +511,9 @@ sub add_to_buffer sub dump_buffer { my ($buffer) = @_; - print '/* ', $buffer, ' */', "\n"; + print $outfh '/* ', $buffer, ' */', "\n"; my $ref = $buff{$buffer}; - print @$ref; + print $outfh @$ref; return; } @@ -652,7 +665,7 @@ sub dump_line sub preload_addons { - my $filename = $path . "/ecpg.addons"; + my $filename = $srcdir . "/ecpg.addons"; open(my $fh, '<', $filename) or die; # there may be multiple lines starting ECPG: and then multiple lines of code. diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 840f251343..312f9c3058 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -746,9 +746,8 @@ sub GenerateFiles 'src/backend/parser/gram.y')) { print "Generating preproc.y...\n"; - chdir('src/interfaces/ecpg/preproc'); - system('perl parse.pl < ../../../backend/parser/gram.y > preproc.y'); - chdir('../../../..'); + my $ecpg = 'src/interfaces/ecpg'; + system("perl $ecpg/preproc/parse.pl --srcdir $ecpg/preproc --parser src/backend/parser/gram.y --output $ecpg/preproc/preproc.y"); } unless (-f "src/port/pg_config_paths.h")