ecpg: Output dir, source dir, stamp file argument for preproc/*.pl
authorAndres Freund <[email protected]>
Mon, 18 Jul 2022 18:59:03 +0000 (11:59 -0700)
committerAndres Freund <[email protected]>
Mon, 18 Jul 2022 19:24:23 +0000 (12:24 -0700)
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 <[email protected]>
Discussion: https://postgr.es/m/5e216522-ba3c-f0e6-7f97-5276d0270029@enterprisedb.com

src/interfaces/ecpg/preproc/Makefile
src/interfaces/ecpg/preproc/check_rules.pl
src/interfaces/ecpg/preproc/parse.pl
src/tools/msvc/Solution.pm

index ef6d645dee186c1677eb326016afff90707f3dc2..ec2359810e59c855a4e4ad7bd07c56d936241cb8 100644 (file)
@@ -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)
index 0a3fafc39fa29f4ebd2422ac59238abf55f9a8fd..58a755f454a940194e035bd6c245f9eafd5f6d3a 100644 (file)
 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;
index 5ec511fd013ff34a12c79a78ea73960e1abb14d8..a15f563ad45761f163f8b1b9ba88cf80c9e39b3c 100644 (file)
 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.
index 840f251343cde6fc4fab3bcec4204113419cd97d..312f9c3058e62f611d928634028af129f495c829 100644 (file)
@@ -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")