OSDN Git Service

ae31b9fcc2b673fb3a9ed9b40748de7f9140bf74
[pg-rex/syncrep.git] / src / tools / msvc / Mkvcbuild.pm
1 package Mkvcbuild;
2
3 #
4 # Package that generates build files for msvc build
5 #
6 # $PostgreSQL: pgsql/src/tools/msvc/Mkvcbuild.pm,v 1.35 2008/12/20 22:04:02 mha Exp $
7 #
8 use Carp;
9 use Win32;
10 use strict;
11 use warnings;
12 use Project;
13 use Solution;
14
15 use Exporter;
16 our (@ISA, @EXPORT_OK);
17 @ISA = qw(Exporter);
18 @EXPORT_OK = qw(Mkvcbuild);
19
20 my $solution;
21 my $libpgport;
22 my $postgres;
23 my $libpq;
24
25 my $contrib_defines = {'refint' => 'REFINT_VERBOSE'};
26 my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo');
27 my @contrib_uselibpgport = ('oid2name', 'pgbench', 'pg_standby', 'vacuumlo');
28 my $contrib_extralibs = {'pgbench' => ['wsock32.lib']};
29 my $contrib_extraincludes = {'tsearch2' => ['contrib/tsearch2']};
30 my $contrib_extrasource = {
31     'cube' => ['cubescan.l','cubeparse.y'],
32     'seg' => ['segscan.l','segparse.y']
33 };
34 my @contrib_excludes = ('pgcrypto','intagg');
35
36 sub mkvcbuild
37 {
38     our $config = shift;
39
40     chdir('..\..\..') if (-d '..\msvc' && -d '..\..\..\src');
41     die 'Must run from root or msvc directory' unless (-d 'src\tools\msvc' && -d 'src');
42
43     $solution = new Solution($config);
44
45     our @pgportfiles = qw(
46       chklocale.c crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
47       unsetenv.c getaddrinfo.c gettimeofday.c kill.c open.c rand.c
48       snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
49       pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
50       getopt.c getopt_long.c dirent.c rint.c win32error.c);
51
52     $libpgport = $solution->AddProject('libpgport','lib','misc');
53     $libpgport->AddDefine('FRONTEND');
54     $libpgport->AddFiles('src\port',@pgportfiles);
55
56     $postgres = $solution->AddProject('postgres','exe','','src\backend');
57     $postgres->AddIncludeDir('src\backend');
58     $postgres->AddDir('src\backend\port\win32');
59     $postgres->AddFile('src\backend\utils\fmgrtab.c');
60     $postgres->ReplaceFile('src\backend\port\dynloader.c','src\backend\port\dynloader\win32.c');
61     $postgres->ReplaceFile('src\backend\port\pg_sema.c','src\backend\port\win32_sema.c');
62     $postgres->ReplaceFile('src\backend\port\pg_shmem.c','src\backend\port\win32_shmem.c');
63     $postgres->AddFiles('src\port',@pgportfiles);
64     $postgres->AddDir('src\timezone');
65     $postgres->AddFiles('src\backend\parser','scan.l','gram.y');
66     $postgres->AddFiles('src\backend\bootstrap','bootscanner.l','bootparse.y');
67     $postgres->AddFiles('src\backend\utils\misc','guc-file.l');
68     $postgres->AddDefine('BUILDING_DLL');
69     $postgres->AddLibrary('wsock32.lib');
70     $postgres->AddLibrary('ws2_32.lib');
71     $postgres->AddLibrary('secur32.lib');
72     $postgres->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
73     $postgres->FullExportDLL('postgres.lib');
74
75     my $snowball = $solution->AddProject('dict_snowball','dll','','src\backend\snowball');
76     $snowball->RelocateFiles('src\backend\snowball\libstemmer', sub {
77         return shift !~ /dict_snowball.c$/;
78     });
79     $snowball->AddIncludeDir('src\include\snowball');
80     $snowball->AddReference($postgres);
81
82     my $plpgsql = $solution->AddProject('plpgsql','dll','PLs','src\pl\plpgsql\src');
83     $plpgsql->AddFiles('src\pl\plpgsql\src','scan.l','gram.y');
84     $plpgsql->AddReference($postgres);
85
86     if ($solution->{options}->{perl})
87     {
88         my $plperl = $solution->AddProject('plperl','dll','PLs','src\pl\plperl');
89         $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE');
90         $plperl->AddDefine('PLPERL_HAVE_UID_GID');
91         if (Solution::IsNewer('src\pl\plperl\SPI.c','src\pl\plperl\SPI.xs'))
92         {
93             print 'Building src\pl\plperl\SPI.c...' . "\n";
94             system( $solution->{options}->{perl}
95                   . '/bin/perl '
96                   . $solution->{options}->{perl}
97                   . '/lib/ExtUtils/xsubpp -typemap '
98                   . $solution->{options}->{perl}
99                   . '/lib/ExtUtils/typemap src\pl\plperl\SPI.xs >src\pl\plperl\SPI.c');
100             if ((!(-f 'src\pl\plperl\SPI.c')) || -z 'src\pl\plperl\SPI.c')
101             {
102                 unlink('src\pl\plperl\SPI.c'); # if zero size
103                 die 'Failed to create SPI.c' . "\n";
104             }
105         }
106         $plperl->AddReference($postgres);
107         $plperl->AddLibrary($solution->{options}->{perl} . '\lib\CORE\perl58.lib');
108     }
109
110     if ($solution->{options}->{python})
111     {
112         my $plpython = $solution->AddProject('plpython','dll','PLs','src\pl\plpython');
113         $plpython->AddIncludeDir($solution->{options}->{python} . '\include');
114         $solution->{options}->{python} =~ /\\Python(\d{2})/i
115           || croak "Could not determine python version from path";
116         $plpython->AddLibrary($solution->{options}->{python} . "\\Libs\\python$1.lib");
117         $plpython->AddReference($postgres);
118     }
119
120     if ($solution->{options}->{tcl})
121     {
122         my $pltcl = $solution->AddProject('pltcl','dll','PLs','src\pl\tcl');
123         $pltcl->AddIncludeDir($solution->{options}->{tcl} . '\include');
124         $pltcl->AddReference($postgres);
125         $pltcl->AddLibrary($solution->{options}->{tcl} . '\lib\tcl84.lib');
126     }
127
128     $libpq = $solution->AddProject('libpq','dll','interfaces','src\interfaces\libpq');
129     $libpq->AddDefine('FRONTEND');
130         $libpq->AddDefine('UNSAFE_STAT_OK');
131     $libpq->AddIncludeDir('src\port');
132     $libpq->AddLibrary('wsock32.lib');
133     $libpq->AddLibrary('secur32.lib');
134     $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap});
135     $libpq->UseDef('src\interfaces\libpq\libpqdll.def');
136     $libpq->ReplaceFile('src\interfaces\libpq\libpqrc.c','src\interfaces\libpq\libpq.rc');
137     $libpq->AddReference($libpgport);
138
139     my $pgtypes =
140       $solution->AddProject('libpgtypes','dll','interfaces','src\interfaces\ecpg\pgtypeslib');
141     $pgtypes->AddDefine('FRONTEND');
142     $pgtypes->AddReference($libpgport);
143     $pgtypes->UseDef('src\interfaces\ecpg\pgtypeslib\pgtypeslib.def');
144     $pgtypes->AddIncludeDir('src\interfaces\ecpg\include');
145
146     my $libecpg =$solution->AddProject('libecpg','dll','interfaces','src\interfaces\ecpg\ecpglib');
147     $libecpg->AddDefine('FRONTEND');
148     $libecpg->AddIncludeDir('src\interfaces\ecpg\include');
149     $libecpg->AddIncludeDir('src\interfaces\libpq');
150     $libecpg->AddIncludeDir('src\port');
151     $libecpg->UseDef('src\interfaces\ecpg\ecpglib\ecpglib.def');
152     $libecpg->AddLibrary('wsock32.lib');
153     $libecpg->AddReference($libpq,$pgtypes,$libpgport);
154
155     my $libecpgcompat =
156       $solution->AddProject('libecpg_compat','dll','interfaces','src\interfaces\ecpg\compatlib');
157     $libecpgcompat->AddIncludeDir('src\interfaces\ecpg\include');
158     $libecpgcompat->AddIncludeDir('src\interfaces\libpq');
159     $libecpgcompat->UseDef('src\interfaces\ecpg\compatlib\compatlib.def');
160     $libecpgcompat->AddReference($pgtypes,$libecpg,$libpgport);
161
162     my $ecpg = $solution->AddProject('ecpg','exe','interfaces','src\interfaces\ecpg\preproc');
163     $ecpg->AddIncludeDir('src\interfaces\ecpg\include');
164     $ecpg->AddIncludeDir('src\interfaces\libpq');
165     $ecpg->AddPrefixInclude('src\interfaces\ecpg\preproc');
166     $ecpg->AddFiles('src\interfaces\ecpg\preproc','pgc.l','preproc.y');
167     $ecpg->AddDefine('MAJOR_VERSION=4');
168     $ecpg->AddDefine('MINOR_VERSION=2');
169     $ecpg->AddDefine('PATCHLEVEL=1');
170     $ecpg->AddDefine('ECPG_COMPILE');
171     $ecpg->AddReference($libpgport);
172
173     my $pgregress_ecpg = $solution->AddProject('pg_regress_ecpg','exe','misc');
174     $pgregress_ecpg->AddFile('src\interfaces\ecpg\test\pg_regress_ecpg.c');
175     $pgregress_ecpg->AddFile('src\test\regress\pg_regress.c');
176     $pgregress_ecpg->AddIncludeDir('src\port');
177     $pgregress_ecpg->AddIncludeDir('src\test\regress');
178     $pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
179     $pgregress_ecpg->AddDefine('FRONTEND');
180     $pgregress_ecpg->AddReference($libpgport);
181
182     # src/bin
183     my $initdb = AddSimpleFrontend('initdb');
184     $initdb->AddIncludeDir('src\interfaces\libpq');
185     $initdb->AddDefine('FRONTEND');
186     $initdb->AddLibrary('wsock32.lib');
187     $initdb->AddLibrary('ws2_32.lib');
188
189     my $pgconfig = AddSimpleFrontend('pg_config');
190
191     my $pgcontrol = AddSimpleFrontend('pg_controldata');
192
193     my $pgctl = AddSimpleFrontend('pg_ctl', 1);
194
195     my $pgreset = AddSimpleFrontend('pg_resetxlog');
196
197     my $pgevent = $solution->AddProject('pgevent','dll','bin');
198     $pgevent->AddFiles('src\bin\pgevent','pgevent.c','pgmsgevent.rc');
199     $pgevent->AddResourceFile('src\bin\pgevent','Eventlog message formatter');
200     $pgevent->RemoveFile('src\bin\pgevent\win32ver.rc');
201     $pgevent->UseDef('src\bin\pgevent\pgevent.def');
202     $pgevent->DisableLinkerWarnings('4104');
203
204     my $psql = AddSimpleFrontend('psql', 1);
205     $psql->AddIncludeDir('src\bin\pg_dump');
206     $psql->AddIncludeDir('src\backend');
207     $psql->AddFile('src\bin\psql\psqlscan.l');
208
209     my $pgdump = AddSimpleFrontend('pg_dump', 1);
210     $pgdump->AddIncludeDir('src\backend');
211     $pgdump->AddFile('src\bin\pg_dump\pg_dump.c');
212     $pgdump->AddFile('src\bin\pg_dump\common.c');
213     $pgdump->AddFile('src\bin\pg_dump\pg_dump_sort.c');
214
215     my $pgdumpall = AddSimpleFrontend('pg_dump', 1);
216     $pgdumpall->{name} = 'pg_dumpall';
217     $pgdumpall->AddIncludeDir('src\backend');
218     $pgdumpall->AddFile('src\bin\pg_dump\pg_dumpall.c');
219
220     my $pgrestore = AddSimpleFrontend('pg_dump', 1);
221     $pgrestore->{name} = 'pg_restore';
222     $pgrestore->AddIncludeDir('src\backend');
223     $pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
224
225     my $zic = $solution->AddProject('zic','exe','utils');
226     $zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c');
227     $zic->AddReference($libpgport);
228
229     if ($solution->{options}->{xml})
230     {
231         $contrib_extraincludes->{'pgxml'} = [
232             $solution->{options}->{xml} . '\include',
233             $solution->{options}->{xslt} . '\include',
234             $solution->{options}->{iconv} . '\include'
235         ];
236
237         $contrib_extralibs->{'pgxml'} = [
238             $solution->{options}->{xml} . '\lib\libxml2.lib',
239             $solution->{options}->{xslt} . '\lib\libxslt.lib'
240         ];
241     }
242     else
243     {
244         push @contrib_excludes,'xml2';
245     }
246
247     if (!$solution->{options}->{openssl})
248     {
249         push @contrib_excludes,'sslinfo';
250     }
251
252     if ($solution->{options}->{uuid})
253     {
254        $contrib_extraincludes->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\include' ];
255        $contrib_extralibs->{'uuid-ossp'} = [ $solution->{options}->{uuid} . '\lib\uuid.lib' ];
256     }
257          else
258     {
259        push @contrib_excludes,'uuid-ossp';
260     }
261
262     # Pgcrypto makefile too complex to parse....
263     my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto');
264     $pgcrypto->AddFiles(
265         'contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c',
266         'px-crypt.c','crypt-gensalt.c','crypt-blowfish.c','crypt-des.c',
267         'crypt-md5.c','mbuf.c','pgp.c','pgp-armor.c',
268         'pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c',
269         'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c',
270         'pgp-pubkey.c','pgp-s2k.c','pgp-pgsql.c'
271     );
272     if ($solution->{options}->{openssl})
273     {
274         $pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c');
275     }
276     else
277     {
278         $pgcrypto->AddFiles(
279             'contrib\pgcrypto', 'md5.c','sha1.c','sha2.c',
280             'internal.c','internal-sha2.c','blf.c','rijndael.c',
281             'fortuna.c','random.c','pgp-mpi-internal.c','imath.c'
282         );
283     }
284     $pgcrypto->AddReference($postgres);
285     $pgcrypto->AddLibrary('wsock32.lib');
286     my $mf = Project::read_file('contrib/pgcrypto/Makefile');
287     GenerateContribSqlFiles('pgcrypto', $mf);
288
289     my $D;
290     opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
291     while (my $d = readdir($D))
292     {
293         next if ($d =~ /^\./);
294         next unless (-f "contrib/$d/Makefile");
295         next if (grep {/^$d$/} @contrib_excludes);
296         AddContrib($d);
297     }
298     closedir($D);
299
300     $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
301     $mf =~ s{\\s*[\r\n]+}{}mg;
302     $mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
303     foreach my $sub (split /\s+/,$1)
304     {
305         my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile');
306         my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
307         $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
308         if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m)
309         {
310             $p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $1);
311         }
312         $p->AddReference($postgres);
313     }
314
315     $mf = Project::read_file('src\backend\foreign\Makefile');
316     $mf =~ s{\\s*[\r\n]+}{}mg;
317     $mf =~ m{FDW\s*=\s*(.*)$}m || die 'Could not match in foreign makefile' . "\n";
318     foreach my $foreign (split /\s+/,$1)
319     {
320         my $proj = $solution->AddProject($foreign . '_fdw', 'dll', 'foreign', 'src\backend\foreign\\' . $foreign);
321         $proj->AddReference($postgres);
322     }
323
324     $mf = Project::read_file('src\bin\scripts\Makefile');
325     $mf =~ s{\\s*[\r\n]+}{}mg;
326     $mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
327     foreach my $prg (split /\s+/,$1)
328     {
329         my $proj = $solution->AddProject($prg,'exe','bin');
330         $mf =~ m{$prg\s*:\s*(.*)$}m || die 'Could not find script define for $prg' . "\n";
331         my @files = split /\s+/,$1;
332         foreach my $f (@files)
333         {
334             if ($f =~ /\/keywords\.o$/)
335             {
336                 $proj->AddFile('src\backend\parser\keywords.c');
337                 $proj->AddIncludeDir('src\backend');
338             }
339             else
340             {
341                 $f =~ s/\.o$/\.c/;
342                 if ($f eq 'dumputils.c')
343                 {
344                     $proj->AddFile('src\bin\pg_dump\dumputils.c');
345                 }
346                 elsif ($f =~ /print\.c$/)
347                 { # Also catches mbprint.c
348                     $proj->AddFile('src\bin\psql\\' . $f);
349                 }
350                 else
351                 {
352                     $proj->AddFile('src\bin\scripts\\' . $f);
353                 }
354             }
355         }
356         $proj->AddIncludeDir('src\interfaces\libpq');
357         $proj->AddIncludeDir('src\bin\pg_dump');
358         $proj->AddIncludeDir('src\bin\psql');
359         $proj->AddReference($libpq,$libpgport);
360         $proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
361     }
362
363     # Regression DLL and EXE
364     my $regress = $solution->AddProject('regress','dll','misc');
365     $regress->AddFile('src\test\regress\regress.c');
366     $regress->AddReference($postgres);
367
368     my $pgregress = $solution->AddProject('pg_regress','exe','misc');
369     $pgregress->AddFile('src\test\regress\pg_regress.c');
370     $pgregress->AddFile('src\test\regress\pg_regress_main.c');
371     $pgregress->AddIncludeDir('src\port');
372     $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
373     $pgregress->AddReference($libpgport);
374
375     $solution->Save();
376 }
377
378 #####################
379 # Utility functions #
380 #####################
381
382 # Add a simple frontend project (exe)
383 sub AddSimpleFrontend
384 {
385     my $n = shift;
386     my $uselibpq= shift;
387
388     my $p = $solution->AddProject($n,'exe','bin');
389     $p->AddDir('src\bin\\' . $n);
390     $p->AddReference($libpgport);
391     if ($uselibpq)
392     {
393         $p->AddIncludeDir('src\interfaces\libpq');
394         $p->AddReference($libpq);
395     }
396     return $p;
397 }
398
399 # Add a simple contrib project
400 sub AddContrib
401 {
402     my $n = shift;
403     my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
404
405     if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg)
406     {
407         my $dn = $1;
408         $mf =~ s{\\\s*[\r\n]+}{}mg;
409         my $proj = $solution->AddProject($dn, 'dll', 'contrib');
410         $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
411                 my $objs = $1;
412         while ($objs =~ /\b([\w-]+\.o)\b/g)
413         {
414                         my $o = $1;
415             $o =~ s/\.o$/.c/;
416             $proj->AddFile('contrib\\' . $n . '\\' . $o);
417         }
418         $proj->AddReference($postgres);
419         if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg)
420         {
421             foreach my $d (split /\s+/, $1)
422             {
423                 my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile');
424                 $mf2 =~ s{\\\s*[\r\n]+}{}mg;
425                 $mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm
426                   || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
427                 $objs = $1;
428                                 while ($objs =~ /\b([\w-]+\.o)\b/g)
429                                 {
430                                         my $o = $1;
431                     $o =~ s/\.o$/.c/;
432                     $proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
433                 }
434             }
435         }
436         AdjustContribProj($proj);
437     }
438     elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg)
439     {
440         foreach my $mod (split /\s+/, $1)
441         {
442             my $proj = $solution->AddProject($mod, 'dll', 'contrib');
443             $proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
444             $proj->AddReference($postgres);
445             AdjustContribProj($proj);
446         }
447     }
448     elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
449     {
450         my $proj = $solution->AddProject($1, 'exe', 'contrib');
451         $mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
452         my $objs = $1;
453         while ($objs =~ /\b([\w-]+\.o)\b/g)
454         {
455                         my $o = $1;
456             $o =~ s/\.o$/.c/;
457             $proj->AddFile('contrib\\' . $n . '\\' . $o);
458         }
459         AdjustContribProj($proj);
460     }
461     else
462     {
463         croak "Could not determine contrib module type for $n\n";
464     }
465
466     # Are there any output data files to build?
467     GenerateContribSqlFiles($n, $mf);
468 }
469
470 sub GenerateContribSqlFiles
471 {
472     my $n = shift;
473     my $mf = shift;
474     if ($mf =~ /^DATA_built\s*=\s*(.*)$/mg)
475     {
476         my $l = $1;
477
478         # Strip out $(addsuffix) rules
479         if (index($l, '$(addsuffix ') >= 0)
480         {
481             my $pcount = 0;
482             my $i;
483             for ($i = index($l, '$(addsuffix ') + 12; $i < length($l); $i++)
484             {
485                 $pcount++ if (substr($l, $i, 1) eq '(');
486                 $pcount-- if (substr($l, $i, 1) eq ')');
487                 last if ($pcount < 0);
488             }
489             $l = substr($l, 0, index($l, '$(addsuffix ')) . substr($l, $i+1);
490         }
491
492         # Special case for contrib/spi
493         $l = "autoinc.sql insert_username.sql moddatetime.sql refint.sql timetravel.sql"
494           if ($n eq 'spi');
495
496         foreach my $d (split /\s+/, $l)
497         {
498             my $in = "$d.in";
499             my $out = "$d";
500
501             if (Solution::IsNewer("contrib/$n/$out", "contrib/$n/$in"))
502             {
503                 print "Building $out from $in (contrib/$n)...\n";
504                 my $cont = Project::read_file("contrib/$n/$in");
505                 my $dn = $out;
506                 $dn =~ s/\.sql$//;
507                 if ($mf =~ /^MODULE_big\s*=\s*(.*)$/m) { $dn = $1 }
508                 $cont =~ s/MODULE_PATHNAME/\$libdir\/$dn/g;
509                 my $o;
510                 open($o,">contrib/$n/$out") || croak "Could not write to contrib/$n/$d";
511                 print $o $cont;
512                 close($o);
513             }
514         }
515     }
516 }
517
518 sub AdjustContribProj
519 {
520     my $proj = shift;
521     my $n = $proj->{name};
522
523     if ($contrib_defines->{$n})
524     {
525         foreach my $d ($contrib_defines->{$n})
526         {
527             $proj->AddDefine($d);
528         }
529     }
530     if (grep {/^$n$/} @contrib_uselibpq)
531     {
532         $proj->AddIncludeDir('src\interfaces\libpq');
533         $proj->AddReference($libpq);
534     }
535     if (grep {/^$n$/} @contrib_uselibpgport)
536     {
537         $proj->AddReference($libpgport);
538     }
539     if ($contrib_extralibs->{$n})
540     {
541         foreach my $l (@{$contrib_extralibs->{$n}})
542         {
543             $proj->AddLibrary($l);
544         }
545     }
546     if ($contrib_extraincludes->{$n})
547     {
548         foreach my $i (@{$contrib_extraincludes->{$n}})
549         {
550             $proj->AddIncludeDir($i);
551         }
552     }
553     if ($contrib_extrasource->{$n})
554     {
555         $proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}});
556     }
557 }
558
559 1;