From 18cc9fbd02e0bdbd788b5485341d2470b16aac00 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 29 Jun 2022 10:47:45 -0700
Subject: [PATCH v10 03/16] meson: prereq: ecpg: Add and use output directory
 argument for preproc/*.pl

---
 src/interfaces/ecpg/preproc/Makefile       |  4 +--
 src/interfaces/ecpg/preproc/check_rules.pl | 24 ++++++++++++-----
 src/interfaces/ecpg/preproc/parse.pl       | 31 +++++++++++++++-------
 src/tools/msvc/Solution.pm                 |  5 ++--
 4 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index ef6d645dee1..ec2359810e5 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 0a3fafc39fa..58a755f454a 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 5ec511fd013..a15f563ad45 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 37bd5c0db69..fcbc1a20772 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -745,9 +745,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")
-- 
2.37.0.3.g30cc8d0f14

