summaryrefslogtreecommitdiff
path: root/cryptest.nmake
blob: 1919122e38e2e4f3e31384971738828485d732f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
# cryptest.nmake - written and placed in public domain by Jeffrey Walton.
#                  Copyright assigned to the Crypto++ project.

# This makefile is used for testing and building cryptlib.lib and cryptest.exe
#  under nmake. Open a Visual Studio Developer Prompt and then run
#  "nmake /f cryptest.nmake". The build procedure will reveal not so readily
#  apparent problems under Microsoft ARM and Metro UI apps.

# The makefile is not intended for production use, though it may be used as a
#  starting point. For example, you can add switches like /MT and /MTd for
#  dynamic runtime linking against the Microsoft C++ Runtime libraries. If you
#  are building for Windows Phone or Windows Store, then you probably want to
#  remove /D_MBCS. The resulting cryptlib.lib may be suitable as a starting
#  point for a DLL project using Crypto++.

# You must also add /DCRYPTOPP_DEBUG or /DDEBUG if you want a debug build with
#  the library's assert. The library moved from Posix NDEBUG and assert() to
#  CRYPTOPP_ASSERT at 5.6.5 due to CVE-2016-7420. CRYPTOPP_ASSERT has the
#  additional benefit of using DebugBreak(), and the program does not crash
#  while you are debugging it like would happen with Posix assert().

# There is mention of cryptopp.dll, CRYPTOPP_IMPORTS and CRYPTOPP_EXPORTS
#  below. They are for testing only. Attempting to produce a working DLL on
#  Windows fails. Too many missing symbols because cryptest.exe exercises
#  about 80% of the library, but CRYPTOPP_DLL is only used for FIPS algos.

# The list of LIB_SRCS and TEST_SRCS was generated under Linux with
#  "make sources | fold -w73 -s". The list of LIB_OBJS and TEST_OBJS was
#  generated with "make sources | fold -w73 -s | sed 's|.cpp|.obj|g'". The
#  order of the first three object files are significant. See C++ Static
#  Initialization Order Fisaco on the Crypto++ wiki for details.

# You are free to add and remove files to the list. For example, you can remove
#  rdrand.asm build it using NASM, and then include the NASM object file
#  rdrand_x86.obj or rdrand_x64.obj.

###########################################################################################

# To test debug builds, use the following CXXFLAGS:
#   - /DDEBUG /D_DEBUG /Oi /Oy- /Od
# To test release builds, use the following CXXFLAGS:
#   - /DNDEBUG /D_NDEBUG /Oi /Oy /O2
# To test with static C++ runtime linking, use the following CXXFLAGS (default below):
#   - /MT (release) or /MTd (debug)
# To test with dynamic C++ runtime linking, use the following CXXFLAGS:
#   - /MD (release) or /MDd (debug)
# To test Desktop app, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# To test Windows Store app, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_APP
# To test Windows Phone, use the following CXXFLAGS:
#   - /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
# To test Surface RT (ARM tablet), use the following CXXFLAGS:
#   - /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP

###########################################################################################

LIB_SRCS = \
    cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.cpp \
    algparam.cpp arc4.cpp aria.cpp aria_simd.cpp ariatab.cpp asn.cpp \
    authenc.cpp base32.cpp base64.cpp basecode.cpp bfinit.cpp blake2.cpp \
    blake2b_simd.cpp blake2s_simd.cpp blowfish.cpp blumshub.cpp camellia.cpp \
    cast.cpp casts.cpp cbcmac.cpp ccm.cpp chacha.cpp chacha_avx.cpp \
    chacha_simd.cpp chachapoly.cpp cham.cpp cham_simd.cpp channels.cpp \
    cmac.cpp crc.cpp crc_simd.cpp darn.cpp default.cpp des.cpp dessp.cpp \
    dh.cpp dh2.cpp dll.cpp donna_32.cpp donna_64.cpp donna_sse.cpp dsa.cpp \
    eax.cpp ec2n.cpp eccrypto.cpp ecp.cpp elgamal.cpp emsa2.cpp eprecomp.cpp \
    esign.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp gcm.cpp \
    gcm_simd.cpp gf256.cpp gf2_32.cpp gf2n.cpp gf2n_simd.cpp gfpcrypt.cpp \
    gost.cpp gzip.cpp hc128.cpp hc256.cpp hex.cpp hight.cpp hmac.cpp \
    hrtimer.cpp ida.cpp idea.cpp iterhash.cpp kalyna.cpp kalynatab.cpp \
    keccak.cpp keccak_core.cpp keccak_simd.cpp lea.cpp lea_simd.cpp luc.cpp \
    mars.cpp marss.cpp md2.cpp md4.cpp md5.cpp misc.cpp modes.cpp mqueue.cpp \
    mqv.cpp nbtheory.cpp neon_simd.cpp oaep.cpp osrng.cpp padlkrng.cpp \
    panama.cpp pkcspad.cpp poly1305.cpp polynomi.cpp ppc_power7.cpp \
    ppc_power8.cpp ppc_power9.cpp ppc_simd.cpp pssr.cpp pubkey.cpp queue.cpp \
    rabbit.cpp rabin.cpp randpool.cpp rc2.cpp rc5.cpp rc6.cpp rdrand.cpp \
    rdtables.cpp rijndael.cpp rijndael_simd.cpp ripemd.cpp rng.cpp rsa.cpp \
    rw.cpp safer.cpp salsa.cpp scrypt.cpp seal.cpp seed.cpp serpent.cpp \
    sha.cpp sha3.cpp sha_simd.cpp shacal2.cpp shacal2_simd.cpp shake.cpp \
    shark.cpp sharkbox.cpp simeck.cpp simeck_simd.cpp simon.cpp \
    simon128_simd.cpp simon64_simd.cpp skipjack.cpp sm3.cpp sm4.cpp \
    sm4_simd.cpp sosemanuk.cpp speck.cpp speck128_simd.cpp speck64_simd.cpp \
    square.cpp squaretb.cpp sse_simd.cpp strciphr.cpp tea.cpp tftables.cpp \
    threefish.cpp tiger.cpp tigertab.cpp ttmac.cpp tweetnacl.cpp twofish.cpp \
    vmac.cpp wake.cpp whrlpool.cpp xed25519.cpp xtr.cpp xtrcrypt.cpp \
    zdeflate.cpp zinflate.cpp zlib.cpp

