Updates for vcbuild

Started by Magnus Haganderabout 19 years ago4 messages
#1Magnus Hagander
mha@sollentuna.net
1 attachment(s)

* Does version check on pgbison per previous discussion. Accepts 1.875,
or >2.0 except 2.1.
* Sets the stacksize from the makefile (as added to the standard
makefiles for mingw)
* Factor out a function read_file that reads a complete file, cuts down
the code a bit.
* Support for building contrib modules
* Builds zic.exe

//Magnus

Attachments:

vcbuild.diffapplication/octet-stream; name=vcbuild.diffDownload
Index: src\tools\msvc/Project.pm
===================================================================
RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/Project.pm,v
retrieving revision 1.2
diff -c -r1.2 Project.pm
*** src\tools\msvc/Project.pm	15 Sep 2006 21:42:02 -0000	1.2
--- src\tools\msvc/Project.pm	20 Oct 2006 23:45:39 -0000
***************
*** 286,292 ****
  			my $of = $f;
  			$of =~ s/\.y$/.c/;
  			$of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
! 			print F '>' . GenerateCustomTool('Running bison on ' . $f, 'src\tools\msvc\pgbison.bat ' . $f, $of) . '</File>' . "\n";
  		}
  		elsif ($f =~ /\.l$/) {
  			my $of = $f;
--- 286,292 ----
  			my $of = $f;
  			$of =~ s/\.y$/.c/;
  			$of =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c};
! 			print F '>' . GenerateCustomTool('Running bison on ' . $f, 'cmd /V:ON /c src\tools\msvc\pgbison.bat ' . $f, $of) . '</File>' . "\n";
  		}
  		elsif ($f =~ /\.l$/) {
  			my $of = $f;
***************
*** 358,364 ****
  	ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
  	<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
  		AdditionalIncludeDirectories="src/include;src/include/port/win32;src/include/port/win32_msvc;$self->{solution}->{options}->{pthread};$self->{includes}"
! 		PreprocessorDefinitions="WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}"
  		StringPooling="$p->{strpool}"
  		RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
  EOF
--- 358,364 ----
  	ConfigurationType="$cfgtype" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="FALSE" CharacterSet="2" WholeProgramOptimization="$p->{wholeopt}">
  	<Tool Name="VCCLCompilerTool" Optimization="$p->{opt}"
  		AdditionalIncludeDirectories="src/include;src/include/port/win32;src/include/port/win32_msvc;$self->{solution}->{options}->{pthread};$self->{includes}"
! 		PreprocessorDefinitions="WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}"
  		StringPooling="$p->{strpool}"
  		RuntimeLibrary="$p->{runtime}" DisableSpecificWarnings="$self->{disablewarnings}"
  EOF
***************
*** 406,410 ****
--- 406,425 ----
  EOF
  }
  
+ 
+ # Utility function that loads a complete file
+ sub read_file {
+ 	my $filename = shift;
+ 	my $F;
+ 	my $t = $/;
+ 
+ 	undef $/;
+ 	open($F, $filename) || croak "Could not open file $filename\n";
+ 	my $txt = <$F>;
+ 	close($F);
+ 	$/ = $t;
+ 	
+ 	return $txt;
+ }
  
  1;
Index: src\tools\msvc/config.pl
===================================================================
RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/config.pl,v
retrieving revision 1.1
diff -c -r1.1 config.pl
*** src\tools\msvc/config.pl	4 Sep 2006 21:30:40 -0000	1.1
--- src\tools\msvc/config.pl	20 Oct 2006 23:54:34 -0000
***************
*** 11,17 ****
  	krb5=>'c:\prog\pgsql\depend\krb5', # --with-krb5=<path>

  	ldap=>1,			# --with-ldap

  	openssl=>'c:\openssl', # --with-ssl=<path>

! 	pthread=>'c:\prog\pgsql\depend\pthread', # foo baz?

  	zlib=>'c:\prog\pgsql\depend\zlib'# --with-zlib=<path>

  };

  

--- 11,20 ----
  	krb5=>'c:\prog\pgsql\depend\krb5', # --with-krb5=<path>

  	ldap=>1,			# --with-ldap

  	openssl=>'c:\openssl', # --with-ssl=<path>

