From 877842183b2f20dc8de309e72d7bc97931e7a662 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Tue, 27 Jul 2021 22:02:36 +1200
Subject: [PATCH v10 1/4] Adjust MSVC build scripts to parse Makefiles for
 defines

This adjusts the MSVC build scripts to look at the compile flags mentioned
in the Makefile to look for -D arguments in order to determine which
constants should be defined in the Visual Studio build.
---
 contrib/ltree/Makefile      |  1 -
 contrib/ltree/crc32.c       |  1 +
 contrib/ltree/ltree.h       | 13 +++++++++++++
 src/tools/msvc/Mkvcbuild.pm | 21 ++++++++++++++++++++-
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/contrib/ltree/Makefile b/contrib/ltree/Makefile
index b16a566852..770769a730 100644
--- a/contrib/ltree/Makefile
+++ b/contrib/ltree/Makefile
@@ -12,7 +12,6 @@ OBJS = \
 	ltree_op.o \
 	ltxtquery_io.o \
 	ltxtquery_op.o
-PG_CPPFLAGS = -DLOWER_NODE
 
 EXTENSION = ltree
 DATA = ltree--1.1--1.2.sql ltree--1.1.sql ltree--1.0--1.1.sql
diff --git a/contrib/ltree/crc32.c b/contrib/ltree/crc32.c
index 8fed3346e8..134f46a805 100644
--- a/contrib/ltree/crc32.c
+++ b/contrib/ltree/crc32.c
@@ -8,6 +8,7 @@
  */
 
 #include "postgres.h"
+#include "ltree.h"
 
 #ifdef LOWER_NODE
 #include <ctype.h>
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index dc68a0c212..615a3631f2 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -17,6 +17,19 @@
  */
 #define LTREE_LABEL_MAX_CHARS 255
 
+/*
+ * LOWER_NODE used to be defined in the Makefile via the compile flags.
+ * However the MSVC build scripts neglected to do the same which resulted in
+ * MSVC builds not using LOWER_NODE.  Since then, the MSVC scripts have been
+ * modified to look for -D compile flags in Makefiles, so here, in order to
+ * get the historic behavior of LOWER_NODE not being defined on MSVC, we only
+ * define it when not building in that environment.  This is important as we
+ * want to maintain the same behavior after a pg_update.
+ */
+#ifndef _MSC_VER
+#define LOWER_NODE
+#endif
+
 typedef struct
 {
 	uint16		len;			/* label string length in bytes */
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 4c36e482fb..fd9b93b4de 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -35,7 +35,7 @@ my $libpq;
 my @unlink_on_exit;
 
 # Set of variables for modules in contrib/ and src/test/modules/
-my $contrib_defines = { 'refint' => 'REFINT_VERBOSE' };
+my $contrib_defines = {};
 my @contrib_uselibpq =
   ('dblink', 'oid2name', 'postgres_fdw', 'vacuumlo', 'libpq_pipeline');
 my @contrib_uselibpgport   = ('libpq_pipeline', 'oid2name', 'vacuumlo');
@@ -964,6 +964,7 @@ sub AddContrib
 	my $subdir = shift;
 	my $n      = shift;
 	my $mf     = Project::read_file("$subdir/$n/Makefile");
+	my @projects;
 
 	if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg)
 	{
@@ -971,6 +972,7 @@ sub AddContrib
 		my $proj = $solution->AddProject($dn, 'dll', 'contrib', "$subdir/$n");
 		$proj->AddReference($postgres);
 		AdjustContribProj($proj);
+		push @projects, $proj;
 	}
 	elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
 	{
@@ -982,18 +984,35 @@ sub AddContrib
 			$proj->AddFile("$subdir/$n/$filename");
 			$proj->AddReference($postgres);
 			AdjustContribProj($proj);
+			push @projects, $proj;
 		}
 	}
 	elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
 	{
 		my $proj = $solution->AddProject($1, 'exe', 'contrib', "$subdir/$n");
 		AdjustContribProj($proj);
+		push @projects, $proj;
 	}
 	else
 	{
 		croak "Could not determine contrib module type for $n\n";
 	}
 
+	# Process custom compiler flags
+	if ($mf =~ /^PG_CPPFLAGS\s*=\s*(.*)$/mg || $mf =~ /^override\s*CPPFLAGS\s*[+:]?=\s*(.*)$/mg)
+	{
+		foreach my $flag (split /\s+/, $1)
+		{
+			if ($flag =~ /^-D(.*)$/)
+			{
+				foreach my $proj (@projects)
+				{
+					$proj->AddDefine($1);
+				}
+			}
+		}
+	}
+
 	# Are there any output data files to build?
 	GenerateContribSqlFiles($n, $mf);
 	return;
-- 
2.21.0.windows.1

