summaryrefslogtreecommitdiff
path: root/cryptest.nmake
blob: b321bf768c450017f5cf5fcb7e6295ac6d1a21e9 (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
361
362
363
# 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 /MD and /MDd 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 Fiasco 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:
#   - /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 allocate.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 lsh256.cpp lsh256_avx.cpp lsh256_sse.cpp lsh512.cpp \
    lsh512_avx.cpp lsh512_sse.cpp luc.cpp mars.cpp marss.cpp md2.cpp md4.cpp \
    md5.cpp misc.cpp modes.cpp mqueue.cpp mqv.cpp nbtheory.cpp oaep.cpp \
    osrng.cpp padlkrng.cpp panama.cpp pkcspad.cpp poly1305.cpp polynomi.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 simon.cpp \
    simon128_simd.cpp skipjack.cpp sm3.cpp sm4.cpp sm4_simd.cpp \
    sosemanuk.cpp speck.cpp speck128_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 xts.cpp zdeflate.cpp \
    zinflate.cpp zlib.cpp

LIB_OBJS = \
    cryptlib.obj cpu.obj integer.obj 3way.obj adler32.obj algebra.obj \
    algparam.obj allocate.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 lsh256.obj lsh256_avx.obj lsh256_sse.obj lsh512.obj \
    lsh512_avx.obj lsh512_sse.obj luc.obj mars.obj marss.obj md2.obj md4.obj \
    md5.obj misc.obj modes.obj mqueue.obj mqv.obj nbtheory.obj oaep.obj \
    osrng.obj padlkrng.obj panama.obj pkcspad.obj poly1305.obj polynomi.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 simon.obj \
    simon128_simd.obj skipjack.obj sm3.obj sm4.obj sm4_simd.obj \
    sosemanuk.obj speck.obj speck128_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 xts.obj zdeflate.obj \
    zinflate.obj zlib.obj

ASM_OBJS = \
    rdrand-x86.obj rdrand-x64.obj rdseed-x86.obj rdseed-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 =

# Compiler debug build.
# CXXFLAGS = $(CXXFLAGS) /DDEBUG /D_DEBUG /Oi /Oy- /Od /MTd
# Compiler release build.
CXXFLAGS = $(CXXFLAGS) /DNDEBUG /D_NDEBUG /Oi /Oy /O2 /MT
# Linker debug build.
# LDFLAGS = $(LDFLAGS) /DEBUG
# Linker release build.
LDFLAGS = $(LDFLAGS) /DEBUG /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 rdseed.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x86.obj rdseed-x86.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X86
LDLIBS = $(LDLIBS) kernel32.lib
RDRAND_OBJ = rdrand-x86.obj
RDSEED_OBJ = rdseed-x86.obj
!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 rdseed.asm
LIB_OBJS = $(LIB_OBJS) rdrand-x64.obj rdseed-x64.obj x64masm.obj x64dll.obj
LDFLAGS = $(LDFLAGS) /MACHINE:X64
LDLIBS = $(LDLIBS) kernel32.lib
RDRAND_OBJ = rdrand-x64.obj
RDSEED_OBJ = rdseed-x64.obj
!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) $(CPPFLAGS) $(CXXFLAGS) /Yc"pch.h" /Fp"pch.pch" /c pch.cpp

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

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

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

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

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

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