! 	pthread=>'c:\prog\pgsql\depend\pthread',
! 	xml=>'c:\prog\pgsql\depend\libxml2',
! 	xslt=>'c:\prog\pgsql\depend\libxslt',
! 	iconv=>'c:\prog\pgsql\depend\iconv',

  	zlib=>'c:\prog\pgsql\depend\zlib'# --with-zlib=<path>

  };

  

Index: src\tools\msvc/mkvcbuild.pl
===================================================================
RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/mkvcbuild.pl,v
retrieving revision 1.5
diff -c -r1.5 mkvcbuild.pl
*** src\tools\msvc/mkvcbuild.pl	4 Oct 2006 16:51:22 -0000	1.5
--- src\tools\msvc/mkvcbuild.pl	20 Oct 2006 22:22:45 -0000
***************
*** 144,159 ****
  $pgrestore->{name} = 'pg_restore';
  $pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
  
! open(MF,'src\backend\utils\mb\conversion_procs\Makefile') || die 'Could not open src\backend\utils\mb\conversion_procs\Makefile';
! my $t = $/;undef $/;
! my $mf = <MF>;
! close(MF);
  $mf =~ s{\\s*[\r\n]+}{}mg;
  $mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
  foreach my $sub (split /\s+/,$1) {
! 	open(MF,'src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile') || die 'Could not open Makefile for $sub';
! 	$mf = <MF>;
! 	close(MF);
  	my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
  	$p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
  	if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m) {
--- 144,216 ----
  $pgrestore->{name} = 'pg_restore';
  $pgrestore->AddFile('src\bin\pg_dump\pg_restore.c');
  
! my $zic = $solution->AddProject('zic','exe','utils');
! $zic->AddFiles('src\timezone','zic.c','ialloc.c','scheck.c','localtime.c');
! $zic->AddReference($libpgport);
! 
! my $contrib_defines = {
! 	'refint' => 'REFINT_VERBOSE'
! };
! my @contrib_uselibpq = ('dblink', 'oid2name', 'pgbench', 'vacuumlo');
! my @contrib_uselibpgport = ('oid2name', 'pgbench', 'vacuumlo');
! my $contrib_extralibs = {
!     'pgbench' => ['wsock32.lib']
! };
! my $contrib_extraincludes = {
! 	'tsearch2' => ['contrib/tsearch2']
! };
! my $contrib_extrasource = {
! 	'cube' => ['cubescan.l','cubeparse.y'],
! 	'seg' => ['segscan.l','segparse.y']
! };
! 
! my @contrib_excludes = ('pgcrypto');
! 
! if ($solution->{options}->{xml}) {
! 	$contrib_extraincludes->{'xml2'} = [$solution->{options}->{xml} . '\include' ,
! 		$solution->{options}->{xslt} . '\include',
! 		$solution->{options}->{iconv} . '\include'];
! 
! 	$contrib_extralibs->{'xml2'} = [$solution->{options}->{xml} . '\lib\libxml2.lib',
! 		$solution->{options}->{xslt} . '\lib\libxslt.lib'];
! }
! else {
! 	push @contrib_excludes,'xml2';
! }
! 
! # Pgcrypto makefile too complex to parse....
! my $pgcrypto = $solution->AddProject('pgcrypto','dll','crypto');
! $pgcrypto->AddFiles('contrib\pgcrypto','pgcrypto.c','px.c','px-hmac.c','px-crypt.c',
! 		'crypt-gensalt.c','crypt-blowfish.c','crypt-des.c','crypt-md5.c','mbuf.c',
! 		'pgp.c','pgp-armor.c','pgp-cfb.c','pgp-compress.c','pgp-decrypt.c','pgp-encrypt.c',
! 		'pgp-info.c','pgp-mpi.c','pgp-pubdec.c','pgp-pubenc.c','pgp-pubkey.c','pgp-s2k.c',
! 		'pgp-pgsql.c');
! if ($solution->{options}->{openssl}) {
! 	$pgcrypto->AddFiles('contrib\pgcrypto', 'openssl.c','pgp-mpi-openssl.c');
! }
! else {
! 	$pgcrypto->AddFiles('contrib\pgcrypto', 'md5.c','sha1.c','sha2.c','internal.c','internal-sha2.c',
! 			'blf.c','rijndael.c','fortuna.c','random.c','pgp-mpi-internal.c','imath.c');
! }
! $pgcrypto->AddReference($postgres);
! $pgcrypto->AddLibrary('wsock32.lib');
! 
! my $D;
! opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
! while (my $d = readdir($D)) {
! 	next if ($d =~ /^\./);
! 	next unless (-f "contrib/$d/Makefile");
! 	next if (grep {/^$d$/} @contrib_excludes);
! 	AddContrib($d);
! }
! closedir($D);
! 
! 
! my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
  $mf =~ s{\\s*[\r\n]+}{}mg;
  $mf =~ m{DIRS\s*=\s*(.*)$}m || die 'Could not match in conversion makefile' . "\n";
  foreach my $sub (split /\s+/,$1) {
! 	my $mf = Project::read_file('src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile');
  	my $p = $solution->AddProject($sub, 'dll', 'conversion procs');
  	$p->AddFile('src\backend\utils\mb\conversion_procs\\' . $sub . '\\' . $sub . '.c');
  	if ($mf =~ m{^SRCS\s*\+=\s*(.*)$}m) {
***************
*** 162,170 ****
  	$p->AddReference($postgres);
  }
  
! open(MF,'src\bin\scripts\Makefile') || die 'Could not open src\bin\scripts\Makefile';
! $mf = <MF>;
! close(MF);
  $mf =~ s{\\s*[\r\n]+}{}mg;
  $mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
  foreach my $prg (split /\s+/,$1) {
--- 219,225 ----
  	$p->AddReference($postgres);
  }
  
! $mf = Project::read_file('src\bin\scripts\Makefile');
  $mf =~ s{\\s*[\r\n]+}{}mg;
  $mf =~ m{PROGRAMS\s*=\s*(.*)$}m || die 'Could not match in bin\scripts\Makefile' . "\n";
  foreach my $prg (split /\s+/,$1) {
***************
*** 194,200 ****
  	$proj->AddReference($libpq,$libpgport);
  	$proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
  }
- $/ = $t;
  
  
  # Regression DLLs
--- 249,254 ----
***************
*** 202,217 ****
  $regress->AddFile('src\test\regress\regress.c');
  $regress->AddReference($postgres);
  
- my $refint = $solution->AddProject('refint','dll','contrib');
- $refint->AddFile('contrib\spi\refint.c');
- $refint->AddReference($postgres);
- $refint->AddDefine('REFINT_VERBOSE');
- 
- my $autoinc = $solution->AddProject('autoinc','dll','contrib');
- $autoinc ->AddFile('contrib\spi\autoinc.c');
- $autoinc->AddReference($postgres);
- 
- 
  $solution->Save();
  
  #####################
--- 256,261 ----
***************
*** 234,236 ****
--- 278,363 ----
  	return $p;
  }
  
+ 
+ # Add a simple contrib project
+ sub AddContrib {
+ 	my $n = shift;
+ 	my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
+ 
+ 	if ($mf =~ /^MODULE_big/mg) {
+ 		$mf =~ s{\\\s*[\r\n]+}{}mg;
+ 		my $proj = $solution->AddProject($n, 'dll', 'contrib');
+ 		$mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
+ 		foreach my $o (split /\s+/, $1) {
+ 			$o =~ s/\.o$/.c/;
+ 			$proj->AddFile('contrib\\' . $n . '\\' . $o);
+ 		}
+ 		$proj->AddReference($postgres);
+ 		if ($mf =~ /^SUBDIRS\s*:?=\s*(.*)$/mg) {
+ 			foreach my $d (split /\s+/, $1) {
+ 				my $mf2 = Project::read_file('contrib\\' . $n . '\\' . $d . '\Makefile');
+ 				$mf2 =~ s{\\\s*[\r\n]+}{}mg;
+ 				$mf2 =~ /^SUBOBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n, subdir $d\n";
+ 				foreach my $o (split /\s+/, $1) {
+ 					$o =~ s/\.o$/.c/;
+ 					$proj->AddFile('contrib\\' . $n . '\\' . $d . '\\' . $o);
+ 				}
+ 			}
+ 		}
+ 		AdjustContribProj($proj);
+ 		return $proj;
+ 	}
+ 	elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg) {
+ 		foreach my $mod (split /\s+/, $1) {
+ 			my $proj = $solution->AddProject($mod, 'dll', 'contrib');
+ 			$proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
+ 			$proj->AddReference($postgres);
+ 			AdjustContribProj($proj);
+ 		}
+ 		return undef;
+ 	}
+ 	elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg) {
+ 		my $proj = $solution->AddProject($1, 'exe', 'contrib');
+ 		$mf =~ /^OBJS\s*=\s*(.*)$/gm || croak "Could not find objects in MODULE_big for $n\n";
+ 		foreach my $o (split /\s+/, $1) {
+ 			$o =~ s/\.o$/.c/;
+ 			$proj->AddFile('contrib\\' . $n . '\\' . $o);
+ 		}
+ 		AdjustContribProj($proj);
+ 		return $proj;
+ 	}
+ 	else {
+ 		croak "Could not determine contrib module type for $n\n";
+ 	}
+ }
+ 
+ sub AdjustContribProj {
+ 	my $proj = shift;
+ 	my $n = $proj->{name};
+ 
+ 	if ($contrib_defines->{$n}) {
+ 		foreach my $d ($contrib_defines->{$n}) {
+ 			$proj->AddDefine($d);
+ 		}
+ 	}
+ 	if (grep {/^$n$/} @contrib_uselibpq) {
+ 		$proj->AddIncludeDir('src\interfaces\libpq');
+ 		$proj->AddReference($libpq);
+ 	}
+ 	if (grep {/^$n$/} @contrib_uselibpgport) {
+ 		$proj->AddReference($libpgport);
+ 	}
+ 	if ($contrib_extralibs->{$n}) {
+ 		foreach my $l (@{$contrib_extralibs->{$n}}) {
+ 			$proj->AddLibrary($l);
+ 		}
+ 	}
+ 	if ($contrib_extraincludes->{$n}) {
+ 		foreach my $i (@{$contrib_extraincludes->{$n}}) {
+ 			$proj->AddIncludeDir($i);
+ 		}
+ 	}
+ 	if ($contrib_extrasource->{$n}) {
+ 		$proj->AddFiles('contrib\\' . $n, @{$contrib_extrasource->{$n}});
+ 	}
+ }
Index: src\tools\msvc/pgbison.bat
===================================================================
RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/pgbison.bat,v
retrieving revision 1.1
diff -c -r1.1 pgbison.bat
*** src\tools\msvc/pgbison.bat	4 Sep 2006 21:30:40 -0000	1.1
--- src\tools\msvc/pgbison.bat	20 Oct 2006 23:42:56 -0000
***************
*** 1,11 ****
! @echo off

