]>
Commit | Line | Data |
---|---|---|
d02b48c6 | 1 | #!/usr/local/bin/perl |
b3836ed3 AP |
2 | # VC-32.pl - unified script for Microsoft Visual C++, covering Win32, |
3 | # Win64 and WinCE [follow $FLAVOR variable to trace the differences]. | |
d02b48c6 RE |
4 | # |
5 | ||
6928b617 RL |
6 | $ssl= "libssl32"; |
7 | $crypto="libcrypto32"; | |
d02b48c6 | 8 | |
06b433ac DSH |
9 | if ($fips && !$shlib) |
10 | { | |
6928b617 RL |
11 | $crypto="libcryptofips32"; |
12 | $crypto_compat = "libcryptocompat32.lib"; | |
06b433ac DSH |
13 | } |
14 | else | |
15 | { | |
6928b617 | 16 | $crypto="libcrypto32"; |
06b433ac DSH |
17 | } |
18 | ||
19 | if ($fipscanisterbuild) | |
20 | { | |
21 | $fips_canister_path = "\$(LIB_D)\\fipscanister.lib"; | |
22 | } | |
23 | ||
d02b48c6 | 24 | $o='\\'; |
2e9f1bf0 | 25 | $cp='$(PERL) util/copy.pl'; |
0b41fcc2 | 26 | $cp2='$(PERL) util/copy.pl -stripcr'; |
2e9f1bf0 | 27 | $mkdir='$(PERL) util/mkdir-p.pl'; |
4664eb52 | 28 | $rm='del /Q'; |
ef249929 | 29 | $mv='move /Y'; |
d02b48c6 | 30 | |
ad2695b1 DSH |
31 | $zlib_lib="zlib1.lib"; |
32 | ||
a70e377f DSH |
33 | # Santize -L options for ms link |
34 | $l_flags =~ s/-L("\[^"]+")/\/libpath:$1/g; | |
35 | $l_flags =~ s/-L(\S+)/\/libpath:$1/g; | |
36 | ||
d02b48c6 RE |
37 | # C compiler stuff |
38 | $cc='cl'; | |
1875e6db AP |
39 | if ($FLAVOR =~ /WIN64/) |
40 | { | |
41 | # Note that we currently don't have /WX on Win64! There is a lot of | |
42 | # warnings, but only of two types: | |
43 | # | |
44 | # C4344: conversion from '__int64' to 'int/long', possible loss of data | |
45 | # C4267: conversion from 'size_t' to 'int/long', possible loss of data | |
46 | # | |
47 | # Amount of latter type is minimized by aliasing strlen to function of | |
48 | # own desing and limiting its return value to 2GB-1 (see e_os.h). As | |
b3836ed3 | 49 | # per 0.9.8 release remaining warnings were explicitly examined and |
1875e6db AP |
50 | # considered safe to ignore. |
51 | # | |
45502bfe | 52 | $base_cflags= " $mf_cflag" . ($mf_shared_cflag ? " $mf_shared_cflag" : ""); |
8be18f34 | 53 | my $f = ($shlib and !$fipscanisterbuild)?' /MD':' /MT'; |
e1b81fed AP |
54 | $opt_cflags=$f.' /Ox'; |
55 | $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG'; | |
1875e6db | 56 | $lflags="/nologo /subsystem:console /opt:ref"; |
f63e4be3 AP |
57 | |
58 | *::perlasm_compile_target = sub { | |
59 | my ($target,$source,$bname)=@_; | |
60 | my $ret; | |
61 | ||
62 | $bname =~ s/(.*)\.[^\.]$/$1/; | |
63 | $ret=<<___; | |
64 | \$(TMP_D)$o$bname.asm: $source | |
a23e3dbe | 65 | set ASM=\$(ASM) |
f63e4be3 | 66 | \$(PERL) $source \$\@ |
01f06617 DSH |
67 | ___ |
68 | $ret .= "\t\$(PERL) util\\fipsas.pl . \$@ norunasm \$(CFLAG)\n" if $fipscanisterbuild; | |
69 | ||
70 | $ret.=<<___; | |
f63e4be3 AP |
71 | |
72 | $target: \$(TMP_D)$o$bname.asm | |
73 | \$(ASM) $afile\$\@ \$(TMP_D)$o$bname.asm | |
74 | ||
75 | ___ | |
76 | } | |
1875e6db | 77 | } |
b3836ed3 AP |
78 | elsif ($FLAVOR =~ /CE/) |
79 | { | |
1e1c5047 AP |
80 | # sanity check |
81 | die '%OSVERSION% is not defined' if (!defined($ENV{'OSVERSION'})); | |
82 | die '%PLATFORM% is not defined' if (!defined($ENV{'PLATFORM'})); | |
83 | die '%TARGETCPU% is not defined' if (!defined($ENV{'TARGETCPU'})); | |
84 | ||
270512ab AP |
85 | # |
86 | # Idea behind this is to mimic flags set by eVC++ IDE... | |
87 | # | |
1e1c5047 AP |
88 | $wcevers = $ENV{'OSVERSION'}; # WCENNN |
89 | die '%OSVERSION% value is insane' if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/); | |
34be0bb1 AP |
90 | $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2"; # -D_WIN32_WCE=NNN |
91 | $wcelflag = "/subsystem:windowsce,$1.$2"; # ...,N.NN | |
270512ab | 92 | |
1e1c5047 AP |
93 | $wceplatf = $ENV{'PLATFORM'}; |
94 | $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d; | |
11a4e58f | 95 | $wcecdefs .= " -DWCE_PLATFORM_$wceplatf"; |
270512ab | 96 | |
34be0bb1 AP |
97 | $wcetgt = $ENV{'TARGETCPU'}; # just shorter name... |
98 | SWITCH: for($wcetgt) { | |
270512ab | 99 | /^X86/ && do { $wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_"; |
668bcfd5 | 100 | $wcelflag.=" /machine:X86"; last; }; |
5147c3c9 | 101 | /^ARMV4[IT]/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; |
270512ab AP |
102 | $wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/); |
103 | $wcecdefs.=" -QRarch4T -QRinterwork-return"; | |
104 | $wcelflag.=" /machine:THUMB"; last; }; | |
105 | /^ARM/ && do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt"; | |
0491e058 | 106 | $wcelflag.=" /machine:ARM"; last; }; |
270512ab AP |
107 | /^MIPSIV/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; |
108 | $wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32"; | |
109 | $wcelflag.=" /machine:MIPSFPU"; last; }; | |
110 | /^MIPS16/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; | |
111 | $wcecdefs.=" -DMIPSII -QMmips16"; | |
112 | $wcelflag.=" /machine:MIPS16"; last; }; | |
113 | /^MIPSII/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt"; | |
114 | $wcecdefs.=" -QMmips2"; | |
115 | $wcelflag.=" /machine:MIPS"; last; }; | |
116 | /^R4[0-9]{3}/ && do { $wcecdefs.=" -DMIPS -D_MIPS_ -DR4000"; | |
19bd66fe | 117 | $wcelflag.=" /machine:MIPS"; last; }; |
34be0bb1 | 118 | /^SH[0-9]/ && do { $wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx"; |
270512ab | 119 | $wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/); |
19bd66fe | 120 | $wcelflag.=" /machine:$wcetgt"; last; }; |
34be0bb1 | 121 | { $wcecdefs.=" -D$wcetgt -D_$wcetgt_"; |
19bd66fe | 122 | $wcelflag.=" /machine:$wcetgt"; last; }; |
34be0bb1 | 123 | } |
1e1c5047 | 124 | |
668bcfd5 | 125 | $cc=($ENV{CC} or "cl"); |
68b00c23 | 126 | $base_cflags=' /W3 /WX /GF /Gy /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYS_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT'; |
1e1c5047 | 127 | $base_cflags.=" $wcecdefs"; |
63d3a9c5 AP |
128 | $base_cflags.=' -I$(WCECOMPAT)/include' if (defined($ENV{'WCECOMPAT'})); |
129 | $base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include' if (defined($ENV{'PORTSDK_LIBPATH'})); | |
a006fef7 | 130 | if (`$cc 2>&1` =~ /Version ([0-9]+)\./ && $1>=14) { |
8be18f34 AP |
131 | $base_cflags.=($shlib and !$fipscanisterbuild)?' /MD':' /MT'; |
132 | } else { | |
133 | $base_cflags.=' /MC'; | |
134 | } | |
135 | $opt_cflags=' /O1i'; # optimize for space, but with intrinsics... | |
8774f78d | 136 | $dbg_cflags=' /Od -DDEBUG -D_DEBUG'; |
1e1c5047 | 137 | $lflags="/nologo /opt:ref $wcelflag"; |
b3836ed3 AP |
138 | } |
139 | else # Win32 | |
1875e6db | 140 | { |
45502bfe | 141 | $base_cflags= " $mf_cflag" . ($mf_shared_cflag ? " $mf_shared_cflag" : ""); |
8be18f34 | 142 | my $f = ($shlib and !$fipscanisterbuild)?' /MD':' /MT'; |
e1b81fed AP |
143 | $opt_cflags=$f.' /Ox /O2 /Ob2'; |
144 | $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG'; | |
963ba100 | 145 | $lflags="/nologo /subsystem:console /opt:ref"; |
1875e6db | 146 | } |
8be18f34 | 147 | $lib_cflag='/Zl' if (!$shlib or $fipscanisterbuild); # remove /DEFAULTLIBs |
d02b48c6 | 148 | $mlflags=''; |
58964a49 | 149 | |
2d060267 AP |
150 | $out_def ="out32"; $out_def.="dll" if ($shlib); |
151 | $out_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); | |
152 | $tmp_def ="tmp32"; $tmp_def.="dll" if ($shlib); | |
153 | $tmp_def.='_$(TARGETCPU)' if ($FLAVOR =~ /CE/); | |
58964a49 RE |
154 | $inc_def="inc32"; |
155 | ||
d02b48c6 RE |
156 | if ($debug) |
157 | { | |
b3836ed3 | 158 | $cflags=$dbg_cflags.$base_cflags; |
d02b48c6 | 159 | } |
b3836ed3 AP |
160 | else |
161 | { | |
162 | $cflags=$opt_cflags.$base_cflags; | |
163 | } | |
58964a49 | 164 | |
2d060267 | 165 | # generate symbols.pdb unconditionally |
57ae37a0 AP |
166 | $app_cflag.=" /Zi /Fd\$(TMP_D)/app"; |
167 | $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib"; | |
2d060267 AP |
168 | $lflags.=" /debug"; |
169 | ||
03e389cf | 170 | $lflags.=" /fixed" if ($fips && $FLAVOR !~ /WIN64/); |
e4588dc4 | 171 | |
d02b48c6 | 172 | $obj='.obj'; |
73980531 | 173 | $asm_suffix='.asm'; |
d02b48c6 RE |
174 | $ofile="/Fo"; |
175 | ||
176 | # EXE linking stuff | |
177 | $link="link"; | |
fc6a6a10 | 178 | $rsc="rc"; |
d02b48c6 RE |
179 | $efile="/out:"; |
180 | $exep='.exe'; | |
b3836ed3 | 181 | if ($no_sock) { $ex_libs=''; } |
668bcfd5 | 182 | elsif ($FLAVOR =~ /CE/) { $ex_libs='ws2.lib'; } |
3189772e | 183 | else { $ex_libs='ws2_32.lib'; } |
b3836ed3 AP |
184 | |
185 | if ($FLAVOR =~ /CE/) | |
1e1c5047 | 186 | { |
668bcfd5 AP |
187 | $ex_libs.=' crypt32.lib'; # for e_capi.c |
188 | if (defined($ENV{WCECOMPAT})) | |
189 | { | |
190 | $ex_libs.= ' $(WCECOMPAT)/lib'; | |
191 | if (-f "$ENV{WCECOMPAT}/lib/$ENV{TARGETCPU}/wcecompatex.lib") | |
192 | { | |
fb0a5208 | 193 | $ex_libs.='/$(TARGETCPU)/wcecompatex.lib'; |
668bcfd5 AP |
194 | } |
195 | else | |
196 | { | |
197 | $ex_libs.='/wcecompatex.lib'; | |
198 | } | |
199 | } | |
176a6148 | 200 | $ex_libs.=' $(PORTSDK_LIBPATH)/portlib.lib' if (defined($ENV{'PORTSDK_LIBPATH'})); |
668bcfd5 | 201 | $ex_libs.=' /nodefaultlib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86"); |
1e1c5047 | 202 | } |
b3836ed3 AP |
203 | else |
204 | { | |
a4792168 | 205 | $ex_libs.=' gdi32.lib advapi32.lib crypt32.lib user32.lib'; |
7766bc1a | 206 | $ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/ and `cl 2>&1` =~ /14\.00\.4[0-9]{4}\./); |
f63e4be3 AP |
207 | # WIN32 UNICODE build gets linked with unicows.lib for |
208 | # backward compatibility with Win9x. | |
209 | $ex_libs="unicows.lib $ex_libs" if ($FLAVOR =~ /WIN32/ and $cflags =~ /\-DUNICODE/); | |
b3836ed3 AP |
210 | } |
211 | ||
d02b48c6 | 212 | # static library stuff |
c836f8ef | 213 | $mklib='lib /nologo'; |
d02b48c6 RE |
214 | $ranlib=''; |
215 | $plib=""; | |
216 | $libp=".lib"; | |
217 | $shlibp=($shlib)?".dll":".lib"; | |
218 | $lfile='/out:'; | |
219 | ||
220 | $shlib_ex_obj=""; | |
b3836ed3 | 221 | $app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/); |
f63e4be3 | 222 | if ($FLAVOR =~ /WIN64A/) { |
2d060267 AP |
223 | if (`nasm -v 2>NUL` =~ /NASM version ([0-9]+\.[0-9]+)/ && $1 >= 2.0) { |
224 | $asm='nasm -f win64 -DNEAR -Ox -g'; | |
a23e3dbe AP |
225 | $afile='-o '; |
226 | } else { | |
2d060267 | 227 | $asm='ml64 /c /Cp /Cx /Zi'; |
a23e3dbe AP |
228 | $afile='/Fo'; |
229 | } | |
f63e4be3 | 230 | } elsif ($FLAVOR =~ /WIN64I/) { |
2d060267 | 231 | $asm='ias -d debug'; |
f63e4be3 AP |
232 | $afile="-o "; |
233 | } elsif ($nasm) { | |
4664eb52 DSH |
234 | my $ver=`nasm -v 2>NUL`; |
235 | my $vew=`nasmw -v 2>NUL`; | |
82a24313 | 236 | # pick newest version |
bc9092f7 | 237 | $asm=($ver ge $vew?"nasm":"nasmw")." -f win32"; |
73980531 | 238 | $asmtype="win32n"; |
bbdb5438 DSH |
239 | $afile='-o '; |
240 | } else { | |
2d060267 | 241 | $asm='ml /nologo /Cp /coff /c /Cx /Zi'; |
bbdb5438 | 242 | $afile='/Fo'; |
73980531 | 243 | $asmtype="win32"; |
bbdb5438 | 244 | } |
d02b48c6 | 245 | |
dfeab068 RE |
246 | $bn_asm_obj=''; |
247 | $bn_asm_src=''; | |
d02b48c6 RE |
248 | $des_enc_obj=''; |
249 | $des_enc_src=''; | |
250 | $bf_enc_obj=''; | |
251 | $bf_enc_src=''; | |
252 | ||
253 | if (!$no_asm) | |
254 | { | |
73980531 DSH |
255 | win32_import_asm($mf_bn_asm, "bn", \$bn_asm_obj, \$bn_asm_src); |
256 | win32_import_asm($mf_aes_asm, "aes", \$aes_asm_obj, \$aes_asm_src); | |
257 | win32_import_asm($mf_des_asm, "des", \$des_enc_obj, \$des_enc_src); | |
258 | win32_import_asm($mf_bf_asm, "bf", \$bf_enc_obj, \$bf_enc_src); | |
259 | win32_import_asm($mf_cast_asm, "cast", \$cast_enc_obj, \$cast_enc_src); | |
260 | win32_import_asm($mf_rc4_asm, "rc4", \$rc4_enc_obj, \$rc4_enc_src); | |
261 | win32_import_asm($mf_rc5_asm, "rc5", \$rc5_enc_obj, \$rc5_enc_src); | |
262 | win32_import_asm($mf_md5_asm, "md5", \$md5_asm_obj, \$md5_asm_src); | |
263 | win32_import_asm($mf_sha_asm, "sha", \$sha1_asm_obj, \$sha1_asm_src); | |
264 | win32_import_asm($mf_rmd_asm, "ripemd", \$rmd160_asm_obj, \$rmd160_asm_src); | |
265 | win32_import_asm($mf_wp_asm, "whrlpool", \$whirlpool_asm_obj, \$whirlpool_asm_src); | |
dc527a62 | 266 | win32_import_asm($mf_modes_asm, "modes", \$modes_asm_obj, \$modes_asm_src); |
73980531 DSH |
267 | win32_import_asm($mf_cpuid_asm, "", \$cpuid_asm_obj, \$cpuid_asm_src); |
268 | $perl_asm = 1; | |
d02b48c6 RE |
269 | } |
270 | ||
b3836ed3 | 271 | if ($shlib && $FLAVOR !~ /CE/) |
d02b48c6 RE |
272 | { |
273 | $mlflags.=" $lflags /dll"; | |
2d060267 | 274 | $lib_cflag.=" -D_WINDLL"; |
53d89967 AP |
275 | # |
276 | # Engage Applink... | |
277 | # | |
278 | $app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib"; | |
51ff6bde | 279 | $cflags.=" -DOPENSSL_USE_APPLINK -I."; |
53d89967 AP |
280 | # I'm open for better suggestions than overriding $banner... |
281 | $banner=<<'___'; | |
282 | @echo Building OpenSSL | |
283 | ||
284 | $(OBJ_D)\applink.obj: ms\applink.c | |
285 | $(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c | |
51ff6bde | 286 | $(OBJ_D)\uplink.obj: ms\uplink.c ms\applink.c |
53d89967 | 287 | $(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c |
53d89967 AP |
288 | |
289 | LIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj | |
290 | CRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ) | |
1875e6db AP |
291 | ___ |
292 | $banner.=<<'___' if ($FLAVOR =~ /WIN64/); | |
293 | CRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ) | |
53d89967 | 294 | ___ |
d02b48c6 | 295 | } |
b3836ed3 AP |
296 | elsif ($shlib && $FLAVOR =~ /CE/) |
297 | { | |
298 | $mlflags.=" $lflags /dll"; | |
176a6148 | 299 | $lflags.=' /entry:mainCRTstartup' if(defined($ENV{'PORTSDK_LIBPATH'})); |
8be18f34 AP |
300 | $lib_cflag.=" -D_WINDLL"; |
301 | $lib_cflag.=" -D_DLL" if (!$fipscanisterbuild); | |
b3836ed3 | 302 | } |
d02b48c6 | 303 | |
fd9ad230 RL |
304 | sub do_rehash_rule { |
305 | my ($target, $deps) = @_; | |
306 | my $ret = <<"EOF"; | |
307 | $target: $deps | |
82987e61 | 308 | echo off > $target |
fd9ad230 RL |
309 | EOF |
310 | return $ret | |
311 | } | |
312 | sub do_test_rule { | |
313 | my ($target, $deps, $test_cmd) = @_; | |
314 | my $ret = <<"EOF"; | |
315 | $target: $deps force.$target | |
316 | set TOP=. | |
317 | set BIN_D=\$(BIN_D) | |
318 | set TEST_D=\$(TEST_D) | |
319 | set PERL=\$(PERL) | |
b00387a0 | 320 | \$(PERL) test\\$test_cmd \$(TESTS) |
fd9ad230 RL |
321 | force.$target: |
322 | EOF | |
323 | } | |
324 | ||
d02b48c6 RE |
325 | sub do_lib_rule |
326 | { | |
06b433ac | 327 | my($objs,$target,$name,$shlib,$ign,$base_addr) = @_; |
fbf002bb | 328 | local($ret); |
d02b48c6 RE |
329 | |
330 | $taget =~ s/\//$o/g if $o ne '/'; | |
06b433ac DSH |
331 | my $base_arg; |
332 | if ($base_addr ne "") | |
333 | { | |
334 | $base_arg= " /base:$base_addr"; | |
335 | } | |
336 | else | |
337 | { | |
338 | $base_arg = ""; | |
339 | } | |
fbf002bb DSH |
340 | if ($name ne "") |
341 | { | |
342 | $name =~ tr/a-z/A-Z/; | |
343 | $name = "/def:ms/${name}.def"; | |
344 | } | |
d02b48c6 | 345 | |
58964a49 | 346 | # $target="\$(LIB_D)$o$target"; |
06b433ac | 347 | # $ret.="$target: $objs\n"; |
d02b48c6 RE |
348 | if (!$shlib) |
349 | { | |
350 | # $ret.="\t\$(RM) \$(O_$Name)\n"; | |
3b5c1dc5 | 351 | $ret.="$target: $objs\n"; |
7766bc1a | 352 | $ret.="\t\$(MKLIB) $lfile$target @<<\n $objs\n<<\n"; |
d02b48c6 RE |
353 | } |
354 | else | |
355 | { | |
fbf002bb | 356 | local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)'; |
ad2695b1 | 357 | $ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/; |
06b433ac DSH |
358 | |
359 | if ($fips && $target =~ /O_CRYPTO/) | |
360 | { | |
361 | $ret.="$target: $objs \$(PREMAIN_DSO_EXE)"; | |
d44bb1c3 | 362 | $ret.="\n\tSET FIPS_LINK=\$(LINK_CMD)\n"; |
06b433ac DSH |
363 | $ret.="\tSET FIPS_CC=\$(CC)\n"; |
364 | $ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n"; | |
365 | $ret.="\tSET PREMAIN_DSO_EXE=\$(PREMAIN_DSO_EXE)\n"; | |
366 | $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n"; | |
367 | $ret.="\tSET FIPS_TARGET=$target\n"; | |
368 | $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n"; | |
369 | $ret.="\t\$(FIPSLINK) \$(MLFLAGS) /map $base_arg $efile$target "; | |
370 | $ret.="$name @<<\n \$(SHLIB_EX_OBJ) $objs \$(EX_LIBS) "; | |
371 | $ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n"; | |
372 | } | |
373 | else | |
374 | { | |
375 | $ret.="$target: $objs"; | |
d44bb1c3 | 376 | $ret.="\n\t\$(LINK_CMD) \$(MLFLAGS) $efile$target $name @<<\n \$(SHLIB_EX_OBJ) $objs $ex \$(EX_LIBS)\n<<\n"; |
06b433ac DSH |
377 | } |
378 | ||
7766bc1a | 379 | $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n"; |
d02b48c6 RE |
380 | } |
381 | $ret.="\n"; | |
382 | return($ret); | |
383 | } | |
384 | ||
385 | sub do_link_rule | |
386 | { | |
06b433ac | 387 | my($target,$files,$dep_libs,$libs,$standalone)=@_; |
d02b48c6 | 388 | local($ret,$_); |
d02b48c6 | 389 | $file =~ s/\//$o/g if $o ne '/'; |
3a114e61 | 390 | $n=&bname($target); |
d02b48c6 | 391 | $ret.="$target: $files $dep_libs\n"; |
06b433ac DSH |
392 | if ($standalone == 1) |
393 | { | |
d44bb1c3 | 394 | $ret.=" \$(LINK_CMD) \$(LFLAGS) $efile$target @<<\n\t"; |
06b433ac DSH |
395 | $ret.= "\$(EX_LIBS) " if ($files =~ /O_FIPSCANISTER/ && !$fipscanisterbuild); |
396 | $ret.="$files $libs\n<<\n"; | |
397 | } | |
398 | elsif ($standalone == 2) | |
399 | { | |
d44bb1c3 | 400 | $ret.="\tSET FIPS_LINK=\$(LINK_CMD)\n"; |
06b433ac DSH |
401 | $ret.="\tSET FIPS_CC=\$(CC)\n"; |
402 | $ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n"; | |
403 | $ret.="\tSET PREMAIN_DSO_EXE=\n"; | |
404 | $ret.="\tSET FIPS_TARGET=$target\n"; | |
405 | $ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n"; | |
406 | $ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n"; | |
407 | $ret.="\t\$(FIPSLINK) \$(LFLAGS) /map $efile$target @<<\n"; | |
408 | $ret.="\t\$(APP_EX_OBJ) $files \$(OBJ_D)${o}fips_premain.obj $libs\n<<\n"; | |
409 | } | |
410 | else | |
411 | { | |
d44bb1c3 | 412 | $ret.="\t\$(LINK_CMD) \$(LFLAGS) $efile$target @<<\n"; |
06b433ac DSH |
413 | $ret.="\t\$(APP_EX_OBJ) $files $libs\n<<\n"; |
414 | } | |
415 | $ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;1\n\n"; | |
416 | return($ret); | |
417 | } | |
418 | ||
419 | sub do_rlink_rule | |
420 | { | |
421 | local($target,$rl_start, $rl_mid, $rl_end,$dep_libs,$libs)=@_; | |
422 | local($ret,$_); | |
423 | my $files = "$rl_start $rl_mid $rl_end"; | |
424 | ||
425 | $file =~ s/\//$o/g if $o ne '/'; | |
3a114e61 | 426 | $n=&bname($target); |
06b433ac DSH |
427 | $ret.="$target: $files $dep_libs \$(FIPS_SHA1_EXE)\n"; |
428 | $ret.="\t\$(PERL) ms\\segrenam.pl \$\$a $rl_start\n"; | |
429 | $ret.="\t\$(PERL) ms\\segrenam.pl \$\$b $rl_mid\n"; | |
430 | $ret.="\t\$(PERL) ms\\segrenam.pl \$\$c $rl_end\n"; | |
431 | $ret.="\t\$(MKLIB) $lfile$target @<<\n\t$files\n<<\n"; | |
432 | $ret.="\t\$(FIPS_SHA1_EXE) $target > ${target}.sha1\n"; | |
433 | $ret.="\t\$(PERL) util${o}copy.pl -stripcr fips${o}fips_premain.c \$(LIB_D)${o}fips_premain.c\n"; | |
434 | $ret.="\t\$(CP) fips${o}fips_premain.c.sha1 \$(LIB_D)${o}fips_premain.c.sha1\n"; | |
435 | $ret.="\n"; | |
d02b48c6 RE |
436 | return($ret); |
437 | } | |
438 | ||
73980531 DSH |
439 | sub win32_import_asm |
440 | { | |
441 | my ($mf_var, $asm_name, $oref, $sref) = @_; | |
442 | my $asm_dir; | |
443 | if ($asm_name eq "") | |
444 | { | |
445 | $asm_dir = "crypto\\"; | |
446 | } | |
447 | else | |
448 | { | |
449 | $asm_dir = "crypto\\$asm_name\\asm\\"; | |
450 | } | |
451 | ||
452 | $$oref = ""; | |
06b433ac DSH |
453 | $$sref = ""; |
454 | $mf_var =~ s/\.o//g; | |
73980531 DSH |
455 | |
456 | foreach (split(/ /, $mf_var)) | |
457 | { | |
06b433ac DSH |
458 | $$sref .= $asm_dir . $_ . ".asm "; |
459 | } | |
460 | foreach (split(/ /, $mf_var)) | |
461 | { | |
462 | $$oref .= "\$(TMP_D)\\" . $_ . ".obj "; | |
73980531 DSH |
463 | } |
464 | $$oref =~ s/ $//; | |
06b433ac | 465 | $$sref =~ s/ $//; |
73980531 DSH |
466 | |
467 | } | |
468 | ||
469 | ||
d02b48c6 | 470 | 1; |