LIB_OBJS = \
    cryptlib.obj cpu.obj integer.obj 3way.obj adler32.obj algebra.obj \
    algparam.obj arc4.obj aria.obj aria_simd.obj ariatab.obj asn.obj \
    authenc.obj base32.obj base64.obj basecode.obj bfinit.obj blake2.obj \
    blake2b_simd.obj blake2s_simd.obj blowfish.obj blumshub.obj camellia.obj \
    cast.obj casts.obj cbcmac.obj ccm.obj chacha.obj chacha_avx.obj \
    chacha_simd.obj chachapoly.obj cham.obj cham_simd.obj channels.obj \
    cmac.obj crc.obj crc_simd.obj darn.obj default.obj des.obj dessp.obj \
    dh.obj dh2.obj dll.obj donna_32.obj donna_64.obj donna_sse.obj dsa.obj \
    eax.obj ec2n.obj eccrypto.obj ecp.obj elgamal.obj emsa2.obj eprecomp.obj \
    esign.obj files.obj filters.obj fips140.obj fipstest.obj gcm.obj \
    gcm_simd.obj gf256.obj gf2_32.obj gf2n.obj gf2n_simd.obj gfpcrypt.obj \
    gost.obj gzip.obj hc128.obj hc256.obj hex.obj hight.obj hmac.obj \
    hrtimer.obj ida.obj idea.obj iterhash.obj kalyna.obj kalynatab.obj \
    keccak.obj keccak_core.obj keccak_simd.obj lea.obj lea_simd.obj luc.obj \
    mars.obj marss.obj md2.obj md4.obj md5.obj misc.obj modes.obj mqueue.obj \
    mqv.obj nbtheory.obj neon_simd.obj oaep.obj osrng.obj padlkrng.obj \
    panama.obj pkcspad.obj poly1305.obj polynomi.obj ppc_power7.obj \
    ppc_power8.obj ppc_power9.obj ppc_simd.obj pssr.obj pubkey.obj queue.obj \
    rabbit.obj rabin.obj randpool.obj rc2.obj rc5.obj rc6.obj rdrand.obj \
    rdtables.obj rijndael.obj rijndael_simd.obj ripemd.obj rng.obj rsa.obj \
    rw.obj safer.obj salsa.obj scrypt.obj seal.obj seed.obj serpent.obj \
    sha.obj sha3.obj sha_simd.obj shacal2.obj shacal2_simd.obj shake.obj \
    shark.obj sharkbox.obj simeck.obj simeck_simd.obj simon.obj \
    simon128_simd.obj simon64_simd.obj skipjack.obj sm3.obj sm4.obj \
    sm4_simd.obj sosemanuk.obj speck.obj speck128_simd.obj speck64_simd.obj \
    square.obj squaretb.obj sse_simd.obj strciphr.obj tea.obj tftables.obj \
    threefish.obj tiger.obj tigertab.obj ttmac.obj tweetnacl.obj twofish.obj \
    vmac.obj wake.obj whrlpool.obj xed25519.obj xtr.obj xtrcrypt.obj \
    zdeflate.obj zinflate.obj zlib.obj

ASM_OBJS = \
    rdrand-x86.obj rdrand-x64.obj x64masm.obj x64dll.obj

