@@ -46,7 +46,11 @@ my $contrib_extraincludes =
4646my $contrib_extrasource = {
4747' cube' => [' contrib/cube/cubescan.l' ,' contrib/cube/cubeparse.y' ],
4848' seg' => [' contrib/seg/segscan.l' ,' contrib/seg/segparse.y' ], };
49- my @contrib_excludes = (' pgcrypto' ,' commit_ts' ,' intagg' ,' sepgsql' );
49+ my @contrib_excludes = (
50+ ' commit_ts' ,' hstore_plperl' ,
51+ ' hstore_plpython' ,' intagg' ,
52+ ' ltree_plpython' ,' pgcrypto' ,
53+ ' sepgsql' );
5054
5155# Set of variables for frontend modules
5256my $frontend_defines = {' initdb' => ' FRONTEND' };
@@ -176,119 +180,6 @@ sub mkvcbuild
176180$plpgsql -> AddFiles(' src/pl/plpgsql/src' ,' pl_gram.y' );
177181$plpgsql -> AddReference($postgres );
178182
179- if ($solution -> {options }-> {perl })
180- {
181- my $plperlsrc =" src/pl/plperl/" ;
182- my $plperl =
183- $solution -> AddProject(' plperl' ,' dll' ,' PLs' ,' src/pl/plperl' );
184- $plperl -> AddIncludeDir($solution -> {options }-> {perl } .' /lib/CORE' );
185- $plperl -> AddDefine(' PLPERL_HAVE_UID_GID' );
186- foreach my $xs (' SPI.xs' ,' Util.xs' )
187- {
188- (my $xsc =$xs ) =~s /\. xs/ .c/ ;
189- if (Solution::IsNewer(" $plperlsrc$xsc " ," $plperlsrc$xs " ))
190- {
191- my $xsubppdir = first {-e " $_ /ExtUtils/xsubpp" }@INC ;
192- print " Building$plperlsrc$xsc ...\n " ;
193- system ($solution -> {options }-> {perl }
194- .' /bin/perl'
195- ." $xsubppdir /ExtUtils/xsubpp -typemap"
196- .$solution -> {options }-> {perl }
197- .' /lib/ExtUtils/typemap'
198- ." $plperlsrc$xs "
199- ." >$plperlsrc$xsc " );
200- if ((!(-f " $plperlsrc$xsc " )) ||-z " $plperlsrc$xsc " )
201- {
202- unlink (" $plperlsrc$xsc " );# if zero size
203- die " Failed to create$xsc .\n " ;
204- }
205- }
206- }
207- if (Solution::IsNewer(
208- ' src/pl/plperl/perlchunks.h' ,
209- ' src/pl/plperl/plc_perlboot.pl' )
210- || Solution::IsNewer(
211- ' src/pl/plperl/perlchunks.h' ,
212- ' src/pl/plperl/plc_trusted.pl' ))
213- {
214- print ' Building src/pl/plperl/perlchunks.h ...' ." \n " ;
215- my $basedir = getcwd;
216- chdir ' src/pl/plperl' ;
217- system ($solution -> {options }-> {perl }
218- .' /bin/perl'
219- .' text2macro.pl'
220- .' --strip="^(\#.*|\s*)$$"'
221- .' plc_perlboot.pl plc_trusted.pl'
222- .' >perlchunks.h' );
223- chdir $basedir ;
224- if ((!(-f ' src/pl/plperl/perlchunks.h' ))
225- ||-z ' src/pl/plperl/perlchunks.h' )
226- {
227- unlink (' src/pl/plperl/perlchunks.h' );# if zero size
228- die ' Failed to create perlchunks.h' ." \n " ;
229- }
230- }
231- if (Solution::IsNewer(
232- ' src/pl/plperl/plperl_opmask.h' ,
233- ' src/pl/plperl/plperl_opmask.pl' ))
234- {
235- print ' Building src/pl/plperl/plperl_opmask.h ...' ." \n " ;
236- my $basedir = getcwd;
237- chdir ' src/pl/plperl' ;
238- system ($solution -> {options }-> {perl }
239- .' /bin/perl'
240- .' plperl_opmask.pl'
241- .' plperl_opmask.h' );
242- chdir $basedir ;
243- if ((!(-f ' src/pl/plperl/plperl_opmask.h' ))
244- ||-z ' src/pl/plperl/plperl_opmask.h' )
245- {
246- unlink (' src/pl/plperl/plperl_opmask.h' );# if zero size
247- die ' Failed to create plperl_opmask.h' ." \n " ;
248- }
249- }
250- $plperl -> AddReference($postgres );
251- my @perl_libs =
252- grep {/ perl\d +.lib$ / }
253- glob ($solution -> {options }-> {perl } .' \lib\CORE\perl*.lib' );
254- if (@perl_libs == 1)
255- {
256- $plperl -> AddLibrary($perl_libs [0]);
257- }
258- else
259- {
260- die " could not identify perl library version" ;
261- }
262- }
263-
264- if ($solution -> {options }-> {python })
265- {
266-
267- # Attempt to get python version and location.
268- # Assume python.exe in specified dir.
269- open (P,
270- $solution -> {options }-> {python }
271- ." \\ python -c\" import sys;print(sys.prefix);print(str(sys.version_info[0])+str(sys.version_info[1]))\" |"
272- ) ||die " Could not query for python version!\n " ;
273- my $pyprefix = <P>;
274- chomp ($pyprefix );
275- my $pyver = <P>;
276- chomp ($pyver );
277- close (P);
278-
279- # Sometimes (always?) if python is not present, the execution
280- # appears to work, but gives no data...
281- die " Failed to query python for version information\n "
282- if (!(defined ($pyprefix ) &&defined ($pyver )));
283-
284- my $pymajorver =substr ($pyver , 0, 1);
285- my $plpython =$solution -> AddProject(' plpython' .$pymajorver ,
286- ' dll' ,' PLs' ,' src/pl/plpython' );
287- $plpython -> AddIncludeDir($pyprefix .' /include' );
288- $plpython -> AddLibrary($pyprefix ." /Libs/python$pyver .lib" );
289- $plpython -> AddReference($postgres );
290- }
291-
292183if ($solution -> {options }-> {tcl })
293184{
294185my $pltcl =
@@ -571,6 +462,138 @@ sub mkvcbuild
571462closedir ($D );
572463}
573464
465+ # Build Perl and Python modules after contrib/ modules to satisfy some
466+ # dependencies with transform contrib modules, like hstore_plpython
467+ # ltree_plpython and hstore_plperl.
468+ if ($solution -> {options }-> {python })
469+ {
470+ # Attempt to get python version and location.
471+ # Assume python.exe in specified dir.
472+ my $pythonprog =" import sys;print(sys.prefix);" .
473+ " print(str(sys.version_info[0])+str(sys.version_info[1]))" ;
474+ my $prefixcmd =$solution -> {options }-> {python }
475+ ." \\ python -c\" $pythonprog \" " ;
476+ my $pyout =` $prefixcmd ` ;
477+ die " Could not query for python version!\n " if $? ;
478+ my ($pyprefix ,$pyver ) =split (/ \r ?\n / ,$pyout );
479+
480+ # Sometimes (always?) if python is not present, the execution
481+ # appears to work, but gives no data...
482+ die " Failed to query python for version information\n "
483+ if (!(defined ($pyprefix ) &&defined ($pyver )));
484+
485+ my $pymajorver =substr ($pyver , 0, 1);
486+ my $plpython =$solution -> AddProject(' plpython' .$pymajorver ,
487+ ' dll' ,' PLs' ,' src/pl/plpython' );
488+ $plpython -> AddIncludeDir($pyprefix .' /include' );
489+ $plpython -> AddLibrary($pyprefix ." /Libs/python$pyver .lib" );
490+ $plpython -> AddReference($postgres );
491+
492+ # Add transform modules dependent on plpython
493+ AddTransformModule(' hstore_plpython' .$pymajorver ,
494+ ' contrib/hstore_plpython' ,
495+ ' plpython' .$pymajorver ,
496+ ' src/pl/plpython' ,' hstore' ,
497+ ' contrib/hstore' );
498+ AddTransformModule(' ltree_plpython' .$pymajorver ,
499+ ' contrib/ltree_plpython' ,
500+ ' plpython' .$pymajorver ,
501+ ' src/pl/plpython' ,' ltree' ,
502+ ' contrib/ltree' );
503+ }
504+
505+ if ($solution -> {options }-> {perl })
506+ {
507+ my $plperlsrc =" src/pl/plperl/" ;
508+ my $plperl =
509+ $solution -> AddProject(' plperl' ,' dll' ,' PLs' ,' src/pl/plperl' );
510+ $plperl -> AddIncludeDir($solution -> {options }-> {perl } .' /lib/CORE' );
511+ $plperl -> AddDefine(' PLPERL_HAVE_UID_GID' );
512+ foreach my $xs (' SPI.xs' ,' Util.xs' )
513+ {
514+ (my $xsc =$xs ) =~s /\. xs/ .c/ ;
515+ if (Solution::IsNewer(" $plperlsrc$xsc " ," $plperlsrc$xs " ))
516+ {
517+ my $xsubppdir = first {-e " $_ /ExtUtils/xsubpp" }@INC ;
518+ print " Building$plperlsrc$xsc ...\n " ;
519+ system ($solution -> {options }-> {perl }
520+ .' /bin/perl'
521+ ." $xsubppdir /ExtUtils/xsubpp -typemap"
522+ .$solution -> {options }-> {perl }
523+ .' /lib/ExtUtils/typemap'
524+ ." $plperlsrc$xs "
525+ ." >$plperlsrc$xsc " );
526+ if ((!(-f " $plperlsrc$xsc " )) ||-z " $plperlsrc$xsc " )
527+ {
528+ unlink (" $plperlsrc$xsc " );# if zero size
529+ die " Failed to create$xsc .\n " ;
530+ }
531+ }
532+ }
533+ if (Solution::IsNewer(
534+ ' src/pl/plperl/perlchunks.h' ,
535+ ' src/pl/plperl/plc_perlboot.pl' )
536+ || Solution::IsNewer(
537+ ' src/pl/plperl/perlchunks.h' ,
538+ ' src/pl/plperl/plc_trusted.pl' ))
539+ {
540+ print ' Building src/pl/plperl/perlchunks.h ...' ." \n " ;
541+ my $basedir = getcwd;
542+ chdir ' src/pl/plperl' ;
543+ system ($solution -> {options }-> {perl }
544+ .' /bin/perl'
545+ .' text2macro.pl'
546+ .' --strip="^(\#.*|\s*)$$"'
547+ .' plc_perlboot.pl plc_trusted.pl'
548+ .' >perlchunks.h' );
549+ chdir $basedir ;
550+ if ((!(-f ' src/pl/plperl/perlchunks.h' ))
551+ ||-z ' src/pl/plperl/perlchunks.h' )
552+ {
553+ unlink (' src/pl/plperl/perlchunks.h' );# if zero size
554+ die ' Failed to create perlchunks.h' ." \n " ;
555+ }
556+ }
557+ if (Solution::IsNewer(
558+ ' src/pl/plperl/plperl_opmask.h' ,
559+ ' src/pl/plperl/plperl_opmask.pl' ))
560+ {
561+ print ' Building src/pl/plperl/plperl_opmask.h ...' ." \n " ;
562+ my $basedir = getcwd;
563+ chdir ' src/pl/plperl' ;
564+ system ($solution -> {options }-> {perl }
565+ .' /bin/perl'
566+ .' plperl_opmask.pl'
567+ .' plperl_opmask.h' );
568+ chdir $basedir ;
569+ if ((!(-f ' src/pl/plperl/plperl_opmask.h' ))
570+ ||-z ' src/pl/plperl/plperl_opmask.h' )
571+ {
572+ unlink (' src/pl/plperl/plperl_opmask.h' );# if zero size
573+ die ' Failed to create plperl_opmask.h' ." \n " ;
574+ }
575+ }
576+ $plperl -> AddReference($postgres );
577+ my @perl_libs =
578+ grep {/ perl\d +.lib$ / }
579+ glob ($solution -> {options }-> {perl } .' \lib\CORE\perl*.lib' );
580+ if (@perl_libs == 1)
581+ {
582+ $plperl -> AddLibrary($perl_libs [0]);
583+ }
584+ else
585+ {
586+ die " could not identify perl library version" ;
587+ }
588+
589+ # Add transform module dependent on plperl
590+ my $hstore_plperl =
591+ AddTransformModule(' hstore_plperl' ,' contrib/hstore_plperl' ,
592+ ' plperl' ,' src/pl/plperl' ,
593+ ' hstore' ,' contrib/hstore' );
594+ $hstore_plperl -> AddDefine(' PLPERL_HAVE_UID_GID' );
595+ }
596+
574597$mf =
575598 Project::read_file(' src/backend/utils/mb/conversion_procs/Makefile' );
576599$mf =~s {\\\r ?\n } {} g ;
@@ -680,6 +703,68 @@ sub AddSimpleFrontend
680703return $p ;
681704}
682705
706+ # Add a simple transform module
707+ sub AddTransformModule
708+ {
709+ my $n =shift ;
710+ my $n_src =shift ;
711+ my $pl_proj_name =shift ;
712+ my $pl_src =shift ;
713+ my $transform_name =shift ;
714+ my $transform_src =shift ;
715+
716+ my $transform_proj =undef ;
717+ foreach my $proj (@{$solution -> {projects }-> {' contrib' } })
718+ {
719+ if ($proj -> {name }eq $transform_name )
720+ {
721+ $transform_proj =$proj ;
722+ last ;
723+ }
724+ }
725+ die " could not find base module$transform_name for transform module$n "
726+ if (!defined ($transform_proj ));
727+
728+ my $pl_proj =undef ;
729+ foreach my $proj (@{$solution -> {projects }-> {' PLs' } })
730+ {
731+ if ($proj -> {name }eq $pl_proj_name )
732+ {
733+ $pl_proj =$proj ;
734+ last ;
735+ }
736+ }
737+ die " could not find PL$pl_proj_name for transform module$n "
738+ if (!defined ($pl_proj ));
739+
740+ my $p =$solution -> AddProject($n ,' dll' ,' contrib' ,$n_src );
741+ for my $file (glob (" $n_src /*.c" ))
742+ {
743+ $p -> AddFile($file );
744+ }
745+ $p -> AddReference($postgres );
746+
747+ # Add PL dependencies
748+ $p -> AddIncludeDir($pl_src );
749+ $p -> AddReference($pl_proj );
750+ $p -> AddIncludeDir($pl_proj -> {includes });
751+ foreach my $pl_lib (@{$pl_proj -> {libraries }})
752+ {
753+ $p -> AddLibrary($pl_lib );
754+ }
755+
756+ # Add base module dependencies
757+ $p -> AddIncludeDir($transform_src );
758+ $p -> AddIncludeDir($transform_proj -> {includes });
759+ foreach my $trans_lib (@{$transform_proj -> {libraries }})
760+ {
761+ $p -> AddLibrary($trans_lib );
762+ }
763+ $p -> AddReference($transform_proj );
764+
765+ return $p ;
766+ }
767+
683768# Add a simple contrib project
684769sub AddContrib
685770{