1# cryptest.nmake - written and placed in public domain by Jeffrey Walton.
2#                  Copyright assigned to the Crypto++ project.
3
4# This makefile is used for testing and building cryptlib.lib and cryptest.exe
5#  under nmake. Open a Visual Studio Developer Prompt and then run
6#  "nmake /f cryptest.nmake". The build procedure will reveal not so readily
7#  apparent problems under Microsoft ARM and Metro UI apps.
8
9# The makefile is not intended for production use, though it may be used as a
10#  starting point. For example, you can add switches like /MT and /MTd for
11#  dynamic runtime linking against the Microsoft C++ Runtime libraries. If you
12#  are building for Windows Phone or Windows Store, then you probably want to
13#  remove /D_MBCS. The resulting cryptlib.lib may be suitable as a starting
14#  point for a DLL project using Crypto++.
15
16# You must also add /DCRYPTOPP_DEBUG or /DDEBUG if you want a debug build with
17#  the library's assert. The library moved from Posix NDEBUG and assert() to
18#  CRYPTOPP_ASSERT at 5.6.5 due to CVE-2016-7420. CRYPTOPP_ASSERT has the
19#  additional benefit of using DebugBreak(), and the program does not crash
20#  while you are debugging it like would happen with Posix assert().
21
22# There is mention of cryptopp.dll, CRYPTOPP_IMPORTS and CRYPTOPP_EXPORTS
23#  below. They are for testing only. Attempting to produce a working DLL on
24#  Windows fails. Too many missing symbols because cryptest.exe exercises
25#  about 80% of the library, but CRYPTOPP_DLL is only used for FIPS algos.
26
27# The list of LIB_SRCS and TEST_SRCS was generated under Linux with
28#  "make sources | fold -w73 -s". The list of LIB_OBJS and TEST_OBJS was
29#  generated with "make sources | fold -w73 -s | sed 's|.cpp|.obj|g'". The
30#  order of the first three object files are significant. See C++ Static
31#  Initialization Order Fisaco on the Crypto++ wiki for details.
32
33# You are free to add and remove files to the list. For example, you can remove
34#  rdrand.asm build it using NASM, and then include the NASM object file
35#  rdrand_x86.obj or rdrand_x64.obj.
36
37###########################################################################################
38
39# To test debug builds, use the following CXXFLAGS:
40#   - /DDEBUG /D_DEBUG /Oi /Oy- /Od
41# To test release builds, use the following CXXFLAGS:
42#   - /DNDEBUG /D_NDEBUG /Oi /Oy /O2
43# To test with static C++ runtime linking, use the following CXXFLAGS (default below):
44#   - /MT (release) or /MTd (debug)
45# To test with dynamic C++ runtime linking, use the following CXXFLAGS:
46#   - /MD (release) or /MDd (debug)
47# To test Desktop app, use the following CXXFLAGS:
48#   - /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
49# To test Windows Store app, use the following CXXFLAGS:
50#   - /DWINAPI_FAMILY=WINAPI_FAMILY_APP
51# To test Windows Phone, use the following CXXFLAGS:
52#   - /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
53# To test Surface RT (ARM tablet), use the following CXXFLAGS:
54#   - /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
55
56###########################################################################################
57
58LIB_SRCS = \
59    cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.cpp \
60    algparam.cpp allocate.cpp arc4.cpp aria.cpp aria_simd.cpp ariatab.cpp asn.cpp \
61    authenc.cpp base32.cpp base64.cpp basecode.cpp bfinit.cpp blake2.cpp \
62    blake2b_simd.cpp blake2s_simd.cpp blowfish.cpp blumshub.cpp camellia.cpp \
63    cast.cpp casts.cpp cbcmac.cpp ccm.cpp chacha.cpp chacha_avx.cpp \
64    chacha_simd.cpp chachapoly.cpp cham.cpp cham_simd.cpp channels.cpp \
65    cmac.cpp crc.cpp crc_simd.cpp darn.cpp default.cpp des.cpp dessp.cpp \
66    dh.cpp dh2.cpp dll.cpp donna_32.cpp donna_64.cpp donna_sse.cpp dsa.cpp \
67    eax.cpp ec2n.cpp eccrypto.cpp ecp.cpp elgamal.cpp emsa2.cpp eprecomp.cpp \
68    esign.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp gcm.cpp \
69    gcm_simd.cpp gf256.cpp gf2_32.cpp gf2n.cpp gf2n_simd.cpp gfpcrypt.cpp \
70    gost.cpp gzip.cpp hc128.cpp hc256.cpp hex.cpp hight.cpp hmac.cpp \
71    hrtimer.cpp ida.cpp idea.cpp iterhash.cpp kalyna.cpp kalynatab.cpp \
72    keccak.cpp keccak_core.cpp keccak_simd.cpp lea.cpp lea_simd.cpp luc.cpp \
73    mars.cpp marss.cpp md2.cpp md4.cpp md5.cpp misc.cpp modes.cpp mqueue.cpp \
74    mqv.cpp nbtheory.cpp neon_simd.cpp oaep.cpp osrng.cpp padlkrng.cpp \
75    panama.cpp pkcspad.cpp poly1305.cpp polynomi.cpp ppc_power7.cpp \
76    ppc_power8.cpp ppc_power9.cpp ppc_simd.cpp pssr.cpp pubkey.cpp queue.cpp \
77    rabbit.cpp rabin.cpp randpool.cpp rc2.cpp rc5.cpp rc6.cpp rdrand.cpp \
78    rdtables.cpp rijndael.cpp rijndael_simd.cpp ripemd.cpp rng.cpp rsa.cpp \
79    rw.cpp safer.cpp salsa.cpp scrypt.cpp seal.cpp seed.cpp serpent.cpp \
80    sha.cpp sha3.cpp sha_simd.cpp shacal2.cpp shacal2_simd.cpp shake.cpp \
81    shark.cpp sharkbox.cpp simeck.cpp simon.cpp \
82    simon128_simd.cpp skipjack.cpp sm3.cpp sm4.cpp \
83    sm4_simd.cpp sosemanuk.cpp speck.cpp speck128_simd.cpp \
84    square.cpp squaretb.cpp sse_simd.cpp strciphr.cpp tea.cpp tftables.cpp \
85    threefish.cpp tiger.cpp tigertab.cpp ttmac.cpp tweetnacl.cpp twofish.cpp \
86    vmac.cpp wake.cpp whrlpool.cpp xed25519.cpp xtr.cpp xtrcrypt.cpp xts.cpp \
87    zdeflate.cpp zinflate.cpp zlib.cpp
88
89LIB_OBJS = \
90    cryptlib.obj cpu.obj integer.obj 3way.obj adler32.obj algebra.obj \
91    algparam.obj allocate.obj arc4.obj aria.obj aria_simd.obj ariatab.obj asn.obj \
92    authenc.obj base32.obj base64.obj basecode.obj bfinit.obj blake2.obj \
93    blake2b_simd.obj blake2s_simd.obj blowfish.obj blumshub.obj camellia.obj \
94    cast.obj casts.obj cbcmac.obj ccm.obj chacha.obj chacha_avx.obj \
95    chacha_simd.obj chachapoly.obj cham.obj cham_simd.obj channels.obj \
96    cmac.obj crc.obj crc_simd.obj darn.obj default.obj des.obj dessp.obj \
97    dh.obj dh2.obj dll.obj donna_32.obj donna_64.obj donna_sse.obj dsa.obj \
98    eax.obj ec2n.obj eccrypto.obj ecp.obj elgamal.obj emsa2.obj eprecomp.obj \
99    esign.obj files.obj filters.obj fips140.obj fipstest.obj gcm.obj \
100    gcm_simd.obj gf256.obj gf2_32.obj gf2n.obj gf2n_simd.obj gfpcrypt.obj \
101    gost.obj gzip.obj hc128.obj hc256.obj hex.obj hight.obj hmac.obj \
102    hrtimer.obj ida.obj idea.obj iterhash.obj kalyna.obj kalynatab.obj \
103    keccak.obj keccak_core.obj keccak_simd.obj lea.obj lea_simd.obj luc.obj \
104    mars.obj marss.obj md2.obj md4.obj md5.obj misc.obj modes.obj mqueue.obj \
105    mqv.obj nbtheory.obj neon_simd.obj oaep.obj osrng.obj padlkrng.obj \
106    panama.obj pkcspad.obj poly1305.obj polynomi.obj ppc_power7.obj \
107    ppc_power8.obj ppc_power9.obj ppc_simd.obj pssr.obj pubkey.obj queue.obj \
108    rabbit.obj rabin.obj randpool.obj rc2.obj rc5.obj rc6.obj rdrand.obj \
109    rdtables.obj rijndael.obj rijndael_simd.obj ripemd.obj rng.obj rsa.obj \
110    rw.obj safer.obj salsa.obj scrypt.obj seal.obj seed.obj serpent.obj \
111    sha.obj sha3.obj sha_simd.obj shacal2.obj shacal2_simd.obj shake.obj \
112    shark.obj sharkbox.obj simeck.obj simon.obj \
113    simon128_simd.obj skipjack.obj sm3.obj sm4.obj \
114    sm4_simd.obj sosemanuk.obj speck.obj speck128_simd.obj \
115    square.obj squaretb.obj sse_simd.obj strciphr.obj tea.obj tftables.obj \
116    threefish.obj tiger.obj tigertab.obj ttmac.obj tweetnacl.obj twofish.obj \
117    vmac.obj wake.obj whrlpool.obj xed25519.obj xtr.obj xtrcrypt.obj xts.obj \
118    zdeflate.obj zinflate.obj zlib.obj
119
120ASM_OBJS = \
121    rdrand-x86.obj rdrand-x64.obj rdseed-x86.obj rdseed-x64.obj x64masm.obj x64dll.obj
122
123TEST_SRCS = \
124    test.cpp bench1.cpp bench2.cpp bench3.cpp datatest.cpp \
125    dlltest.cpp fipsalgt.cpp validat0.cpp validat1.cpp validat2.cpp \
126    validat3.cpp validat4.cpp validat5.cpp validat6.cpp validat7.cpp \
127    validat8.cpp validat9.cpp validat10.cpp regtest1.cpp regtest2.cpp \
128    regtest3.cpp regtest4.cpp
129
130TEST_OBJS = \
131    test.obj bench1.obj bench2.obj bench3.obj datatest.obj \
132    dlltest.obj fipsalgt.obj validat0.obj validat1.obj validat2.obj \
133    validat3.obj validat4.obj validat5.obj validat6.obj validat7.obj \
134    validat8.obj validat9.obj validat10.obj regtest1.obj regtest2.obj \
135    regtest3.obj regtest4.obj
136
137CXX = cl.exe
138LD = link.exe
139AR = lib.exe
140RM = del
141RMDIR = rd
142
143# We may misdetect the environment on VS2005 or so. Uncomment as
144# needed to match the Developer Prompt environment.
145# PLATFORM = x86
146# PLATFORM = x64
147# PLATFORM = arm
148# PLATFORM = arm64
149
150# C4231 is needed for VS2008 and below. Lots of noise...
151CXXFLAGS = /nologo /W4 /wd4231 /wd4511 /wd4156 /D_MBCS /Zi /TP /GR /EHsc
152LDFLAGS = /nologo /SUBSYSTEM:CONSOLE /DEBUG
153ARFLAGS = /nologo
154LDLIBS =
155
156# Compiler debug build.
157# CXXFLAGS = $(CXXFLAGS) /DDEBUG /D_DEBUG /Oi /Oy- /Od /MTd
158# Compiler release build.
159CXXFLAGS = $(CXXFLAGS) /DNDEBUG /D_NDEBUG /Oi /Oy /O2 /MT
160# Linker debug build.
161# LDFLAGS = $(LDFLAGS) /DEBUG
162# Linker release build.
163LDFLAGS = $(LDFLAGS) /DEBUG /OPT:REF
164
165# Attempt to detect when <sdkddkver.h> and <winapifamily.h> are available
166#   http://stackoverflow.com/q/40577415 ?
167!IF "$(WINDOWSSDKDIR)" != "" || "$(WINDOWSSDKLIBVERSION)" != ""
168CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
169!ENDIF
170!IF "$(WINDOWSPHONEKITDIR)" != "" || "$(UNIVERSALCRTSDKDIR)" != "" || "$(UCRTVERSION)" != ""
171CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
172!ELSEIF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
173CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
174!ENDIF
175
176# Check for empty Platform and Processor
177!IF "$(PLATFORM)" == ""
178!IF "$(PROCESSOR_ARCHITECTURE)" == "x86"
179PLATFORM = x86
180!ELSEIF "$(PROCESSOR_ARCHITECTURE)" == "x64" || "$(PROCESSOR_ARCHITECTURE)" == "AMD64"
181PLATFORM = x64
182!ELSE
183!ERROR "Unknown platform"
184!ENDIF
185!ENDIF
186
187!MESSAGE
188!MESSAGE ******************************
189!MESSAGE Platform is $(PLATFORM)
190!MESSAGE ******************************
191!MESSAGE
192
193!IF "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
194# CXXFLAGS = $(CXXFLAGS) /arch:SSE2
195# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
196# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
197AS = ml.exe
198ASFLAGS = /nologo /D_M_X86 /W3 /Cx /Zi /safeseh
199LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm rdseed.asm
200LIB_OBJS = $(LIB_OBJS) rdrand-x86.obj rdseed-x86.obj
201LDFLAGS = $(LDFLAGS) /MACHINE:X86
202LDLIBS = $(LDLIBS) kernel32.lib
203RDRAND_OBJ = rdrand-x86.obj
204RDSEED_OBJ = rdseed-x86.obj
205!ENDIF
206
207# May need $(VCINSTALLDIR)\bin\amd64\ml64.exe
208!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64"
209# CXXFLAGS = $(CXXFLAGS) /arch:AVX2
210# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
211# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
212AS = ml64.exe
213ASFLAGS = /nologo /D_M_X64 /W3 /Cx /Zi
214LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm rdseed.asm
215LIB_OBJS = $(LIB_OBJS) rdrand-x64.obj rdseed-x64.obj x64masm.obj x64dll.obj
216LDFLAGS = $(LDFLAGS) /MACHINE:X64
217LDLIBS = $(LDLIBS) kernel32.lib
218RDRAND_OBJ = rdrand-x64.obj
219RDSEED_OBJ = rdseed-x64.obj
220!ENDIF
221
222!IF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
223# CXXFLAGS = $(CXXFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
224CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
225LIB_SRCS = $(LIB_SRCS) neon_simd.cpp
226LIB_OBJS = $(LIB_OBJS) neon_simd.obj
227# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
228# LDLIBS = $(LDLIBS)
229!ENDIF
230
231all: cryptest.exe
232
233# For testing cryptopp.dll and CRYPTOPP_IMPORTS
234#cryptest.exe: pch.pch cryptopp.lib $(TEST_OBJS)
235#	$(LD) $(LDFLAGS) $(TEST_OBJS) cryptopp.lib $(LDLIBS) /out:$@
236
237cryptest.exe: pch.pch cryptlib.lib $(TEST_OBJS)
238	$(LD) $(LDFLAGS) $(TEST_OBJS) cryptlib.lib $(LDLIBS) /out:$@
239
240cryptlib.lib: $(LIB_OBJS)
241	$(AR) $(ARFLAGS) $(LIB_OBJS) /out:$@
242
243cryptopp.dump: cryptlib.lib
244	dumpbin.exe /LINKERMEMBER cryptlib.lib /OUT:$@
245
246cryptopp.map: $(LIB_OBJS)
247	$(LD) $(LDFLAGS) /DLL /MAP /MAPINFO:EXPORTS $(LIB_OBJS)
248	mv cryptlib.map cryptopp.map
249
250cryptopp.def: cryptopp.dump
251	dump2def.exe cryptopp.dump cryptopp.def
252
253# LD produces 3 output artifacts for cryptopp.dll
254cryptopp.dll cryptopp.lib cryptopp.exp: $(LIB_OBJS) cryptopp.def
255	$(LD) $(LDFLAGS) /DLL /DEF:cryptopp.def /IGNORE:4102 $(LIB_OBJS) $(LDLIBS) /out:cryptopp.dll
256
257clean ::
258	$(RM) /F /Q cryptest.exe cryptest.lib cryptest.exp pch.pch 2>nul
259clean ::
260	$(RM) /F /Q cryptlib.lib cryptlib.exp cryptlib.dll 2>nul
261clean ::
262	$(RM) /F /Q cryptopp.dll cryptopp.lib cryptopp.exp cryptopp.def 2>nul
263clean ::
264	$(RM) /F /Q pch.obj $(LIB_OBJS) $(ASM_OBJS) $(TEST_OBJS) *.pdb 2>nul
265
266distclean :: clean
267!IF EXIST ("$(USERNAME).sdf")
268	attrib -r -a -s -h "$(USERNAME).sdf" 2>nul
269	$(RM) /F /Q "$(USERNAME).sdf" 2>nul
270!ENDIF
271!IF EXIST ("$(USERNAME).suo")
272	attrib -r -a -s -h $(USERNAME).suo" 2>nul
273	$(RM) /F /Q $(USERNAME).suo" 2>nul
274!ENDIF
275!IF EXIST (Win32\)
276	$(RMDIR) Win32\ /q /s 2>nul
277!ENDIF
278!IF EXIST (x64\)
279	$(RMDIR) x64\ /q /s 2>nul
280!ENDIF
281!IF EXIST (ipch\)
282	$(RMDIR) ipch\ /q /s 2>nul
283!ENDIF
284
285# Precompiled header
286pch.pch: pch.h pch.cpp
287	$(CXX) $(CXXFLAGS) /Yc"pch.h" /Fp"pch.pch" /c pch.cpp
288
289# No precompiled headers
290iterhash.obj: iterhash.h iterhash.cpp
291	$(CXX) $(CXXFLAGS) /Y- /c iterhash.cpp
292dll.obj: dll.h dll.cpp
293	$(CXX) $(CXXFLAGS) /Y- /c dll.cpp
294rdrand.obj: rdrand.h rdrand.cpp
295	$(CXX) $(CXXFLAGS) /c rdrand.cpp
296
297# Built for x86/x64
298rdrand-x86.obj: rdrand.asm
299	$(AS) $(ASFLAGS) /Fo rdrand-x86.obj /c rdrand.asm
300rdrand-x64.obj: rdrand.asm
301	$(AS) $(ASFLAGS) /Fo rdrand-x64.obj /c rdrand.asm
302rdseed-x86.obj: rdseed.asm
303	$(AS) $(ASFLAGS) /Fo rdseed-x86.obj /c rdseed.asm
304rdseed-x64.obj: rdseed.asm
305	$(AS) $(ASFLAGS) /Fo rdseed-x64.obj /c rdseed.asm
306x64masm.obj: x64masm.asm
307	$(AS) $(ASFLAGS) /Fo x64masm.obj /c x64masm.asm
308x64dll.obj: x64dll.asm
309	$(AS) $(ASFLAGS) /Fo x64dll.obj /c x64dll.asm
310
311# You may need to delete this on early versions of Visual Studio.
312# Down-level compilers will simply see chacha_avx.cpp as an empty file.
313!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64" || "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
314chacha_avx.obj:
315	$(CXX) $(CXXFLAGS) /arch:AVX /c chacha_avx.cpp
316!endif
317
318# For testing cryptopp.dll and CRYPTOPP_IMPORTS
319#CXXFLAGS_IMPORTS = /wd4275 /wd4251 /DCRYPTOPP_IMPORTS
320#test.obj:
321#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
322#datatest.obj:
323#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
324#fipstest.obj:
325#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
326#bench1.obj:
327#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
328#bench2.obj:
329#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
330#bench3.obj:
331#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
332#regtest1.obj:
333#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
334#regtest2.obj:
335#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
336#regtest3.obj:
337#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
338#regtest4.obj:
339#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
340#validat1.obj:
341#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
342#validat2.obj:
343#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
344#validat3.obj:
345#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
346#validat4.obj:
347#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
348#validat5.obj:
349#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
350#validat6.obj:
351#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
352#validat7.obj:
353#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
354#validat8.obj:
355#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
356#validat9.obj:
357#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
358#validat10.obj:
359#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
360
361# For testing cryptopp.dll and CRYPTOPP_EXPORTS
362#CXXFLAGS_EXPORTS = /wd4275 /wd4251 /DCXXFLAGS_EXPORTS
363#.cpp.obj:
364#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_EXPORTS) /c $<
365
366.cpp.obj:
367	$(CXX) $(CXXFLAGS) /c $<
368
369.asm.obj:
370	$(AS) $(ASFLAGS) /c $<
371