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
30279264Sdelphijmy $ff = "";
31279264Sdelphij
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    $lib_cflag='/Zl' if (!$shlib);	# remove /DEFAULTLIBs from static lib
50194206Ssimon    $opt_cflags=$f.' /Ox';
51194206Ssimon    $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
52160814Ssimon    $lflags="/nologo /subsystem:console /opt:ref";
53238405Sjkim
54238405Sjkim    *::perlasm_compile_target = sub {
55238405Sjkim	my ($target,$source,$bname)=@_;
56238405Sjkim	my $ret;
57238405Sjkim
58238405Sjkim	$bname =~ s/(.*)\.[^\.]$/$1/;
59238405Sjkim	$ret=<<___;
60238405Sjkim\$(TMP_D)$o$bname.asm: $source
61238405Sjkim	set ASM=\$(ASM)
62238405Sjkim	\$(PERL) $source \$\@
63238405Sjkim
64238405Sjkim$target: \$(TMP_D)$o$bname.asm
65238405Sjkim	\$(ASM) $afile\$\@ \$(TMP_D)$o$bname.asm
66238405Sjkim
67238405Sjkim___
68238405Sjkim	}
69160814Ssimon    }
70160814Ssimonelsif ($FLAVOR =~ /CE/)
71160814Ssimon    {
72160814Ssimon    # sanity check
73160814Ssimon    die '%OSVERSION% is not defined'	if (!defined($ENV{'OSVERSION'}));
74160814Ssimon    die '%PLATFORM% is not defined'	if (!defined($ENV{'PLATFORM'}));
75160814Ssimon    die '%TARGETCPU% is not defined'	if (!defined($ENV{'TARGETCPU'}));
76160814Ssimon
77160814Ssimon    #
78160814Ssimon    # Idea behind this is to mimic flags set by eVC++ IDE...
79160814Ssimon    #
80160814Ssimon    $wcevers = $ENV{'OSVERSION'};			# WCENNN
81160814Ssimon    die '%OSVERSION% value is insane'	if ($wcevers !~ /^WCE([1-9])([0-9]{2})$/);
82160814Ssimon    $wcecdefs = "-D_WIN32_WCE=$1$2 -DUNDER_CE=$1$2";	# -D_WIN32_WCE=NNN
83160814Ssimon    $wcelflag = "/subsystem:windowsce,$1.$2";		# ...,N.NN
84160814Ssimon
85160814Ssimon    $wceplatf =  $ENV{'PLATFORM'};
86160814Ssimon    $wceplatf =~ tr/a-z0-9 /A-Z0-9_/d;
87160814Ssimon    $wcecdefs .= " -DWCE_PLATFORM_$wceplatf";
88160814Ssimon
89160814Ssimon    $wcetgt = $ENV{'TARGETCPU'};	# just shorter name...
90160814Ssimon    SWITCH: for($wcetgt) {
91160814Ssimon	/^X86/		&& do {	$wcecdefs.=" -Dx86 -D_X86_ -D_i386_ -Di_386_";
92160814Ssimon				$wcelflag.=" /machine:IX86";	last; };
93160814Ssimon	/^ARMV4[IT]/	&& do { $wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
94160814Ssimon				$wcecdefs.=" -DTHUMB -D_THUMB_" if($wcetgt=~/T$/);
95160814Ssimon				$wcecdefs.=" -QRarch4T -QRinterwork-return";
96160814Ssimon				$wcelflag.=" /machine:THUMB";	last; };
97160814Ssimon	/^ARM/		&& do {	$wcecdefs.=" -DARM -D_ARM_ -D$wcetgt";
98160814Ssimon				$wcelflag.=" /machine:ARM";	last; };
99160814Ssimon	/^MIPSIV/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
100160814Ssimon				$wcecdefs.=" -D_MIPS64 -QMmips4 -QMn32";
101160814Ssimon				$wcelflag.=" /machine:MIPSFPU";	last; };
102160814Ssimon	/^MIPS16/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
103160814Ssimon				$wcecdefs.=" -DMIPSII -QMmips16";
104160814Ssimon				$wcelflag.=" /machine:MIPS16";	last; };
105160814Ssimon	/^MIPSII/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000 -D$wcetgt";
106160814Ssimon				$wcecdefs.=" -QMmips2";
107160814Ssimon				$wcelflag.=" /machine:MIPS";	last; };
108160814Ssimon	/^R4[0-9]{3}/	&& do {	$wcecdefs.=" -DMIPS -D_MIPS_ -DR4000";
109160814Ssimon				$wcelflag.=" /machine:MIPS";	last; };
110160814Ssimon	/^SH[0-9]/	&& do {	$wcecdefs.=" -D$wcetgt -D_$wcetgt_ -DSHx";
111160814Ssimon				$wcecdefs.=" -Qsh4" if ($wcetgt =~ /^SH4/);
112160814Ssimon				$wcelflag.=" /machine:$wcetgt";	last; };
113160814Ssimon	{ $wcecdefs.=" -D$wcetgt -D_$wcetgt_";
114160814Ssimon	  $wcelflag.=" /machine:$wcetgt";			last; };
115160814Ssimon    }
116160814Ssimon
117160814Ssimon    $cc='$(CC)';
118238405Sjkim    $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';
119160814Ssimon    $base_cflags.=" $wcecdefs";
120238405Sjkim    $base_cflags.=' -I$(WCECOMPAT)/include'		if (defined($ENV{'WCECOMPAT'}));
121238405Sjkim    $base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include'	if (defined($ENV{'PORTSDK_LIBPATH'}));
122160814Ssimon    $opt_cflags=' /MC /O1i';	# optimize for space, but with intrinsics...
123246772Sjkim    $dbg_cflags=' /MC /Od -DDEBUG -D_DEBUG';
124160814Ssimon    $lflags="/nologo /opt:ref $wcelflag";
125160814Ssimon    }
126160814Ssimonelse	# Win32
127160814Ssimon    {
128238405Sjkim    $base_cflags= " $mf_cflag";
129194206Ssimon    my $f = $shlib || $fips ?' /MD':' /MT';
130194206Ssimon    $lib_cflag='/Zl' if (!$shlib);	# remove /DEFAULTLIBs from static lib
131279264Sdelphij    $ff = "/fixed";
132194206Ssimon    $opt_cflags=$f.' /Ox /O2 /Ob2';
133194206Ssimon    $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
134160814Ssimon    $lflags="/nologo /subsystem:console /opt:ref";
135160814Ssimon    }
13655714Skris$mlflags='';
13755714Skris
138238405Sjkim$out_def ="out32";	$out_def.="dll"			if ($shlib);
139238405Sjkim			$out_def.='_$(TARGETCPU)'	if ($FLAVOR =~ /CE/);
140238405Sjkim$tmp_def ="tmp32";	$tmp_def.="dll"			if ($shlib);
141238405Sjkim			$tmp_def.='_$(TARGETCPU)'	if ($FLAVOR =~ /CE/);
14255714Skris$inc_def="inc32";
14355714Skris
14455714Skrisif ($debug)
14555714Skris	{
146238405Sjkim	$cflags=$dbg_cflags.$base_cflags;
14755714Skris	}
148160814Ssimonelse
149160814Ssimon	{
150160814Ssimon	$cflags=$opt_cflags.$base_cflags;
151160814Ssimon	}
15255714Skris
153238405Sjkim# generate symbols.pdb unconditionally
154238405Sjkim$app_cflag.=" /Zi /Fd\$(TMP_D)/app";
155238405Sjkim$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib";
156238405Sjkim$lflags.=" /debug";
157238405Sjkim
15855714Skris$obj='.obj';
159238405Sjkim$asm_suffix='.asm';
16055714Skris$ofile="/Fo";
16155714Skris
16255714Skris# EXE linking stuff
16355714Skris$link="link";
164160814Ssimon$rsc="rc";
16555714Skris$efile="/out:";
16655714Skris$exep='.exe';
167160814Ssimonif ($no_sock)		{ $ex_libs=''; }
168160814Ssimonelsif ($FLAVOR =~ /CE/)	{ $ex_libs='winsock.lib'; }
169238405Sjkimelse			{ $ex_libs='ws2_32.lib'; }
17055714Skris
171160814Ssimonif ($FLAVOR =~ /CE/)
172160814Ssimon	{
173238405Sjkim	$ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib'	if (defined($ENV{'WCECOMPAT'}));
174238405Sjkim	$ex_libs.=' $(PORTSDK_LIBPATH)/portlib.lib'	if (defined($ENV{'PORTSDK_LIBPATH'}));
175160814Ssimon	$ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if ($ENV{'TARGETCPU'} eq "X86");
176160814Ssimon	}
177160814Ssimonelse
178160814Ssimon	{
179238405Sjkim	$ex_libs.=' gdi32.lib advapi32.lib crypt32.lib user32.lib';
180238405Sjkim	$ex_libs.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/ and `cl 2>&1` =~ /14\.00\.4[0-9]{4}\./);
181238405Sjkim	# WIN32 UNICODE build gets linked with unicows.lib for
182238405Sjkim	# backward compatibility with Win9x.
183238405Sjkim	$ex_libs="unicows.lib $ex_libs" if ($FLAVOR =~ /WIN32/ and $cflags =~ /\-DUNICODE/);
184160814Ssimon	}
185160814Ssimon
18655714Skris# static library stuff
187194206Ssimon$mklib='lib /nologo';
18855714Skris$ranlib='';
18955714Skris$plib="";
19055714Skris$libp=".lib";
19155714Skris$shlibp=($shlib)?".dll":".lib";
19255714Skris$lfile='/out:';
19355714Skris
19455714Skris$shlib_ex_obj="";
195160814Ssimon$app_ex_obj="setargv.obj" if ($FLAVOR !~ /CE/);
196238405Sjkimif ($FLAVOR =~ /WIN64A/) {
197238405Sjkim	if (`nasm -v 2>NUL` =~ /NASM version ([0-9]+\.[0-9]+)/ && $1 >= 2.0) {
198238405Sjkim		$asm='nasm -f win64 -DNEAR -Ox -g';
199238405Sjkim		$afile='-o ';
200238405Sjkim	} else {
201238405Sjkim		$asm='ml64 /c /Cp /Cx /Zi';
202238405Sjkim		$afile='/Fo';
203238405Sjkim	}
204238405Sjkim} elsif ($FLAVOR =~ /WIN64I/) {
205238405Sjkim	$asm='ias -d debug';
206238405Sjkim	$afile="-o ";
207238405Sjkim} elsif ($nasm) {
208194206Ssimon	my $ver=`nasm -v 2>NUL`;
209194206Ssimon	my $vew=`nasmw -v 2>NUL`;
210194206Ssimon	# pick newest version
211238405Sjkim	$asm=($ver ge $vew?"nasm":"nasmw")." -f win32";
212238405Sjkim	$asmtype="win32n";
21355714Skris	$afile='-o ';
21455714Skris} else {
215238405Sjkim	$asm='ml /nologo /Cp /coff /c /Cx /Zi';
21655714Skris	$afile='/Fo';
217238405Sjkim	$asmtype="win32";
21855714Skris}
21955714Skris
22055714Skris$bn_asm_obj='';
22155714Skris$bn_asm_src='';
22255714Skris$des_enc_obj='';
22355714Skris$des_enc_src='';
22455714Skris$bf_enc_obj='';
22555714Skris$bf_enc_src='';
22655714Skris
227160814Ssimonif (!$no_asm)
22855714Skris	{
229238405Sjkim	win32_import_asm($mf_bn_asm, "bn", \$bn_asm_obj, \$bn_asm_src);
230238405Sjkim	win32_import_asm($mf_aes_asm, "aes", \$aes_asm_obj, \$aes_asm_src);
231238405Sjkim	win32_import_asm($mf_des_asm, "des", \$des_enc_obj, \$des_enc_src);
232238405Sjkim	win32_import_asm($mf_bf_asm, "bf", \$bf_enc_obj, \$bf_enc_src);
233238405Sjkim	win32_import_asm($mf_cast_asm, "cast", \$cast_enc_obj, \$cast_enc_src);
234238405Sjkim	win32_import_asm($mf_rc4_asm, "rc4", \$rc4_enc_obj, \$rc4_enc_src);
235238405Sjkim	win32_import_asm($mf_rc5_asm, "rc5", \$rc5_enc_obj, \$rc5_enc_src);
236238405Sjkim	win32_import_asm($mf_md5_asm, "md5", \$md5_asm_obj, \$md5_asm_src);
237238405Sjkim	win32_import_asm($mf_sha_asm, "sha", \$sha1_asm_obj, \$sha1_asm_src);
238238405Sjkim	win32_import_asm($mf_rmd_asm, "ripemd", \$rmd160_asm_obj, \$rmd160_asm_src);
239238405Sjkim	win32_import_asm($mf_wp_asm, "whrlpool", \$whirlpool_asm_obj, \$whirlpool_asm_src);
240238405Sjkim	win32_import_asm($mf_cpuid_asm, "", \$cpuid_asm_obj, \$cpuid_asm_src);
241238405Sjkim	$perl_asm = 1;
24255714Skris	}
24355714Skris
244160814Ssimonif ($shlib && $FLAVOR !~ /CE/)
24555714Skris	{
24655714Skris	$mlflags.=" $lflags /dll";
247238405Sjkim	$lib_cflag.=" -D_WINDLL";
248160814Ssimon	#
249160814Ssimon	# Engage Applink...
250160814Ssimon	#
251160814Ssimon	$app_ex_obj.=" \$(OBJ_D)\\applink.obj /implib:\$(TMP_D)\\junk.lib";
252160814Ssimon	$cflags.=" -DOPENSSL_USE_APPLINK -I.";
253160814Ssimon	# I'm open for better suggestions than overriding $banner...
254160814Ssimon	$banner=<<'___';
255160814Ssimon	@echo Building OpenSSL
256160814Ssimon
257160814Ssimon$(OBJ_D)\applink.obj:	ms\applink.c
258160814Ssimon	$(CC) /Fo$(OBJ_D)\applink.obj $(APP_CFLAGS) -c ms\applink.c
259160814Ssimon$(OBJ_D)\uplink.obj:	ms\uplink.c ms\applink.c
260160814Ssimon	$(CC) /Fo$(OBJ_D)\uplink.obj $(SHLIB_CFLAGS) -c ms\uplink.c
261160814Ssimon$(INCO_D)\applink.c:	ms\applink.c
262160814Ssimon	$(CP) ms\applink.c $(INCO_D)\applink.c
263160814Ssimon
264160814SsimonEXHEADER= $(EXHEADER) $(INCO_D)\applink.c
265160814Ssimon
266160814SsimonLIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj
267238405SjkimCRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ)
268160814Ssimon___
269160814Ssimon	$banner.=<<'___' if ($FLAVOR =~ /WIN64/);
270160814SsimonCRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ)
271160814Ssimon___
27255714Skris	}
273160814Ssimonelsif ($shlib && $FLAVOR =~ /CE/)
274160814Ssimon	{
275160814Ssimon	$mlflags.=" $lflags /dll";
276238405Sjkim	$lflags.=' /entry:mainCRTstartup' if(defined($ENV{'PORTSDK_LIBPATH'}));
277238405Sjkim	$lib_cflag.=" -D_WINDLL -D_DLL";
278160814Ssimon	}
27955714Skris
28055714Skrissub do_lib_rule
28155714Skris	{
282194206Ssimon	my($objs,$target,$name,$shlib,$ign,$base_addr) = @_;
283160814Ssimon	local($ret);
28455714Skris
28555714Skris	$taget =~ s/\//$o/g if $o ne '/';
286194206Ssimon	my $base_arg;
287194206Ssimon	if ($base_addr ne "")
288160814Ssimon		{
289194206Ssimon		$base_arg= " /base:$base_addr";
290194206Ssimon		}
291194206Ssimon	else
292194206Ssimon		{
293194206Ssimon		$base_arg = "";
294194206Ssimon		}
295238405Sjkim	if ($name ne "")
296194206Ssimon		{
297160814Ssimon		$name =~ tr/a-z/A-Z/;
298160814Ssimon		$name = "/def:ms/${name}.def";
299160814Ssimon		}
30055714Skris
30155714Skris#	$target="\$(LIB_D)$o$target";
302194206Ssimon#	$ret.="$target: $objs\n";
30355714Skris	if (!$shlib)
30455714Skris		{
30555714Skris#		$ret.="\t\$(RM) \$(O_$Name)\n";
306194206Ssimon		$ret.="$target: $objs\n";
307238405Sjkim		$ret.="\t\$(MKLIB) $lfile$target @<<\n  $objs\n<<\n";
30855714Skris		}
30955714Skris	else
31055714Skris		{
311238405Sjkim		local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)';
312160814Ssimon		$ex.=" $zlib_lib" if $zlib_opt == 1 && $target =~ /O_CRYPTO/;
313194206Ssimon
314238405Sjkim 		if ($fips && $target =~ /O_CRYPTO/)
315194206Ssimon			{
316194206Ssimon			$ret.="$target: $objs \$(PREMAIN_DSO_EXE)";
317194206Ssimon			$ret.="\n\tSET FIPS_LINK=\$(LINK)\n";
318194206Ssimon			$ret.="\tSET FIPS_CC=\$(CC)\n";
319194206Ssimon			$ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
320194206Ssimon			$ret.="\tSET PREMAIN_DSO_EXE=\$(PREMAIN_DSO_EXE)\n";
321194206Ssimon			$ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
322194206Ssimon			$ret.="\tSET FIPS_TARGET=$target\n";
323194206Ssimon			$ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
324279264Sdelphij			$ret.="\t\$(FIPSLINK) \$(MLFLAGS) $ff /map $base_arg $efile$target ";
325238405Sjkim			$ret.="$name @<<\n  \$(SHLIB_EX_OBJ) $objs \$(EX_LIBS) ";
326194206Ssimon			$ret.="\$(OBJ_D)${o}fips_premain.obj $ex\n<<\n";
327194206Ssimon			}
328194206Ssimon		else
329194206Ssimon			{
330194206Ssimon			$ret.="$target: $objs";
331238405Sjkim			$ret.="\n\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex \$(EX_LIBS)\n<<\n";
332194206Ssimon			}
333238405Sjkim		$ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;2\n\n";
33455714Skris		}
33555714Skris	$ret.="\n";
33655714Skris	return($ret);
33755714Skris	}
33855714Skris
33955714Skrissub do_link_rule
34055714Skris	{
341194206Ssimon	my($target,$files,$dep_libs,$libs,$standalone)=@_;
34255714Skris	local($ret,$_);
34355714Skris	$file =~ s/\//$o/g if $o ne '/';
34455714Skris	$n=&bname($targer);
34555714Skris	$ret.="$target: $files $dep_libs\n";
346194206Ssimon	if ($standalone == 1)
347194206Ssimon		{
348194206Ssimon		$ret.="  \$(LINK) \$(LFLAGS) $efile$target @<<\n\t";
349194206Ssimon		$ret.= "\$(EX_LIBS) " if ($files =~ /O_FIPSCANISTER/ && !$fipscanisterbuild);
350194206Ssimon		$ret.="$files $libs\n<<\n";
351194206Ssimon		}
352194206Ssimon	elsif ($standalone == 2)
353194206Ssimon		{
354194206Ssimon		$ret.="\tSET FIPS_LINK=\$(LINK)\n";
355194206Ssimon		$ret.="\tSET FIPS_CC=\$(CC)\n";
356194206Ssimon		$ret.="\tSET FIPS_CC_ARGS=/Fo\$(OBJ_D)${o}fips_premain.obj \$(SHLIB_CFLAGS) -c\n";
357194206Ssimon		$ret.="\tSET PREMAIN_DSO_EXE=\n";
358194206Ssimon		$ret.="\tSET FIPS_TARGET=$target\n";
359194206Ssimon		$ret.="\tSET FIPS_SHA1_EXE=\$(FIPS_SHA1_EXE)\n";
360194206Ssimon		$ret.="\tSET FIPSLIB_D=\$(FIPSLIB_D)\n";
361279264Sdelphij		$ret.="\t\$(FIPSLINK) \$(LFLAGS) $ff /map $efile$target @<<\n";
362194206Ssimon		$ret.="\t\$(APP_EX_OBJ) $files \$(OBJ_D)${o}fips_premain.obj $libs\n<<\n";
363194206Ssimon		}
364194206Ssimon	else
365194206Ssimon		{
366194206Ssimon		$ret.="\t\$(LINK) \$(LFLAGS) $efile$target @<<\n";
367194206Ssimon		$ret.="\t\$(APP_EX_OBJ) $files $libs\n<<\n";
368194206Ssimon		}
369194206Ssimon    	$ret.="\tIF EXIST \$@.manifest mt -nologo -manifest \$@.manifest -outputresource:\$@;1\n\n";
37055714Skris	return($ret);
37155714Skris	}
37255714Skris
373238405Sjkimsub win32_import_asm
374194206Ssimon	{
375238405Sjkim	my ($mf_var, $asm_name, $oref, $sref) = @_;
376238405Sjkim	my $asm_dir;
377238405Sjkim	if ($asm_name eq "")
378238405Sjkim		{
379238405Sjkim		$asm_dir = "crypto\\";
380238405Sjkim		}
381238405Sjkim	else
382238405Sjkim		{
383238405Sjkim		$asm_dir = "crypto\\$asm_name\\asm\\";
384238405Sjkim		}
385194206Ssimon
386238405Sjkim	$$oref = "";
387238405Sjkim	$mf_var =~ s/\.o$/.obj/g;
388194206Ssimon
389238405Sjkim	foreach (split(/ /, $mf_var))
390238405Sjkim		{
391238405Sjkim		$$oref .= $asm_dir . $_ . " ";
392238405Sjkim		}
393238405Sjkim	$$oref =~ s/ $//;
394238405Sjkim	$$sref = $$oref;
395238405Sjkim	$$sref =~ s/\.obj/.asm/g;
396238405Sjkim
397194206Ssimon	}
398194206Ssimon
399238405Sjkim
40055714Skris1;
401