! bison -V > NUL

! if errorlevel 1 goto nobison

  

  if "%1" == "src\backend\parser\gram.y" call :generate %1 src\backend\parser\gram.c src\include\parser\parse.h

  if "%1" == "src\backend\bootstrap\bootparse.y" call :generate %1 src\backend\bootstrap\bootparse.c src\backend\bootstrap\bootstrap_tokens.h

  if "%1" == "src\pl\plpgsql\src\gram.y" call :generate %1 src\pl\plpgsql\src\pl_gram.c src\pl\plpgsql\src\pl.tab.h

! if "%1" == "src\interfaces\ecpg\preproc\preproc.y" call :generate %1 src\interfaces\ecpg\preproc\preproc.c src\interfaces\ecpg\preproc\preproc.h

  

  echo Unknown bison input: %1

  exit 1

--- 1,16 ----
! @echo off
! SET BV=
! for /F "tokens=4 usebackq" %%f in (`bison -V`) do if "!BV!"=="" SET BV=%%f
! if "%BV%"=="" goto novarexp
! if %BV% LSS 1.875 goto nobison
! if %BV% EQU 2.1 goto nobison
  

  if "%1" == "src\backend\parser\gram.y" call :generate %1 src\backend\parser\gram.c src\include\parser\parse.h

  if "%1" == "src\backend\bootstrap\bootparse.y" call :generate %1 src\backend\bootstrap\bootparse.c src\backend\bootstrap\bootstrap_tokens.h

  if "%1" == "src\pl\plpgsql\src\gram.y" call :generate %1 src\pl\plpgsql\src\pl_gram.c src\pl\plpgsql\src\pl.tab.h

