From ad9625026bcb7768c636fdf3a37a3403db195ae2 Mon Sep 17 00:00:00 2001
From: Craig Ringer <craig.ringer@enterprisedb.com>
Date: Tue, 13 Jul 2021 14:18:44 +1000
Subject: [PATCH v1 1/2] Teach pgflex.pl and pgbision.pl to read buildenv.pl
 for tool names

Some distributions of flex and bison on Windows use alternate executable
names such as win_flex.exe and win_bison.exe. Teach our pgflex.pl and
pgbison.pl wrappers how to handle them by reading the executables to use
from the new $flex and $bison variables in src/tools/msvc/buildenv.pl .

These may be bare names of commands on the PATH or they may be a fully
qualified path to the target executable.

While we're at it, notice when the test execution of flex or bision to
check the version fails and complain with a more informative error.
---
 src/tools/msvc/build.pl            |  4 ++++
 src/tools/msvc/buildenv_default.pl | 14 ++++++++++++++
 src/tools/msvc/pgbison.pl          | 27 +++++++++++++++++++++++----
 src/tools/msvc/pgflex.pl           | 25 +++++++++++++++++++++----
 4 files changed, 62 insertions(+), 8 deletions(-)
 create mode 100644 src/tools/msvc/buildenv_default.pl

diff --git a/src/tools/msvc/build.pl b/src/tools/msvc/build.pl
index de50554e7e..dedd515307 100644
--- a/src/tools/msvc/build.pl
+++ b/src/tools/msvc/build.pl
@@ -28,6 +28,10 @@ elsif (-e "./buildenv.pl")
 {
 	do "./buildenv.pl";
 }
+elsif (-e "src/tools/msvc/buildenv_default.pl")
+{
+	do "src/tools/msvc/buildenv_default.pl";
+}
 
 # set up the project
 our $config;
diff --git a/src/tools/msvc/buildenv_default.pl b/src/tools/msvc/buildenv_default.pl
new file mode 100644
index 0000000000..b3868f2145
--- /dev/null
+++ b/src/tools/msvc/buildenv_default.pl
@@ -0,0 +1,14 @@
+# Copy this file to src\test\msvc\buildenv.pl and modify it as required
+# for your build toolchain, path, etc.
+#
+# Note that there's no way to run vcvarsall.bat from here to set up the
+# visual studio environment. You still have to do that before starting
+# the build.
+#
+# Examples:
+
+#$ENV{PATH}="$ENV{PATH};C:\\ProgramData\\chocolatey\\bin";
+#our $flex = "$ENV{ProgramData}\\chocolatey\\bin\\win_flex.exe";
+#our $bison = "$ENV{ProgramData}\\chocolatey\\bin\\win_bison.exe";
+
+1;
diff --git a/src/tools/msvc/pgbison.pl b/src/tools/msvc/pgbison.pl
index 774d5be059..6289c1aa18 100644
--- a/src/tools/msvc/pgbison.pl
+++ b/src/tools/msvc/pgbison.pl
@@ -7,11 +7,26 @@ use warnings;
 
 use File::Basename;
 
-# assume we are in the postgres source root
+my $bison = $ENV{BISON_EXE} // 'bison';
 
-do './src/tools/msvc/buildenv.pl' if -e 'src/tools/msvc/buildenv.pl';
+# assume we're in the build root.
+if (-e 'src/tools/msvc/buildenv.pl') {
+	do './src/tools/msvc/buildenv.pl';
+} elsif (-e './src/tools/msvc/buildenv_default.pl') {
+	do './src/tools/msvc/buildenv_default.pl';
+} else {
+	die 'Could not find src/tools/msvc/buildenv.pl or ./src/tools/msvc/buildenv_default.pl. Run pgbison from the build root, not src/test/msvc';
+}
 
-my ($bisonver) = `bison -V`;    # grab first line
+our $bison;
+if (! $bison) {
+	$bison = 'bison';
+}
+
+my ($bisonver) = `"$bison" -V`;    # grab first line
+if ($? ne 0) {
+	die "bison (\"$bison\") died with $?, see stderr output above. Check PATH and buildenv.pl"
+}
 $bisonver = (split(/\s+/, $bisonver))[3];    # grab version number
 
 unless ($bisonver eq '1.875' || $bisonver ge '2.2')
@@ -22,6 +37,10 @@ unless ($bisonver eq '1.875' || $bisonver ge '2.2')
 }
 
 my $input = shift;
+if (!defined($input)) {
+	print STDERR "Using bison from ${bison}\n";
+	die "usage: src/test/msvc/pgbison.pl inputfile.l [...]";
+}
 if ($input !~ /\.y$/)
 {
 	print "Input must be a .y file\n";
@@ -49,5 +68,5 @@ my $headerflag = ($make =~ /^$basetarg:\s+BISONFLAGS\b.*-d/m ? '-d' : '');
 
 my $nodep = $bisonver ge '3.0' ? "-Wno-deprecated" : "";
 
-system("bison $nodep $headerflag $input -o $output");
+system("\"$bison\" $nodep $headerflag $input -o $output");
 exit $? >> 8;
diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl
index 26c73dbfad..69f8ac261c 100644
--- a/src/tools/msvc/pgflex.pl
+++ b/src/tools/msvc/pgflex.pl
@@ -6,15 +6,28 @@ use strict;
 use warnings;
 
 use File::Basename;
+use Cwd;
 
 # silence flex bleatings about file path style
 $ENV{CYGWIN} = 'nodosfilewarning';
 
-# assume we are in the postgres source root
+if (-e 'src/tools/msvc/buildenv.pl') {
+	do './src/tools/msvc/buildenv.pl';
+} elsif (-e './src/tools/msvc/buildenv_default.pl') {
+	do './src/tools/msvc/buildenv_default.pl';
+} else {
+	die 'Could not find src/tools/msvc/buildenv.pl or ./src/tools/msvc/buildenv_default.pl. Run pgflex from the build root, not src/test/msvc';
+}
 
-do './src/tools/msvc/buildenv.pl' if -e 'src/tools/msvc/buildenv.pl';
+our $flex;
+if (! $flex) {
+	$flex = 'flex';
+}
 
-my ($flexver) = `flex -V`;    # grab first line
+my ($flexver) = `"$flex" -V`;    # grab first line
+if ($? ne 0) {
+	die "flex (\"$flex\") died with $?, see stderr output above. Check PATH and buildenv.pl";
+}
 $flexver = (split(/\s+/, $flexver))[1];
 $flexver =~ s/[^0-9.]//g;
 my @verparts = split(/\./, $flexver);
@@ -27,6 +40,10 @@ unless ($verparts[0] == 2
 }
 
 my $input = shift;
+if (!defined($input)) {
+	print STDERR "Using flex from ${flex}\n";
+	die "usage: src/test/msvc/pgflex.pl inputfile.l [...]";
+}
 if ($input !~ /\.l$/)
 {
 	print "Input must be a .l file\n";
@@ -50,7 +67,7 @@ close($mf);
 my $basetarg = basename($output);
 my $flexflags = ($make =~ /^$basetarg:\s*FLEXFLAGS\s*=\s*(\S.*)/m ? $1 : '');
 
-system("flex $flexflags -o$output $input");
+system("\"$flex\" $flexflags -o$output $input");
 if ($? == 0)
 {
 
-- 
2.31.1

