
1: #!/usr/local/bin/perl 2: # VC-32.pl - unified script for Microsoft Visual C++, covering Win32, 3: # Win64 and WinCE [follow $FLAVOR variable to trace the differences]. 4: # 5: 6: $ssl= "ssleay32"; 7: $crypto="libeay32"; 8: 9: $o='\\'; 10: $cp='$(PERL) util/copy.pl'; 11: $mkdir='$(PERL) util/mkdir-p.pl'; 12: $rm='del'; 13: 14: $zlib_lib="zlib1.lib"; 15: 16: # C compiler stuff 17: $cc='cl'; 18: if ($FLAVOR =~ /WIN64/) 19: { 20: # Note that we currently don't have /WX on Win64! There is a lot of 21: # warnings, but only of two types: 22: # 23: # C4344: conversion from '__int64' to 'int/long', possible loss of data 24: # C4267: conversion from 'size_t' to 'int/long', possible loss of data 25: # 26: # Amount of latter type is minimized by aliasing strlen to function of 27: # own desing and limiting its return value to 2GB-1 (see e_os.h). As 28: # per 0.9.8 release remaining warnings were explicitly examined and 29: # considered safe to ignore. 30: # 31: $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE'; 32: $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE'; # shut up VC8 33: $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE'; # shut up VC8 34: $opt_cflags=' /MD /Ox'; 35: $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG'; 36: $lflags="/nologo /subsystem:console /opt:ref"; 37: } 38: elsif ($FLAVOR =~ /CE/) 39: { 40: # sanity check 41: die '%OSVERSION% is not defined' if (!defined($ENV{'OSVERSION'})); 42: die '%PLATFORM% is not defined' if (!defined($ENV{'PLATFORM'})); 43: die '%TARGETCPU% is not defined' if (!defined($ENV{'TARGETCPU'})); 44: 45: # 46: # Idea behind this is to mimic flags set by eVC++ IDE... 47: # 48: $wcevers = $ENV{'OSVERSION'}; # WCENNN 49: die '%OSVERSION% value is insane' if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/); 50: $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2"; # -D_WIN32_WCE=NNN 51: $wcelflag = "/subsystem:windowsce,$1.$2"; # ...,N.NN 52: 53: $wceplatf = $ENV{'PLATFORM'}; 54: $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d; 55: $wcecdefs .= " -DWCE_PLATFORM_$wceplatf"; 56: 57: $wcetgt = $ENV{'TARGETCPU'}; # just shorter name... 58: SWITCH: for($wcetgt) { 59: /^X86/ && do { $wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_"; 60: $wcelflag.=" /machine:IX86"; last; }; 61: /^ARMV4[IT]/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; 62: $wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/); 63: $wcecdefs.=" -QRarch4T -QRinterwork-return"; 64: $wcelflag.=" /machine:THUMB"; last; }; 65: /^ARM/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; 66: $wcelflag.=" /machine:ARM"; last; }; 67: /^MIPSIV/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 68: $wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32"; 69: $wcelflag.=" /machine:MIPSFPU"; last; }; 70: /^MIPS16/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 71: $wcecdefs.=" -DMIPSII -QMmips16"; 72: $wcelflag.=" /machine:MIPS16"; last; }; 73: /^MIPSII/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; 74: $wcecdefs.=" -QMmips2"; 75: $wcelflag.=" /machine:MIPS"; last; }; 76: /^R4[0-9]{3}/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000"; 77: $wcelflag.=" /machine:MIPS"; last; }; 78: /^SH[0-9]/ && do { $wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx"; 79: $wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/); 80: $wcelflag.=" /machine:$wcetgt"; last; }; 81: { $wcecdefs.=" -D$wcetgt -D_$wcetgt_"; 82: $wcelflag.=" /machine:$wcetgt"; last; }; 83: } 84: 85: $cc='$(CC)'; 86: $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'; 87: $base_cflags.=" $wcecdefs"; 88: $opt_cflags=' /MC /O1i'; # optimize for space, but with intrinsics... 89: $dbg_clfags=' /MC /Od -DDEBUG -D_DEBUG'; 90: $lflags="/nologo /opt:ref $wcelflag"; 91: } 92: else # Win32 93: { 94: $base_cflags=' /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32'; 95: $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE'; # shut up VC8 96: $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE'; # shut up VC8 97: $opt_cflags=' /MD /Ox /O2 /Ob2'; 98: $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG'; 99: $lflags="/nologo /subsystem:console /opt:ref"; 100: } 101: $mlflags=''; 102: 103: $out_def="out32"; $out_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); 104: $tmp_def="tmp32"; $tmp_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); 105: $inc_def="inc32"; 106: 107: if ($debug) 108: { 109: $cflags=$dbg_cflags.$base_cflags; 110: $lflags.=" /debug"; 111: $mlflags.=' /debug'; 112: } 113: else 114: { 115: $cflags=$opt_cflags.$base_cflags; 116: } 117: 118: $obj='.obj'; 119: $ofile="/Fo"; 120: 121: # EXE linking stuff 122: $link="link"; 123: $rsc="rc"; 124: $efile="/out:"; 125: $exep='.exe'; 126: if ($no_sock) { $ex_libs=''; } 127: elsif ($FLAVOR =~ /CE/) { $ex_libs='winsock.lib'; } 128: else { $ex_libs='wsock32.lib'; } 129: 130: if ($FLAVOR =~ /CE/) 131: { 132: $ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib'; 133: $ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86"); 134: } 135: else 136: { 137: $ex_libs.=' gdi32.lib advapi32.lib user32.lib'; 138: $ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 139: } 140: 141: # As native NT API is pure UNICODE, our WIN-NT build defaults to UNICODE, 142: # but gets linked with unicows.lib to ensure backward compatibility. 143: if ($FLAVOR =~ /NT/) 144: { 145: $cflags.=" -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE"; 146: $ex_libs="unicows.lib $ex_libs"; 147: } 148: # static library stuff 149: $mklib='lib'; 150: $ranlib=''; 151: $plib=""; 152: $libp=".lib"; 153: $shlibp=($shlib)?".dll":".lib"; 154: $lfile='/out:'; 155: 156: $shlib_ex_obj=""; 157: $app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/); 158: if ($nasm) { 159: $asm='nasmw -f win32'; 160: $afile='-o '; 161: } else { 162: $asm='ml /Cp /coff /c /Cx'; 163: $asm.=" /Zi" if $debug; 164: $afile='/Fo'; 165: } 166: 167: $bn_asm_obj=''; 168: $bn_asm_src=''; 169: $des_enc_obj=''; 170: $des_enc_src=''; 171: $bf_enc_obj=''; 172: $bf_enc_src=''; 173: 174: if (!$no_asm) 175: { 176: $aes_asm_obj='crypto\aes\asm\a_win32.obj'; 177: $aes_asm_src='crypto\aes\asm\a_win32.asm'; 178: $bn_asm_obj='crypto\bn\asm\bn_win32.obj'; 179: $bn_asm_src='crypto\bn\asm\bn_win32.asm'; 180: $bnco_asm_obj='crypto\bn\asm\co_win32.obj'; 181: $bnco_asm_src='crypto\bn\asm\co_win32.asm'; 182: $des_enc_obj='crypto\des\asm\d_win32.obj crypto\des\asm\y_win32.obj'; 183: $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm'; 184: $bf_enc_obj='crypto\bf\asm\b_win32.obj'; 185: $bf_enc_src='crypto\bf\asm\b_win32.asm'; 186: $cast_enc_obj='crypto\cast\asm\c_win32.obj'; 187: $cast_enc_src='crypto\cast\asm\c_win32.asm'; 188: $rc4_enc_obj='crypto\rc4\asm\r4_win32.obj'; 189: $rc4_enc_src='crypto\rc4\asm\r4_win32.asm'; 190: $rc5_enc_obj='crypto\rc5\asm\r5_win32.obj'; 191: $rc5_enc_src='crypto\rc5\asm\r5_win32.asm'; 192: $md5_asm_obj='crypto\md5\asm\m5_win32.obj'; 193: $md5_asm_src='crypto\md5\asm\m5_win32.asm'; 194: $sha1_asm_obj='crypto\sha\asm\s1_win32.obj crypto\sha\asm\sha512-sse2.obj'; 195: $sha1_asm_src='crypto\sha\asm\s1_win32.asm crypto\sha\asm\sha512-sse2.asm'; 196: $rmd160_asm_obj='crypto\ripemd\asm\rm_win32.obj'; 197: $rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm'; 198: $cpuid_asm_obj='crypto\cpu_win32.obj'; 199: $cpuid_asm_src='crypto\cpu_win32.asm'; 200: $cflags.=" -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DAES_ASM -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DMD5_ASM -DSHA1_ASM -DRMD160_ASM"; 201: } 202: 203: if ($shlib && $FLAVOR !~ /CE/) 204: { 205: $mlflags.=" $lflags /dll"; 206: # $cflags =~ s| /MD| /MT|; 207: $lib_cflag=" -D_WINDLL"; 208: $out_def="out32dll"; 209: $tmp_def="tmp32dll"; 210: # 211: # Engage Applink... 212: # 213: $app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib"; 214: $cflags.=" -DOPENSSL_USE_APPLINK -I."; 215: # I'm open for better suggestions than overriding $banner... 216: $banner=<<'___'; 217: @echo Building OpenSSL 218: 219: $(OBJ_D)\applink.obj: ms\applink.c 220: $(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c 221: $(OBJ_D)\uplink.obj: ms\uplink.c ms\applink.c 222: $(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c 223: $(INCO_D)\applink.c: ms\applink.c 224: $(CP) ms\applink.c $(INCO_D)\applink.c 225: 226: EXHEADER= $(EXHEADER) $(INCO_D)\applink.c 227: 228: LIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj 229: CRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ) 230: ___ 231: $banner.=<<'___' if ($FLAVOR =~ /WIN64/); 232: CRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ) 233: ___ 234: } 235: elsif ($shlib && $FLAVOR =~ /CE/) 236: { 237: $mlflags.=" $lflags /dll"; 238: $lib_cflag=" -D_WINDLL -D_DLL"; 239: $out_def='out32dll_$(TARGETCPU)'; 240: $tmp_def='tmp32dll_$(TARGETCPU)'; 241: } 242: 243: $cflags.=" /Fd$out_def"; 244: 245: sub do_lib_rule 246: { 247: local($objs,$target,$name,$shlib)=@_; 248: local($ret); 249: 250: $taget =~ s/\//$o/g if $o ne '/'; 251: if ($name ne "") 252: { 253: $name =~ tr/a-z/A-Z/; 254: $name = "/def:ms/${name}.def"; 255: } 256: 257: # $target="\$(LIB_D)$o$target"; 258: $ret.="$target: $objs\n"; 259: if (!$shlib) 260: { 261: # $ret.="\t\$(RM) \$(O_$Name)\n"; 262: $ex =' '; 263: $ret.="\t\$(MKLIB) $lfile$target @<<\n $objs $ex\n<<\n"; 264: } 265: else 266: { 267: local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)'; 268: if ($name eq "") 269: { 270: $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 271: } 272: elsif ($FLAVOR =~ /CE/) 273: { 274: $ex.=' winsock.lib $(WCECOMPAT)/lib/wcecompatex.lib'; 275: } 276: else 277: { 278: $ex.=' unicows.lib' if ($FLAVOR =~ /NT/); 279: $ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib'; 280: $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/); 281: } 282: $ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/; 283: $ret.="\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n \$(SHLIB_EX_OBJ) $objs $ex\n<<\n"; 284: $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n"; 285: } 286: $ret.="\n"; 287: return($ret); 288: } 289: 290: sub do_link_rule 291: { 292: local($target,$files,$dep_libs,$libs)=@_; 293: local($ret,$_); 294: 295: $file =~ s/\//$o/g if $o ne '/'; 296: $n=&bname($targer); 297: $ret.="$target: $files $dep_libs\n"; 298: $ret.="\t\$(LINK) \$(LFLAGS) $efile$target @<<\n"; 299: $ret.=" \$(APP_EX_OBJ) $files $libs\n<<\n"; 300: $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;1\n\n"; 301: return($ret); 302: } 303: 304: 1;