From 4a15216e282d700a409b7dcad74b553122a534a3 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@otacoo.com>
Date: Mon, 15 Dec 2014 22:16:36 -0800
Subject: [PATCH 1/8] Refactor MSVC scripts for modules of src/bin similarly to
 contrib/

This refactoring is a preparation work for the integration of many contrib/
modules into src/bin, and permits to make any default new binary of src/bin/
to be detected by the build process.
---
 src/tools/msvc/Mkvcbuild.pm | 104 +++++++++++++++++++++++++++++---------------
 1 file changed, 69 insertions(+), 35 deletions(-)

diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 5dc8426..bd63193 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -29,6 +29,7 @@ my $libpgcommon;
 my $postgres;
 my $libpq;
 
+# Set of variables for contrib modules
 my $contrib_defines = { 'refint' => 'REFINT_VERBOSE' };
 my @contrib_uselibpq =
   ('dblink', 'oid2name', 'pgbench', 'pg_upgrade', 'postgres_fdw', 'vacuumlo');
@@ -48,11 +49,25 @@ my $contrib_extralibs = { 'pgbench' => ['ws2_32.lib'] };
 my $contrib_extraincludes =
   { 'tsearch2' => ['contrib/tsearch2'], 'dblink' => ['src/backend'] };
 my $contrib_extrasource = {
-	'cube' => [ 'cubescan.l', 'cubeparse.y' ],
-	'pgbench' => [ 'exprscan.l', 'exprparse.y' ],
-	'seg'  => [ 'segscan.l',  'segparse.y' ], };
+	'cube' => [ 'contrib\cube\cubescan.l', 'contrib\cube\cubeparse.y' ],
+	'pgbench' => [ 'contrib\pgbench\exprscan.l', 'contrib\pgbench\exprparse.y' ],
+	'seg'  => [ 'contrib\seg\segscan.l',  'contrib\seg\segparse.y' ], };
 my @contrib_excludes = ('pgcrypto', 'intagg', 'sepgsql');
 
