VC-32.pl revision 160814
155714Skris#!/usr/local/bin/perl 2160814Ssimon# VC-32.pl - unified script for Microsoft Visual C++, covering Win32, 3160814Ssimon# Win64 and WinCE [follow $FLAVOR variable to trace the differences]. 455714Skris# 555714Skris 655714Skris$ssl= "ssleay32"; 755714Skris$crypto="libeay32"; 855714Skris 955714Skris$o='\\'; 10160814Ssimon$cp='$(PERL) util/copy.pl'; 11160814Ssimon$mkdir='$(PERL) util/mkdir-p.pl'; 1255714Skris$rm='del'; 1355714Skris 14160814Ssimon$zlib_lib="zlib1.lib"; 15160814Ssimon 1655714Skris# C compiler stuff 1755714Skris$cc='cl'; 18160814Ssimonif ($FLAVOR =~ /WIN64/) 19160814Ssimon { 20160814Ssimon # Note that we currently don't have /WX on Win64! There is a lot of 21160814Ssimon # warnings, but only of two types: 22160814Ssimon # 23160814Ssimon # C4344: conversion from '__int64' to 'int/long', possible loss of data 24160814Ssimon # C4267: conversion from 'size_t' to 'int/long', possible loss of data 25160814Ssimon # 26160814Ssimon # Amount of latter type is minimized by aliasing strlen to function of 27160814Ssimon # own desing and limiting its return value to 2GB-1 (see e_os.h). As 28160814Ssimon # per 0.9.8 release remaining warnings were explicitly examined and 29160814Ssimon # considered safe to ignore. 30160814Ssimon # 31160814Ssimon $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE'; 32160814Ssimon $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE'; # shut up VC8 33160814Ssimon $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE'; # shut up VC8 34160814Ssimon $opt_cflags=' /MD /Ox'; 35160814Ssimon $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG'; 36160814Ssimon $lflags="/nologo /subsystem:console /opt:ref"; 37160814Ssimon } 38160814Ssimonelsif ($FLAVOR =~ /CE/) 39160814Ssimon { 40160814Ssimon # sanity check 41160814Ssimon die '%OSVERSION% is not defined' if (!defined($ENV{'OSVERSION'})); 42160814Ssimon die '%PLATFORM% is not defined' if (!defined($ENV{'PLATFORM'})); 43160814Ssimon die '%TARGETCPU% is not defined' if (!defined($ENV{'TARGETCPU'})); 44160814Ssimon 45160814Ssimon # 46160814Ssimon # Idea behind this is to mimic flags set by eVC++ IDE... 47160814Ssimon # 48160814Ssimon $wcevers = $ENV{'OSVERSION'}; # WCENNN 49160814Ssimon die '%OSVERSION% value is insane' if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/); 50160814Ssimon $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2"; # -D_WIN32_WCE=NNN 51160814Ssimon $wcelflag = "/subsystem:windowsce,$1.$2"; # ...,N.NN 52160814Ssimon 53160814Ssimon $wceplatf = $ENV{'PLATFORM'}; 54160814Ssimon $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d; 55160814Ssimon $wcecdefs .= " -DWCE_PLATFORM_$wceplatf"; 56160814Ssimon 57160814Ssimon $wcetgt = $ENV{'TARGETCPU'}; # just shorter name... 58160814Ssimon SWITCH: for($wcetgt) { 59160814Ssimon /^X86/ && do { $wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_"; 60160814Ssimon $wcelflag.=" /machine:IX86"; last; }; 61160814Ssimon /^ARMV4[IT]/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; 62160814Ssimon $wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/); 63160814Ssimon $wcecdefs.=" -QRarch4T -QRinterwork-return"; 64160814Ssimon $wcelflag.=" /machine:THUMB"; last; }; 65160814Ssimon /^ARM/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; 66160814Ssimon $wcelflag.=" /machine:ARM"; last; }; 67160814Ssimon /^MIPSIV/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 68160814Ssimon $wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32"; 69160814Ssimon $wcelflag.=" /machine:MIPSFPU"; last; }; 70160814Ssimon /^MIPS16/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 71160814Ssimon $wcecdefs.=" -DMIPSII -QMmips16"; 72160814Ssimon $wcelflag.=" /machine:MIPS16"; last; }; 73160814Ssimon /^MIPSII/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 74160814Ssimon $wcecdefs.=" -QMmips2"; 75160814Ssimon $wcelflag.=" /machine:MIPS"; last; }; 76160814Ssimon /^R4[0-9]{3}/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000"; 77160814Ssimon $wcelflag.=" /machine:MIPS"; last; }; 78160814Ssimon /^SH[0-9]/ && do { $wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx"; 79160814Ssimon $wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/); 80160814Ssimon $wcelflag.=" /machine:$wcetgt"; last; }; 81160814Ssimon { $wcecdefs.=" -D$wcetgt -D_$wcetgt_"; 82160814Ssimon $wcelflag.=" /machine:$wcetgt"; last; }; 83160814Ssimon } 84160814Ssimon 85160814Ssimon $cc='$(CC)'; 86160814Ssimon $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'; 87160814Ssimon $base_cflags.=" $wcecdefs"; 88160814Ssimon $opt_cflags=' /MC /O1i'; # optimize for space, but with intrinsics... 89160814Ssimon $dbg_clfags=' /MC /Od -DDEBUG -D_DEBUG'; 90160814Ssimon $lflags="/nologo /opt:ref $wcelflag"; 91160814Ssimon } 92160814Ssimonelse # Win32 93160814Ssimon { 94160814Ssimon $base_cflags=' /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32'; 95160814Ssimon $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE'; # shut up VC8 96160814Ssimon $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE'; # shut up VC8 97160814Ssimon $opt_cflags=' /MD /Ox /O2 /Ob2'; 98160814Ssimon $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG'; 99160814Ssimon $lflags="/nologo /subsystem:console /opt:ref"; 100160814Ssimon } 10155714Skris$mlflags=''; 10255714Skris 103160814Ssimon$out_def="out32"; $out_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); 104160814Ssimon$tmp_def="tmp32"; $tmp_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); 10555714Skris$inc_def="inc32"; 10655714Skris 10755714Skrisif ($debug) 10855714Skris { 109160814Ssimon $cflags=$dbg_cflags.$base_cflags; 11055714Skris $lflags.=" /debug"; 11155714Skris $mlflags.=' /debug'; 11255714Skris } 113160814Ssimonelse 114160814Ssimon { 115160814Ssimon $cflags=$opt_cflags.$base_cflags; 116160814Ssimon } 11755714Skris 11855714Skris$obj='.obj'; 11955714Skris$ofile="/Fo"; 12055714Skris 12155714Skris# EXE linking stuff 12255714Skris$link="link"; 123160814Ssimon$rsc="rc"; 12455714Skris$efile="/out:"; 12555714Skris$exep='.exe'; 126160814Ssimonif ($no_sock) { $ex_libs=''; } 127160814Ssimonelsif ($FLAVOR =~ /CE/) { $ex_libs='winsock.lib'; } 128160814Ssimonelse { $ex_libs='wsock32.lib'; } 12955714Skris 130160814Ssimonif ($FLAVOR =~ /CE/) 131160814Ssimon { 132160814Ssimon $ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib'; 133160814Ssimon $ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86"); 134160814Ssimon } 135160814Ssimonelse 136160814Ssimon { 137160814Ssimon $ex_libs.=' gdi32.lib advapi32.lib user32.lib'; 138160814Ssimon $ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 139160814Ssimon } 140160814Ssimon 141160814Ssimon# As native NT API is pure UNICODE, our WIN-NT build defaults to UNICODE, 142160814Ssimon# but gets linked with unicows.lib to ensure backward compatibility. 143160814Ssimonif ($FLAVOR =~ /NT/) 144160814Ssimon { 145160814Ssimon $cflags.=" -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE"; 146160814Ssimon $ex_libs="unicows.lib $ex_libs"; 147160814Ssimon } 14855714Skris# static library stuff 14955714Skris$mklib='lib'; 15055714Skris$ranlib=''; 15155714Skris$plib=""; 15255714Skris$libp=".lib"; 15355714Skris$shlibp=($shlib)?".dll":".lib"; 15455714Skris$lfile='/out:'; 15555714Skris 15655714Skris$shlib_ex_obj=""; 157160814Ssimon$app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/); 15855714Skrisif ($nasm) { 15955714Skris $asm='nasmw -f win32'; 16055714Skris $afile='-o '; 16155714Skris} else { 16255714Skris $asm='ml /Cp /coff /c /Cx'; 16355714Skris $asm.=" /Zi" if $debug; 16455714Skris $afile='/Fo'; 16555714Skris} 16655714Skris 16755714Skris$bn_asm_obj=''; 16855714Skris$bn_asm_src=''; 16955714Skris$des_enc_obj=''; 17055714Skris$des_enc_src=''; 17155714Skris$bf_enc_obj=''; 17255714Skris$bf_enc_src=''; 17355714Skris 174160814Ssimonif (!$no_asm) 17555714Skris { 176100936Snectar $bn_asm_obj='crypto\bn\asm\bn_win32.obj'; 177100936Snectar $bn_asm_src='crypto\bn\asm\bn_win32.asm'; 178100936Snectar $des_enc_obj='crypto\des\asm\d_win32.obj crypto\des\asm\y_win32.obj'; 179100936Snectar $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm'; 180100936Snectar $bf_enc_obj='crypto\bf\asm\b_win32.obj'; 181100936Snectar $bf_enc_src='crypto\bf\asm\b_win32.asm'; 182100936Snectar $cast_enc_obj='crypto\cast\asm\c_win32.obj'; 183100936Snectar $cast_enc_src='crypto\cast\asm\c_win32.asm'; 184100936Snectar $rc4_enc_obj='crypto\rc4\asm\r4_win32.obj'; 185100936Snectar $rc4_enc_src='crypto\rc4\asm\r4_win32.asm'; 186100936Snectar $rc5_enc_obj='crypto\rc5\asm\r5_win32.obj'; 187100936Snectar $rc5_enc_src='crypto\rc5\asm\r5_win32.asm'; 188100936Snectar $md5_asm_obj='crypto\md5\asm\m5_win32.obj'; 189100936Snectar $md5_asm_src='crypto\md5\asm\m5_win32.asm'; 190100936Snectar $sha1_asm_obj='crypto\sha\asm\s1_win32.obj'; 191100936Snectar $sha1_asm_src='crypto\sha\asm\s1_win32.asm'; 192100936Snectar $rmd160_asm_obj='crypto\ripemd\asm\rm_win32.obj'; 193100936Snectar $rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm'; 19455714Skris $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM"; 19555714Skris } 19655714Skris 197160814Ssimonif ($shlib && $FLAVOR !~ /CE/) 19855714Skris { 19955714Skris $mlflags.=" $lflags /dll"; 20055714Skris# $cflags =~ s| /MD| /MT|; 201109998Smarkm $lib_cflag=" -D_WINDLL"; 20255714Skris $out_def="out32dll"; 20355714Skris $tmp_def="tmp32dll"; 204160814Ssimon # 205160814Ssimon # Engage Applink... 206160814Ssimon # 207160814Ssimon $app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib"; 208160814Ssimon $cflags.=" -DOPENSSL_USE_APPLINK -I."; 209160814Ssimon # I'm open for better suggestions than overriding $banner... 210160814Ssimon $banner=<<'___'; 211160814Ssimon @echo Building OpenSSL 212160814Ssimon 213160814Ssimon$(OBJ_D)\applink.obj: ms\applink.c 214160814Ssimon $(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c 215160814Ssimon$(OBJ_D)\uplink.obj: ms\uplink.c ms\applink.c 216160814Ssimon $(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c 217160814Ssimon$(INCO_D)\applink.c: ms\applink.c 218160814Ssimon $(CP) ms\applink.c $(INCO_D)\applink.c 219160814Ssimon 220160814SsimonEXHEADER= $(EXHEADER) $(INCO_D)\applink.c 221160814Ssimon 222160814SsimonLIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj 223160814SsimonCRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ) 224160814Ssimon___ 225160814Ssimon $banner.=<<'___' if ($FLAVOR =~ /WIN64/); 226160814SsimonCRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ) 227160814Ssimon___ 22855714Skris } 229160814Ssimonelsif ($shlib && $FLAVOR =~ /CE/) 230160814Ssimon { 231160814Ssimon $mlflags.=" $lflags /dll"; 232160814Ssimon $lib_cflag=" -D_WINDLL -D_DLL"; 233160814Ssimon $out_def='out32dll_$(TARGETCPU)'; 234160814Ssimon $tmp_def='tmp32dll_$(TARGETCPU)'; 235160814Ssimon } 23655714Skris 23755714Skris$cflags.=" /Fd$out_def"; 23855714Skris 23955714Skrissub do_lib_rule 24055714Skris { 24155714Skris local($objs,$target,$name,$shlib)=@_; 242160814Ssimon local($ret); 24355714Skris 24455714Skris $taget =~ s/\//$o/g if $o ne '/'; 245160814Ssimon if ($name ne "") 246160814Ssimon { 247160814Ssimon $name =~ tr/a-z/A-Z/; 248160814Ssimon $name = "/def:ms/${name}.def"; 249160814Ssimon } 25055714Skris 25155714Skris# $target="\$(LIB_D)$o$target"; 25255714Skris $ret.="$target: $objs\n"; 25355714Skris if (!$shlib) 25455714Skris { 25555714Skris# $ret.="\t\$(RM) \$(O_$Name)\n"; 256160814Ssimon $ex =' '; 25768651Skris $ret.="\t\$(MKLIB) $lfile$target @<<\n $objs $ex\n<<\n"; 25855714Skris } 25955714Skris else 26055714Skris { 261160814Ssimon local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)'; 262160814Ssimon if ($name eq "") 263160814Ssimon { 264160814Ssimon $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 265160814Ssimon } 266160814Ssimon elsif ($FLAVOR =~ /CE/) 267160814Ssimon { 268160814Ssimon $ex.=' winsock.lib $(WCECOMPAT)/lib/wcecompatex.lib'; 269160814Ssimon } 270160814Ssimon else 271160814Ssimon { 272160814Ssimon $ex.=' unicows.lib' if ($FLAVOR =~ /NT/); 273160814Ssimon $ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib'; 274160814Ssimon $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 275160814Ssimon } 276160814Ssimon $ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/; 277160814Ssimon $ret.="\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n \$(SHLIB_EX_OBJ) $objs $ex\n<<\n"; 278160814Ssimon $ret.="\tIF EXIST \$@.manifest mt -manifest \$@.manifest -outputresource:\$@;2\n\n"; 27955714Skris } 28055714Skris $ret.="\n"; 28155714Skris return($ret); 28255714Skris } 28355714Skris 28455714Skrissub do_link_rule 28555714Skris { 286160814Ssimon local($target,$files,$dep_libs,$libs)=@_; 28755714Skris local($ret,$_); 28855714Skris 28955714Skris $file =~ s/\//$o/g if $o ne '/'; 29055714Skris $n=&bname($targer); 29155714Skris $ret.="$target: $files $dep_libs\n"; 292160814Ssimon $ret.="\t\$(LINK) \$(LFLAGS) $efile$target @<<\n"; 293142425Snectar $ret.=" \$(APP_EX_OBJ) $files $libs\n<<\n"; 294160814Ssimon $ret.="\tIF EXIST \$@.manifest mt -manifest \$@.manifest -outputresource:\$@;1\n\n"; 29555714Skris return($ret); 29655714Skris } 29755714Skris 29855714Skris1; 299