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";
7238405Sjkim$crypto="libeay32";
855714Skris
9194206Ssimonif ($fips && !$shlib)
10194206Ssimon	{
11194206Ssimon	$crypto="libeayfips32";
12194206Ssimon	$crypto_compat = "libeaycompat32.lib";
13194206Ssimon	}
14194206Ssimonelse
15194206Ssimon	{
16194206Ssimon	$crypto="libeay32";
17194206Ssimon	}
18194206Ssimon
1955714Skris$o='\\';
20160814Ssimon$cp='$(PERL) util/copy.pl';
21160814Ssimon$mkdir='$(PERL) util/mkdir-p.pl';
22194206Ssimon$rm='del /Q';
2355714Skris
24160814Ssimon$zlib_lib="zlib1.lib";
25160814Ssimon
26205128Ssimon# Santize -L options for ms link
27205128Ssimon$l_flags =~ s/-L("\[^"]+")/\/libpath:$1/g;
28205128Ssimon$l_flags =~ s/-L(\S+)/\/libpath:$1/g;
29205128Ssimon
30264278Sjkimmy $ff = "";
31264278Sjkim
3255714Skris# C compiler stuff
3355714Skris$cc='cl';
34160814Ssimonif ($FLAVOR =~ /WIN64/)
35160814Ssimon    {
36160814Ssimon    # Note that we currently don't have /WX on Win64! There is a lot of
37160814Ssimon    # warnings, but only of two types:
38160814Ssimon    #
39160814Ssimon    # C4344: conversion from '__int64' to 'int/long', possible loss of data
40160814Ssimon    # C4267: conversion from 'size_t' to 'int/long', possible loss of data
41160814Ssimon    #
42160814Ssimon    # Amount of latter type is minimized by aliasing strlen to function of
43160814Ssimon    # own desing and limiting its return value to 2GB-1 (see e_os.h). As
44160814Ssimon    # per 0.9.8 release remaining warnings were explicitly examined and
45160814Ssimon    # considered safe to ignore.
46160814Ssimon    #
47238405Sjkim    $base_cflags= " $mf_cflag";
48215697Ssimon    my $f = $shlib || $fips ?' /MD':' /MT';
49194206Ssimon    $opt_cflags=$f.' /Ox';
50194206Ssimon    $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
51160814Ssimon    $lflags="/nologo /subsystem:console /opt:ref";
52238405Sjkim
53238405Sjkim    *::perlasm_compile_target = sub {
54238405Sjkim	my ($target,$source,$bname)=@_;
55238405Sjkim	my $ret;
56238405Sjkim
57238405Sjkim	$bname =~ s/(.*)\.[^\.]$/$1/;
58238405Sjkim	$ret=<<___;
59238405Sjkim\$(TMP_D)$o$bname.asm: $source
60238405Sjkim	set ASM=\$(ASM)
61238405Sjkim	\$(PERL) $source \$\@
62238405Sjkim
63238405Sjkim$target: \$(TMP_D)$o$bname.asm
64238405Sjkim	\$(ASM) $afile\$\@ \$(TMP_D)$o$bname.asm
65238405Sjkim
66238405Sjkim___
67238405Sjkim	}
68160814Ssimon    }
69160814Ssimonelsif ($FLAVOR =~ /CE/)
70160814Ssimon    {
71160814Ssimon    # sanity check
72160814Ssimon    die '%OSVERSION% is not defined'	if (!defined($ENV{'OSVERSION'}));
73160814Ssimon    die '%PLATFORM% is not defined'	if (!defined($ENV{'PLATFORM'}));
74160814Ssimon    die '%TARGETCPU% is not defined'	if (!defined($ENV{'TARGETCPU'}));
75160814Ssimon
76160814Ssimon    #
77160814Ssimon    # Idea behind this is to mimic flags set by eVC++ IDE...
78160814Ssimon    #
79160814Ssimon    $wcevers = $ENV{'OSVERSION'};			# WCENNN
80160814Ssimon    die '%OSVERSION% value is insane'	if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/);
81160814Ssimon    $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2";	# -D_WIN32_WCE=NNN
82160814Ssimon    $wcelflag = "/subsystem:windowsce,$1.$2";		# ...,N.NN
83160814Ssimon
84160814Ssimon    $wceplatf =  $ENV{'PLATFORM'};
85160814Ssimon    $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d;
86160814Ssimon    $wcecdefs .= " -DWCE_PLATFORM_$wceplatf";
87160814Ssimon
88160814Ssimon    $wcetgt = $ENV{'TARGETCPU'};	# just shorter name...
89160814Ssimon    SWITCH: for($wcetgt) {
90160814Ssimon	/^X86/		&& do {	$wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_";
91290207Sjkim				$wcelflag.=" /machine:X86";	last; };
92160814Ssimon	/^ARMV4[IT]/	&& do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
93160814Ssimon				$wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/);
94160814Ssimon				$wcecdefs.=" -QRarch4T -QRinterwork-return";
95160814Ssimon				$wcelflag.=" /machine:THUMB";	last; };
96160814Ssimon	/^ARM/		&& do {	$wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
97160814Ssimon				$wcelflag.=" /machine:ARM";	last; };
98160814Ssimon	/^MIPSIV/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
99160814Ssimon				$wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32";
100160814Ssimon				$wcelflag.=" /machine:MIPSFPU";	last; };
101160814Ssimon	/^MIPS16/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
102160814Ssimon				$wcecdefs.=" -DMIPSII -QMmips16";
103160814Ssimon				$wcelflag.=" /machine:MIPS16";	last; };
104160814Ssimon	/^MIPSII/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
105160814Ssimon				$wcecdefs.=" -QMmips2";
106160814Ssimon				$wcelflag.=" /machine:MIPS";	last; };
107160814Ssimon	/^R4[0-9]{3}/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000";
108160814Ssimon				$wcelflag.=" /machine:MIPS";	last; };
109160814Ssimon	/^SH[0-9]/	&& do {	$wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx";
110160814Ssimon				$wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/);
111160814Ssimon				$wcelflag.=" /machine:$wcetgt";	last; };
112160814Ssimon	{ $wcecdefs.=" -D$wcetgt -D_$wcetgt_";
113160814Ssimon	  $wcelflag.=" /machine:$wcetgt";			last; };
114160814Ssimon    }
115160814Ssimon
116290207Sjkim    $cc=($ENV{CC} or "cl");
117238405Sjkim    $base_cflags=' /W3 /WX /GF /Gy /nologo -DUNICODE -D_UNICODE -DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT';
118160814Ssimon    $base_cflags.=" $wcecdefs";
119238405Sjkim    $base_cflags.=' -I$(WCECOMPAT)/include'		if (defined($ENV{'WCECOMPAT'}));
120238405Sjkim    $base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include'	if (defined($ENV{'PORTSDK_LIBPATH'}));
121290207Sjkim    if (`$cc 2>&1` =~ /Version ([0-9]+)\./ && $1>=14) {
122290207Sjkim	$base_cflags.=$shlib?' /MD':' /MT';
123290207Sjkim    } else {
124290207Sjkim	$base_cflags.=' /MC';
125290207Sjkim    }
126290207Sjkim    $opt_cflags=' /O1i';	# optimize for space, but with intrinsics...
127290207Sjkim    $dbg_cflags=' /Od -DDEBUG -D_DEBUG';
128160814Ssimon    $lflags="/nologo /opt:ref $wcelflag";
129160814Ssimon    }
130160814Ssimonelse	# Win32
131160814Ssimon    {
132238405Sjkim    $base_cflags= " $mf_cflag";
133194206Ssimon    my $f = $shlib || $fips ?' /MD':' /MT';
134264278Sjkim    $ff = "/fixed";
135194206Ssimon    $opt_cflags=$f.' /Ox /O2 /Ob2';
136194206Ssimon    $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
137160814Ssimon    $lflags="/nologo /subsystem:console /opt:ref";
138160814Ssimon    }
139290207Sjkim$lib_cflag='/Zl' if (!$shlib);	# remove /DEFAULTLIBs from static lib
14055714Skris$mlflags='';
14155714Skris
142238405Sjkim$out_def ="out32";	$out_def.="dll"			if ($shlib);
143238405Sjkim			$out_def.='_$(TARGETCPU)'	if ($FLAVOR =~ /CE/);
144238405Sjkim$tmp_def ="tmp32";	$tmp_def.="dll"			if ($shlib);
145238405Sjkim			$tmp_def.='_$(TARGETCPU)'	if ($FLAVOR =~ /CE/);
14655714Skris$inc_def="inc32";
14755714Skris
14855714Skrisif ($debug)
14955714Skris	{
150238405Sjkim	$cflags=$dbg_cflags.$base_cflags;
15155714Skris	}
152160814Ssimonelse
153160814Ssimon	{
154160814Ssimon	$cflags=$opt_cflags.$base_cflags;
155160814Ssimon	}
15655714Skris
157238405Sjkim# generate symbols.pdb unconditionally
158238405Sjkim$app_cflag.=" /Zi /Fd\$(TMP_D)/app";
159238405Sjkim$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib";
160238405Sjkim$lflags.=" /debug";
161238405Sjkim
16255714Skris$obj='.obj';
163238405Sjkim$asm_suffix='.asm';
16455714Skris$ofile="/Fo";
16555714Skris
16655714Skris# EXE linking stuff
16755714Skris$link="link";
168160814Ssimon$rsc="rc";
16955714Skris$efile="/out:";
17055714Skris$exep='.exe';
171160814Ssimonif ($no_sock)		{ $ex_libs=''; }
172290207Sjkimelsif ($FLAVOR =~ /CE/)	{ $ex_libs='ws2.lib'; }
173238405Sjkimelse			{ $ex_libs='ws2_32.lib'; }
17455714Skris
175160814Ssimonif ($FLAVOR =~ /CE/)
176160814Ssimon	{
177290207Sjkim	$ex_libs.=' crypt32.lib';	# for e_capi.c
178290207Sjkim	if (defined($ENV{WCECOMPAT}))
179290207Sjkim		{
180290207Sjkim		$ex_libs.= ' $(WCECOMPAT)/lib';
181290207Sjkim		if (-f "$ENV{WCECOMPAT}/lib/$ENV{TARGETCPU}/wcecompatex.lib")
182290207Sjkim			{
183290207Sjkim			$ex_libs.='/$(TARGETCPU)/wcecompatex.lib';
184290207Sjkim			}
185290207Sjkim		else
186290207Sjkim			{
187290207Sjkim			$ex_libs.='/wcecompatex.lib';
188290207Sjkim			}
189290207Sjkim		}
190238405Sjkim	$ex_libs.=' $(PORTSDK_LIBPATH)/portlib.lib'	if (defined($ENV{'PORTSDK_LIBPATH'}));
191290207Sjkim	$ex_libs.=' /nodefaultlib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86");
192160814Ssimon	}
193160814Ssimonelse
194160814Ssimon	{
195238405Sjkim	$ex_libs.=' gdi32.lib advapi32.lib crypt32.lib user32.lib';
196238405Sjkim	$ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/ and `cl 2>&1` =~ /14\.00\.4[0-9]{4}\./);
197238405Sjkim	# WIN32 UNICODE build gets linked with unicows.lib for
198238405Sjkim	# backward compatibility with Win9x.
199238405Sjkim	$ex_libs="unicows.lib $ex_libs" if ($FLAVOR =~ /WIN32/ and $cflags =~ /\-DUNICODE/);
200160814Ssimon	}
201160814Ssimon
20255714Skris# static library stuff
203194206Ssimon$mklib='lib /nologo';
20455714Skris$ranlib='';
20555714Skris$plib="";
20655714Skris$libp=".lib";
20755714Skris$shlibp=($shlib)?".dll":".lib";
20855714Skris$lfile='/out:';
20955714Skris
21055714Skris$shlib_ex_obj="";
211160814Ssimon$app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/);
212238405Sjkimif ($FLAVOR =~ /WIN64A/) {
213238405Sjkim	if (`nasm -v 2>NUL` =~ /NASM version ([0-9]+\.[0-9]+)/ && $1 >= 2.0) {
214238405Sjkim		$asm='nasm -f win64 -DNEAR -Ox -g';
215238405Sjkim		$afile='-o ';
216238405Sjkim	} else {
217238405Sjkim		$asm='ml64 /c /Cp /Cx /Zi';
218238405Sjkim		$afile='/Fo';
219238405Sjkim	}
220238405Sjkim} elsif ($FLAVOR =~ /WIN64I/) {
221238405Sjkim	$asm='ias -d debug';
222238405Sjkim	$afile="-o ";
223238405Sjkim} elsif ($nasm) {
224194206Ssimon	my $ver=`nasm -v 2>NUL`;
225194206Ssimon	my $vew=`nasmw -v 2>NUL`;
226194206Ssimon	# pick newest version
227238405Sjkim	$asm=($ver ge $vew?"nasm":"nasmw")." -f win32";
228238405Sjkim	$asmtype="win32n";
22955714Skris	$afile='-o ';
23055714Skris} else {
231238405Sjkim	$asm='ml /nologo /Cp /coff /c /Cx /Zi';
23255714Skris	$afile='/Fo';
233238405Sjkim	$asmtype="win32";
23455714Skris}
23555714Skris
23655714Skris$bn_asm_obj='';
23755714Skris$bn_asm_src='';
23855714Skris$des_enc_obj='';
23955714Skris$des_enc_src='';
24055714Skris$bf_enc_obj='';
24155714Skris$bf_enc_src='';
24255714Skris
243160814Ssimonif (!$no_asm)
24455714Skris	{
245238405Sjkim	win32_import_asm($mf_bn_asm, "bn", \$bn_asm_obj, \$bn_asm_src);
246238405Sjkim	win32_import_asm($mf_aes_asm, "aes", \$aes_asm_obj, \$aes_asm_src);
247238405Sjkim	win32_import_asm($mf_des_asm, "des", \$des_enc_obj, \$des_enc_src);
248238405Sjkim	win32_import_asm($mf_bf_asm, "bf", \$bf_enc_obj, \$bf_enc_src);
249238405Sjkim	win32_import_asm($mf_cast_asm, "cast", \$cast_enc_obj, \$cast_enc_src);
250238405Sjkim	win32_import_asm($mf_rc4_asm, "rc4", \$rc4_enc_obj, \$rc4_enc_src);
251238405Sjkim	win32_import_asm($mf_rc5_asm, "rc5", \$rc5_enc_obj, \$rc5_enc_src);
252238405Sjkim	win32_import_asm($mf_md5_asm, "md5", \$md5_asm_obj, \$md5_asm_src);
253238405Sjkim	win32_import_asm($mf_sha_asm, "sha", \$sha1_asm_obj, \$sha1_asm_src);
254238405Sjkim	win32_import_asm($mf_rmd_asm, "ripemd", \$rmd160_asm_obj, \$rmd160_asm_src);
255238405Sjkim	win32_import_asm($mf_wp_asm, "whrlpool", \$whirlpool_asm_obj, \$whirlpool_asm_src);
256238405Sjkim	win32_import_asm($mf_cpuid_asm, "", \$cpuid_asm_obj, \$cpuid_asm_src);
257238405Sjkim	$perl_asm = 1;
25855714Skris	}
25955714Skris
260160814Ssimonif ($shlib && $FLAVOR !~ /CE/)
26155714Skris	{
26255714Skris	$mlflags.=" $lflags /dll";
263238405Sjkim	$lib_cflag.=" -D_WINDLL";
264160814Ssimon	#
265160814Ssimon	# Engage Applink...
266160814Ssimon	#
267160814Ssimon	$app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib";
268160814Ssimon	$cflags.=" -DOPENSSL_USE_APPLINK -I.";
269160814Ssimon	# I'm open for better suggestions than overriding $banner...
270160814Ssimon	$banner=<<'___';
271160814Ssimon	@echo Building OpenSSL
272160814Ssimon
273160814Ssimon$(OBJ_D)\applink.obj:	ms\applink.c
274160814Ssimon	$(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c
275160814Ssimon$(OBJ_D)\uplink.obj:	ms\uplink.c ms\applink.c
276160814Ssimon	$(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c
277160814Ssimon$(INCO_D)\applink.c:	ms\applink.c
278160814Ssimon	$(CP) ms\applink.c $(INCO_D)\applink.c
279160814Ssimon
280160814SsimonEXHEADER= $(EXHEADER) $(INCO_D)\applink.c
281160814Ssimon
282160814SsimonLIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj
283238405SjkimCRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ)
284160814Ssimon___
285160814Ssimon	$banner.=<<'___' if ($FLAVOR =~ /WIN64/);
286160814SsimonCRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ)
287160814Ssimon___
28855714Skris	}
289160814Ssimonelsif ($shlib && $FLAVOR =~ /CE/)
290160814Ssimon	{
291160814Ssimon	$mlflags.=" $lflags /dll";
292238405Sjkim	$lflags.=' /entry:mainCRTstartup' if(defined($ENV{'PORTSDK_LIBPATH'}));
293238405Sjkim	$lib_cflag.=" -D_WINDLL -D_DLL";
294160814Ssimon	}
29555714Skris
29655714Skrissub do_lib_rule
29755714Skris	{
298194206Ssimon	my($objs,$target,$name,$shlib,$ign,$base_addr) = @_;
299160814Ssimon	local($ret);
30055714Skris
30155714Skris	$taget =~ s/\//$o/g if $o ne '/';
302194206Ssimon	my $base_arg;
303194206Ssimon	if ($base_addr ne "")
304160814Ssimon		{
305194206Ssimon		$base_arg= " /base:$base_addr";
306194206Ssimon		}
307194206Ssimon	else
308194206Ssimon		{
309194206Ssimon		$base_arg = "";
310194206Ssimon		}
311238405Sjkim	if ($name ne "")
312194206Ssimon		{
313160814Ssimon		$name =~ tr/a-z/A-Z/;
314160814Ssimon		$name = "/def:ms/${name}.def";
315160814Ssimon		}
31655714Skris
31755714Skris#	$target="\$(LIB_D)$o$target";
318194206Ssimon#	$ret.="$target: $objs\n";
31955714Skris	if (!$shlib)
32055714Skris		{
32155714Skris#		$ret.="\t\$(RM) \$(O_$Name)\n";
322194206Ssimon		$ret.="$target: $objs\n";
323238405Sjkim		$ret.="\t\$(MKLIB) $lfile$target @<<\n  $objs\n<<\n";
32455714Skris		}
32555714Skris	else
32655714Skris		{
327238405Sjkim		local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)';
328160814Ssimon		$ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
329194206Ssimon
330238405Sjkim 		if ($fips && $target =~ /O_CRYPTO/)
331194206Ssimon			{
332194206Ssimon			$ret.="$target: $objs \$(PREMAIN_DSO_EXE)";
333296279Sjkim			$ret.="\n\tSET FIPS_LINK=\$(LINK_CMD)\n";
334194206Ssimon			$ret.="\tSET FIPS_CC=\$(CC)\n";
335194206Ssimon			$ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
336194206Ssimon			$ret.="\tSET PREMAIN_DSO_EXE=\$(PREMAIN_DSO_EXE)\n";
337194206Ssimon			$ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
338194206Ssimon			$ret.="\tSET FIPS_TARGET=$target\n";
339194206Ssimon			$ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
340264278Sjkim			$ret.="\t\$(FIPSLINK) \$(MLFLAGS) $ff /map $base_arg $efile$target ";
341238405Sjkim			$ret.="$name @<<\n  \$(SHLIB_EX_OBJ) $objs \$(EX_LIBS) ";
342194206Ssimon			$ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n";
343194206Ssimon			}
344194206Ssimon		else
345194206Ssimon			{
346194206Ssimon			$ret.="$target: $objs";
347296279Sjkim			$ret.="\n\t\$(LINK_CMD) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex \$(EX_LIBS)\n<<\n";
348194206Ssimon			}
349238405Sjkim		$ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n";
35055714Skris		}
35155714Skris	$ret.="\n";
35255714Skris	return($ret);
35355714Skris	}
35455714Skris
35555714Skrissub do_link_rule
35655714Skris	{
357194206Ssimon	my($target,$files,$dep_libs,$libs,$standalone)=@_;
35855714Skris	local($ret,$_);
35955714Skris	$file =~ s/\//$o/g if $o ne '/';
360284283Sjkim	$n=&bname($target);
361291719Sjkim	$ret.="$target: $files $dep_libs";
362194206Ssimon	if ($standalone == 1)
363194206Ssimon		{
364295009Sjkim		$ret.=" \$(OBJ_D)${o}applink.obj" if $shlib;
365295009Sjkim		$ret.="\n";
366296279Sjkim		$ret.="  \$(LINK_CMD) \$(LFLAGS) $efile$target @<<\n\t";
367295009Sjkim		if ($files =~ /O_FIPSCANISTER/ && !$fipscanisterbuild) {
368295009Sjkim			$ret.= "\$(EX_LIBS) ";
369295009Sjkim			$ret.= "\$(OBJ_D)${o}applink.obj " if $shlib;
370295009Sjkim		}
371194206Ssimon		$ret.="$files $libs\n<<\n";
372194206Ssimon		}
373194206Ssimon	elsif ($standalone == 2)
374194206Ssimon		{
375291719Sjkim		$ret.="\n";
376296279Sjkim		$ret.="\tSET FIPS_LINK=\$(LINK_CMD)\n";
377194206Ssimon		$ret.="\tSET FIPS_CC=\$(CC)\n";
378194206Ssimon		$ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
379194206Ssimon		$ret.="\tSET PREMAIN_DSO_EXE=\n";
380194206Ssimon		$ret.="\tSET FIPS_TARGET=$target\n";
381194206Ssimon		$ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
382194206Ssimon		$ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
383264278Sjkim		$ret.="\t\$(FIPSLINK) \$(LFLAGS) $ff /map $efile$target @<<\n";
384194206Ssimon		$ret.="\t\$(APP_EX_OBJ) $files \$(OBJ_D)${o}fips_premain.obj $libs\n<<\n";
385194206Ssimon		}
386194206Ssimon	else
387194206Ssimon		{
388291719Sjkim		$ret.="\n";
389296279Sjkim		$ret.="\t\$(LINK_CMD) \$(LFLAGS) $efile$target @<<\n";
390194206Ssimon		$ret.="\t\$(APP_EX_OBJ) $files $libs\n<<\n";
391194206Ssimon		}
392194206Ssimon    	$ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;1\n\n";
39355714Skris	return($ret);
39455714Skris	}
39555714Skris
396238405Sjkimsub win32_import_asm
397194206Ssimon	{
398238405Sjkim	my ($mf_var, $asm_name, $oref, $sref) = @_;
399238405Sjkim	my $asm_dir;
400238405Sjkim	if ($asm_name eq "")
401238405Sjkim		{
402238405Sjkim		$asm_dir = "crypto\\";
403238405Sjkim		}
404238405Sjkim	else
405238405Sjkim		{
406238405Sjkim		$asm_dir = "crypto\\$asm_name\\asm\\";
407238405Sjkim		}
408194206Ssimon
409238405Sjkim	$$oref = "";
410238405Sjkim	$mf_var =~ s/\.o$/.obj/g;
411194206Ssimon
412238405Sjkim	foreach (split(/ /, $mf_var))
413238405Sjkim		{
414238405Sjkim		$$oref .= $asm_dir . $_ . " ";
415238405Sjkim		}
416238405Sjkim	$$oref =~ s/ $//;
417238405Sjkim	$$sref = $$oref;
418238405Sjkim	$$sref =~ s/\.obj/.asm/g;
419238405Sjkim
420194206Ssimon	}
421194206Ssimon
422238405Sjkim
42355714Skris1;
424