TEST_SRCS = \
    test.cpp bench1.cpp bench2.cpp bench3.cpp datatest.cpp \
    dlltest.cpp fipsalgt.cpp validat0.cpp validat1.cpp validat2.cpp \
    validat3.cpp validat4.cpp validat5.cpp validat6.cpp validat7.cpp \
    validat8.cpp validat9.cpp validat10.cpp regtest1.cpp regtest2.cpp \
    regtest3.cpp regtest4.cpp

TEST_OBJS = \
    test.obj bench1.obj bench2.obj bench3.obj datatest.obj \
    dlltest.obj fipsalgt.obj validat0.obj validat1.obj validat2.obj \
    validat3.obj validat4.obj validat5.obj validat6.obj validat7.obj \
    validat8.obj validat9.obj validat10.obj regtest1.obj regtest2.obj \
    regtest3.obj regtest4.obj

CXX = cl.exe
LD = link.exe
AR = lib.exe
RM = del
RMDIR = rd

# We may misdetect the environment on VS2005 or so. Uncomment as
# needed to match the Developer Prompt environment.
# PLATFORM = x86
# PLATFORM = x64
# PLATFORM = arm
# PLATFORM = arm64

# C4231 is needed for VS2008 and below. Lots of noise...
CXXFLAGS = /nologo /W4 /wd4231 /wd4511 /wd4156 /D_MBCS /Zi /TP /GR /EHsc
LDFLAGS = /nologo /SUBSYSTEM:CONSOLE /DEBUG
ARFLAGS = /nologo
LDLIBS =

# Debug build.
# CXXFLAGS = $(CXXFLAGS) /DDEBUG /D_DEBUG /Oi /Oy- /Od /MTd
# Release build. Add /OPT:REF to linker
CXXFLAGS = $(CXXFLAGS) /DNDEBUG /D_NDEBUG /Oi /Oy /O2 /MT
# Linker flags.
LDFLAGS = $(LDFLAGS) /OPT:REF

# Attempt to detect when <sdkddkver.h> and <winapifamily.h> are available
#   http://stackoverflow.com/q/40577415 ?
!IF "$(WINDOWSSDKDIR)" != "" || "$(WINDOWSSDKLIBVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF
!IF "$(WINDOWSPHONEKITDIR)" != "" || "$(UNIVERSALCRTSDKDIR)" != "" || "$(UCRTVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
!ELSEIF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
!ENDIF

# Check for empty Platform and Processor
!IF "$(PLATFORM)" == ""
!IF "$(PROCESSOR_ARCHITECTURE)" == "x86"
PLATFORM = x86
!ELSEIF "$(PROCESSOR_ARCHITECTURE)" == "x64" || "$(PROCESSOR_ARCHITECTURE)" == "AMD64"
PLATFORM = x64
!ELSE
!ERROR "Unknown platform"
!ENDIF
!ENDIF

!MESSAGE
!MESSAGE ******************************
!MESSAGE Platform is $(PLATFORM)
!MESSAGE ******************************
!MESSAGE

!IF "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
# CXXFLAGS = $(CXXFLAGS) /arch:SSE2
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
AS = ml.exe
ASFLAGS = /nologo /D_M_X86 /W3 /Cx /Zi /safeseh
LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x86.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X86
LDLIBS = $(LDLIBS) kernel32.lib
!ENDIF

# May need $(VCINSTALLDIR)\bin\amd64\ml64.exe
!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64"
# CXXFLAGS = $(CXXFLAGS) /arch:AVX2
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
AS = ml64.exe
ASFLAGS = /nologo /D_M_X64 /W3 /Cx /Zi
LIB_SRCS = $(LIB_SRCS) rdrand.cpp rdrand.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x64.obj x64masm.obj x64dll.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X64
LDLIBS = $(LDLIBS) kernel32.lib
!ENDIF

!IF "$(PLATFORM)" == "ARM" || "$(PLATFORM)" == "arm" || "$(PLATFORM)" == "ARM64" || "$(PLATFORM)" == "arm64"
# CXXFLAGS = $(CXXFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP
LIB_SRCS = $(LIB_SRCS) neon_simd.cpp
LIB_OBJS = $(LIB_OBJS) neon_simd.obj
# CXXFLAGS = $(CXXFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_APP
# LDLIBS = $(LDLIBS)
!ENDIF

all: cryptest.exe

# For testing cryptopp.dll and CRYPTOPP_IMPORTS
#cryptest.exe: pch.pch cryptopp.lib $(TEST_OBJS)
#	$(LD) $(LDFLAGS) $(TEST_OBJS) cryptopp.lib $(LDLIBS) /out:$@

cryptest.exe: pch.pch cryptlib.lib $(TEST_OBJS)
	$(LD) $(LDFLAGS) $(TEST_OBJS) cryptlib.lib $(LDLIBS) /out:$@

