shlib_wrap update [from HEAD].
[oweals/openssl.git] / util / pl / VC-32.pl
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
8 if ($fips && !$shlib)
9         {
10         $crypto="libeayfips32";
11         $crypto_compat = "libeaycompat32.lib";
12         }
13 else
14         {
15         $crypto="libeay32";
16         }
17
18 if ($fipscanisterbuild)
19         {
20         $fips_canister_path = "\$(LIB_D)\\fipscanister.lib";
21         }
22
23 $o='\\';
24 $cp='$(PERL) util/copy.pl';
25 $mkdir='$(PERL) util/mkdir-p.pl';
26 $rm='del /Q';
27
28 $zlib_lib="zlib1.lib";
29
30 # C compiler stuff
31 $cc='cl';
32 if ($FLAVOR =~ /WIN64/)
33     {
34     # Note that we currently don't have /WX on Win64! There is a lot of
35     # warnings, but only of two types:
36     #
37     # C4344: conversion from '__int64' to 'int/long', possible loss of data
38     # C4267: conversion from 'size_t' to 'int/long', possible loss of data
39     #
40     # Amount of latter type is minimized by aliasing strlen to function of
41     # own desing and limiting its return value to 2GB-1 (see e_os.h). As
42     # per 0.9.8 release remaining warnings were explicitly examined and
43     # considered safe to ignore.
44     # 
45     $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE';
46     $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE';        # shut up VC8
47     $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE';       # shut up VC8
48     $opt_cflags=' /MD /Ox';
49     $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG';
50     $lflags="/nologo /subsystem:console /opt:ref";
51     }
52 elsif ($FLAVOR =~ /CE/)
53     {
54     # sanity check
55     die '%OSVERSION% is not defined'    if (!defined($ENV{'OSVERSION'}));
56     die '%PLATFORM% is not defined'     if (!defined($ENV{'PLATFORM'}));
57     die '%TARGETCPU% is not defined'    if (!defined($ENV{'TARGETCPU'}));
58
59     #
60     # Idea behind this is to mimic flags set by eVC++ IDE...
61     #
62     $wcevers = $ENV{'OSVERSION'};                       # WCENNN
63     die '%OSVERSION% value is insane'   if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/);
64     $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2";    # -D_WIN32_WCE=NNN
65     $wcelflag = "/subsystem:windowsce,$1.$2";           # ...,N.NN
66
67     $wceplatf =  $ENV{'PLATFORM'};
68     $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d;
69     $wcecdefs .= " -DWCE_PLATFORM_$wceplatf";
70
71     $wcetgt = $ENV{'TARGETCPU'};        # just shorter name...
72     SWITCH: for($wcetgt) {
73         /^X86/          && do { $wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_";
74                                 $wcelflag.=" /machine:IX86";    last; };
75         /^ARMV4[IT]/    && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
76                                 $wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/);
77                                 $wcecdefs.=" -QRarch4T -QRinterwork-return";
78                                 $wcelflag.=" /machine:THUMB";   last; };
79         /^ARM/          && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
80                                 $wcelflag.=" /machine:ARM";     last; };
81         /^MIPSIV/       && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
82                                 $wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32";
83                                 $wcelflag.=" /machine:MIPSFPU"; last; };
84         /^MIPS16/       && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
85                                 $wcecdefs.=" -DMIPSII -QMmips16";
86                                 $wcelflag.=" /machine:MIPS16";  last; };
87         /^MIPSII/       && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
88                                 $wcecdefs.=" -QMmips2";
89                                 $wcelflag.=" /machine:MIPS";    last; };
90         /^R4[0-9]{3}/   && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000";
91                                 $wcelflag.=" /machine:MIPS";    last; };
92         /^SH[0-9]/      && do { $wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx";
93                                 $wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/);
94                                 $wcelflag.=" /machine:$wcetgt"; last; };
95         { $wcecdefs.=" -D$wcetgt -D_$wcetgt_";
96           $wcelflag.=" /machine:$wcetgt";                       last; };
97     }
98
99     $cc='$(CC)';
100     $base_cflags=' /W3 /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';
101     $base_cflags.=" $wcecdefs";
102     $opt_cflags=' /MC /O1i';    # optimize for space, but with intrinsics...
103     $dbg_clfags=' /MC /Od -DDEBUG -D_DEBUG';
104     $lflags="/nologo /opt:ref $wcelflag";
105     }
106 else    # Win32
107     {
108     $base_cflags=' /W3 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
109     $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE';        # shut up VC8
110     $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE';       # shut up VC8
111     $opt_cflags=' /MD /Ox /O2 /Ob2';
112     $dbg_cflags=' /MDd /Od -DDEBUG -D_DEBUG';
113     $lflags="/nologo /subsystem:console /opt:ref";
114     }
115 $mlflags='';
116
117 $out_def="out32"; $out_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/);
118 $tmp_def="tmp32"; $tmp_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/);
119 $inc_def="inc32";
120
121 if ($debug)
122         {
123         $cflags=$dbg_cflags.$base_cflags;
124         $lflags.=" /debug";
125         $mlflags.=' /debug';
126         }
127 else
128         {
129         $cflags=$opt_cflags.$base_cflags;
130         }
131
132 $obj='.obj';
133 $ofile="/Fo";
134
135 # EXE linking stuff
136 $link="link";
137 $rsc="rc";
138 $efile="/out:";
139 $exep='.exe';
140 if ($no_sock)           { $ex_libs=''; }
141 elsif ($FLAVOR =~ /CE/) { $ex_libs='winsock.lib'; }
142 else                    { $ex_libs='wsock32.lib'; }
143
144 if ($FLAVOR =~ /CE/)
145         {
146         $ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib';
147         $ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86");
148         }
149 else
150         {
151         $ex_libs.=' gdi32.lib advapi32.lib user32.lib';
152         $ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
153         }
154
155 # As native NT API is pure UNICODE, our WIN-NT build defaults to UNICODE,
156 # but gets linked with unicows.lib to ensure backward compatibility.
157 if ($FLAVOR =~ /NT/)
158         {
159         $cflags.=" -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE";
160         $ex_libs="unicows.lib $ex_libs";
161         }
162 # static library stuff
163 $mklib='lib';
164 $ranlib='';
165 $plib="";
166 $libp=".lib";
167 $shlibp=($shlib)?".dll":".lib";
168 $lfile='/out:';
169
170 $shlib_ex_obj="";
171 $app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/);
172 if ($nasm) {
173         $asm='nasmw -f win32';
174         $afile='-o ';
175 } elsif ($ml64) {
176         $asm='ml64 /c /Cp /Cx';
177         $asm.=' /Zi' if $debug;
178         $afile='/Fo';
179 } else {
180         $asm='ml /Cp /coff /c /Cx';
181         $asm.=" /Zi" if $debug;
182         $afile='/Fo';
183 }
184
185 $aes_asm_obj='';
186 $bn_asm_obj='';
187 $bn_asm_src='';
188 $des_enc_obj='';
189 $des_enc_src='';
190 $bf_enc_obj='';
191 $bf_enc_src='';
192
193 if (!$no_asm)
194     {
195     if ($FLAVOR =~ "WIN32")
196         {
197         $aes_asm_obj='crypto\aes\asm\a_win32.obj';
198         $aes_asm_src='crypto\aes\asm\a_win32.asm';
199         $bn_asm_obj='crypto\bn\asm\bn_win32.obj crypto\bn\asm\mt_win32.obj';
200         $bn_asm_src='crypto\bn\asm\bn_win32.asm crypto\bn\asm\mt_win32.asm';
201         $bnco_asm_obj='crypto\bn\asm\co_win32.obj';
202         $bnco_asm_src='crypto\bn\asm\co_win32.asm';
203         $des_enc_obj='crypto\des\asm\d_win32.obj crypto\des\asm\y_win32.obj';
204         $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm';
205         $bf_enc_obj='crypto\bf\asm\b_win32.obj';
206         $bf_enc_src='crypto\bf\asm\b_win32.asm';
207         $cast_enc_obj='crypto\cast\asm\c_win32.obj';
208         $cast_enc_src='crypto\cast\asm\c_win32.asm';
209         $rc4_enc_obj='crypto\rc4\asm\r4_win32.obj';
210         $rc4_enc_src='crypto\rc4\asm\r4_win32.asm';
211         $rc5_enc_obj='crypto\rc5\asm\r5_win32.obj';
212         $rc5_enc_src='crypto\rc5\asm\r5_win32.asm';
213         $md5_asm_obj='crypto\md5\asm\m5_win32.obj';
214         $md5_asm_src='crypto\md5\asm\m5_win32.asm';
215         $sha1_asm_obj='crypto\sha\asm\s1_win32.obj crypto\sha\asm\sha512-sse2.obj';
216         $sha1_asm_src='crypto\sha\asm\s1_win32.asm crypto\sha\asm\sha512-sse2.asm';
217         $rmd160_asm_obj='crypto\ripemd\asm\rm_win32.obj';
218         $rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm';
219         $cpuid_asm_obj='crypto\cpu_win32.obj';
220         $cpuid_asm_src='crypto\cpu_win32.asm';
221         $cflags.=" -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DAES_ASM -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_BN_ASM_MONT -DMD5_ASM -DSHA1_ASM -DRMD160_ASM";
222         }
223     elsif ($FLAVOR =~ "WIN64A")
224         {
225         $aes_asm_obj='$(OBJ_D)\aes-x86_64.obj';
226         $aes_asm_src='crypto\aes\asm\aes-x86_64.asm';
227         $bn_asm_obj='$(OBJ_D)\x86_64-mont.obj $(OBJ_D)\bn_asm.obj';
228         $bn_asm_src='crypto\bn\asm\x86_64-mont.asm';
229         $sha1_asm_obj='$(OBJ_D)\sha1-x86_64.obj $(OBJ_D)\sha256-x86_64.obj $(OBJ_D)\sha512-x86_64.obj';
230         $sha1_asm_src='crypto\sha\asm\sha1-x86_64.asm crypto\sha\asm\sha256-x86_64.asm crypto\sha\asm\sha512-x86_64.asm';
231         $cpuid_asm_obj='$(OBJ_D)\cpuid-x86_64.obj';
232         $cpuid_asm_src='crypto\cpuid-x86_64.asm';
233         $cflags.=" -DOPENSSL_CPUID_OBJ -DAES_ASM -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM";
234         }
235     }
236
237 if ($shlib && $FLAVOR !~ /CE/)
238         {
239         $mlflags.=" $lflags /dll";
240 #       $cflags =~ s| /MD| /MT|;
241         $lib_cflag=" -D_WINDLL";
242         $out_def="out32dll";
243         $tmp_def="tmp32dll";
244         #
245         # Engage Applink...
246         #
247         $app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib";
248         $cflags.=" -DOPENSSL_USE_APPLINK -I.";
249         # I'm open for better suggestions than overriding $banner...
250         $banner=<<'___';
251         @echo Building OpenSSL
252
253 $(OBJ_D)\applink.obj:   ms\applink.c
254         $(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c
255 $(OBJ_D)\uplink.obj:    ms\uplink.c ms\applink.c
256         $(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c
257 $(INCO_D)\applink.c:    ms\applink.c
258         $(CP) ms\applink.c $(INCO_D)\applink.c
259
260 EXHEADER= $(EXHEADER) $(INCO_D)\applink.c
261
262 LIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj
263 ___
264 $banner .= "CRYPTOOBJ=\$(OBJ_D)\\uplink.obj \$(CRYPTOOBJ)\n";
265         $banner.=<<'___' if ($FLAVOR =~ /WIN64/);
266 CRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ)
267 ___
268         }
269 elsif ($shlib && $FLAVOR =~ /CE/)
270         {
271         $mlflags.=" $lflags /dll";
272         $lib_cflag=" -D_WINDLL -D_DLL";
273         $out_def='out32dll_$(TARGETCPU)';
274         $tmp_def='tmp32dll_$(TARGETCPU)';
275         }
276
277 $cflags.=" /Fd$out_def";
278
279 sub do_lib_rule
280         {
281         my($objs,$target,$name,$shlib,$ign,$base_addr) = @_;
282         local($ret);
283
284         $taget =~ s/\//$o/g if $o ne '/';
285         my $base_arg;
286         if ($base_addr ne "")
287                 {
288                 $base_arg= " /base:$base_addr";
289                 }
290         else
291                 {
292                 $base_arg = "";
293                 }
294         if ($target =~ /O_CRYPTO/ && $fipsdso)
295                 {
296                 $name = "/def:ms/libeayfips.def";
297                 }
298         elsif ($name ne "")
299                 {
300                 $name =~ tr/a-z/A-Z/;
301                 $name = "/def:ms/${name}.def";
302                 }
303
304 #       $target="\$(LIB_D)$o$target";
305 #       $ret.="$target: $objs\n";
306         if (!$shlib)
307                 {
308 #               $ret.="\t\$(RM) \$(O_$Name)\n";
309                 $ex =' ';
310                 $ret.="$target: $objs\n";
311                 $ret.="\t\$(MKLIB) $lfile$target @<<\n  $objs $ex\n<<\n";
312                 }
313         else
314                 {
315                 my $ex = "";            
316                 if ($target =~ /O_SSL/)
317                         {
318                         $ex .= " \$(L_CRYPTO)";
319                         #$ex .= " \$(L_FIPS)" if $fipsdso;
320                         }
321                 my $fipstarget;
322                 if ($fipsdso)
323                         {
324                         $fipstarget = "O_FIPS";
325                         }
326                 else
327                         {
328                         $fipstarget = "O_CRYPTO";
329                         }
330
331
332                 if ($name eq "")
333                         {
334                         $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
335                         }
336                 elsif ($FLAVOR =~ /CE/)
337                         {
338                         $ex.=' winsock.lib $(WCECOMPAT)/lib/wcecompatex.lib';
339                         }
340                 else
341                         {
342                         $ex.=' unicows.lib' if ($FLAVOR =~ /NT/);
343                         $ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib';
344                         $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
345                         }
346                 $ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
347
348                 if ($fips && $target =~ /$fipstarget/)
349                         {
350                         $ex.= $mwex unless $fipscanisterbuild;
351                         $ret.="$target: $objs \$(PREMAIN_DSO_EXE)";
352                         if ($fipsdso)
353                                 {
354                                 $ex.=" \$(OBJ_D)\\\$(LIBFIPS).res";
355                                 $ret.=" \$(OBJ_D)\\\$(LIBFIPS).res";
356                                 $ret.=" ms/\$(LIBFIPS).def";
357                                 }
358                         $ret.="\n\tSET FIPS_LINK=\$(LINK)\n";
359                         $ret.="\tSET FIPS_CC=\$(CC)\n";
360                         $ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
361                         $ret.="\tSET PREMAIN_DSO_EXE=\$(PREMAIN_DSO_EXE)\n";
362                         $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
363                         $ret.="\tSET FIPS_TARGET=$target\n";
364                         $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
365                         $ret.="\t\$(FIPSLINK) \$(MLFLAGS) /map $base_arg $efile$target ";
366                         $ret.="$name @<<\n  \$(SHLIB_EX_OBJ) $objs ";
367                         $ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n";
368                         }
369                 else
370                         {
371                         $ret.="$target: $objs";
372                         if ($target =~ /O_CRYPTO/ && $fipsdso)
373                                 {
374                                 $ret .= " \$(O_FIPS)";
375                                 $ex .= " \$(L_FIPS)";
376                                 }
377                         $ret.="\n\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex\n<<\n";
378                         }
379
380         $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n";
381                 }
382         $ret.="\n";
383         return($ret);
384         }
385
386 sub do_link_rule
387         {
388         my($target,$files,$dep_libs,$libs,$standalone)=@_;
389         local($ret,$_);
390         $file =~ s/\//$o/g if $o ne '/';
391         $n=&bname($targer);
392         $ret.="$target: $files $dep_libs\n";
393         if ($standalone == 1)
394                 {
395                 $ret.="  \$(LINK) \$(LFLAGS) $efile$target @<<\n\t";
396                 $ret.= "$mwex advapi32.lib " if ($files =~ /O_FIPSCANISTER/ && !$fipscanisterbuild);
397                 $ret.="$files $libs\n<<\n";
398                 }
399         elsif ($standalone == 2)
400                 {
401                 $ret.="\tSET FIPS_LINK=\$(LINK)\n";
402                 $ret.="\tSET FIPS_CC=\$(CC)\n";
403                 $ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
404                 $ret.="\tSET PREMAIN_DSO_EXE=\n";
405                 $ret.="\tSET FIPS_TARGET=$target\n";
406                 $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
407                 $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
408                 $ret.="\t\$(FIPSLINK) \$(LFLAGS) /map $efile$target @<<\n";
409                 $ret.="\t\$(APP_EX_OBJ) $files \$(OBJ_D)${o}fips_premain.obj $libs\n<<\n";
410                 }
411         else
412                 {
413                 $ret.="\t\$(LINK) \$(LFLAGS) $efile$target @<<\n";
414                 $ret.="\t\$(APP_EX_OBJ) $files $libs\n<<\n";
415                 }
416         $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;1\n\n";
417         return($ret);
418         }
419
420 sub do_rlink_rule
421         {
422         local($target,$rl_start, $rl_mid, $rl_end,$dep_libs,$libs)=@_;
423         local($ret,$_);
424         my $files = "$rl_start $rl_mid $rl_end";
425
426         $file =~ s/\//$o/g if $o ne '/';
427         $n=&bname($targer);
428         $ret.="$target: $files $dep_libs \$(FIPS_SHA1_EXE)\n";
429         $ret.="\t\$(PERL) ms\\segrenam.pl \$\$a $rl_start\n";
430         $ret.="\t\$(PERL) ms\\segrenam.pl \$\$b $rl_mid\n";
431         $ret.="\t\$(PERL) ms\\segrenam.pl \$\$c $rl_end\n";
432         $ret.="\t\$(MKLIB) $lfile$target @<<\n\t$files\n<<\n";
433         $ret.="\t\$(FIPS_SHA1_EXE) $target > ${target}.sha1\n";
434         $ret.="\t\$(PERL) util${o}copy.pl -stripcr fips${o}fips_premain.c \$(LIB_D)${o}fips_premain.c\n";
435         $ret.="\t\$(CP) fips${o}fips_premain.c.sha1 \$(LIB_D)${o}fips_premain.c.sha1\n";
436         $ret.="\n";
437         return($ret);
438         }
439
440 sub do_sdef_rule
441         {
442         my $ret = "ms/\$(LIBFIPS).def: \$(O_FIPSCANISTER)\n";
443         $ret.="\t\$(PERL) util/mksdef.pl \$(MLFLAGS) /out:dummy.dll /def:ms/libeay32.def @<<\n  \$(O_FIPSCANISTER)\n<<\n";
444         $ret.="\n";
445         return $ret;
446         }
447
448 1;