Crypto++  8.7
Free C++ class library of cryptographic schemes
GNUmakefile-cross
1 # https://www.gnu.org/software/make/manual/make.html#Makefile-Conventions
2 # and https://www.gnu.org/prep/standards/standards.html
3 
4 SHELL = /bin/sh
5 
6 # If needed
7 TMPDIR ?= /tmp
8 # Used for feature tests
9 TOUT ?= a.out
10 TOUT := $(strip $(TOUT))
11 
12 # Allow override for the cryptest.exe recipe. Change to
13 # ./libcryptopp.so or ./libcryptopp.dylib to suit your
14 # taste. https://github.com/weidai11/cryptopp/issues/866
15 LINK_LIBRARY ?= libcryptopp.a
16 LINK_LIBRARY_PATH ?= ./
17 
18 # Default FLAGS if none were provided
19 CPPFLAGS ?= -DNDEBUG
20 CXXFLAGS ?= -g2 -O3 -fPIC -pipe
21 
22 AR ?= ar
23 ARFLAGS ?= cr
24 RANLIB ?= ranlib
25 CP ?= cp
26 MV ?= mv
27 CHMOD ?= chmod
28 MKDIR ?= mkdir -p
29 GREP ?= grep
30 SED ?= sed
31 
32 LN ?= ln -sf
33 LDCONF ?= /sbin/ldconfig -n
34 
35 IS_IOS ?= 0
36 IS_ANDROID ?= 0
37 IS_ARM_EMBEDDED ?= 0
38 
39 # Clang is reporting armv8l-unknown-linux-gnueabihf
40 # for ARMv7 images on Aarch64 hardware.
41 MACHINEX := $(shell $(CXX) $(CXXFLAGS) -dumpmachine 2>/dev/null)
42 HOSTX := $(shell echo $(MACHINEX) | cut -f 1 -d '-')
43 ifeq ($(HOSTX),)
44  HOSTX := $(shell uname -m 2>/dev/null)
45 endif
46 
47 IS_LINUX := $(shell echo $(MACHINEX) | $(GREP) -i -c "Linux")
48 
49 # Can be used by Android and Embedded cross-compiles. Disable by default because
50 # Android and embedded users typically don't run this configuration.
51 HAS_SOLIB_VERSION ?= 0
52 
53 # Formerly adhoc.cpp was created from adhoc.cpp.proto when needed.
54 # This is now needed because ISA tests are performed using adhoc.cpp.
55 ifeq ($(wildcard adhoc.cpp),)
56 $(shell cp adhoc.cpp.proto adhoc.cpp)
57 endif
58 
59 ###########################################################
60 ##### General Variables #####
61 ###########################################################
62 
63 # Needed when the assembler is invoked
64 ifeq ($(findstring -Wa,--noexecstack,$(ASFLAGS)$(CXXFLAGS)),)
65  ASFLAGS += -Wa,--noexecstack
66 endif
67 
68 # On ARM we may compile aes_armv4.S, sha1_armv4.S, sha256_armv4.S, and
69 # sha512_armv4.S through the CC compiler
70 ifeq ($(GCC_COMPILER),1)
71  CC ?= gcc
72 else ifeq ($(CLANG_COMPILER),1)
73  CC ?= clang
74 endif
75 
76 # http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
77 ifeq ($(PREFIX),)
78  PREFIX = /usr/local
79 endif
80 ifeq ($(LIBDIR),)
81  LIBDIR := $(PREFIX)/lib
82 endif
83 ifeq ($(DATADIR),)
84  DATADIR := $(PREFIX)/share
85 endif
86 ifeq ($(INCLUDEDIR),)
87  INCLUDEDIR := $(PREFIX)/include
88 endif
89 ifeq ($(BINDIR),)
90  BINDIR := $(PREFIX)/bin
91 endif
92 
93 # We honor ARFLAGS, but the "v" option used by default causes a noisy make
94 ifeq ($(ARFLAGS),rv)
95  ARFLAGS = r
96 endif
97 
98 ###########################################################
99 ##### MacOS #####
100 ###########################################################
101 
102 # MacOS cross-compile configuration.
103 # See http://www.cryptopp.com/wiki/MacOS_(Command_Line).
104 ifeq ($(IS_MACOS),1)
105  # setenv-macos.sh sets CPPFLAGS, CXXFLAGS and LDFLAGS
106  IS_APPLE_LIBTOOL=$(shell libtool -V 2>&1 | $(GREP) -i -c 'Apple')
107  ifeq ($(IS_APPLE_LIBTOOL),1)
108  AR = libtool
109  else
110  AR = /usr/bin/libtool
111  endif
112  ARFLAGS = -static -o
113 endif
114 
115 ###########################################################
116 ##### iOS #####
117 ###########################################################
118 
119 # iOS cross-compile configuration.
120 # See http://www.cryptopp.com/wiki/iOS_(Command_Line).
121 ifeq ($(IS_IOS),1)
122  # setenv-ios.sh sets CPPFLAGS, CXXFLAGS and LDFLAGS
123  AR = libtool
124  ARFLAGS = -static -o
125 endif
126 
127 ###########################################################
128 ##### Android #####
129 ###########################################################
130 
131 # Android cross-compile configuration.
132 # See http://www.cryptopp.com/wiki/Android_(Command_Line).
133 ifeq ($(IS_ANDROID),1)
134  # setenv-android.sh sets CPPFLAGS, CXXFLAGS and LDFLAGS
135 
136  # Source files copied into PWD for Android cpu-features
137  # setenv-android.sh does the copying. Its a dirty compile.
138  ANDROID_CPU_OBJ = cpu-features.o
139 endif
140 
141 ###########################################################
142 ##### Embedded #####
143 ###########################################################
144 
145 # ARM embedded cross-compile configuration.
146 # See http://www.cryptopp.com/wiki/ARM_Embedded_(Command_Line)
147 # and http://www.cryptopp.com/wiki/ARM_Embedded_(Bare Metal).
148 ifeq ($(IS_ARM_EMBEDDED),1)
149  # setenv-android.sh sets CPPFLAGS, CXXFLAGS and LDFLAGS
150 endif
151 
152 ###########################################################
153 ##### Compiler and Platform #####
154 ###########################################################
155 
156 # Wait until CXXFLAGS have been set by setenv scripts.
157 
158 GCC_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -v -E 'llvm|clang' | $(GREP) -i -c -E '(gcc|g\+\+)')
159 CLANG_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -i -c -E 'llvm|clang')
160 
161 HOSTX := $(shell $(CXX) $(CXXFLAGS) -dumpmachine 2>/dev/null | cut -f 1 -d '-')
162 ifeq ($(HOSTX),)
163  HOSTX := $(shell uname -m 2>/dev/null)
164 endif
165 
166 # This dance is because Clang reports the host architecture instead
167 # of the target architecture for -dumpmachine. Running Clang on an
168 # x86_64 machine with -arch arm64 yields x86_64 instead of arm64.
169 
170 ifeq ($(CLANG_COMPILER),1)
171  # The compiler is either GCC or Clang
172  IS_X86 := $(shell echo $(CXXFLAGS) | $(GREP) -v 64 | $(GREP) -i -c -E 'i.86')
173  IS_X64 := $(shell echo $(CXXFLAGS) | $(GREP) -i -c -E 'x86_64|amd64')
174  IS_ARM32 := $(shell echo $(CXXFLAGS) | $(GREP) -v 64 | $(GREP) -i -c -E 'arm|armhf|arm7l|armeabihf')
175  IS_ARMV8 := $(shell echo $(CXXFLAGS) | $(GREP) -i -c -E 'aarch32|aarch64|arm64|armv8')
176 else
177  IS_X86 := $(shell echo $(HOSTX) | $(GREP) -v 64 | $(GREP) -i -c -E 'i.86')
178  IS_X64 := $(shell echo $(HOSTX) | $(GREP) -i -c -E 'x86_64|amd64')
179  IS_ARM32 := $(shell echo $(HOSTX) | $(GREP) -v 64 | $(GREP) -i -c -E 'arm|armhf|arm7l|eabihf')
180  IS_ARMV8 := $(shell echo $(HOSTX) | $(GREP) -i -c -E 'aarch32|aarch64|arm64|armv8')
181 endif
182 
183 ifeq ($(IS_ARMV8),1)
184  IS_ARM32 = 0
185 endif
186 
187 IS_PPC32 := 0
188 IS_PPC64 := 0
189 
190 # Uncomment for debugging
191 # $(info Here's what we found... IS_X86: $(IS_X86), IS_X64: $(IS_X64), IS_ARM32: $(IS_ARM32), IS_ARMV8: $(IS_ARMV8))
192 
193 ###########################################################
194 ##### Test Program #####
195 ###########################################################
196 
197 # Hack to skip CPU feature tests for some recipes
198 DETECT_FEATURES ?= 1
199 ifneq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CPPFLAGS)$(CXXFLAGS)h),)
200  DETECT_FEATURES := 0
201 else ifneq ($(findstring clean,$(MAKECMDGOALS)),)
202  DETECT_FEATURES := 0
203 else ifneq ($(findstring distclean,$(MAKECMDGOALS)),)
204  DETECT_FEATURES := 0
205 else ifneq ($(findstring trim,$(MAKECMDGOALS)),)
206  DETECT_FEATURES := 0
207 else ifneq ($(findstring zip,$(MAKECMDGOALS)),)
208  DETECT_FEATURES := 0
209 endif
210 
211 # Strip out -Wall, -Wextra and friends for feature testing. FORTIFY_SOURCE is removed
212 # because it requires -O1 or higher, but we use -O0 to tame the optimizer.
213 # Always print testing flags since some tests always happen, like 64-bit.
214 TCXXFLAGS := $(filter-out -D_FORTIFY_SOURCE=% -M -MM -Wall -Wextra -Werror% -Wunused -Wconversion -Wp%, $(CPPFLAGS) $(CXXFLAGS))
215 ifneq ($(strip $(TCXXFLAGS)),)
216  $(info Using testing flags: $(TCXXFLAGS))
217 endif
218 
219 # TCOMMAND is used for just about all tests. Make will lazy-evaluate
220 # the variables when executed by $(shell $(TCOMMAND) ...).
221 TCOMMAND = $(CXX) -I. $(TCXXFLAGS) $(TEXTRA) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT)
222 
223 ###########################################################
224 ##### X86/X32/X64 Options #####
225 ###########################################################
226 
227 ifneq ($(IS_X86)$(IS_X64),00)
228 ifeq ($(DETECT_FEATURES),1)
229 
230  SSE2_FLAG = -msse2
231  SSE3_FLAG = -msse3
232  SSSE3_FLAG = -mssse3
233  SSE41_FLAG = -msse4.1
234  SSE42_FLAG = -msse4.2
235  CLMUL_FLAG = -mpclmul
236  AESNI_FLAG = -maes
237  AVX_FLAG = -mavx
238  AVX2_FLAG = -mavx2
239  SHANI_FLAG = -msha
240 
241  TPROG = TestPrograms/test_x86_sse2.cpp
242  TOPT = $(SSE2_FLAG)
243  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
244  ifeq ($(strip $(HAVE_OPT)),0)
245  CHACHA_FLAG = $(SSE2_FLAG)
246  else
247  # Make does not have useful debugging facilities. Show the user
248  # what happened by compiling again without the pipe.
249  $(info Running make again to see what failed)
250  $(info $(shell $(TCOMMAND)))
251  SSE2_FLAG =
252  endif
253 
254  ifeq ($(SSE2_FLAG),)
255  CPPFLAGS += -DCRYPTOPP_DISABLE_ASM
256  endif
257 
258  # Need SSE2 or higher for these tests
259  ifneq ($(SSE2_FLAG),)
260  TPROG = TestPrograms/test_x86_ssse3.cpp
261  TOPT = $(SSSE3_FLAG)
262  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
263  ifeq ($(strip $(HAVE_OPT)),0)
264  ARIA_FLAG = $(SSSE3_FLAG)
265  CHAM_FLAG = $(SSSE3_FLAG)
266  KECCAK_FLAG = $(SSSE3_FLAG)
267  LEA_FLAG = $(SSSE3_FLAG)
268  LSH256_FLAG = $(SSSE3_FLAG)
269  LSH512_FLAG = $(SSSE3_FLAG)
270  SIMON128_FLAG = $(SSSE3_FLAG)
271  SPECK128_FLAG = $(SSSE3_FLAG)
272  else
273  SSSE3_FLAG =
274  endif
275 
276  # The first Apple MacBooks were Core2's with SSE4.1
277  ifneq ($(IS_DARWIN),0)
278  # Add SSE2 algo's here as required
279  # They get a free upgrade
280  endif
281 
282  TPROG = TestPrograms/test_x86_sse41.cpp
283  TOPT = $(SSE41_FLAG)
284  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
285  ifeq ($(strip $(HAVE_OPT)),0)
286  BLAKE2B_FLAG = $(SSE41_FLAG)
287  BLAKE2S_FLAG = $(SSE41_FLAG)
288  else
289  SSE41_FLAG =
290  endif
291 
292  TPROG = TestPrograms/test_x86_sse42.cpp
293  TOPT = $(SSE42_FLAG)
294  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
295  ifeq ($(strip $(HAVE_OPT)),0)
296  CRC_FLAG = $(SSE42_FLAG)
297  else
298  SSE42_FLAG =
299  endif
300 
301  TPROG = TestPrograms/test_x86_clmul.cpp
302  TOPT = $(CLMUL_FLAG)
303  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
304  ifeq ($(strip $(HAVE_OPT)),0)
305  GCM_FLAG = $(SSSE3_FLAG) $(CLMUL_FLAG)
306  GF2N_FLAG = $(CLMUL_FLAG)
307  else
308  CLMUL_FLAG =
309  endif
310 
311  TPROG = TestPrograms/test_x86_aes.cpp
312  TOPT = $(AESNI_FLAG)
313  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
314  ifeq ($(strip $(HAVE_OPT)),0)
315  AES_FLAG = $(SSE41_FLAG) $(AESNI_FLAG)
316  SM4_FLAG = $(SSSE3_FLAG) $(AESNI_FLAG)
317  else
318  AESNI_FLAG =
319  endif
320 
321  TPROG = TestPrograms/test_x86_avx.cpp
322  TOPT = $(AVX_FLAG)
323  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
324  ifeq ($(strip $(HAVE_OPT)),0)
325  # XXX_FLAG = $(AVX_FLAG)
326  else
327  AVX_FLAG =
328  endif
329 
330  TPROG = TestPrograms/test_x86_avx2.cpp
331  TOPT = $(AVX2_FLAG)
332  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
333  ifeq ($(strip $(HAVE_OPT)),0)
334  CHACHA_AVX2_FLAG = $(AVX2_FLAG)
335  LSH256_AVX2_FLAG = $(AVX2_FLAG)
336  LSH512_AVX2_FLAG = $(AVX2_FLAG)
337  else
338  AVX2_FLAG =
339  endif
340 
341  TPROG = TestPrograms/test_x86_sha.cpp
342  TOPT = $(SHANI_FLAG)
343  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
344  ifeq ($(strip $(HAVE_OPT)),0)
345  SHA_FLAG = $(SSE42_FLAG) $(SHANI_FLAG)
346  else
347  SHANI_FLAG =
348  endif
349 
350  ifeq ($(SSE3_FLAG),)
351  CPPFLAGS += -DCRYPTOPP_DISABLE_SSE3
352  else ifeq ($(SSSE3_FLAG),)
353  CPPFLAGS += -DCRYPTOPP_DISABLE_SSSE3
354  else ifeq ($(SSE41_FLAG),)
355  CPPFLAGS += -DCRYPTOPP_DISABLE_SSE4
356  else ifeq ($(SSE42_FLAG),)
357  CPPFLAGS += -DCRYPTOPP_DISABLE_SSE4
358  endif
359 
360  ifneq ($(SSE42_FLAG),)
361  # Unusual GCC/Clang on Macports. It assembles AES, but not CLMUL.
362  # test_x86_clmul.s:15: no such instruction: 'pclmulqdq $0, %xmm1,%xmm0'
363  ifeq ($(CLMUL_FLAG),)
364  CPPFLAGS += -DCRYPTOPP_DISABLE_CLMUL
365  endif
366  ifeq ($(AESNI_FLAG),)
367  CPPFLAGS += -DCRYPTOPP_DISABLE_AESNI
368  endif
369 
370  ifeq ($(AVX_FLAG),)
371  CPPFLAGS += -DCRYPTOPP_DISABLE_AVX
372  else ifeq ($(AVX2_FLAG),)
373  CPPFLAGS += -DCRYPTOPP_DISABLE_AVX2
374  endif
375  # SHANI independent of AVX per GH #1045
376  ifeq ($(SHANI_FLAG),)
377  CPPFLAGS += -DCRYPTOPP_DISABLE_SHANI
378  endif
379  endif
380 
381  # Drop to SSE2 if available
382  ifeq ($(GCM_FLAG),)
383  GCM_FLAG = $(SSE2_FLAG)
384  endif
385 
386  # Most Clang cannot handle mixed asm with positional arguments, where the
387  # body is Intel style with no prefix and the templates are AT&T style.
388  # Also see https://bugs.llvm.org/show_bug.cgi?id=39895 .
389 
390  # CRYPTOPP_DISABLE_MIXED_ASM is now being added in config_asm.h for all
391  # Clang compilers. This test will need to be re-enabled if Clang fixes it.
392  #TPROG = TestPrograms/test_asm_mixed.cpp
393  #TOPT =
394  #HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
395  #ifneq ($(strip $(HAVE_OPT)),0)
396  # CPPFLAGS += -DCRYPTOPP_DISABLE_MIXED_ASM
397  #endif
398 
399  # SSE2_FLAGS
400  endif
401 
402 # DETECT_FEATURES
403 endif
404 
405 # IS_X86 and IS_X64
406 endif
407 
408 ###########################################################
409 ##### ARM A-32 and NEON #####
410 ###########################################################
411 
412 ifneq ($(IS_ARM32),0)
413 
414 # No need for feature detection on this platform if NEON is disabled
415 ifneq ($(findstring -DCRYPTOPP_DISABLE_ARM_NEON,$(CPPFLAGS)$(CXXFLAGS)),)
416  DETECT_FEATURES := 0
417 endif
418 
419 ifeq ($(DETECT_FEATURES),1)
420 
421  # Android needs -c compile flag for NEON. Otherwise there's an odd linker message.
422  ifeq ($(IS_ANDROID),1)
423  NEON_FLAG = -march=armv7-a -mfpu=vfpv3-d16 -mfpu=neon
424  else
425  NEON_FLAG = -march=armv7-a -mfpu=neon
426  endif
427 
428  # Clang needs an option to include <arm_neon.h>
429  TPROG = TestPrograms/test_arm_neon_header.cpp
430  TOPT = -DCRYPTOPP_ARM_NEON_HEADER=1 $(NEON_FLAG)
431  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
432  ifeq ($(strip $(HAVE_OPT)),0)
433  TEXTRA += -DCRYPTOPP_ARM_NEON_HEADER=1
434  endif
435 
436  TPROG = TestPrograms/test_arm_neon.cpp
437  TOPT = $(NEON_FLAG)
438  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
439  ifeq ($(strip $(HAVE_OPT)),0)
440  ARIA_FLAG = $(NEON_FLAG)
441  AES_FLAG = $(NEON_FLAG)
442  CRC_FLAG = $(NEON_FLAG)
443  GCM_FLAG = $(NEON_FLAG)
444  BLAKE2B_FLAG = $(NEON_FLAG)
445  BLAKE2S_FLAG = $(NEON_FLAG)
446  CHACHA_FLAG = $(NEON_FLAG)
447  CHAM_FLAG = $(NEON_FLAG)
448  LEA_FLAG = $(NEON_FLAG)
449  SHA_FLAG = $(NEON_FLAG)
450  SIMON128_FLAG = $(NEON_FLAG)
451  SPECK128_FLAG = $(NEON_FLAG)
452  SM4_FLAG = $(NEON_FLAG)
453  else
454  # Make does not have useful debugging facilities. Show the user
455  # what happened by compiling again without the pipe.
456  #$(info Running make again to see what failed)
457  #$(info $(shell $(TCOMMAND)))
458  NEON_FLAG =
459  endif
460 
461  ifeq ($(NEON_FLAG),)
462  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_NEON
463  endif
464 
465 # DETECT_FEATURES
466 endif
467 # IS_ARM32
468 endif
469 
470 ###########################################################
471 ##### Aach32 and Aarch64 #####
472 ###########################################################
473 
474 ifneq ($(IS_ARMV8),0)
475 ifeq ($(DETECT_FEATURES),1)
476 
477  ifeq ($(IS_IOS),1)
478  ASIMD_FLAG = -arch arm64
479  CRC_FLAG = -arch arm64
480  AES_FLAG = -arch arm64
481  PMUL_FLAG = -arch arm64
482  SHA_FLAG = -arch arm64
483  else
484  ASIMD_FLAG = -march=armv8-a
485  CRC_FLAG = -march=armv8-a+crc
486  AES_FLAG = -march=armv8-a+crypto
487  GCM_FLAG = -march=armv8-a+crypto
488  GF2N_FLAG = -march=armv8-a+crypto
489  SHA_FLAG = -march=armv8-a+crypto
490  endif
491 
492  TPROG = TestPrograms/test_arm_neon_header.cpp
493  TOPT = -DCRYPTOPP_ARM_NEON_HEADER=1
494  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
495  ifeq ($(strip $(HAVE_OPT)),0)
496  TEXTRA += -DCRYPTOPP_ARM_NEON_HEADER=1
497  endif
498 
499  TPROG = TestPrograms/test_arm_acle_header.cpp
500  TOPT = -DCRYPTOPP_ARM_ACLE_HEADER=1 $(ASIMD_FLAG)
501  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
502  ifeq ($(strip $(HAVE_OPT)),0)
503  TEXTRA += -DCRYPTOPP_ARM_ACLE_HEADER=1
504  endif
505 
506  TPROG = TestPrograms/test_arm_asimd.cpp
507  TOPT = $(ASIMD_FLAG)
508  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
509  ifeq ($(strip $(HAVE_OPT)),0)
510  ARIA_FLAG = $(ASIMD_FLAG)
511  BLAKE2B_FLAG = $(ASIMD_FLAG)
512  BLAKE2S_FLAG = $(ASIMD_FLAG)
513  CHACHA_FLAG = $(ASIMD_FLAG)
514  CHAM_FLAG = $(ASIMD_FLAG)
515  LEA_FLAG = $(ASIMD_FLAG)
516  NEON_FLAG = $(ASIMD_FLAG)
517  SIMON128_FLAG = $(ASIMD_FLAG)
518  SPECK128_FLAG = $(ASIMD_FLAG)
519  SM4_FLAG = $(ASIMD_FLAG)
520  else
521  # Make does not have useful debugging facilities. Show the user
522  # what happened by compiling again without the pipe.
523  $(info Running make again to see what failed)
524  $(info $(shell $(TCOMMAND)))
525  ASIMD_FLAG =
526  endif
527 
528  ifeq ($(ASIMD_FLAG),)
529  CPPFLAGS += -DCRYPTOPP_DISABLE_ASM
530  endif
531 
532  ifneq ($(ASIMD_FLAG),)
533 
534  TPROG = TestPrograms/test_arm_crc.cpp
535  TOPT = $(CRC_FLAG)
536  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
537  ifneq ($(strip $(HAVE_OPT)),0)
538  CRC_FLAG =
539  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_CRC32
540  endif
541 
542  TPROG = TestPrograms/test_arm_aes.cpp
543  TOPT = $(AES_FLAG)
544  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
545  ifneq ($(strip $(HAVE_OPT)),0)
546  AES_FLAG =
547  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_AES
548  endif
549 
550  TPROG = TestPrograms/test_arm_pmull.cpp
551  TOPT = $(PMULL_FLAG)
552  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
553  ifneq ($(strip $(HAVE_OPT)),0)
554  GCM_FLAG =
555  GF2N_FLAG =
556  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_PMULL
557  endif
558 
559  TPROG = TestPrograms/test_arm_sha1.cpp
560  TOPT = $(SHA_FLAG)
561  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
562  ifneq ($(strip $(HAVE_OPT)),0)
563  SHA_FLAG =
564  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SHA1
565  endif
566 
567  TPROG = TestPrograms/test_arm_sha256.cpp
568  TOPT = $(SHA_FLAG)
569  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
570  ifneq ($(strip $(HAVE_OPT)),0)
571  SHA_FLAG =
572  CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SHA2
573  endif
574 
575  TPROG = TestPrograms/test_arm_sm3.cpp
576  TOPT = -march=armv8.4-a+sm3
577  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
578  ifeq ($(strip $(HAVE_OPT)),0)
579  SM3_FLAG = -march=armv8.4-a+sm3
580  SM4_FLAG = -march=armv8.4-a+sm3
581  else
582  #CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SM3
583  #CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SM4
584  endif
585 
586  TPROG = TestPrograms/test_arm_sha3.cpp
587  TOPT = -march=armv8.4-a+sha3
588  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
589  ifeq ($(strip $(HAVE_OPT)),0)
590  SHA3_FLAG = -march=armv8.4-a+sha3
591  else
592  #CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SHA3
593  endif
594 
595  TPROG = TestPrograms/test_arm_sha512.cpp
596  TOPT = -march=armv8.4-a+sha512
597  HAVE_OPT = $(shell $(TCOMMAND) 2>&1 | wc -w)
598  ifeq ($(strip $(HAVE_OPT)),0)
599  SHA512_FLAG = -march=armv8.4-a+sha512
600  else
601  #CPPFLAGS += -DCRYPTOPP_DISABLE_ARM_SHA512
602  endif
603 
604  # ASIMD_FLAG
605  endif
606 
607 # DETECT_FEATURES
608 endif
609 # IS_ARMV8
610 endif
611 
612 ###########################################################
613 ##### Common #####
614 ###########################################################
615 
616 # Undefined Behavior Sanitizer (UBsan) testing. Issue 'make ubsan'.
617 ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
618  ifeq ($(findstring -fsanitize=undefined,$(CXXFLAGS)),)
619  CXXFLAGS += -fsanitize=undefined
620  endif # CXXFLAGS
621  ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CPPFLAGS)$(CXXFLAGS)),)
622  CPPFLAGS += -DCRYPTOPP_COVERAGE
623  endif # CPPFLAGS
624 endif # UBsan
625 
626 # Address Sanitizer (Asan) testing. Issue 'make asan'.
627 ifeq ($(findstring asan,$(MAKECMDGOALS)),asan)
628  ifeq ($(findstring -fsanitize=address,$(CXXFLAGS)),)
629  CXXFLAGS += -fsanitize=address
630  endif # CXXFLAGS
631  ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CPPFLAGS)$(CXXFLAGS)),)
632  CPPFLAGS += -DCRYPTOPP_COVERAGE
633  endif # CPPFLAGS
634  ifeq ($(findstring -fno-omit-frame-pointer,$(CXXFLAGS)),)
635  CXXFLAGS += -fno-omit-frame-pointer
636  endif # CXXFLAGS
637 endif # Asan
638 
639 # LD gold linker testing. Triggered by 'LD=ld.gold'.
640 ifeq ($(findstring ld.gold,$(LD)),ld.gold)
641  ifeq ($(findstring -fuse-ld=gold,$(CXXFLAGS)),)
642  ELF_FORMAT := $(shell file `which ld.gold` 2>&1 | cut -d":" -f 2 | $(GREP) -i -c "elf")
643  ifneq ($(ELF_FORMAT),0)
644  LDFLAGS += -fuse-ld=gold
645  endif # ELF/ELF64
646  endif # CXXFLAGS
647 endif # Gold
648 
649 # Valgrind testing. Issue 'make valgrind'.
650 ifneq ($(filter valgrind,$(MAKECMDGOALS)),)
651  # Tune flags; see http://valgrind.org/docs/manual/quick-start.html
652  CXXFLAGS := $(CXXFLAGS:-g%=-g3)
653  CXXFLAGS := $(CXXFLAGS:-O%=-O1)
654  CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
655  ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CPPFLAGS)$(CXXFLAGS)),)
656  CPPFLAGS += -DCRYPTOPP_COVERAGE
657  endif # CPPFLAGS
658 endif # Valgrind
659 
660 # Debug testing on GNU systems. Triggered by -DDEBUG.
661 # Newlib test due to http://sourceware.org/bugzilla/show_bug.cgi?id=20268
662 ifneq ($(filter -DDEBUG -DDEBUG=1,$(CPPFLAGS) $(CXXFLAGS)),)
663  USING_GLIBCXX := $(shell $(CXX) $(CPPFLAGS) $(CXXFLAGS) -E pch.cpp 2>&1 | $(GREP) -i -c "__GLIBCXX__")
664  ifneq ($(USING_GLIBCXX),0)
665  ifeq ($(HAS_NEWLIB),0)
666  ifeq ($(findstring -D_GLIBCXX_DEBUG,$(CPPFLAGS)$(CXXFLAGS)),)
667  CPPFLAGS += -D_GLIBCXX_DEBUG
668  endif # CPPFLAGS
669  endif # HAS_NEWLIB
670  endif # USING_GLIBCXX
671 endif # GNU Debug build
672 
673 # Dead code stripping. Issue 'make lean'.
674 ifeq ($(findstring lean,$(MAKECMDGOALS)),lean)
675  ifeq ($(findstring -ffunction-sections,$(CXXFLAGS)),)
676  CXXFLAGS += -ffunction-sections
677  endif # CXXFLAGS
678  ifeq ($(findstring -fdata-sections,$(CXXFLAGS)),)
679  CXXFLAGS += -fdata-sections
680  endif # CXXFLAGS
681  ifneq ($(IS_IOS),0)
682  ifeq ($(findstring -Wl,-dead_strip,$(LDFLAGS)),)
683  LDFLAGS += -Wl,-dead_strip
684  endif # CXXFLAGS
685  else # BSD, Linux and Unix
686  ifeq ($(findstring -Wl,--gc-sections,$(LDFLAGS)),)
687  LDFLAGS += -Wl,--gc-sections
688  endif # LDFLAGS
689  endif # MAKECMDGOALS
690 endif # Dead code stripping
691 
692 ###########################################################
693 ##### Source and object files #####
694 ###########################################################
695 
696 # List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
697 SRCS := cryptlib.cpp cpu.cpp integer.cpp $(filter-out cryptlib.cpp cpu.cpp integer.cpp pch.cpp simple.cpp,$(sort $(wildcard *.cpp)))
698 # For Makefile.am; resource.h is Windows
699 INCL := $(filter-out resource.h,$(sort $(wildcard *.h)))
700 
701 # Cryptogams source files. We couple to ARMv7 and NEON.
702 # Limit to Linux. The source files target the GNU assembler.
703 # Also see https://www.cryptopp.com/wiki/Cryptogams.
704 ifeq ($(IS_ARM32)$(IS_LINUX),11)
705  ifeq ($(filter -DCRYPTOPP_DISABLE_ASM -DCRYPTOPP_DISABLE_ARM_NEON,$(CPPFLAGS)$(CXXFLAGS)),)
706  # Do not use -march=armv7 if the compiler is already targeting the ISA.
707  # Also see https://github.com/weidai11/cryptopp/issues/1094
708  ifeq ($(shell $(CXX) -dM -E TestPrograms/test_cxx.cpp 2>/dev/null | grep -E '__ARM_ARCH 7|__ARM_ARCH_7A__'),)
709  CRYPTOGAMS_ARMV7_FLAG = -march=armv7-a
710  endif
711  ifeq ($(CLANG_COMPILER),1)
712  CRYPTOGAMS_ARM_FLAG = $(CRYPTOGAMS_ARMV7_FLAG)
713  CRYPTOGAMS_ARM_THUMB_FLAG = $(CRYPTOGAMS_ARMV7_FLAG) -mthumb
714  else
715  # -mfpu=auto due to https://github.com/weidai11/cryptopp/issues/1094
716  CRYPTOGAMS_ARM_FLAG = $(CRYPTOGAMS_ARMV7_FLAG)
717  CRYPTOGAMS_ARM_THUMB_FLAG = $(CRYPTOGAMS_ARMV7_FLAG)
718  endif
719  SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S
720  endif
721 endif
722 
723 # Remove unneeded arch specific files to speed build time.
724 ifeq ($(IS_PPC32)$(IS_PPC64),00)
725  SRCS := $(filter-out %_ppc.cpp,$(SRCS))
726 endif
727 ifeq ($(IS_ARM32)$(IS_ARMV8),00)
728  SRCS := $(filter-out arm_%,$(SRCS))
729  SRCS := $(filter-out neon_%,$(SRCS))
730  SRCS := $(filter-out %_armv4.S,$(SRCS))
731 endif
732 ifeq ($(IS_X86)$(IS_X64),00)
733  SRCS := $(filter-out sse_%,$(SRCS))
734  SRCS := $(filter-out %_sse.cpp,$(SRCS))
735  SRCS := $(filter-out %_avx.cpp,$(SRCS))
736 endif
737 
738 # If ASM is disabled we can remove the SIMD files, too.
739 ifneq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CRYPTOPP_CPPFLAGS)$(CPPFLAGS)$(CXXFLAGS)),)
740  SRCS := $(filter-out arm_%,$(SRCS))
741  SRCS := $(filter-out ppc_%,$(SRCS))
742  SRCS := $(filter-out neon_%,$(SRCS))
743  SRCS := $(filter-out sse_%,$(SRCS))
744  SRCS := $(filter-out %_sse.cpp,$(SRCS))
745  SRCS := $(filter-out %_avx.cpp,$(SRCS))
746  SRCS := $(filter-out %_ppc.cpp,$(SRCS))
747  SRCS := $(filter-out %_simd.cpp,$(SRCS))
748  SRCS := $(filter-out %_armv4.S,$(SRCS))
749 endif
750 
751 # List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
752 OBJS := $(SRCS:.cpp=.o)
753 OBJS := $(OBJS:.S=.o)
754 
755 # List test.cpp first to tame C++ static initialization problems.
756 TESTSRCS := adhoc.cpp 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
757 TESTINCL := bench.h factory.h validate.h
758 
759 # Test objects
760 TESTOBJS := $(TESTSRCS:.cpp=.o)
761 LIBOBJS := $(filter-out $(TESTOBJS),$(OBJS))
762 
763 # Clean recipe, Issue 998. Don't filter-out some artifacts from the list of objects
764 # The *.S is a hack. It makes the ASM appear like C++ so the object files make the CLEAN_OBJS list
765 CLEAN_SRCS := $(wildcard *.cpp) $(patsubst %.S,%.cpp,$(wildcard *.S))
766 CLEAN_OBJS := $(CLEAN_SRCS:.cpp=.o) $(CLEAN_SRCS:.cpp=.import.o) $(CLEAN_SRCS:.cpp=.export.o)
767 
768 # For Shared Objects, Diff, Dist/Zip rules
769 LIB_VER := $(shell $(GREP) "define CRYPTOPP_VERSION" config_ver.h | cut -d" " -f 3)
770 LIB_MAJOR := $(shell echo $(LIB_VER) | cut -c 1)
771 LIB_MINOR := $(shell echo $(LIB_VER) | cut -c 2)
772 LIB_PATCH := $(shell echo $(LIB_VER) | cut -c 3)
773 
774 ifeq ($(strip $(LIB_PATCH)),)
775 LIB_PATCH := 0
776 endif
777 
778 ifeq ($(HAS_SOLIB_VERSION),1)
779 # Full version suffix for shared library
780 SOLIB_VERSION_SUFFIX=.$(LIB_MAJOR).$(LIB_MINOR).$(LIB_PATCH)
781 # Different patchlevels and minors are compatible since 6.1
782 SOLIB_COMPAT_SUFFIX=.$(LIB_MAJOR)
783 SOLIB_FLAGS=-Wl,-soname,libcryptopp.so$(SOLIB_COMPAT_SUFFIX)
784 endif # HAS_SOLIB_VERSION
785 
786 ###########################################################
787 ##### Targets and Recipes #####
788 ###########################################################
789 
790 # Default builds program with static library only
791 .PHONY: default
792 default: cryptest.exe
793 
794 .PHONY: all static dynamic
795 all: static dynamic cryptest.exe
796 
797 ifneq ($(IS_IOS),0)
798 static: libcryptopp.a
799 shared dynamic dylib: libcryptopp.dylib
800 else
801 static: libcryptopp.a
802 shared dynamic: libcryptopp.so$(SOLIB_VERSION_SUFFIX)
803 endif
804 
805 .PHONY: test check
806 test check: cryptest.exe
807  ./cryptest.exe v
808 
809 # CXXFLAGS are tuned earlier. Applications must use linker flags
810 # -Wl,--gc-sections (Linux and Unix) or -Wl,-dead_strip (OS X)
811 .PHONY: lean
812 lean: static dynamic cryptest.exe
813 
814 .PHONY: clean
815 clean:
816  -$(RM) adhoc.cpp.o adhoc.cpp.proto.o $(CLEAN_OBJS) $(ANDROID_CPU_OBJ) rdrand-*.o
817  @-$(RM) libcryptopp.a libcryptopp.dylib cryptopp.dll libcryptopp.dll.a libcryptopp.import.a
818  @-$(RM) libcryptopp.so libcryptopp.so$(SOLIB_COMPAT_SUFFIX) libcryptopp.so$(SOLIB_VERSION_SUFFIX)
819  @-$(RM) cryptest.exe dlltest.exe cryptest.import.exe cryptest.dat ct et
820  @-$(RM) *.la *.lo *.gcov *.gcno *.gcda *.stackdump core core-*
821  @-$(RM) /tmp/adhoc.exe
822  @-$(RM) -r /tmp/cryptopp_test/
823  @-$(RM) -r *.exe.dSYM/
824  @-$(RM) -r *.dylib.dSYM/
825  @-$(RM) -r cov-int/
826 
827 .PHONY: autotools-clean
828 autotools-clean:
829  @-$(RM) -f bootstrap.sh configure.ac configure configure.in Makefile.am Makefile.in Makefile
830  @-$(RM) -f config.guess config.status config.sub config.h.in compile depcomp
831  @-$(RM) -f install-sh stamp-h1 ar-lib *.lo *.la *.m4 local.* lt*.sh missing
832  @-$(RM) -f cryptest cryptestcwd libtool* libcryptopp.la libcryptopp.pc*
833  @-$(RM) -rf build-aux/ m4/ auto*.cache/ .deps/ .libs/
834 
835 .PHONY: cmake-clean
836 cmake-clean:
837  @-$(RM) -f cryptopp-config.cmake CMakeLists.txt
838  @-$(RM) -rf cmake_build/
839 
840 .PHONY: android-clean
841 android-clean:
842  @-$(RM) -f $(patsubst %_simd.cpp,%_simd.cpp.neon,$(wildcard *_simd.cpp))
843  @-$(RM) -rf obj/
844 
845 .PHONY: distclean
846 distclean: clean autotools-clean cmake-clean android-clean
847  -$(RM) adhoc.cpp adhoc.cpp.copied GNUmakefile.deps benchmarks.html cryptest.txt
848  -$(RM) cryptest_all.info cryptest_debug.info cryptest_noasm.info cryptest_base.info cryptest.info cryptest_release.info
849  @-$(RM) cryptest-*.txt cryptopp.tgz libcryptopp.pc *.o *.bc *.ii *~
850  @-$(RM) -r cryptlib.lib cryptest.exe *.suo *.sdf *.pdb Win32/ x64/ ipch/
851  @-$(RM) -r $(LIBOBJS:.o=.obj) $(TESTOBJS:.o=.obj)
852  @-$(RM) -r $(LIBOBJS:.o=.lst) $(TESTOBJS:.o=.lst)
853  @-$(RM) -r TestCoverage/ ref*/
854  @-$(RM) cryptopp$(LIB_VER)\.* CryptoPPRef.zip
855 
856 # Install cryptest.exe, libcryptopp.a and libcryptopp.so.
857 # The library install was broken-out into its own recipe at GH #653.
858 .PHONY: install
859 install: cryptest.exe install-lib
860  @-$(MKDIR) $(DESTDIR)$(BINDIR)
861  $(CP) cryptest.exe $(DESTDIR)$(BINDIR)
862  $(CHMOD) u=rwx,go=rx $(DESTDIR)$(BINDIR)/cryptest.exe
863  @-$(MKDIR) $(DESTDIR)$(DATADIR)/cryptopp/TestData
864  @-$(MKDIR) $(DESTDIR)$(DATADIR)/cryptopp/TestVectors
865  $(CP) TestData/*.dat $(DESTDIR)$(DATADIR)/cryptopp/TestData
866  $(CHMOD) u=rw,go=r $(DESTDIR)$(DATADIR)/cryptopp/TestData/*.dat
867  $(CP) TestVectors/*.txt $(DESTDIR)$(DATADIR)/cryptopp/TestVectors
868  $(CHMOD) u=rw,go=r $(DESTDIR)$(DATADIR)/cryptopp/TestVectors/*.txt
869 
870 # A recipe to install only the library, and not cryptest.exe. Also
871 # see https://github.com/weidai11/cryptopp/issues/653.
872 .PHONY: install-lib
873 install-lib:
874  @-$(MKDIR) $(DESTDIR)$(INCLUDEDIR)/cryptopp
875  $(CP) *.h $(DESTDIR)$(INCLUDEDIR)/cryptopp
876  $(CHMOD) u=rw,go=r $(DESTDIR)$(INCLUDEDIR)/cryptopp/*.h
877 ifneq ($(wildcard libcryptopp.a),)
878  @-$(MKDIR) $(DESTDIR)$(LIBDIR)
879  $(CP) libcryptopp.a $(DESTDIR)$(LIBDIR)
880  $(CHMOD) u=rw,go=r $(DESTDIR)$(LIBDIR)/libcryptopp.a
881 endif
882 ifneq ($(wildcard libcryptopp.dylib),)
883  @-$(MKDIR) $(DESTDIR)$(LIBDIR)
884  $(CP) libcryptopp.dylib $(DESTDIR)$(LIBDIR)
885  $(CHMOD) u=rwx,go=rx $(DESTDIR)$(LIBDIR)/libcryptopp.dylib
886  -install_name_tool -id $(DESTDIR)$(LIBDIR)/libcryptopp.dylib $(DESTDIR)$(LIBDIR)/libcryptopp.dylib
887 endif
888 ifneq ($(wildcard libcryptopp.so$(SOLIB_VERSION_SUFFIX)),)
889  @-$(MKDIR) $(DESTDIR)$(LIBDIR)
890  $(CP) libcryptopp.so$(SOLIB_VERSION_SUFFIX) $(DESTDIR)$(LIBDIR)
891  $(CHMOD) u=rwx,go=rx $(DESTDIR)$(LIBDIR)/libcryptopp.so$(SOLIB_VERSION_SUFFIX)
892 ifeq ($(HAS_SOLIB_VERSION),1)
893  -$(LN) libcryptopp.so$(SOLIB_VERSION_SUFFIX) $(DESTDIR)$(LIBDIR)/libcryptopp.so
894  -$(LN) libcryptopp.so$(SOLIB_VERSION_SUFFIX) $(DESTDIR)$(LIBDIR)/libcryptopp.so$(SOLIB_COMPAT_SUFFIX)
895  $(LDCONF) $(DESTDIR)$(LIBDIR)
896 endif
897 endif
898 ifneq ($(wildcard libcryptopp.pc),)
899  @-$(MKDIR) $(DESTDIR)$(LIBDIR)/pkgconfig
900  $(CP) libcryptopp.pc $(DESTDIR)$(LIBDIR)/pkgconfig
901  $(CHMOD) u=rw,go=r $(DESTDIR)$(LIBDIR)/pkgconfig/libcryptopp.pc
902 endif
903 
904 .PHONY: remove uninstall
905 remove uninstall:
906  -$(RM) -r $(DESTDIR)$(INCLUDEDIR)/cryptopp
907  -$(RM) $(DESTDIR)$(LIBDIR)/libcryptopp.a
908  -$(RM) $(DESTDIR)$(BINDIR)/cryptest.exe
909  @-$(RM) $(DESTDIR)$(LIBDIR)/libcryptopp.dylib
910  @-$(RM) $(DESTDIR)$(LIBDIR)/libcryptopp.so$(SOLIB_VERSION_SUFFIX)
911  @-$(RM) $(DESTDIR)$(LIBDIR)/libcryptopp.so$(SOLIB_COMPAT_SUFFIX)
912  @-$(RM) $(DESTDIR)$(LIBDIR)/libcryptopp.so
913 
914 libcryptopp.a: $(LIBOBJS) $(ANDROID_CPU_OBJ)
915  $(AR) $(ARFLAGS) $@ $(LIBOBJS) $(ANDROID_CPU_OBJ)
916  $(RANLIB) $@
917 
918 ifeq ($(HAS_SOLIB_VERSION),1)
919 .PHONY: libcryptopp.so
920 libcryptopp.so: libcryptopp.so$(SOLIB_VERSION_SUFFIX)
921 endif
922 
923 libcryptopp.so$(SOLIB_VERSION_SUFFIX): $(LIBOBJS) $(ANDROID_CPU_OBJ)
924  $(CXX) -shared $(SOLIB_FLAGS) -o $@ $(strip $(CPPFLAGS) $(CXXFLAGS)) -Wl,--exclude-libs,ALL $(LIBOBJS) $(ANDROID_CPU_OBJ) $(LDFLAGS) $(LDLIBS)
925 ifeq ($(HAS_SOLIB_VERSION),1)
926  -$(LN) libcryptopp.so$(SOLIB_VERSION_SUFFIX) libcryptopp.so
927  -$(LN) libcryptopp.so$(SOLIB_VERSION_SUFFIX) libcryptopp.so$(SOLIB_COMPAT_SUFFIX)
928 endif
929 
930 libcryptopp.dylib: $(LIBOBJS)
931  $(CXX) -dynamiclib -o $@ $(strip $(CPPFLAGS) $(CXXFLAGS)) -install_name "$@" -current_version "$(LIB_MAJOR).$(LIB_MINOR).$(LIB_PATCH)" -compatibility_version "$(LIB_MAJOR).$(LIB_MINOR)" -headerpad_max_install_names $(LDFLAGS) $(LIBOBJS)
932 
933 cryptest.exe: $(LINK_LIBRARY) $(TESTOBJS)
934  $(CXX) -o $@ $(strip $(CPPFLAGS) $(CXXFLAGS)) $(TESTOBJS) $(LINK_LIBRARY_PATH)$(LINK_LIBRARY) $(LDFLAGS) $(LDLIBS)
935 
936 # Used to generate list of source files for Autotools, CMakeList and Android.mk
937 .PHONY: sources
938 sources:
939  $(info ***** Library sources *****)
940  $(info $(filter-out $(TESTSRCS),$(SRCS)))
941  $(info )
942  $(info ***** Library headers *****)
943  $(info $(filter-out $(TESTINCL),$(INCL)))
944  $(info )
945  $(info ***** Test sources *****)
946  $(info $(TESTSRCS))
947  $(info )
948  $(info ***** Test headers *****)
949  $(info $(TESTINCL))
950 
951 adhoc.cpp: adhoc.cpp.proto
952 ifeq ($(wildcard adhoc.cpp),)
953  cp adhoc.cpp.proto adhoc.cpp
954 else
955  touch adhoc.cpp
956 endif
957 
958 # Include dependencies, if present. You must issue `make deps` to create them.
959 ifeq ($(wildcard GNUmakefile.deps),GNUmakefile.deps)
960 -include GNUmakefile.deps
961 endif # Dependencies
962 
963 # A few recipes trigger warnings for -std=c++11 and -stdlib=c++
964 NOSTD_CXXFLAGS=$(filter-out -stdlib=%,$(filter-out -std=%,$(CXXFLAGS)))
965 
966 # Cryptogams ARM asm implementation. AES needs -mthumb for Clang
967 aes_armv4.o : aes_armv4.S
968  $(CXX) $(strip $(CPPFLAGS) $(ASFLAGS) $(NOSTD_CXXFLAGS) $(CRYPTOGAMS_ARM_THUMB_FLAG) -c) $<
969 
970 # Use C++ compiler on C source after patching.
971 # https://github.com/weidai11/cryptopp/issues/926
972 cpu-features.o: cpu-features.h cpu-features.c
973  $(CXX) -x c $(strip $(CPPFLAGS) $(NOSTD_CXXFLAGS) -c) cpu-features.c
974 
975 # SSSE3 or NEON available
976 aria_simd.o : aria_simd.cpp
977  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(ARIA_FLAG) -c) $<
978 
979 # SSE, NEON or POWER7 available
980 blake2s_simd.o : blake2s_simd.cpp
981  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(BLAKE2S_FLAG) -c) $<
982 
983 # SSE, NEON or POWER8 available
984 blake2b_simd.o : blake2b_simd.cpp
985  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(BLAKE2B_FLAG) -c) $<
986 
987 # SSE2 or NEON available
988 chacha_simd.o : chacha_simd.cpp
989  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(CHACHA_FLAG) -c) $<
990 
991 # AVX2 available
992 chacha_avx.o : chacha_avx.cpp
993  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(CHACHA_AVX2_FLAG) -c) $<
994 
995 # SSSE3 available
996 cham_simd.o : cham_simd.cpp
997  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(CHAM_FLAG) -c) $<
998 
999 # SSE2 on i686
1000 donna_sse.o : donna_sse.cpp
1001  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SSE2_FLAG) -c) $<
1002 
1003 # SSE2 on i686
1004 sse_simd.o : sse_simd.cpp
1005  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SSE2_FLAG) -c) $<
1006 
1007 # SSE4.2 or ARMv8a available
1008 crc_simd.o : crc_simd.cpp
1009  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(CRC_FLAG) -c) $<
1010 
1011 # PCLMUL or ARMv7a/ARMv8a available
1012 gcm_simd.o : gcm_simd.cpp
1013  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(GCM_FLAG) -c) $<
1014 
1015 # Carryless multiply
1016 gf2n_simd.o : gf2n_simd.cpp
1017  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(GF2N_FLAG) -c) $<
1018 
1019 # SSSE3 available
1020 keccak_simd.o : keccak_simd.cpp
1021  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(KECCAK_FLAG) -c) $<
1022 
1023 # SSSE3 available
1024 lea_simd.o : lea_simd.cpp
1025  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(LEA_FLAG) -c) $<
1026 
1027 # SSSE3 available
1028 lsh256_sse.o : lsh256_sse.cpp
1029  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(LSH256_FLAG) -c) $<
1030 
1031 # AVX2 available
1032 lsh256_avx.o : lsh256_avx.cpp
1033  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(LSH256_AVX2_FLAG) -c) $<
1034 
1035 # SSSE3 available
1036 lsh512_sse.o : lsh512_sse.cpp
1037  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(LSH512_FLAG) -c) $<
1038 
1039 # AVX2 available
1040 lsh512_avx.o : lsh512_avx.cpp
1041  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(LSH512_AVX2_FLAG) -c) $<
1042 
1043 # NEON available
1044 neon_simd.o : neon_simd.cpp
1045  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(NEON_FLAG) -c) $<
1046 
1047 # AESNI or ARMv7a/ARMv8a available
1048 rijndael_simd.o : rijndael_simd.cpp
1049  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(AES_FLAG) -c) $<
1050 
1051 # SSE4.2/SHA-NI or ARMv8a available
1052 sha_simd.o : sha_simd.cpp
1053  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SHA_FLAG) -c) $<
1054 
1055 # Cryptogams SHA1/SHA256/SHA512 asm implementation.
1056 sha%_armv4.o : sha%_armv4.S
1057  $(CXX) $(strip $(CPPFLAGS) $(ASFLAGS) $(NOSTD_CXXFLAGS) $(CRYPTOGAMS_ARM_FLAG) -c) $<
1058 
1059 # SSE4.2/SHA-NI or ARMv8a available
1060 shacal2_simd.o : shacal2_simd.cpp
1061  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SHA_FLAG) -c) $<
1062 
1063 # SSSE3, NEON or POWER8 available
1064 simon128_simd.o : simon128_simd.cpp
1065  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SIMON128_FLAG) -c) $<
1066 
1067 # SSSE3, NEON or POWER8 available
1068 speck128_simd.o : speck128_simd.cpp
1069  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SPECK128_FLAG) -c) $<
1070 
1071 # ARMv8.4 available
1072 sm3_simd.o : sm3_simd.cpp
1073  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SM3_FLAG) -c) $<
1074 
1075 # AESNI available
1076 sm4_simd.o : sm4_simd.cpp
1077  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) $(SM4_FLAG) -c) $<
1078 
1079 %.o : %.cpp
1080  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS) -c) $<
1081 
1082 .PHONY: dep deps depend
1083 dep deps depend GNUmakefile.deps:
1084  $(CXX) $(strip $(CPPFLAGS) $(CXXFLAGS)) -MM *.cpp > GNUmakefile.deps