! if "%1" == "src\interfaces\ecpg\preproc\preproc.y" call :generate %1 src\interfaces\ecpg\preproc\preproc.c src\interfaces\ecpg\preproc\preproc.h
! if "%1" == "contrib\cube\cubeparse.y" call :generate %1 contrib\cube\cubeparse.c contrib\cube\cubeparse.h
! if "%1" == "contrib\seg\segparse.y" call :generate %1 contrib\seg\segparse.c contrib\seg\segparse.h

  

  echo Unknown bison input: %1

  exit 1

***************
*** 21,27 ****
  del %fn:~0,-2%.tab.*

  exit 0

  

  

  :nobison

! echo WARNING! Bison install not found, attempting to build without!

  exit 0

--- 26,37 ----
  del %fn:~0,-2%.tab.*

  exit 0

  

+ 
+ :novarexp
+ echo pgbison must be called with cmd /V:ON /C pgbison to work!
+ exit 1
  

  :nobison

! echo WARNING! Bison install not found, or unsupported Bison version.
! echo Attempting to build without.

  exit 0

Index: src\tools\msvc/pgflex.bat
===================================================================
RCS file: c:/prog/cvsrepo/pgsql/pgsql/src/tools/msvc/pgflex.bat,v
retrieving revision 1.1
diff -c -r1.1 pgflex.bat
*** src\tools\msvc/pgflex.bat	4 Sep 2006 21:30:40 -0000	1.1
--- src\tools\msvc/pgflex.bat	19 Oct 2006 18:51:09 -0000
***************
*** 7,13 ****
  if "%1" == "src\backend\utils\misc\guc-file.l" call :generate %1 src\backend\utils\misc\guc-file.c

  if "%1" == "src\pl\plpgsql\src\scan.l" call :generate %1 src\pl\plpgsql\src\pl_scan.c

  if "%1" == "src\interfaces\ecpg\preproc\pgc.l" call :generate %1 src\interfaces\ecpg\preproc\pgc.c

