diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm
index e90b98d4b3eafc4b6cff7024838f0869027dcae9..05435c405954d683e19d82e3b79487d3cf744c94 100644
--- a/src/tools/msvc/Project.pm
+++ b/src/tools/msvc/Project.pm
@@ -286,7 +286,7 @@ EOF
 			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";
+			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,7 +358,7 @@ sub WriteConfiguration
 	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}"
+		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
@@ -407,4 +407,19 @@ 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;
diff --git a/src/tools/msvc/config.pl b/src/tools/msvc/config.pl
index 0165819d67e28c02534bf002195db7eb48a3907c..f6ece40d07e67c4b72e293ae1f4ea5b2fd09e385 100644
--- a/src/tools/msvc/config.pl
+++ b/src/tools/msvc/config.pl
@@ -1,18 +1,21 @@
-# Configuration arguments for vcbuild.
-use strict;
-use warnings;
-
-our $config = {
-	asserts=>1,			# --enable-cassert
-	nls=>undef,				# --enable-nls=<path>
-	tcl=>'c:\tcl',		# --with-tls=<path>
-	perl=>1, 			# --with-perl
-	python=>'c:\python24', # --with-python=<path>
-	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>
-};
-
-1;
+# Configuration arguments for vcbuild.
+use strict;
+use warnings;
+
+our $config = {
+	asserts=>1,			# --enable-cassert
+	nls=>undef,				# --enable-nls=<path>
+	tcl=>'c:\tcl',		# --with-tls=<path>
+	perl=>1, 			# --with-perl
+	python=>'c:\python24', # --with-python=<path>
+	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>
+};
+
+1;
diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc/gendef.pl
index fd97497f70b23e70a37c574345de1523ac5bb7a6..d5d9bc78c7d4c0f063974d7317db63d2e8a576d7 100644
--- a/src/tools/msvc/gendef.pl
+++ b/src/tools/msvc/gendef.pl
@@ -1,50 +1,50 @@
-my @def;
-
-die "Usage: gendef.pl <modulepath>\n" unless ($ARGV[0] =~ /\\([^\\]+$)/);
-my $defname = uc $1;
-
-if (-f "$ARGV[0]/$defname.def") {
-	print "Not re-generating $defname.DEF, file already exists.\n";
-	exit(0);
-}
-
-print "Generating $defname.DEF from directory $ARGV[0]\n";
-
-while (<$ARGV[0]/*>) {
-    print ".";
-	open(F,"dumpbin /symbols $_|") || die "Could not open $_\n";
-	while (<F>) {
-		s/\(\)//g;
-		next unless /^\d/;
-		my @pieces = split ;
-		next unless $pieces[6];
-		next if ($pieces[2] eq "UNDEF");
-		next unless ($pieces[4] eq "External");
-		next if $pieces[6] =~ /^@/;
-		next if $pieces[6] =~ /^\(/;
-		next if $pieces[6] =~ /^__real/;
-		next if $pieces[6] =~ /^__imp/;
-		next if $pieces[6] =~ /NULL_THUNK_DATA$/;
-		next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
-		next if $pieces[6] =~ /^__NULL_IMPORT/;
-
-		push @def, $pieces[6];
-	}
-	close(F);
-}
-print "\n";
-
-open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
-print DEF "EXPORTS\n";
-my $i = 0;
-my $last = "";
-foreach my $f (sort @def) {
-   next if ($f eq $last);
-   $last = $f;
-   $f =~ s/^_//;
-   $i++;
-#   print DEF "  $f \@ $i\n";  # ordinaled exports?
-   print DEF "  $f\n";
-}
-close(DEF);
-print "Generated $i symbols\n";
+my @def;
+
+die "Usage: gendef.pl <modulepath>\n" unless ($ARGV[0] =~ /\\([^\\]+$)/);
+my $defname = uc $1;
+
+if (-f "$ARGV[0]/$defname.def") {
+	print "Not re-generating $defname.DEF, file already exists.\n";
+	exit(0);
+}
+
+print "Generating $defname.DEF from directory $ARGV[0]\n";
+
+while (<$ARGV[0]/*>) {
+    print ".";
+	open(F,"dumpbin /symbols $_|") || die "Could not open $_\n";
+	while (<F>) {
+		s/\(\)//g;
+		next unless /^\d/;
+		my @pieces = split ;
+		next unless $pieces[6];
+		next if ($pieces[2] eq "UNDEF");
+		next unless ($pieces[4] eq "External");
+		next if $pieces[6] =~ /^@/;
+		next if $pieces[6] =~ /^\(/;
+		next if $pieces[6] =~ /^__real/;
+		next if $pieces[6] =~ /^__imp/;
+		next if $pieces[6] =~ /NULL_THUNK_DATA$/;
+		next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
+		next if $pieces[6] =~ /^__NULL_IMPORT/;
+
+		push @def, $pieces[6];
+	}
+	close(F);
+}
+print "\n";
+
+open(DEF,">$ARGV[0]/$defname.def") || die "Could not write to $defname\n";
+print DEF "EXPORTS\n";
+my $i = 0;
+my $last = "";
+foreach my $f (sort @def) {
+   next if ($f eq $last);
+   $last = $f;
+   $f =~ s/^_//;
+   $i++;
+#   print DEF "  $f \@ $i\n";  # ordinaled exports?
+   print DEF "  $f\n";
+}
+close(DEF);
+print "Generated $i symbols\n";
diff --git a/src/tools/msvc/mkvcbuild.pl b/src/tools/msvc/mkvcbuild.pl
index 1ea58ca2f902f1402c42a5a3dae92490ead65a67..6fc246f9a5ffa2d6dd6827c897df4faad27956bd 100644
--- a/src/tools/msvc/mkvcbuild.pl
+++ b/src/tools/msvc/mkvcbuild.pl
@@ -144,16 +144,73 @@ my $pgrestore = AddSimpleFrontend('pg_dump', 1);
 $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);
+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) {
-	open(MF,'src\backend\utils\mb\conversion_procs\\' . $sub . '\Makefile') || die 'Could not open Makefile for $sub';
-	$mf = <MF>;
-	close(MF);
+	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,9 +219,7 @@ foreach my $sub (split /\s+/,$1) {
 	$p->AddReference($postgres);
 }
 
-open(MF,'src\bin\scripts\Makefile') || die 'Could not open src\bin\scripts\Makefile';
-$mf = <MF>;
-close(MF);
+$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,7 +249,6 @@ foreach my $prg (split /\s+/,$1) {
 	$proj->AddReference($libpq,$libpgport);
 	$proj->AddResourceFile('src\bin\scripts','PostgreSQL Utility');
 }
-$/ = $t;
 
 
 # Regression DLLs
@@ -202,16 +256,6 @@ my $regress = $solution->AddProject('regress','dll','misc');
 $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();
 
 #####################
@@ -234,3 +278,86 @@ sub AddSimpleFrontend {
 	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}});
+	}
+}
diff --git a/src/tools/msvc/pgbison.bat b/src/tools/msvc/pgbison.bat
index 8e6bfc82f9a31a440c93873333090708b175ae5e..cacd82cb165fe4504c4f7eb38b52f5b380b67d64 100755
--- a/src/tools/msvc/pgbison.bat
+++ b/src/tools/msvc/pgbison.bat
@@ -1,27 +1,37 @@
-@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
-
-:generate
-SET fn=%1
-bison -d %fn%
-if errorlevel 1 exit 1
-copy /y %fn:~0,-2%.tab.c %2
-if errorlevel 1 exit 1
-copy /y %fn:~0,-2%.tab.h %3
-if errorlevel 1 exit 1
-del %fn:~0,-2%.tab.*
-exit 0
-
-
-:nobison
-echo WARNING! Bison install not found, attempting to build without!
-exit 0
+@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
+
+:generate
+SET fn=%1
+bison -d %fn%
+if errorlevel 1 exit 1
+copy /y %fn:~0,-2%.tab.c %2
+if errorlevel 1 exit 1
+copy /y %fn:~0,-2%.tab.h %3
+if errorlevel 1 exit 1
+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
diff --git a/src/tools/msvc/pgflex.bat b/src/tools/msvc/pgflex.bat
index 90479b6bc0c31d85a6e12781e67e9d9f53e1946c..ae200428146e5484135d9bf2ce7afe3f7b42f209 100755
--- a/src/tools/msvc/pgflex.bat
+++ b/src/tools/msvc/pgflex.bat
@@ -1,21 +1,23 @@
-@echo off
-flex -V > NUL
-if errorlevel 1 goto noflex
-
-if "%1" == "src\backend\parser\scan.l" call :generate %1 src\backend\parser\scan.c -CF
-if "%1" == "src\backend\bootstrap\bootscanner.l" call :generate %1 src\backend\bootstrap\bootscanner.c
-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
-
-:generate
-flex %3 -o%2 %1
-exit %errorlevel%
-
-:noflex
-echo WARNING! flex install not found, attempting to build without
-exit 0
+@echo off
+flex -V > NUL
+if errorlevel 1 goto noflex
+
+if "%1" == "src\backend\parser\scan.l" call :generate %1 src\backend\parser\scan.c -CF
+if "%1" == "src\backend\bootstrap\bootscanner.l" call :generate %1 src\backend\bootstrap\bootscanner.c
+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
+
+:generate
+flex %3 -o%2 %1
+exit %errorlevel%
+
+:noflex
+echo WARNING! flex install not found, attempting to build without
+exit 0