# Build patches used to created apache_2.2.x-win32-openssl_0.9.8h.msi
# binary packages, using;
#
#   perl Configure no-idea no-rc5 no-mdc2 enable-zlib -I/path/to/zh -L/path/to/zlib
#   ms\do_masm.bat
#   nmake -f ms/do_masm.bat
#
# 1. accept perl Configure -Llibpath (-Ihdrpath already worked)
# 2. propogate /Zi, /debug flag to cl/masm/link to unconditionally produce
#    .PDB debugging symbols, at no cost to compiled, linked binaries
# 3. switch from /Fd to /Yd, since this ensures source .pdb data ends up in .lib
#    files for static builds without carrying source .pdb files along
# 4. toggle /Oy- to ensure a walkable backtrace in Dr Watson etc without .PDBs
#
--- ..\openssl-0.9.8k-orig/util\pl\VC-32.pl	Mon Mar 09 07:14:08 2009
+++ util\pl\VC-32.pl	Thu Jul 23 12:57:33 2009
@@ -25,7 +25,12 @@
 $mkdir='$(PERL) util/mkdir-p.pl';
 $rm='del /Q';
 
-$zlib_lib="zlib1.lib";
+$zlib_lib="zlib.lib";
+$zlib_lib="zdll.lib" if $shlib;
+
+# Santize -L options for ms link
+$l_flags =~ s/-L("\[^"]+")/\/libpath:$1/g;
+$l_flags =~ s/-L(\S+)/\/libpath:$1/g;
 
 # C compiler stuff
 $cc='cl';
@@ -42,14 +47,14 @@
     # per 0.9.8 release remaining warnings were explicitly examined and
     # considered safe to ignore.
     # 
-    $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE';
+    $base_cflags=' /W3 /Gs0 /GF /Gy /Zi /Yd /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE';
     $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE';	# shut up VC8
     $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE';	# shut up VC8
     my $f = $shlib?' /MD':' /MT';
     $lib_cflag='/Zl' if (!$shlib);	# remove /DEFAULTLIBs from static lib
-    $opt_cflags=$f.' /Ox';
+    $opt_cflags=$f.' /Ox /Oy-';
     $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
-    $lflags="/nologo /subsystem:console /opt:ref";
+    $lflags="/nologo /debug /subsystem:console /opt:ref";
     }
 elsif ($FLAVOR =~ /CE/)
     {
@@ -99,24 +104,23 @@
     }
 
     $cc='$(CC)';
-    $base_cflags=' /W3 /WX /GF /Gy /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -I$(WCECOMPAT)/include -DOPENSSL_SMALL_FOOTPRINT';
+    $base_cflags=' /W3 /WX /GF /Gy /Zi /Yd /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -I$(WCECOMPAT)/include -DOPENSSL_SMALL_FOOTPRINT';
     $base_cflags.=" $wcecdefs";
-    $opt_cflags=' /MC /O1i';	# optimize for space, but with intrinsics...
+    $opt_cflags=' /MC /O1i /Oy-';	# optimize for space, but with intrinsics...
     $dbg_clfags=' /MC /Od -DDEBUG -D_DEBUG';
-    $lflags="/nologo /opt:ref $wcelflag";
+    $lflags="/nologo /debug /opt:ref $wcelflag";
     }
 else	# Win32
     {
-    $base_cflags=' /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
+    $base_cflags=' /W3 /WX /Gs0 /GF /Gy /Zi /Yd /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
     $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE';	# shut up VC8
     $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE';	# shut up VC8
     my $f = $shlib || $fips ?' /MD':' /MT';
     $lib_cflag='/Zl' if (!$shlib);	# remove /DEFAULTLIBs from static lib
-    $opt_cflags=$f.' /Ox /O2 /Ob2';
+    $opt_cflags=$f.' /Ox /O2 /Ob2 /Oy-';
     $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
-    $lflags="/nologo /subsystem:console /opt:ref";
+    $lflags="/nologo /debug /subsystem:console /opt:ref";
     }
-$mlflags='';
 
 $out_def="out32"; $out_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/);
 $tmp_def="tmp32"; $tmp_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/);
