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