@@ -29,6 +29,7 @@ my $libpgcommon;
2929my $postgres ;
3030my $libpq ;
3131
32+ # Set of variables for contrib modules
3233my $contrib_defines = {' refint' => ' REFINT_VERBOSE' };
3334my @contrib_uselibpq =
3435 (' dblink' ,' oid2name' ,' pgbench' ,' pg_upgrade' ,' postgres_fdw' ,' vacuumlo' );
@@ -48,11 +49,25 @@ my $contrib_extralibs = { 'pgbench' => ['ws2_32.lib'] };
4849my $contrib_extraincludes =
4950 {' tsearch2' => [' contrib/tsearch2' ],' dblink' => [' src/backend' ] };
5051my $contrib_extrasource = {
51- ' cube' => [' cubescan.l' ,' cubeparse.y' ],
52- ' pgbench' => [' exprscan.l' ,' exprparse.y' ],
53- ' seg' => [' segscan.l' ,' segparse.y' ], };
52+ ' cube' => [' contrib\cube\cubescan.l' ,' contrib\cube\cubeparse.y' ],
53+ ' pgbench' =>
54+ [' contrib\pgbench\exprscan.l' ,' contrib\pgbench\exprparse.y' ],
55+ ' seg' => [' contrib\seg\segscan.l' ,' contrib\seg\segparse.y' ], };
5456my @contrib_excludes = (' pgcrypto' ,' intagg' ,' sepgsql' );
5557
58+ # Set of variables for frontend modules
59+ my $frontend_defines = {' initdb' => ' FRONTEND' };
60+ my @frontend_uselibpq = (' pg_ctl' ,' psql' );
61+ my $frontend_extralibs = {
62+ ' initdb' => [' ws2_32.lib' ],
63+ ' pg_restore' => [' ws2_32.lib' ],
64+ ' psql' => [' ws2_32.lib' ] };
65+ my $frontend_extraincludes = {
66+ ' initdb' => [' src\timezone' ],
67+ ' psql' => [' src\bin\pg_dump' ,' src\backend' ] };
68+ my $frontend_extrasource = {' psql' => [' src\bin\psql\psqlscan.l' ] };
69+ my @frontend_excludes = (' pgevent' ,' pg_basebackup' ,' pg_dump' ,' scripts' );
70+
5671sub mkvcbuild
5772{
5873our $config =shift ;
@@ -108,6 +123,7 @@ sub mkvcbuild
108123$postgres -> AddFiles(' src\port' ,@pgportfiles );
109124$postgres -> AddFiles(' src\common' ,@pgcommonbkndfiles );
110125$postgres -> AddDir(' src\timezone' );
126+
111127# We need source files from src\timezone, but that directory's resource
112128# file pertains to "zic", not to the backend.
113129$postgres -> RemoveFile(' src\timezone\win32ver.rc' );
@@ -122,15 +138,17 @@ sub mkvcbuild
122138$postgres -> AddLibrary(' ws2_32.lib' );
123139$postgres -> AddLibrary(' wldap32.lib' )if ($solution -> {options }-> {ldap });
124140$postgres -> FullExportDLL(' postgres.lib' );
125- # The OBJS scraper doesn't know about ifdefs, so remove be-secure-openssl.c
126- # if building without OpenSSL
141+
142+ # The OBJS scraper doesn't know about ifdefs, so remove be-secure-openssl.c
143+ # if building without OpenSSL
127144if (!$solution -> {options }-> {openssl })
128145{
129146$postgres -> RemoveFile(' src\backend\libpq\be-secure-openssl.c' );
130147}
131148
132149my $snowball =$solution -> AddProject(' dict_snowball' ,' dll' ,' ' ,
133150' src\backend\snowball' );
151+
134152# This Makefile uses VPATH to find most source files in a subdirectory.
135153$snowball -> RelocateFiles(
136154' src\backend\snowball\libstemmer' ,
@@ -288,8 +306,9 @@ sub mkvcbuild
288306$libpq -> ReplaceFile(' src\interfaces\libpq\libpqrc.c' ,
289307' src\interfaces\libpq\libpq.rc' );
290308$libpq -> AddReference($libpgport );
291- # The OBJS scraper doesn't know about ifdefs, so remove fe-secure-openssl.c
292- # if building without OpenSSL
309+
310+ # The OBJS scraper doesn't know about ifdefs, so remove fe-secure-openssl.c
311+ # if building without OpenSSL
293312if (!$solution -> {options }-> {openssl })
294313{
295314$libpq -> RemoveFile(' src\interfaces\libpq\fe-secure-openssl.c' );
@@ -380,11 +399,15 @@ sub mkvcbuild
380399$pgregress_isolation -> AddReference($libpgcommon ,$libpgport );
381400
382401# src/bin
383- my $initdb = AddSimpleFrontend(' initdb' );
384- $initdb -> AddIncludeDir(' src\interfaces\libpq' );
385- $initdb -> AddIncludeDir(' src\timezone' );
386- $initdb -> AddDefine(' FRONTEND' );
387- $initdb -> AddLibrary(' ws2_32.lib' );
402+ my $D ;
403+ opendir ($D ,' src/bin' ) || croak" Could not opendir on src/bin!\n " ;
404+ while (my $d =readdir ($D ))
405+ {
406+ next if ($d =~/ ^\. / );
407+ next unless (-f " src/bin/$d /Makefile" );
408+ next if (grep {/ ^$d $ / }@frontend_excludes );
409+ AddSimpleFrontend($d );
410+ }
388411
389412my $pgbasebackup = AddSimpleFrontend(' pg_basebackup' , 1);
390413$pgbasebackup -> AddFile(' src\bin\pg_basebackup\pg_basebackup.c' );
@@ -400,14 +423,6 @@ sub mkvcbuild
400423$pgrecvlogical -> AddFile(' src\bin\pg_basebackup\pg_recvlogical.c' );
401424$pgrecvlogical -> AddLibrary(' ws2_32.lib' );
402425
403- my $pgconfig = AddSimpleFrontend(' pg_config' );
404-
405- my $pgcontrol = AddSimpleFrontend(' pg_controldata' );
406-
407- my $pgctl = AddSimpleFrontend(' pg_ctl' , 1);
408-
409- my $pgreset = AddSimpleFrontend(' pg_resetxlog' );
410-
411426my $pgevent =$solution -> AddProject(' pgevent' ,' dll' ,' bin' );
412427$pgevent -> AddFiles(' src\bin\pgevent' ,' pgevent.c' ,' pgmsgevent.rc' );
413428$pgevent -> AddResourceFile(' src\bin\pgevent' ,' Eventlog message formatter' ,
@@ -416,12 +431,6 @@ sub mkvcbuild
416431$pgevent -> UseDef(' src\bin\pgevent\pgevent.def' );
417432$pgevent -> DisableLinkerWarnings(' 4104' );
418433
419- my $psql = AddSimpleFrontend(' psql' , 1);
420- $psql -> AddIncludeDir(' src\bin\pg_dump' );
421- $psql -> AddIncludeDir(' src\backend' );
422- $psql -> AddFile(' src\bin\psql\psqlscan.l' );
423- $psql -> AddLibrary(' ws2_32.lib' );
424-
425434my $pgdump = AddSimpleFrontend(' pg_dump' , 1);
426435$pgdump -> AddIncludeDir(' src\backend' );
427436$pgdump -> AddFile(' src\bin\pg_dump\pg_dump.c' );
@@ -532,7 +541,6 @@ sub mkvcbuild
532541my $mf = Project::read_file(' contrib/pgcrypto/Makefile' );
533542GenerateContribSqlFiles(' pgcrypto' ,$mf );
534543
535- my $D ;
536544opendir ($D ,' contrib' ) || croak" Could not opendir on contrib!\n " ;
537545while (my $d =readdir ($D ))
538546{
@@ -652,6 +660,10 @@ sub AddSimpleFrontend
652660$p -> AddIncludeDir(' src\interfaces\libpq' );
653661$p -> AddReference($libpq );
654662}
663+
664+ # Adjust module definition using frontent variables
665+ AdjustFrontendProj($p );
666+
655667return $p ;
656668}
657669
@@ -729,7 +741,7 @@ sub GenerateContribSqlFiles
729741print " Building$out from$in (contrib/$n )...\n " ;
730742my $cont = Project::read_file(" contrib/$n /$in " );
731743my $dn =$out ;
732- $dn =~s /\. sql$// ;
744+ $dn =~s /\. sql$// ;
733745$cont =~s / MODULE_PATHNAME/ \$ libdir\/ $dn / g ;
734746my $o ;
735747open ($o ," >contrib/$n /$out " )
@@ -744,45 +756,74 @@ sub GenerateContribSqlFiles
744756sub AdjustContribProj
745757{
746758my $proj =shift ;
747- my $n =$proj -> {name };
759+ AdjustModule(
760+ $proj ,$contrib_defines ,
761+ \@contrib_uselibpq , \@contrib_uselibpgport ,
762+ \@contrib_uselibpgcommon ,$contrib_extralibs ,
763+ $contrib_extrasource ,$contrib_extraincludes );
764+ }
748765
749- if ($contrib_defines -> {$n })
766+ sub AdjustFrontendProj
767+ {
768+ my $proj =shift ;
769+ AdjustModule($proj ,$frontend_defines , \@frontend_uselibpq ,undef ,
770+ undef ,$frontend_extralibs ,
771+ $frontend_extrasource ,$frontend_extraincludes );
772+ }
773+
774+ sub AdjustModule
775+ {
776+ my $proj =shift ;
777+ my $module_defines =shift ;
778+ my $module_uselibpq =shift ;
779+ my $module_uselibpgport =shift ;
780+ my $module_uselibpgcommon =shift ;
781+ my $module_extralibs =shift ;
782+ my $module_extrasource =shift ;
783+ my $module_extraincludes =shift ;
784+ my $n =$proj -> {name };
785+
786+ if ($module_defines -> {$n })
750787{
751- foreach my $d ($contrib_defines -> {$n })
788+ foreach my $d ($module_defines -> {$n })
752789{
753790$proj -> AddDefine($d );
754791}
755792}
756- if (grep {/ ^$n $ / }@contrib_uselibpq )
793+ if (grep {/ ^$n $ / } @{ $module_uselibpq } )
757794{
758795$proj -> AddIncludeDir(' src\interfaces\libpq' );
759796$proj -> AddReference($libpq );
760797}
761- if (grep {/ ^$n $ / }@contrib_uselibpgport )
798+ if (grep {/ ^$n $ / } @{ $module_uselibpgport } )
762799{
763800$proj -> AddReference($libpgport );
764801}
765- if (grep {/ ^$n $ / }@contrib_uselibpgcommon )
802+ if (grep {/ ^$n $ / } @{ $module_uselibpgcommon } )
766803{
767804$proj -> AddReference($libpgcommon );
768805}
769- if ($contrib_extralibs -> {$n })
806+ if ($module_extralibs -> {$n })
770807{
771- foreach my $l (@{$contrib_extralibs -> {$n } })
808+ foreach my $l (@{$module_extralibs -> {$n } })
772809{
773810$proj -> AddLibrary($l );
774811}
775812}
776- if ($contrib_extraincludes -> {$n })
813+ if ($module_extraincludes -> {$n })
777814{
778- foreach my $i (@{$contrib_extraincludes -> {$n } })
815+ foreach my $i (@{$module_extraincludes -> {$n } })
779816{
780817$proj -> AddIncludeDir($i );
781818}
782819}
783- if ($contrib_extrasource -> {$n })
820+ if ($module_extrasource -> {$n })
784821{
785- $proj -> AddFiles(' contrib\\ ' .$n , @{$contrib_extrasource -> {$n } });
822+ foreach my $i (@{$module_extrasource -> {$n } })
823+ {
824+ print " Files$i \n " ;
825+ $proj -> AddFile($i );
826+ }
786827}
787828}
788829