@@ -125,8 +129,6 @@
 if ($debug)
 	{
 	$cflags=$dbg_cflags.$base_cflags;
-	$lflags.=" /debug";
-	$mlflags.=' /debug';
 	}
 else
 	{
@@ -141,17 +143,15 @@
 $rsc="rc";
 $efile="/out:";
 $exep='.exe';
-if ($no_sock)		{ $ex_libs=''; }
-elsif ($FLAVOR =~ /CE/)	{ $ex_libs='winsock.lib'; }
-else			{ $ex_libs='wsock32.lib'; }
-
 if ($FLAVOR =~ /CE/)
 	{
+	$ex_libs.=' winsock.lib' if !$no_sock;
 	$ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib';
 	$ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86");
 	}
 else
 	{
+	$ex_libs.=' wsock32.lib' if !$no_sock;
 	$ex_libs.=' gdi32.lib crypt32.lib advapi32.lib user32.lib';
 	$ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
 	}
@@ -180,12 +180,10 @@
 	$asm=($ver gt $vew?"nasm":"nasmw")." -f win32";
 	$afile='-o ';
 } elsif ($ml64) {
-	$asm='ml64 /c /Cp /Cx';
-	$asm.=' /Zi' if $debug;
+	$asm='ml64 /c /Cp /Cx /Zi';
 	$afile='/Fo';
 } else {
-	$asm='ml /nologo /Cp /coff /c /Cx';
-	$asm.=" /Zi" if $debug;
+	$asm='ml /nologo /Cp /coff /c /Cx /Zi';
 	$afile='/Fo';
 }
 
@@ -281,7 +279,7 @@
 	$tmp_def='tmp32dll_$(TARGETCPU)';
 	}
 
-$cflags.=" /Fd$out_def";
+$cflags.=" /Fd$tmp_def/c_src";
 
 sub do_lib_rule
 	{
@@ -308,23 +306,17 @@
 		$name = "/def:ms/${name}.def";
 		}
 
-#	$target="\$(LIB_D)$o$target";
-#	$ret.="$target: $objs\n";
 	if (!$shlib)
 		{
-#		$ret.="\t\$(RM) \$(O_$Name)\n";
-		$ex =' ';
 		$ret.="$target: $objs\n";
-		$ret.="\t\$(MKLIB) $lfile$target @<<\n  $objs $ex\n<<\n";
+		$ret.="\t\$(MKLIB) $lfile$target @<<\n  $objs\n<<\n";
 		}
 	else
 		{
 		my $ex = "";		
-		if ($target =~ /O_SSL/)
-			{
-			$ex .= " \$(L_CRYPTO)";
-			#$ex .= " \$(L_FIPS)" if $fipsdso;
-			}
+		$ex.=" \$(L_CRYPTO)" if $target =~ /O_SSL/;
+		$ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
+
 		my $fipstarget;
 		if ($fipsdso)
 			{
@@ -335,31 +327,8 @@
 			$fipstarget = "O_CRYPTO";
 			}
 
-
-		if ($name eq "")
-			{
-			$ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
-			if ($target =~ /capi/)
-				{
-				$ex.=' crypt32.lib advapi32.lib';
-				}
-			}
-		elsif ($FLAVOR =~ /CE/)
-			{
-			$ex.=' winsock.lib $(WCECOMPAT)/lib/wcecompatex.lib';
-			}
-		else
-			{
-			$ex.=' unicows.lib' if ($FLAVOR =~ /NT/);
-			$ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib';
-			$ex.=' crypt32.lib';
-			$ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
-			}
-		$ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
-
  		if ($fips && $target =~ /$fipstarget/)
 			{
-			$ex.= $mwex unless $fipscanisterbuild;
 			$ret.="$target: $objs \$(PREMAIN_DSO_EXE)";
 			if ($fipsdso)
 				{
@@ -376,7 +345,7 @@
 			$ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
 			$ret.="\t\$(FIPSLINK) \$(MLFLAGS) /map $base_arg $efile$target ";
 			$ret.="$name @<<\n  \$(SHLIB_EX_OBJ) $objs ";
-			$ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n";
+			$ret.="\$(OBJ_D)${o}fips_premain.obj $ex \$(EX_LIBS)\n<<\n";
 			}
 		else
 			{
@@ -386,7 +355,7 @@
 				$ret .= " \$(O_FIPS)";
 				$ex .= " \$(L_FIPS)";
 				}
-			$ret.="\n\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex\n<<\n";
+			$ret.="\n\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex \$(EX_LIBS)\n<<\n";
 			}
 
         $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n";