! if "%1" == "src\bin\psql\psqlscan.l" call :generate %1 src\bin\psql\psqlscan.c

  

  echo Unknown flex input: %1

  exit 1

--- 7,15 ----
  if "%1" == "src\backend\utils\misc\guc-file.l" call :generate %1 src\backend\utils\misc\guc-file.c

  if "%1" == "src\pl\plpgsql\src\scan.l" call :generate %1 src\pl\plpgsql\src\pl_scan.c

  if "%1" == "src\interfaces\ecpg\preproc\pgc.l" call :generate %1 src\interfaces\ecpg\preproc\pgc.c

! if "%1" == "src\bin\psql\psqlscan.l" call :generate %1 src\bin\psql\psqlscan.c
! if "%1" == "contrib\cube\cubescan.l" call :generate %1 contrib\cube\cubescan.c

! if "%1" == "contrib\seg\segscan.l" call :generate %1 contrib\seg\segscan.c

  

  echo Unknown flex input: %1

  exit 1

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Magnus Hagander (#1)
Re: Updates for vcbuild

"Magnus Hagander" <mha@sollentuna.net> writes:

[ various fixes ]

I'm confused: which of the files in src/tools/msvc need to have
Windows-style newlines, if any? GNU patch wants to strip the newlines
from your patches, so it'd be easiest from here if the answer is "none".

regards, tom lane

#3Magnus Hagander
mha@sollentuna.net
In reply to: Tom Lane (#2)
Re: Updates for vcbuild

[ various fixes ]

I'm confused: which of the files in src/tools/msvc need to
have Windows-style newlines, if any? GNU patch wants to
strip the newlines from your patches, so it'd be easiest from
here if the answer is "none".

Hmm. I think the answer should be "none", yes. Both .bat and .pl/.pm can
deal with unix style line breaks.

Looking around, I think my own cvs is getting confused over the mix, and
that's why it looks weird in the patch.

//Magnus

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Magnus Hagander (#3)
Re: Updates for vcbuild

"Magnus Hagander" <mha@sollentuna.net> writes:

Hmm. I think the answer should be "none", yes. Both .bat and .pl/.pm can
deal with unix style line breaks.

OK, patch applied and all ^M's removed in src/tools/msvc/

regards, tom lane