cryptlib.lib: $(LIB_OBJS)
	$(AR) $(ARFLAGS) $(LIB_OBJS) /out:$@

cryptopp.dump: cryptlib.lib
	dumpbin.exe /LINKERMEMBER cryptlib.lib /OUT:$@

cryptopp.map: $(LIB_OBJS)
	$(LD) $(LDFLAGS) /DLL /MAP /MAPINFO:EXPORTS $(LIB_OBJS)
	mv cryptlib.map cryptopp.map

cryptopp.def: cryptopp.dump
	dump2def.exe cryptopp.dump cryptopp.def

# LD produces 3 output artifacts for cryptopp.dll
cryptopp.dll cryptopp.lib cryptopp.exp: $(LIB_OBJS) cryptopp.def
	$(LD) $(LDFLAGS) /DLL /DEF:cryptopp.def /IGNORE:4102 $(LIB_OBJS) $(LDLIBS) /out:cryptopp.dll

clean ::
	$(RM) /F /Q cryptest.exe cryptest.lib cryptest.exp pch.pch 2>nul
clean ::
	$(RM) /F /Q cryptlib.lib cryptlib.exp cryptlib.dll 2>nul
clean ::
	$(RM) /F /Q cryptopp.dll cryptopp.lib cryptopp.exp cryptopp.def 2>nul
clean ::
	$(RM) /F /Q pch.obj $(LIB_OBJS) $(ASM_OBJS) $(TEST_OBJS) *.pdb 2>nul

distclean :: clean
!IF EXIST ($(USERNAME).sdf)
	attrib -r -a -s -h $(USERNAME).sdf 2>nul
	$(RM) /F /Q $(USERNAME).sdf 2>nul
!ENDIF
!IF EXIST ($(USERNAME).suo)
	attrib -r -a -s -h $(USERNAME).suo 2>nul
	$(RM) /F /Q $(USERNAME).suo 2>nul
!ENDIF
!IF EXIST (Win32\)
	$(RMDIR) Win32\ /q /s 2>nul
!ENDIF
!IF EXIST (x64\)
	$(RMDIR) x64\ /q /s 2>nul
!ENDIF
!IF EXIST (ipch\)
	$(RMDIR) ipch\ /q /s 2>nul
!ENDIF

# Precompiled header
pch.pch: pch.h pch.cpp
	$(CXX) $(CXXFLAGS) /Yc"pch.h" /Fp"pch.pch" /c pch.cpp

# No precompiled headers
iterhash.obj:
	$(CXX) $(CXXFLAGS) /Y- /c iterhash.cpp
dll.obj:
	$(CXX) $(CXXFLAGS) /Y- /c dll.cpp
rdrand.obj:
	$(CXX) $(CXXFLAGS) /c rdrand.cpp

# Built for x86/x64
rdrand-x86.obj:
	$(AS) $(ASFLAGS) /Fo rdrand-x86.obj /c rdrand.asm
rdrand-x64.obj:
	$(AS) $(ASFLAGS) /Fo rdrand-x64.obj /c rdrand.asm
x64masm.obj:
	$(AS) $(ASFLAGS) /Fo x64masm.obj /c x64masm.asm
x64dll.obj:
	$(AS) $(ASFLAGS) /Fo x64dll.obj /c x64dll.asm

# You may need to delete this on early versions of Visual Studio.
# Down-level compilers will simply see chacha_avx.cpp as an empty file.
!IF "$(PLATFORM)" == "x64" || "$(PLATFORM)" == "X64" || "$(PLATFORM)" == "amd64" || "$(PLATFORM)" == "x86" || "$(PLATFORM)" == "X86"
chacha_avx.obj:
	$(CXX) $(CXXFLAGS) /arch:AVX /c chacha_avx.cpp
!endif

# For testing cryptopp.dll and CRYPTOPP_IMPORTS
#CXXFLAGS_IMPORTS = /wd4275 /wd4251 /DCRYPTOPP_IMPORTS
#test.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#datatest.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#fipstest.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#bench1.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#bench2.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#bench3.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#regtest1.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#regtest2.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#regtest3.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#regtest4.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat1.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat2.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat3.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat4.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat5.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat6.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat7.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat8.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat9.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?
#validat10.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_IMPORTS) /c $?

# For testing cryptopp.dll and CRYPTOPP_EXPORTS
#CXXFLAGS_EXPORTS = /wd4275 /wd4251 /DCXXFLAGS_EXPORTS
#.cpp.obj:
#	$(CXX) $(CXXFLAGS) $(CXXFLAGS_EXPORTS) /c $<

.cpp.obj:
	$(CXX) $(CXXFLAGS) /c $<

.asm.obj:
	$(AS) $(ASFLAGS) /c $<