+# Set of variables for frontend modules
+my $frontend_defines = { 'initdb' => 'FRONTEND' };
+my @frontend_uselibpq = ('pg_ctl', 'psql');
+my $frontend_extralibs = {'initdb' => ['ws2_32.lib'],
+						  'pg_restore' => ['ws2_32.lib'],
+						  'psql' => ['ws2_32.lib'] };
+my $frontend_extraincludes = {
+   'initdb' => ['src\timezone'],
+   'psql' => ['src\bin\pg_dump', 'src\backend'] };
+my $frontend_extrasource = {
+	'psql' => [ 'src\bin\psql\psqlscan.l' ] };
+my @frontend_excludes = ('pgevent', 'pg_basebackup', 'pg_dump',
+						 'scripts');
+
 sub mkvcbuild
 {
 	our $config = shift;
@@ -380,11 +395,15 @@ sub mkvcbuild
 	$pgregress_isolation->AddReference($libpgcommon, $libpgport);
 
 	# src/bin
-	my $initdb = AddSimpleFrontend('initdb');
-	$initdb->AddIncludeDir('src\interfaces\libpq');
-	$initdb->AddIncludeDir('src\timezone');
-	$initdb->AddDefine('FRONTEND');
-	$initdb->AddLibrary('ws2_32.lib');
+	my $D;
+	opendir($D, 'src/bin') || croak "Could not opendir on src/bin!\n";
+	while (my $d = readdir($D))
+	{
+		next if ($d =~ /^\./);
+		next unless (-f "src/bin/$d/Makefile");
+		next if (grep { /^$d$/ } @frontend_excludes);
+		AddSimpleFrontend($d);
+	}
 
 	my $pgbasebackup = AddSimpleFrontend('pg_basebackup', 1);
 	$pgbasebackup->AddFile('src\bin\pg_basebackup\pg_basebackup.c');
@@ -400,14 +419,6 @@ sub mkvcbuild
 	$pgrecvlogical->AddFile('src\bin\pg_basebackup\pg_recvlogical.c');
 	$pgrecvlogical->AddLibrary('ws2_32.lib');
 
-	my $pgconfig = AddSimpleFrontend('pg_config');
-
-	my $pgcontrol = AddSimpleFrontend('pg_controldata');
-
-	my $pgctl = AddSimpleFrontend('pg_ctl', 1);
-
-	my $pgreset = AddSimpleFrontend('pg_resetxlog');
-
 	my $pgevent = $solution->AddProject('pgevent', 'dll', 'bin');
 	$pgevent->AddFiles('src\bin\pgevent', 'pgevent.c', 'pgmsgevent.rc');
 	$pgevent->AddResourceFile('src\bin\pgevent', 'Eventlog message formatter',
@@ -416,12 +427,6 @@ sub mkvcbuild
 	$pgevent->UseDef('src\bin\pgevent\pgevent.def');
 	$pgevent->DisableLinkerWarnings('4104');
 
-	my $psql = AddSimpleFrontend('psql', 1);
-	$psql->AddIncludeDir('src\bin\pg_dump');
-	$psql->AddIncludeDir('src\backend');
-	$psql->AddFile('src\bin\psql\psqlscan.l');
-	$psql->AddLibrary('ws2_32.lib');
-
 	my $pgdump = AddSimpleFrontend('pg_dump', 1);
 	$pgdump->AddIncludeDir('src\backend');
 	$pgdump->AddFile('src\bin\pg_dump\pg_dump.c');
@@ -532,7 +537,6 @@ sub mkvcbuild
 	my $mf = Project::read_file('contrib/pgcrypto/Makefile');
 	GenerateContribSqlFiles('pgcrypto', $mf);
 
-	my $D;
 	opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
 	while (my $d = readdir($D))
 	{
@@ -652,6 +656,9 @@ sub AddSimpleFrontend
 		$p->AddIncludeDir('src\interfaces\libpq');
 		$p->AddReference($libpq);
 	}
+	# Adjust module definition using frontent variables
+	AdjustFrontendProj($p);
+
 	return $p;
 }
 
@@ -744,45 +751,72 @@ sub GenerateContribSqlFiles
 sub AdjustContribProj
 {
 	my $proj = shift;
-	my $n    = $proj->{name};
+	AdjustModule($proj, $contrib_defines, \@contrib_uselibpq,
+		\@contrib_uselibpgport, \@contrib_uselibpgcommon, $contrib_extralibs,
+		$contrib_extrasource, $contrib_extraincludes);
+}
+
+sub AdjustFrontendProj
+{
+	my $proj = shift;
+	AdjustModule($proj, $frontend_defines, \@frontend_uselibpq,
+		undef, undef, $frontend_extralibs,
+		$frontend_extrasource, $frontend_extraincludes);
+}
 
-	if ($contrib_defines->{$n})
+sub AdjustModule
+{
+	my $proj                  = shift;
+	my $module_defines        = shift;
+	my $module_uselibpq       = shift;
+	my $module_uselibpgport   = shift;
+	my $module_uselibpgcommon = shift;
+	my $module_extralibs      = shift;
+	my $module_extrasource    = shift;
+	my $module_extraincludes  = shift;
+	my $n                     = $proj->{name};
+
+	if ($module_defines->{$n})
 	{
-		foreach my $d ($contrib_defines->{$n})
+		foreach my $d ($module_defines->{$n})
 		{
 			$proj->AddDefine($d);
 		}
 	}
-	if (grep { /^$n$/ } @contrib_uselibpq)
+	if (grep { /^$n$/ } @{ $module_uselibpq })
 	{
 		$proj->AddIncludeDir('src\interfaces\libpq');
 		$proj->AddReference($libpq);
 	}
-	if (grep { /^$n$/ } @contrib_uselibpgport)
+	if (grep { /^$n$/ } @{ $module_uselibpgport })
 	{
 		$proj->AddReference($libpgport);
 	}
-	if (grep { /^$n$/ } @contrib_uselibpgcommon)
+	if (grep { /^$n$/ } @{ $module_uselibpgcommon })
 	{
 		$proj->AddReference($libpgcommon);
 	}
-	if ($contrib_extralibs->{$n})
+	if ($module_extralibs->{$n})
 	{
-		foreach my $l (@{ $contrib_extralibs->{$n} })
+		foreach my $l (@{ $module_extralibs->{$n} })
 		{
 			$proj->AddLibrary($l);
 		}
 	}
-	if ($contrib_extraincludes->{$n})
+	if ($module_extraincludes->{$n})
 	{
-		foreach my $i (@{ $contrib_extraincludes->{$n} })
+		foreach my $i (@{ $module_extraincludes->{$n} })
 		{
 			$proj->AddIncludeDir($i);
 		}
 	}
-	if ($contrib_extrasource->{$n})
+	if ($module_extrasource->{$n})
 	{
-		$proj->AddFiles('contrib\\' . $n, @{ $contrib_extrasource->{$n} });
+		foreach my $i (@{ $module_extrasource->{$n} })
+		{
+			print "Files $i\n";
+			$proj->AddFile($i);
+		}
 	}
 }
 
-- 
1.9.2.msysgit.0

