2 ###########################################################
3 ##### System Attributes and Programs #####
4 ###########################################################
6 # https://www.gnu.org/software/make/manual/make.html#Makefile-Conventions
7 # and https://www.gnu.org/prep/standards/standards.html
13 # Used for ARMv7 and NEON.
15 # Used for feature tests
17 TOUT := $(strip $(TOUT))
19 # Command and arguments
21 ARFLAGS ?= -cr # ar needs the dash on OpenBSD
31 LDCONF ?= /sbin/ldconfig -n
34 INSTALL_PROGRAM = $(INSTALL)
35 INSTALL_DATA = $(INSTALL) -m 644
37 # Solaris provides a non-Posix grep at /usr/bin
38 ifneq ($(wildcard /usr/xpg4/bin/grep),)
39 GREP ?= /usr/xpg4/bin/grep
44 # Attempt to determine target machine, fallback to "this" machine.
45 # The target machine is the one the package runs on. Most people
46 # call this the "target", but not Autotools.
47 HOSTX := $(shell $(CXX) $(CXXFLAGS) -dumpmachine 2>/dev/null | cut -f 1 -d '-')
49 HOSTX := $(shell uname -m 2>/dev/null)
52 IS_X86 := $(shell echo "$(HOSTX)" | $(GREP) -v "64" | $(GREP) -i -c -E 'i.86|x86|i86')
53 IS_X64 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E '_64|d64')
54 IS_PPC32 := $(shell echo "$(HOSTX)" | $(GREP) -v "64" | $(GREP) -i -c -E 'ppc|power')
55 IS_PPC64 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'ppc64|powerpc64|power64')
56 IS_SPARC32 := $(shell echo "$(HOSTX)" | $(GREP) -v "64" | $(GREP) -i -c -E 'sun|sparc')
57 IS_SPARC64 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'sun|sparc64')
58 IS_ARM32 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'arm|armhf|arm7l|eabihf')
59 IS_ARMV8 := $(shell echo "$(HOSTX)" | $(GREP) -i -c -E 'aarch32|aarch64|arm64|armv8')
61 IS_NEON := $(shell $(CXX) $(CXXFLAGS) -dumpmachine 2>/dev/null | $(GREP) -i -c -E 'armv7|armhf|arm7l|eabihf|armv8|aarch32|aarch64')
63 # Attempt to determine platform
64 SYSTEMX := $(shell $(CXX) $(CXXFLAGS) -dumpmachine 2>/dev/null)
66 SYSTEMX := $(shell uname -s 2>/dev/null)
69 IS_LINUX := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "Linux")
70 IS_MINGW := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "MinGW")
71 IS_CYGWIN := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "Cygwin")
72 IS_DARWIN := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "Darwin")
73 IS_NETBSD := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "NetBSD")
74 IS_AIX := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c "aix")
75 IS_SUN := $(shell echo "$(SYSTEMX)" | $(GREP) -i -c -E "SunOS|Solaris")
77 SUN_COMPILER := $(shell $(CXX) -V 2>&1 | $(GREP) -i -c -E 'CC: (Sun|Studio)')
78 GCC_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -v -E '(llvm|clang)' | $(GREP) -i -c -E '(gcc|g\+\+)')
79 XLC_COMPILER := $(shell $(CXX) -qversion 2>/dev/null |$(GREP) -i -c "IBM XL")
80 CLANG_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -i -c -E '(llvm|clang)')
81 INTEL_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -i -c '\(icc\)')
83 # Various Port compilers on OS X
84 MACPORTS_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -i -c "macports")
85 HOMEBREW_COMPILER := $(shell $(CXX) --version 2>/dev/null | $(GREP) -i -c "homebrew")
87 ifneq ($(MACPORTS_COMPILER)$(HOMEBREW_COMPILER),00)
92 # Enable shared object versioning for Linux and Solaris
93 HAS_SOLIB_VERSION ?= 0
94 ifneq ($(IS_LINUX)$(IS_SUN),00)
95 HAS_SOLIB_VERSION := 1
98 # Formely adhoc.cpp was created from adhoc.cpp.proto when needed.
99 ifeq ($(wildcard adhoc.cpp),)
100 $(shell cp adhoc.cpp.proto adhoc.cpp)
103 # Tell MacPorts and Homebrew GCC to use Clang integrated assembler
104 # http://github.com/weidai11/cryptopp/issues/190
105 ifeq ($(GCC_COMPILER)$(OSXPORT_COMPILER),11)
106 ifeq ($(findstring -Wa,-q,$(CXXFLAGS)),)
111 # Hack to skip CPU feature tests for some recipes
113 ifeq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CXXFLAGS)),-DCRYPTOPP_DISABLE_ASM)
115 else ifeq ($(findstring clean,$(MAKECMDGOALS)),clean)
117 else ifeq ($(findstring distclean,$(MAKECMDGOALS)),distclean)
119 else ifeq ($(findstring distclean,$(MAKECMDGOALS)),trim)
123 # Strip out -Wall, -Wextra and friends for feature testing
124 ifeq ($(DETECT_FEATURES),1)
125 TCXXFLAGS := $(filter-out -Wall -Wextra -Werror% -Wunused -Wconversion -Wp%, $(CXXFLAGS))
126 ifneq ($(strip $(TCXXFLAGS)),)
127 $(info Using testing flags: $(TCXXFLAGS))
133 TPROG = TestPrograms/test_64bit.cxx
134 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
135 ifeq ($(strip $(HAVE_OPT)),0)
142 # libc++ is LLVM's standard C++ library. If we add libc++
143 # here then all user programs must use it too. The open
144 # question is, which choice is easier on users?
145 ifneq ($(IS_DARWIN),0)
147 # CXXFLAGS += -stdlib=libc++
152 ###########################################################
153 ##### General Variables #####
154 ###########################################################
156 # Base CXXFLAGS used if the user did not specify them
157 ifeq ($(SUN_COMPILER),1)
158 CXXFLAGS ?= -DNDEBUG -g -xO3
161 CXXFLAGS ?= -DNDEBUG -g2 -O3
165 # On ARM we may compile aes_armv4.S though the CC compiler
166 ifeq ($(GCC_COMPILER),1)
168 else ifeq ($(CLANG_COMPILER),1)
172 # Default prefix for make install
177 # http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
179 DATADIR := $(PREFIX)/share
182 LIBDIR := $(PREFIX)/lib
185 BINDIR := $(PREFIX)/bin
187 ifeq ($(INCLUDEDIR),)
188 INCLUDEDIR := $(PREFIX)/include
191 # Fix CXX on Cygwin 1.1.4
196 # We honor ARFLAGS, but the "v" option used by default causes a noisy make
201 # Clang integrated assembler will be used with -Wa,-q
202 CLANG_INTEGRATED_ASSEMBLER ?= 0
204 # Original MinGW targets Win2k by default, but lacks proper Win2k support
205 # if target Windows version is not specified, use Windows XP instead
207 ifeq ($(findstring -D_WIN32_WINNT,$(CXXFLAGS)),)
208 ifeq ($(findstring -D_WIN32_WINDOWS,$(CXXFLAGS)),)
209 ifeq ($(findstring -DWINVER,$(CXXFLAGS)),)
210 ifeq ($(findstring -DNTDDI_VERSION,$(CXXFLAGS)),)
211 CXXFLAGS += -D_WIN32_WINNT=0x0501
212 endif # NTDDI_VERSION
214 endif # _WIN32_WINDOWS
218 # Newlib needs _XOPEN_SOURCE=600 for signals
219 TPROG = TestPrograms/test_newlib.cxx
220 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
221 ifeq ($(strip $(HAVE_OPT)),0)
222 ifeq ($(findstring -D_XOPEN_SOURCE,$(CXXFLAGS)),)
223 CXXFLAGS += -D_XOPEN_SOURCE=600
227 ###########################################################
228 ##### X86/X32/X64 Options #####
229 ###########################################################
231 ifneq ($(IS_X86)$(IS_X64),00)
232 ifeq ($(DETECT_FEATURES),1)
234 ifeq ($(SUN_COMPILER),1)
235 SSE2_FLAG = -xarch=sse2
236 SSE3_FLAG = -xarch=sse3
237 SSSE3_FLAG = -xarch=ssse3
238 SSE41_FLAG = -xarch=sse4_1
239 SSE42_FLAG = -xarch=sse4_2
240 CLMUL_FLAG = -xarch=aes
241 AESNI_FLAG = -xarch=aes
242 AVX_FLAG = -xarch=avx
243 AVX2_FLAG = -xarch=avx2
244 SHANI_FLAG = -xarch=sha
249 SSE41_FLAG = -msse4.1
250 SSE42_FLAG = -msse4.2
251 CLMUL_FLAG = -mpclmul
258 TPROG = TestPrograms/test_x86_sse2.cxx
260 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
261 ifeq ($(strip $(HAVE_OPT)),0)
262 CHACHA_FLAG = $(SSE2_FLAG)
263 SUN_LDFLAGS += $(SSE2_FLAG)
268 TPROG = TestPrograms/test_x86_ssse3.cxx
270 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
271 ifeq ($(strip $(HAVE_OPT)),0)
272 ARIA_FLAG = $(SSSE3_FLAG)
273 CHAM_FLAG = $(SSSE3_FLAG)
274 LEA_FLAG = $(SSSE3_FLAG)
275 SIMECK_FLAG = $(SSSE3_FLAG)
276 SIMON64_FLAG = $(SSSE3_FLAG)
277 SIMON128_FLAG = $(SSSE3_FLAG)
278 SPECK64_FLAG = $(SSSE3_FLAG)
279 SPECK128_FLAG = $(SSSE3_FLAG)
280 SUN_LDFLAGS += $(SSSE3_FLAG)
285 TPROG = TestPrograms/test_x86_sse41.cxx
287 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
288 ifeq ($(strip $(HAVE_OPT)),0)
289 BLAKE2B_FLAG = $(SSE41_FLAG)
290 BLAKE2S_FLAG = $(SSE41_FLAG)
291 SIMON64_FLAG = $(SSE41_FLAG)
292 SPECK64_FLAG = $(SSE41_FLAG)
293 SUN_LDFLAGS += $(SSE41_FLAG)
298 TPROG = TestPrograms/test_x86_sse42.cxx
300 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
301 ifeq ($(strip $(HAVE_OPT)),0)
302 CRC_FLAG = $(SSE42_FLAG)
303 SUN_LDFLAGS += $(SSE42_FLAG)
308 TPROG = TestPrograms/test_x86_clmul.cxx
310 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
311 ifeq ($(strip $(HAVE_OPT)),0)
312 GCM_FLAG = $(SSSE3_FLAG) $(CLMUL_FLAG)
313 SUN_LDFLAGS += $(CLMUL_FLAG)
318 TPROG = TestPrograms/test_x86_aes.cxx
320 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
321 ifeq ($(strip $(HAVE_OPT)),0)
322 AES_FLAG = $(SSE41_FLAG) $(AESNI_FLAG)
323 SM4_FLAG = $(SSSE3_FLAG) $(AESNI_FLAG)
324 SUN_LDFLAGS += $(AESNI_FLAG)
329 TPROG = TestPrograms/test_x86_avx.cxx
331 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
332 ifeq ($(strip $(HAVE_OPT)),0)
333 # XXX_FLAG = $(AVX_FLAG)
334 SUN_LDFLAGS += $(AVX_FLAG)
339 TPROG = TestPrograms/test_x86_avx2.cxx
341 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
342 ifeq ($(strip $(HAVE_OPT)),0)
343 CHACHA_AVX2_FLAG = $(AVX2_FLAG)
344 SUN_LDFLAGS += $(AVX2_FLAG)
349 TPROG = TestPrograms/test_x86_sha.cxx
351 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
352 ifeq ($(strip $(HAVE_OPT)),0)
353 SHA_FLAG = $(SSE42_FLAG) $(SHANI_FLAG)
354 SUN_LDFLAGS += $(SHANI_FLAG)
359 ifeq ($(SUN_COMPILER),1)
360 LDFLAGS += $(SUN_LDFLAGS)
364 CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
365 else ifeq ($(SSE3_FLAG),)
366 CXXFLAGS += -DCRYPTOPP_DISABLE_SSE3
367 else ifeq ($(SSSE3_FLAG),)
368 CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3
369 else ifeq ($(SSE41_FLAG),)
370 CXXFLAGS += -DCRYPTOPP_DISABLE_SSE4
371 else ifeq ($(SSE42_FLAG),)
372 CXXFLAGS += -DCRYPTOPP_DISABLE_SSE4
375 ifneq ($(SSE42_FLAG),)
377 # Unusual GCC/Clang on Macports. It assembles AES, but not CLMUL.
378 # test_x86_clmul.s:15: no such instruction: 'pclmulqdq $0, %xmm1,%xmm0'
379 ifeq ($(CLMUL_FLAG),)
380 CXXFLAGS += -DCRYPTOPP_DISABLE_CLMUL
382 ifeq ($(AESNI_FLAG),)
383 CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI
387 CXXFLAGS += -DCRYPTOPP_DISABLE_AVX
388 else ifeq ($(AVX2_FLAG),)
389 CXXFLAGS += -DCRYPTOPP_DISABLE_AVX2
390 else ifeq ($(SHANI_FLAG),)
391 CXXFLAGS += -DCRYPTOPP_DISABLE_SHANI
398 ifneq ($(INTEL_COMPILER),0)
399 CXXFLAGS += -wd68 -wd186 -wd279 -wd327 -wd161 -wd3180
401 ICC111_OR_LATER := $(shell $(CXX) --version 2>&1 | $(GREP) -c -E "\(ICC\) ([2-9][0-9]|1[2-9]|11\.[1-9])")
402 ifeq ($(ICC111_OR_LATER),0)
403 # "internal error: backend signals" occurs on some x86 inline assembly with ICC 9 and
404 # some x64 inline assembly with ICC 11.0. If you want to use Crypto++'s assembly code
405 # with ICC, try enabling it on individual files
406 CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
410 # Allow use of "/" operator for GNU Assembler.
411 # http://sourceware.org/bugzilla/show_bug.cgi?id=4572
412 ifeq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CXXFLAGS)),)
413 ifeq ($(IS_SUN)$(GCC_COMPILER),11)
414 CXXFLAGS += -Wa,--divide
418 # Most Clang cannot handle mixed asm with positional arguments, where the
419 # body is Intel style with no prefix and the templates are AT&T style.
420 # Also see https://bugs.llvm.org/show_bug.cgi?id=39895 .
421 TPROG = TestPrograms/test_mixed_asm.cxx
422 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
423 ifneq ($(strip $(HAVE_OPT)),0)
424 CXXFLAGS += -DCRYPTOPP_DISABLE_MIXED_ASM
427 # IS_X86, IS_X32 and IS_X64
430 ###########################################################
431 ##### ARM A-32, Aach64 and NEON #####
432 ###########################################################
434 ifneq ($(IS_ARM32)$(IS_ARMV8)$(IS_NEON),000)
435 ifeq ($(DETECT_FEATURES),1)
437 ifeq ($(IS_ARM32)$(IS_NEON),11)
439 TPROG = TestPrograms/test_arm_neon.cxx
440 TOPT = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
441 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
442 ifeq ($(strip $(HAVE_OPT)),0)
443 NEON_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
444 ARIA_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
445 AES_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
446 CRC_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
447 GCM_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
448 BLAKE2B_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
449 BLAKE2S_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
450 CHACHA_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
451 CHAM_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
452 LEA_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
453 SHA_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
454 SIMECK_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
455 SIMON64_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
456 SIMON128_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
457 SPECK64_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
458 SPECK128_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
459 SM4_FLAG = -march=armv7-a -mfloat-abi=$(FP_ABI) -mfpu=neon
461 CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
469 TPROG = TestPrograms/test_arm_acle.cxx
470 TOPT = -march=armv8-a
471 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
472 ifeq ($(strip $(HAVE_OPT)),0)
473 ACLE_FLAG += -DCRYPTOPP_ARM_ACLE_AVAILABLE=1
475 CXXFLAGS += -DCRYPTOPP_ARM_ACLE_AVAILABLE=0
478 TPROG = TestPrograms/test_arm_asimd.cxx
479 TOPT = -march=armv8-a
480 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
481 ifeq ($(strip $(HAVE_OPT)),0)
482 ASIMD_FLAG = -march=armv8-a
483 ARIA_FLAG = -march=armv8-a
484 BLAKE2B_FLAG = -march=armv8-a
485 BLAKE2S_FLAG = -march=armv8-a
486 CHACHA_FLAG = -march=armv8-a
487 CHAM_FLAG = -march=armv8-a
488 LEA_FLAG = -march=armv8-a
489 NEON_FLAG = -march=armv8-a
490 SIMECK_FLAG = -march=armv8-a
491 SIMON64_FLAG = -march=armv8-a
492 SIMON128_FLAG = -march=armv8-a
493 SPECK64_FLAG = -march=armv8-a
494 SPECK128_FLAG = -march=armv8-a
495 SM4_FLAG = -march=armv8-a
497 CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
500 ifneq ($(ASIMD_FLAG),)
501 TPROG = TestPrograms/test_arm_crc.cxx
502 TOPT = -march=armv8-a+crc
503 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
504 ifeq ($(strip $(HAVE_OPT)),0)
505 CRC_FLAG = -march=armv8-a+crc
507 CXXFLAGS += -DCRYPTOPP_ARM_CRC32_AVAILABLE=0
510 TPROG = TestPrograms/test_arm_aes.cxx
511 TOPT = -march=armv8-a+crypto
512 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
513 ifeq ($(strip $(HAVE_OPT)),0)
514 AES_FLAG = -march=armv8-a+crypto
516 CXXFLAGS += -DCRYPTOPP_ARM_AES_AVAILABLE=0
519 TPROG = TestPrograms/test_arm_pmull.cxx
520 TOPT = -march=armv8-a+crypto
521 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
522 ifeq ($(strip $(HAVE_OPT)),0)
523 GCM_FLAG = -march=armv8-a+crypto
525 CXXFLAGS += -DCRYPTOPP_ARM_PMULL_AVAILABLE=0
528 TPROG = TestPrograms/test_arm_sha.cxx
529 TOPT = -march=armv8-a+crypto
530 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
531 ifeq ($(strip $(HAVE_OPT)),0)
532 SHA_FLAG = -march=armv8-a+crypto
534 CXXFLAGS += -DCRYPTOPP_ARM_SHA_AVAILABLE=0
537 TPROG = TestPrograms/test_arm_sm3.cxx
538 TOPT = -march=armv8.4-a+crypto
539 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
540 ifeq ($(strip $(HAVE_OPT)),0)
541 SM3_FLAG = -march=armv8.4-a+crypto
542 SM4_FLAG = -march=armv8.4-a+crypto
545 TPROG = TestPrograms/test_arm_sha3.cxx
546 TOPT = -march=armv8.4-a+crypto
547 HAVE_OPT = $(shell $(CXX) $(CXXFLAGS) $(ACLE_FLAG) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
548 ifeq ($(strip $(HAVE_OPT)),0)
549 SHA3_FLAG = -march=armv8.4-a+crypto
561 # IS_ARM32, IS_ARMV8, IS_NEON
564 ###########################################################
566 ###########################################################
568 # PowerPC and PowerPC-64. Altivec is available with POWER4 with GCC and
569 # POWER6 with XLC. The tests below are crafted for IBM XLC and the LLVM
570 # front-end. XLC/LLVM only supplies POWER8 so we have to set the flags for
571 # XLC/LLVM to POWER8. I've got a feeling LLVM is going to cause trouble.
572 ifneq ($(IS_PPC32)$(IS_PPC64),00)
573 ifeq ($(DETECT_FEATURES),1)
575 ifeq ($(XLC_COMPILER),1)
576 POWER9_FLAG = -qarch=pwr9 -qaltivec
577 POWER8_FLAG = -qarch=pwr8 -qaltivec
578 POWER7_FLAG = -qarch=pwr7 -qaltivec
579 POWER6_FLAG = -qarch=pwr6 -qaltivec
580 POWER5_FLAG = -qarch=pwr5 -qaltivec
581 POWER4_FLAG = -qarch=pwr4 -qaltivec
582 ALTIVEC_FLAG = -qaltivec
584 POWER9_FLAG = -mcpu=power9 -maltivec
585 POWER8_FLAG = -mcpu=power8 -maltivec
586 POWER7_FLAG = -mcpu=power7 -maltivec
587 ALTIVEC_FLAG = -maltivec
590 # XLC with LLVM front-ends failed to define XLC defines.
591 #ifeq ($(findstring -qxlcompatmacros,$(CXXFLAGS)),)
592 # TPROG = TestPrograms/test_ppc_altivec.cxx
593 # TOPT = -qxlcompatmacros
594 # HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
595 # ifeq ($(strip $(HAVE_OPT)),0)
596 # CXXFLAGS += -qxlcompatmacros
600 #####################################################################
601 # Looking for a POWER8 option
603 TPROG = TestPrograms/test_ppc_power9.cxx
604 TOPT = $(POWER9_FLAG)
605 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
606 ifeq ($(strip $(HAVE_OPT)),0)
607 # DARN_FLAG = $(POWER9_FLAG)
612 TPROG = TestPrograms/test_ppc_power8.cxx
613 TOPT = $(POWER8_FLAG)
614 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
615 ifeq ($(strip $(HAVE_OPT)),0)
616 BLAKE2B_FLAG = $(POWER8_FLAG)
617 CRC_FLAG = $(POWER8_FLAG)
618 GCM_FLAG = $(POWER8_FLAG)
619 AES_FLAG = $(POWER8_FLAG)
620 SHA_FLAG = $(POWER8_FLAG)
621 SHACAL2_FLAG = $(POWER8_FLAG)
622 SIMON128_FLAG = $(POWER8_FLAG)
623 SPECK128_FLAG = $(POWER8_FLAG)
628 #####################################################################
629 # Looking for a POWER7 option
631 TPROG = TestPrograms/test_ppc_power7.cxx
632 TOPT = $(POWER7_FLAG)
633 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
634 ifeq ($(strip $(HAVE_OPT)),0)
635 ARIA_FLAG = $(POWER7_FLAG)
636 BLAKE2S_FLAG = $(POWER7_FLAG)
637 CHACHA_FLAG = $(POWER7_FLAG)
638 CHAM_FLAG = $(POWER7_FLAG)
639 LEA_FLAG = $(POWER7_FLAG)
640 SIMECK_FLAG = $(POWER7_FLAG)
641 SIMON64_FLAG = $(POWER7_FLAG)
642 SPECK64_FLAG = $(POWER7_FLAG)
647 #####################################################################
648 # Looking for an Altivec option
650 TPROG = TestPrograms/test_ppc_altivec.cxx
651 TOPT = $(ALTIVEC_FLAG)
652 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
653 ifneq ($(strip $(HAVE_OPT)),0)
658 ifeq ($(XLC_COMPILER)$(ALTIVEC_FLAG),1)
659 TPROG = TestPrograms/test_ppc_altivec.cxx
660 TOPT = $(POWER4_FLAG)
661 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
662 ifeq ($(strip $(HAVE_OPT)),0)
663 ALTIVEC_FLAG = $(POWER4_FLAG)
665 TPROG = TestPrograms/test_ppc_altivec.cxx
666 TOPT = $(POWER5_FLAG)
667 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
668 ifeq ($(strip $(HAVE_OPT)),0)
669 ALTIVEC_FLAG = $(POWER5_FLAG)
671 TPROG = TestPrograms/test_ppc_altivec.cxx
672 TOPT = $(POWER6_FLAG)
673 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
674 ifeq ($(strip $(HAVE_OPT)),0)
675 ALTIVEC_FLAG = $(POWER6_FLAG)
683 #####################################################################
684 # Fixups for algorithms that can drop to a lower ISA, if needed
686 # Drop to Power7 if Power8 is not available.
687 ifeq ($(POWER8_FLAG),)
688 ifneq ($(POWER7_FLAG),)
689 GCM_FLAG = $(POWER7_FLAG)
693 # Drop to Power4 if Power7 not available
694 ifeq ($(POWER7_FLAG),)
695 ifneq ($(ALTIVEC_FLAG),)
696 BLAKE2S_FLAG = $(ALTIVEC_FLAG)
697 CHACHA_FLAG = $(ALTIVEC_FLAG)
698 SIMON64_FLAG = $(ALTIVEC_FLAG)
699 SPECK64_FLAG = $(ALTIVEC_FLAG)
703 #####################################################################
704 # Fixups for missing ISAs
706 ifeq ($(ALTIVEC_FLAG),)
707 CXXFLAGS += -DCRYPTOPP_DISABLE_ALTIVEC
708 else ifeq ($(POWER8_FLAG)$(POWER7_FLAG),)
709 CXXFLAGS += -DCRYPTOPP_DISABLE_POWER7
710 else ifeq ($(POWER8_FLAG),)
711 CXXFLAGS += -DCRYPTOPP_DISABLE_POWER8
712 else ifeq ($(POWER9_FLAG),)
713 CXXFLAGS += -DCRYPTOPP_DISABLE_POWER9
719 # IBM XL C/C++ compiler
720 ifeq ($(XLC_COMPILER),1)
721 ifeq ($(findstring -qmaxmem,$(CXXFLAGS)),)
722 CXXFLAGS += -qmaxmem=-1
724 # http://www-01.ibm.com/support/docview.wss?uid=swg21007500
725 ifeq ($(findstring -qrtti,$(CXXFLAGS)),)
733 ###########################################################
735 ###########################################################
737 # Add -fPIC for targets *except* X86, X32, Cygwin or MinGW
738 ifeq ($(IS_X86)$(IS_CYGWIN)$(IS_MINGW),000)
739 ifeq ($(findstring -fpic,$(CXXFLAGS))$(findstring -fPIC,$(CXXFLAGS)),)
744 # Use -pthread whenever it is available. See http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf
745 # http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling
746 ifeq ($(DETECT_FEATURES),1)
747 ifeq ($(XLC_COMPILER),1)
748 ifeq ($(findstring -qthreaded,$(CXXFLAGS)),)
749 TPROG = TestPrograms/test_pthreads.cxx
751 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
752 ifeq ($(strip $(HAVE_OPT)),0)
753 CXXFLAGS += -qthreaded
757 ifeq ($(findstring -pthread,$(CXXFLAGS)),)
758 TPROG = TestPrograms/test_pthreads.cxx
760 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
761 ifeq ($(strip $(HAVE_OPT)),0)
765 endif # XLC/GCC and friends
766 endif # DETECT_FEATURES
768 # Remove -fPIC if present. SunCC use -KPIC, and needs the larger GOT table
769 # https://docs.oracle.com/cd/E19205-01/819-5267/bkbaq/index.html
770 ifeq ($(SUN_COMPILER),1)
771 CXXFLAGS := $(subst -fPIC,-KPIC,$(CXXFLAGS))
772 CXXFLAGS := $(subst -fpic,-KPIC,$(CXXFLAGS))
775 # Remove -fPIC if present. IBM XL C/C++ use -qpic
776 ifeq ($(XLC_COMPILER),1)
777 CXXFLAGS := $(subst -fPIC,-qpic,$(CXXFLAGS))
778 CXXFLAGS := $(subst -fpic,-qpic,$(CXXFLAGS))
781 # Add -xregs=no%appl SPARC. SunCC should not use certain registers in library code.
782 # https://docs.oracle.com/cd/E18659_01/html/821-1383/bkamt.html
783 ifeq ($(IS_SUN)$(SUN_COMPILER),11)
784 ifneq ($(IS_SPARC32)$(IS_SPARC64),00)
785 ifeq ($(findstring -xregs=no%appl,$(CXXFLAGS)),)
786 CXXFLAGS += -xregs=no%appl
791 # Add -pipe for everything except IBM XL C/C++, SunCC and ARM.
792 # Allow ARM-64 because they seems to have >1 GB of memory
793 ifeq ($(XLC_COMPILER)$(SUN_COMPILER)$(IS_ARM32),000)
794 ifeq ($(findstring -save-temps,$(CXXFLAGS)),)
799 # For SunOS, create a Mapfile that allows our object files
800 # to contain additional bits (like SSE4 and AES on old Xeon)
801 # http://www.oracle.com/technetwork/server-storage/solaris/hwcap-modification-139536.html
802 ifeq ($(IS_SUN)$(SUN_COMPILER),11)
803 ifneq ($(IS_X86)$(IS_X64),00)
804 ifeq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CXXFLAGS)),)
805 LDFLAGS += -M cryptopp.mapfile
806 endif # No CRYPTOPP_DISABLE_ASM
810 # TODO: can we remove this since removing sockets?
811 ifneq ($(IS_MINGW),0)
815 # TODO: can we remove this since removing sockets?
817 LDLIBS += -lnsl -lsocket
821 ifeq ($(findstring -fopenmp,$(CXXFLAGS)),-fopenmp)
822 ifeq ($(findstring -lgomp,$(LDLIBS)),)
828 # Add -errtags=yes to get the name for a warning suppression
829 ifneq ($(SUN_COMPILER),0) # override flags for CC Sun C++ compiler
831 CXXFLAGS += -template=no%extdef
832 SUN_CC10_BUGGY := $(shell $(CXX) -V 2>&1 | $(GREP) -c -E "CC: Sun .* 5\.10 .* (2009|2010/0[1-4])")
833 ifneq ($(SUN_CC10_BUGGY),0)
834 # -DCRYPTOPP_INCLUDE_VECTOR_CC is needed for Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
835 # and was fixed in May 2010. Remove it if you get "already had a body defined" errors in vector.cc
836 CXXFLAGS += -DCRYPTOPP_INCLUDE_VECTOR_CC
843 # No ASM for Travis testing
844 ifeq ($(findstring no-asm,$(MAKECMDGOALS)),no-asm)
845 ifeq ($(findstring -DCRYPTOPP_DISABLE_ASM,$(CXXFLAGS)),)
846 CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
850 # Native build testing. Issue 'make native'.
851 ifeq ($(findstring native,$(MAKECMDGOALS)),native)
854 # Try GCC and compatibles first
855 TPROG = TestPrograms/test_cxx.cxx
857 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
858 ifeq ($(strip $(HAVE_OPT)),0)
859 NATIVE_OPT = -march=native
863 ifeq ($(NATIVE_OPT),)
865 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
866 ifeq ($(strip $(HAVE_OPT)),0)
871 ifneq ($(NATIVE_OPT),)
872 CXXFLAGS += $(NATIVE_OPT)
877 # Undefined Behavior Sanitizer (UBsan) testing. Issue 'make ubsan'.
878 ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
879 CXXFLAGS := $(CXXFLAGS:-g%=-g3)
880 CXXFLAGS := $(CXXFLAGS:-O%=-O1)
881 CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
882 ifeq ($(findstring -fsanitize=undefined,$(CXXFLAGS)),)
883 CXXFLAGS += -fsanitize=undefined
885 ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CXXFLAGS)),)
886 CXXFLAGS += -DCRYPTOPP_COVERAGE
890 # Address Sanitizer (Asan) testing. Issue 'make asan'.
891 ifeq ($(findstring asan,$(MAKECMDGOALS)),asan)
892 CXXFLAGS := $(CXXFLAGS:-g%=-g3)
893 CXXFLAGS := $(CXXFLAGS:-O%=-O1)
894 CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
895 ifeq ($(findstring -fsanitize=address,$(CXXFLAGS)),)
896 CXXFLAGS += -fsanitize=address
898 ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CXXFLAGS)),)
899 CXXFLAGS += -DCRYPTOPP_COVERAGE
901 ifeq ($(findstring -fno-omit-frame-pointer,$(CXXFLAGS)),)
902 CXXFLAGS += -fno-omit-frame-pointer
906 # LD gold linker testing. Triggered by 'LD=ld.gold'.
907 ifeq ($(findstring ld.gold,$(LD)),ld.gold)
908 ifeq ($(findstring -fuse-ld=gold,$(CXXFLAGS)),)
909 LD_GOLD = $(shell command -v ld.gold)
910 ELF_FORMAT := $(shell file $(LD_GOLD) 2>&1 | cut -d":" -f 2 | $(GREP) -i -c "elf")
911 ifneq ($(ELF_FORMAT),0)
912 LDFLAGS += -fuse-ld=gold
917 # lcov code coverage. Issue 'make coverage'.
918 ifneq ($(filter lcov coverage,$(MAKECMDGOALS)),)
919 CXXFLAGS := $(CXXFLAGS:-g%=-g3)
920 CXXFLAGS := $(CXXFLAGS:-O%=-O1)
921 CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
922 ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CXXFLAGS)),)
923 CXXFLAGS += -DCRYPTOPP_COVERAGE
924 endif # CRYPTOPP_COVERAGE
925 ifeq ($(findstring -coverage,$(CXXFLAGS)),)
926 CXXFLAGS += -coverage
928 endif # GCC code coverage
930 # gcov code coverage for Travis. Issue 'make codecov'.
931 ifneq ($(filter gcov codecov,$(MAKECMDGOALS)),)
932 CXXFLAGS := $(CXXFLAGS:-g%=-g3)
933 CXXFLAGS := $(CXXFLAGS:-O%=-O1)
934 CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
935 ifeq ($(findstring -DCRYPTOPP_COVERAGE,$(CXXFLAGS)),)
936 CXXFLAGS += -DCRYPTOPP_COVERAGE
937 endif # CRYPTOPP_COVERAGE
938 ifeq ($(findstring -coverage,$(CXXFLAGS)),)
939 CXXFLAGS += -coverage
941 endif # GCC code coverage
943 # Valgrind testing. Issue 'make valgrind'.
944 ifneq ($(filter valgrind,$(MAKECMDGOALS)),)
945 # Tune flags; see http://valgrind.org/docs/manual/quick-start.html
946 CXXFLAGS := $(CXXFLAGS:-g%=-g3)
947 CXXFLAGS := $(CXXFLAGS:-O%=-O1)
948 CXXFLAGS := $(CXXFLAGS:-xO%=-xO1)
949 ifeq ($(findstring -DCRYPTOPP_VALGRIND,$(CXXFLAGS)),)
950 CXXFLAGS += -DCRYPTOPP_VALGRIND
951 endif # -DCRYPTOPP_VALGRIND
954 # Debug testing on GNU systems. Triggered by -DDEBUG.
955 # Newlib test due to http://sourceware.org/bugzilla/show_bug.cgi?id=20268
956 ifneq ($(filter -DDEBUG -DDEBUG=1,$(CXXFLAGS)),)
957 TPROG = TestPrograms/test_cxx.cxx
958 USING_GLIBCXX := $(shell $(CXX) $(CXXFLAGS) -E $(TPROG) -o $(TOUT) 2>&1 | $(GREP) -i -c "__GLIBCXX__")
959 ifneq ($(USING_GLIBCXX),0)
960 ifeq ($(HAS_NEWLIB),0)
961 ifeq ($(findstring -D_GLIBCXX_DEBUG,$(CXXFLAGS)),)
962 CXXFLAGS += -D_GLIBCXX_DEBUG
965 endif # USING_GLIBCXX
967 ifeq ($(XLC_COMPILER),1)
968 TPROG = TestPrograms/test_cxx.cxx
969 TOPT = -qheapdebug -qro
970 HAVE_OPT = $(shell $(CXX) $(TCXXFLAGS) $(ZOPT) $(TOPT) $(TPROG) -o $(TOUT) 2>&1 | tr ' ' '\n' | wc -l)
971 ifeq ($(strip $(HAVE_OPT)),0)
972 CXXFLAGS += -qheapdebug -qro
977 # Dead code stripping. Issue 'make lean'.
978 ifeq ($(findstring lean,$(MAKECMDGOALS)),lean)
979 ifeq ($(findstring -ffunction-sections,$(CXXFLAGS)),)
980 CXXFLAGS += -ffunction-sections
982 ifeq ($(findstring -fdata-sections,$(CXXFLAGS)),)
983 CXXFLAGS += -fdata-sections
985 ifneq ($(IS_DARWIN),0)
986 ifeq ($(findstring -Wl,-dead_strip,$(LDFLAGS)),)
987 LDFLAGS += -Wl,-dead_strip
989 else # BSD, Linux and Unix
990 ifeq ($(findstring -Wl,--gc-sections,$(LDFLAGS)),)
991 LDFLAGS += -Wl,--gc-sections
994 endif # Dead code stripping
996 # For Shared Objects, Diff, Dist/Zip rules
997 LIB_VER := $(shell $(GREP) "define CRYPTOPP_VERSION" config.h | cut -d" " -f 3)
998 LIB_MAJOR := $(shell echo $(LIB_VER) | cut -c 1)
999 LIB_MINOR := $(shell echo $(LIB_VER) | cut -c 2)
1000 LIB_PATCH := $(shell echo $(LIB_VER) | cut -c 3)
1002 ifeq ($(strip $(LIB_PATCH)),)
1006 ifeq ($(HAS_SOLIB_VERSION),1)
1007 # Different patchlevels and minors are compatible since 6.1
1008 SOLIB_COMPAT_SUFFIX=.$(LIB_MAJOR)
1009 # Linux uses -Wl,-soname
1010 ifeq ($(IS_LINUX),1)
1011 # Linux uses full version suffix for shared library
1012 SOLIB_VERSION_SUFFIX=.$(LIB_MAJOR).$(LIB_MINOR).$(LIB_PATCH)
1013 SOLIB_FLAGS=-Wl,-soname,libcrypto++.so$(SOLIB_COMPAT_SUFFIX)
1015 # Solaris uses -Wl,-h
1017 # Solaris uses major version suffix for shared library, but we use major.minor
1018 # The minor version allows previous version to remain and not overwritten.
1019 # https://blogs.oracle.com/solaris/how-to-name-a-solaris-shared-object-v2
1020 SOLIB_VERSION_SUFFIX=.$(LIB_MAJOR).$(LIB_MINOR)
1021 SOLIB_FLAGS=-Wl,-h,libcrypto++.so$(SOLIB_COMPAT_SUFFIX)
1023 endif # HAS_SOLIB_VERSION
1025 ###########################################################
1026 ##### Temp file cleanup #####
1027 ###########################################################
1029 # After this point no more test programs should be run.
1030 # https://github.com/weidai11/cryptopp/issues/738
1031 ifeq ($(findstring /dev/null,$(TOUT)),)
1032 # $(info TOUT is not /dev/null, cleaning $(TOUT))
1033 ifeq ($(wildcard $(TOUT)),$(TOUT))
1034 UNUSED := $(shell $(RM) $(TOUT) 2>/dev/null)
1036 ifeq ($(wildcard $(TOUT).dSYM/),$(TOUT).dSYM/)
1037 UNUSED := $(shell $(RM) -r $(TOUT).dSYM/ 2>/dev/null)
1041 ###########################################################
1042 ##### Source and object files #####
1043 ###########################################################
1045 # List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
1046 SRCS := cryptlib.cpp cpu.cpp integer.cpp $(filter-out cryptlib.cpp cpu.cpp integer.cpp pch.cpp simple.cpp winpipes.cpp cryptlib_bds.cpp,$(sort $(wildcard *.cpp)))
1047 # For Makefile.am; resource.h is Windows
1048 INCL := $(filter-out resource.h,$(sort $(wildcard *.h)))
1050 ifneq ($(IS_MINGW),0)
1054 # Cryptogams AES for ARMv4 and above. We couple to ARMv7.
1055 # Avoid iOS. It cannot consume the assembly.
1056 ifeq ($(IS_ARM32),1)
1057 CRYPTOGAMS_AES_FLAG = -march=armv7-a
1058 CRYPTOGAMS_AES_FLAG += -Wa,--noexecstack
1062 # List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
1063 OBJS := $(SRCS:.cpp=.o)
1064 OBJS := $(OBJS:.S=.o)
1066 # List test.cpp first to tame C++ static initialization problems.
1067 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
1068 TESTINCL := bench.h factory.h validate.h
1071 TESTOBJS := $(TESTSRCS:.cpp=.o)
1072 LIBOBJS := $(filter-out $(TESTOBJS),$(OBJS))
1074 # In Crypto++ 5.6.2 these were the source and object files for the FIPS DLL.
1075 # Since the library is on the Historical Validation List we add all files.
1076 # The 5.6.2 list is at https://github.com/weidai11/cryptopp/blob/789f81f048c9.
1078 DLLOBJS := $(DLLSRCS:.cpp=.export.o)
1079 DLLOBJS := $(DLLOBJS:.S=.export.o)
1081 # Import lib testing
1082 LIBIMPORTOBJS := $(LIBOBJS:.o=.import.o)
1083 TESTIMPORTOBJS := $(TESTOBJS:.o=.import.o)
1084 DLLTESTOBJS := dlltest.dllonly.o
1086 ###########################################################
1087 ##### Targets and Recipes #####
1088 ###########################################################
1090 # Default builds program with static library only
1094 .PHONY: all static dynamic
1095 all: static dynamic cryptest
1097 ifneq ($(IS_DARWIN),0)
1098 static: libcrypto++.a
1099 shared dynamic dylib: libcrypto++.dylib
1101 static: libcrypto++.a
1102 shared dynamic: libcrypto++.so$(SOLIB_VERSION_SUFFIX)
1105 .PHONY: dep deps depend
1106 dep deps depend GNUmakefile.deps:
1107 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DISABLE_ASM) -MM *.cpp > GNUmakefile.deps
1109 # CXXFLAGS are tuned earlier.
1110 .PHONY: native no-asm asan ubsan
1111 native no-asm asan ubsan: cryptest
1113 # CXXFLAGS are tuned earlier. Applications must use linker flags
1114 # -Wl,--gc-sections (Linux and Unix) or -Wl,-dead_strip (OS X)
1116 lean: static dynamic cryptest
1118 # May want to export CXXFLAGS="-g3 -O1"
1119 .PHONY: lcov coverage
1120 lcov coverage: cryptest
1121 @-$(RM) -r ./TestCoverage/
1122 lcov --base-directory . --directory . --zerocounters -q
1125 lcov --base-directory . --directory . -c -o cryptest.info
1126 lcov --remove cryptest.info "adhoc.cpp" "wait.*" "network.*" "socketft.*" "fips140.*" "*test.*" "bench*.cpp" "validat*.*" "/usr/*" -o cryptest.info
1127 genhtml -o ./TestCoverage/ -t "cryptest test coverage" --num-spaces 4 cryptest.info
1129 # Travis CI and CodeCov rule
1130 .PHONY: gcov codecov
1131 gcov codecov: cryptest
1132 @-$(RM) -r ./TestCoverage/
1137 # Should use CXXFLAGS="-g3 -O1"
1140 valgrind --track-origins=yes --suppressions=cryptopp.supp ./cryptest v
1143 test check: cryptest
1146 # Used to generate list of source files for Autotools, CMakeList, Android.mk, etc
1149 $(info ***** Library sources *****)
1150 $(info $(filter-out $(TESTSRCS),$(SRCS)))
1152 $(info ***** Library headers *****)
1153 $(info $(filter-out $(TESTINCL),$(INCL)))
1155 $(info ***** Test sources *****)
1158 $(info ***** Test headers *****)
1161 # Directory we want (can't specify on Doygen command line)
1162 DOCUMENT_DIRECTORY := ref$(LIB_VER)
1163 # Directory Doxygen uses (specified in Doygen config file)
1164 ifeq ($(wildcard Doxyfile),Doxyfile)
1165 DOXYGEN_DIRECTORY := $(strip $(shell $(GREP) "OUTPUT_DIRECTORY" Doxyfile | $(GREP) -v "\#" | cut -d "=" -f 2))
1167 # Default directory (in case its missing in the config file)
1168 ifeq ($(strip $(DOXYGEN_DIRECTORY)),)
1169 DOXYGEN_DIRECTORY := html-docs
1172 # Builds the documentation. Directory name is ref563, ref570, etc.
1175 @-$(RM) -r $(DOXYGEN_DIRECTORY)/ $(DOCUMENT_DIRECTORY)/ html-docs/
1176 @-$(RM) CryptoPPRef.zip
1177 doxygen Doxyfile -d CRYPTOPP_DOXYGEN_PROCESSING
1178 $(MV) $(DOXYGEN_DIRECTORY)/ $(DOCUMENT_DIRECTORY)/
1179 zip -9 CryptoPPRef.zip -x ".*" -x "*/.*" -r $(DOCUMENT_DIRECTORY)/
1183 -$(RM) adhoc.cpp.o adhoc.cpp.proto.o $(LIBOBJS) rdrand-*.o $(TESTOBJS) $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTIMPORTOBJS) $(DLLTESTOBJS)
1184 @-$(RM) libcrypto++.a libcrypto++.dylib cryptopp.dll libcrypto++.dll.a libcrypto++.import.a
1185 @-$(RM) libcrypto++.so libcrypto++.so$(SOLIB_COMPAT_SUFFIX) libcrypto++.so$(SOLIB_VERSION_SUFFIX)
1186 @-$(RM) cryptest dlltest.exe cryptest.import.exe cryptest.info ct et
1187 @-$(RM) *.la *.lo *.gcov *.gcno *.gcda *.stackdump core core-*
1188 @-$(RM) /tmp/adhoc.exe
1189 @-$(RM) -r /tmp/cryptopp_test/
1190 @-$(RM) -r *.exe.dSYM/ *.dylib.dSYM/
1193 .PHONY: autotools-clean
1195 @-$(RM) -f configure.ac configure configure.in Makefile.am Makefile.in Makefile
1196 @-$(RM) -f config.guess config.status config.sub config.h.in compile depcomp
1197 @-$(RM) -f install-sh stamp-h1 ar-lib *.lo *.la *.m4 local.* lt*.sh missing
1198 @-$(RM) -f cryptest cryptestcwd libtool* libcrypto++.la libcrypto++.pc*
1199 @-$(RM) -rf m4/ auto*.cache/ .deps/ .libs/
1203 @-$(RM) -f cryptopp-config.cmake CMakeLists.txt
1204 @-$(RM) -rf cmake_build/
1207 distclean: clean autotools-clean cmake-clean
1208 -$(RM) adhoc.cpp adhoc.cpp.copied GNUmakefile.deps benchmarks.html cryptest.txt
1209 @-$(RM) cryptest-*.txt cryptopp.tgz libcrypto++.pc *.o *.bc *.ii *~
1210 @-$(RM) -r cryptlib.lib cryptest *.suo *.sdf *.pdb Win32/ x64/ ipch/
1211 @-$(RM) -r $(LIBOBJS:.o=.obj) $(TESTOBJS:.o=.obj)
1212 @-$(RM) -r $(LIBOBJS:.o=.lst) $(TESTOBJS:.o=.lst)
1213 @-$(RM) -r TestCoverage/ ref*/
1214 @-$(RM) cryptopp$(LIB_VER)\.* CryptoPPRef.zip
1216 # Install cryptest, libcrypto++.a, libcrypto++.so and libcrypto++.pc.
1217 # The library install was broken-out into its own recipe at GH #653.
1219 install: cryptest install-lib
1220 @-$(MKDIR) $(DESTDIR)$(BINDIR)
1221 $(INSTALL_PROGRAM) cryptest $(DESTDIR)$(BINDIR)
1222 @-$(MKDIR) $(DESTDIR)$(DATADIR)/cryptopp/TestData
1223 @-$(MKDIR) $(DESTDIR)$(DATADIR)/cryptopp/TestVectors
1224 $(INSTALL_DATA) TestData/*.dat $(DESTDIR)$(DATADIR)/cryptopp/TestData
1225 $(INSTALL_DATA) TestVectors/*.txt $(DESTDIR)$(DATADIR)/cryptopp/TestVectors
1227 # A recipe to install only the library, and not cryptest. Also
1228 # see https://github.com/weidai11/cryptopp/issues/653. Some users
1229 # already have a libcrypto++.pc. Install the *.pc file if the file
1230 # is present. If you want one, then issue 'make libcrypto++.pc'.
1233 @-$(MKDIR) $(DESTDIR)$(INCLUDEDIR)/crypto++
1234 $(INSTALL_DATA) *.h $(DESTDIR)$(INCLUDEDIR)/crypto++
1235 ifneq ($(wildcard libcrypto++.a),)
1236 @-$(MKDIR) $(DESTDIR)$(LIBDIR)
1237 $(INSTALL_DATA) libcrypto++.a $(DESTDIR)$(LIBDIR)
1239 ifneq ($(wildcard libcrypto++.dylib),)
1240 @-$(MKDIR) $(DESTDIR)$(LIBDIR)
1241 $(INSTALL_PROGRAM) libcrypto++.dylib $(DESTDIR)$(LIBDIR)
1242 -install_name_tool -id $(DESTDIR)$(LIBDIR)/libcrypto++.dylib $(DESTDIR)$(LIBDIR)/libcrypto++.dylib
1244 ifneq ($(wildcard libcrypto++.so$(SOLIB_VERSION_SUFFIX)),)
1245 @-$(MKDIR) $(DESTDIR)$(LIBDIR)
1246 $(INSTALL_PROGRAM) libcrypto++.so$(SOLIB_VERSION_SUFFIX) $(DESTDIR)$(LIBDIR)
1247 ifeq ($(HAS_SOLIB_VERSION),1)
1248 -$(LN) libcrypto++.so$(SOLIB_VERSION_SUFFIX) $(DESTDIR)$(LIBDIR)/libcrypto++.so
1249 $(LDCONF) $(DESTDIR)$(LIBDIR)
1252 ifneq ($(wildcard libcrypto++.pc),)
1253 @-$(MKDIR) $(DESTDIR)$(LIBDIR)/pkgconfig
1254 $(INSTALL_DATA) libcrypto++.pc $(DESTDIR)$(LIBDIR)/pkgconfig/libcrypto++.pc
1257 .PHONY: remove uninstall
1259 -$(RM) -r $(DESTDIR)$(INCLUDEDIR)/crypto++
1260 -$(RM) $(DESTDIR)$(LIBDIR)/libcrypto++.a
1261 -$(RM) $(DESTDIR)$(BINDIR)/cryptest
1262 @-$(RM) $(DESTDIR)$(LIBDIR)/libcrypto++.dylib
1263 @-$(RM) $(DESTDIR)$(LIBDIR)/libcrypto++.so$(SOLIB_VERSION_SUFFIX)
1264 @-$(RM) $(DESTDIR)$(LIBDIR)/libcrypto++.so$(SOLIB_COMPAT_SUFFIX)
1265 @-$(RM) $(DESTDIR)$(LIBDIR)/libcrypto++.so
1266 @-$(RM) $(DESTDIR)$(LIBDIR)/pkgconfig/libcrypto++.pc
1267 @-$(RM) -r $(DESTDIR)$(DATADIR)/cryptopp
1269 libcrypto++.a: $(LIBOBJS)
1270 $(AR) $(ARFLAGS) $@ $(LIBOBJS)
1275 ifeq ($(HAS_SOLIB_VERSION),1)
1276 .PHONY: libcrypto++.so
1277 libcrypto++.so: libcrypto++.so$(SOLIB_VERSION_SUFFIX) | so_warning
1280 libcrypto++.so$(SOLIB_VERSION_SUFFIX): $(LIBOBJS)
1281 ifeq ($(XLC_COMPILER),1)
1282 $(CXX) -qmkshrobj $(SOLIB_FLAGS) -o $@ $(strip $(CXXFLAGS)) $(LDFLAGS) $(LIBOBJS) $(LDLIBS)
1284 $(CXX) -shared $(SOLIB_FLAGS) -o $@ $(strip $(CXXFLAGS)) $(LDFLAGS) $(LIBOBJS) $(LDLIBS)
1286 ifeq ($(HAS_SOLIB_VERSION),1)
1287 -$(LN) libcrypto++.so$(SOLIB_VERSION_SUFFIX) libcrypto++.so
1288 -$(LN) libcrypto++.so$(SOLIB_VERSION_SUFFIX) libcrypto++.so$(SOLIB_COMPAT_SUFFIX)
1291 libcrypto++.dylib: $(LIBOBJS)
1292 $(CXX) -dynamiclib -o $@ $(strip $(CXXFLAGS)) -install_name "$@" -current_version "$(LIB_MAJOR).$(LIB_MINOR).$(LIB_PATCH)" -compatibility_version "$(LIB_MAJOR).$(LIB_MINOR)" -headerpad_max_install_names $(LDFLAGS) $(LIBOBJS)
1294 cryptest:libcrypto++.a $(TESTOBJS)
1295 $(CXX) -o $@ $(strip $(CXXFLAGS)) $(TESTOBJS) ./libcrypto++.a $(LDFLAGS) $(LDLIBS)
1297 # Makes it faster to test changes
1299 $(CXX) -o ct $(strip $(CXXFLAGS)) $(OBJS) $(LDFLAGS) $(LDLIBS)
1301 dll: cryptest.import.exe dlltest.exe
1303 cryptopp.dll: $(DLLOBJS)
1304 $(CXX) -shared -o $@ $(strip $(CXXFLAGS)) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcrypto++.dll.a
1306 libcrypto++.import.a: $(LIBIMPORTOBJS)
1307 $(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
1312 cryptest.import.exe: cryptopp.dll libcrypto++.import.a $(TESTIMPORTOBJS)
1313 $(CXX) -o $@ $(strip $(CXXFLAGS)) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS)
1315 dlltest.exe: cryptopp.dll $(DLLTESTOBJS)
1316 $(CXX) -o $@ $(strip $(CXXFLAGS)) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS)
1318 # Some users already have a libcrypto++.pc. We install it if the file
1319 # is present. If you want one, then issue 'make libcrypto++.pc'. Be sure
1320 # to use/verify PREFIX and LIBDIR below after writing the file.
1322 @echo '# Crypto++ package configuration file' > libcrypto++.pc
1323 @echo '' >> libcrypto++.pc
1324 @echo 'prefix=$(PREFIX)' >> libcrypto++.pc
1325 @echo 'libdir=$(LIBDIR)' >> libcrypto++.pc
1326 @echo 'includedir=$${prefix}/include' >> libcrypto++.pc
1327 @echo '' >> libcrypto++.pc
1328 @echo 'Name: Crypto++' >> libcrypto++.pc
1329 @echo 'Description: Crypto++ cryptographic library' >> libcrypto++.pc
1330 @echo 'Version: 8.0' >> libcrypto++.pc
1331 @echo 'URL: https://cryptopp.com/' >> libcrypto++.pc
1332 @echo '' >> libcrypto++.pc
1333 @echo 'Cflags: -I$${includedir}' >> libcrypto++.pc
1334 @echo 'Libs: -L$${libdir} -lcrypto++' >> libcrypto++.pc
1336 # This recipe prepares the distro files
1337 TEXT_FILES := *.h *.cpp adhoc.cpp License.txt Readme.txt Install.txt Filelist.txt Doxyfile cryptest* cryptlib* dlltest* cryptdll* *.sln *.s *.S *.vcxproj *.filters cryptopp.rc TestVectors/*.txt TestData/*.dat TestPrograms/*.cxx TestScripts/*.sh TestScripts/*.cmd
1338 EXEC_FILES := GNUmakefile GNUmakefile-cross TestData/ TestVectors/ TestScripts/ TestPrograms/
1340 ifeq ($(wildcard Filelist.txt),Filelist.txt)
1341 DIST_FILES := $(shell cat Filelist.txt)
1346 ifneq ($(IS_DARWIN),0)
1347 sed -i '' -e's/[[:space:]]*$$//' *.supp *.txt *.sh .*.yml *.h *.cpp *.asm *.s *.S
1348 sed -i '' -e's/[[:space:]]*$$//' *.sln *.vcxproj *.filters GNUmakefile GNUmakefile-cross
1349 sed -i '' -e's/[[:space:]]*$$//' TestData/*.dat TestVectors/*.txt TestPrograms/*.cxx TestScripts/*.*
1352 sed -i -e's/[[:space:]]*$$//' *.supp *.txt *.sh .*.yml *.h *.cpp *.asm *.s *.S
1353 sed -i -e's/[[:space:]]*$$//' *.sln *.vcxproj *.filters GNUmakefile GNUmakefile-cross
1354 sed -i -e's/[[:space:]]*$$//' TestData/*.dat TestVectors/*.txt TestPrograms/*.cxx TestScripts/*.*
1360 @-$(CHMOD) 0700 TestVectors/ TestData/ TestPrograms/ TestScripts/
1361 @-$(CHMOD) 0600 $(TEXT_FILES) *.supp .*.yml *.asm *.s *.zip TestVectors/*.txt TestData/*.dat TestPrograms/*.cxx TestScripts/*.*
1362 @-$(CHMOD) 0700 $(EXEC_FILES) *.sh *.cmd TestScripts/*.sh TestScripts/*.cmd
1363 @-$(CHMOD) 0700 *.cmd *.sh GNUmakefile GNUmakefile-cross TestScripts/*.sh
1364 -unix2dos --keepdate --quiet $(TEXT_FILES) .*.yml *.asm *.cmd TestScripts/*.*
1365 -dos2unix --keepdate --quiet GNUmakefile* *.supp *.s *.S *.sh *.mapfile TestScripts/*.sh
1366 ifneq ($(IS_DARWIN),0)
1370 # Build the ZIP file with source files. No documentation.
1372 zip dist: | distclean convert
1373 zip -q -9 cryptopp$(LIB_VER).zip $(DIST_FILES)
1375 # Build the ISO to transfer the ZIP to old distros via CDROM
1378 ifneq ($(IS_DARWIN),0)
1379 $(MKDIR) $(PWD)/cryptopp$(LIB_VER)
1380 $(CP) cryptopp$(LIB_VER).zip $(PWD)/cryptopp$(LIB_VER)
1381 hdiutil makehybrid -iso -joliet -o cryptopp$(LIB_VER).iso $(PWD)/cryptopp$(LIB_VER)
1382 @-$(RM) -r $(PWD)/cryptopp$(LIB_VER)
1383 else ifneq ($(IS_LINUX),0)
1384 $(MKDIR) $(PWD)/cryptopp$(LIB_VER)
1385 $(CP) cryptopp$(LIB_VER).zip $(PWD)/cryptopp$(LIB_VER)
1386 genisoimage -q -o cryptopp$(LIB_VER).iso $(PWD)/cryptopp$(LIB_VER)
1387 @-$(RM) -r $(PWD)/cryptopp$(LIB_VER)
1390 # CRYPTOPP_CPU_FREQ in GHz
1391 CRYPTOPP_CPU_FREQ ?= 0.0
1392 .PHONY: bench benchmark benchmarks
1393 bench benchmark benchmarks: cryptest
1394 @-$(RM) -f benchmarks.html
1395 ./cryptest b 2 $(CRYPTOPP_CPU_FREQ)
1397 adhoc.cpp: adhoc.cpp.proto
1398 ifeq ($(wildcard adhoc.cpp),)
1399 cp adhoc.cpp.proto adhoc.cpp
1404 # Include dependencies, if present. You must issue `make deps` to create them.
1405 ifeq ($(wildcard GNUmakefile.deps),GNUmakefile.deps)
1406 -include GNUmakefile.deps
1407 endif # Dependencies
1409 # Cryptogams ARM asm implementation.
1410 aes_armv4.o : aes_armv4.S
1411 $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_AES_FLAG) -mfloat-abi=$(FP_ABI) -c) $<
1413 # SSSE3 or NEON available
1414 aria_simd.o : aria_simd.cpp
1415 $(CXX) $(strip $(CXXFLAGS) $(ARIA_FLAG) -c) $<
1417 # SSE, NEON or POWER7 available
1418 blake2s_simd.o : blake2s_simd.cpp
1419 $(CXX) $(strip $(CXXFLAGS) $(BLAKE2S_FLAG) -c) $<
1421 # SSE, NEON or POWER8 available
1422 blake2b_simd.o : blake2b_simd.cpp
1423 $(CXX) $(strip $(CXXFLAGS) $(BLAKE2B_FLAG) -c) $<
1425 # SSE2 or NEON available
1426 chacha_simd.o : chacha_simd.cpp
1427 $(CXX) $(strip $(CXXFLAGS) $(CHACHA_FLAG) -c) $<
1430 chacha_avx.o : chacha_avx.cpp
1431 $(CXX) $(strip $(CXXFLAGS) $(CHACHA_AVX2_FLAG) -c) $<
1434 cham_simd.o : cham_simd.cpp
1435 $(CXX) $(strip $(CXXFLAGS) $(CHAM_FLAG) -c) $<
1439 $(CXX) $(strip $(CXXFLAGS) $(DARN_FLAG) -c) $<
1442 donna_sse.o : donna_sse.cpp
1443 $(CXX) $(strip $(CXXFLAGS) $(SSE2_FLAG) -c) $<
1446 sse_simd.o : sse_simd.cpp
1447 $(CXX) $(strip $(CXXFLAGS) $(SSE2_FLAG) -c) $<
1449 # SSE4.2 or ARMv8a available
1450 crc_simd.o : crc_simd.cpp
1451 $(CXX) $(strip $(CXXFLAGS) $(CRC_FLAG) -c) $<
1453 # PCLMUL or ARMv7a/ARMv8a available
1454 gcm_simd.o : gcm_simd.cpp
1455 $(CXX) $(strip $(CXXFLAGS) $(GCM_FLAG) -c) $<
1458 lea_simd.o : lea_simd.cpp
1459 $(CXX) $(strip $(CXXFLAGS) $(LEA_FLAG) -c) $<
1462 neon_simd.o : neon_simd.cpp
1463 $(CXX) $(strip $(CXXFLAGS) $(NEON_FLAG) -c) $<
1466 ppc_simd.o : ppc_simd.cpp
1467 $(CXX) $(strip $(CXXFLAGS) $(ALTIVEC_FLAG) -c) $<
1470 ppc_power7.o : ppc_power7.cpp
1471 $(CXX) $(strip $(CXXFLAGS) $(POWER7_FLAG) -c) $<
1474 ppc_power8.o : ppc_power8.cpp
1475 $(CXX) $(strip $(CXXFLAGS) $(POWER8_FLAG) -c) $<
1478 ppc_power9.o : ppc_power9.cpp
1479 $(CXX) $(strip $(CXXFLAGS) $(POWER9_FLAG) -c) $<
1481 # AESNI or ARMv7a/ARMv8a available
1482 rijndael_simd.o : rijndael_simd.cpp
1483 $(CXX) $(strip $(CXXFLAGS) $(AES_FLAG) -c) $<
1485 # SSE4.2/SHA-NI or ARMv8a available
1486 sha_simd.o : sha_simd.cpp
1487 $(CXX) $(strip $(CXXFLAGS) $(SHA_FLAG) -c) $<
1489 sha3_simd.o : sha3_simd.cpp
1490 $(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $<
1492 # SSE4.2/SHA-NI or ARMv8a available
1493 shacal2_simd.o : shacal2_simd.cpp
1494 $(CXX) $(strip $(CXXFLAGS) $(SHA_FLAG) -c) $<
1496 # SSSE3 or NEON available
1497 simeck_simd.o : simeck_simd.cpp
1498 $(CXX) $(strip $(CXXFLAGS) $(SIMECK_FLAG) -c) $<
1500 # SSE4.1, NEON or POWER7 available
1501 simon64_simd.o : simon64_simd.cpp
1502 $(CXX) $(strip $(CXXFLAGS) $(SIMON64_FLAG) -c) $<
1504 # SSSE3, NEON or POWER8 available
1505 simon128_simd.o : simon128_simd.cpp
1506 $(CXX) $(strip $(CXXFLAGS) $(SIMON128_FLAG) -c) $<
1508 # SSE4.1, NEON or POWER7 available
1509 speck64_simd.o : speck64_simd.cpp
1510 $(CXX) $(strip $(CXXFLAGS) $(SPECK64_FLAG) -c) $<
1512 # SSSE3, NEON or POWER8 available
1513 speck128_simd.o : speck128_simd.cpp
1514 $(CXX) $(strip $(CXXFLAGS) $(SPECK128_FLAG) -c) $<
1517 sm3_simd.o : sm3_simd.cpp
1518 $(CXX) $(strip $(CXXFLAGS) $(SM3_FLAG) -c) $<
1521 sm4_simd.o : sm4_simd.cpp
1522 $(CXX) $(strip $(CXXFLAGS) $(SM4_FLAG) -c) $<
1524 # IBM XLC -O3 optimization bug
1525 ifeq ($(XLC_COMPILER),1)
1527 $(CXX) $(strip $(subst -O3,-O2,$(CXXFLAGS)) -c) $<
1530 # Don't build Rijndael with UBsan. Too much noise due to unaligned data accesses.
1531 ifneq ($(findstring -fsanitize=undefined,$(CXXFLAGS)),)
1532 rijndael.o : rijndael.cpp
1533 $(CXX) $(strip $(subst -fsanitize=undefined,,$(CXXFLAGS)) -c) $<
1536 # Only use CRYPTOPP_DATA_DIR if its not set in CXXFLAGS
1537 ifeq ($(findstring -DCRYPTOPP_DATA_DIR, $(strip $(CXXFLAGS))),)
1538 ifneq ($(strip $(CRYPTOPP_DATA_DIR)),)
1539 validat%.o : validat%.cpp
1540 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DATA_DIR=\"$(CRYPTOPP_DATA_DIR)\" -c) $<
1541 bench%.o : bench%.cpp
1542 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DATA_DIR=\"$(CRYPTOPP_DATA_DIR)\" -c) $<
1543 datatest.o : datatest.cpp
1544 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DATA_DIR=\"$(CRYPTOPP_DATA_DIR)\" -c) $<
1546 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DATA_DIR=\"$(CRYPTOPP_DATA_DIR)\" -c) $<
1550 validat1.o : validat1.cpp
1551 $(CXX) $(strip $(CXXFLAGS) $(ALTIVEC_FLAG) -c) $<
1554 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_DLL_ONLY -c) $< -o $@
1557 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_IMPORTS -c) $< -o $@
1560 $(CXX) $(strip $(CXXFLAGS) -DCRYPTOPP_EXPORTS -c) $< -o $@
1563 $(CXX) $(strip $(CXXFLAGS) -c) $<
1566 $(CXX) $(strip $(CXXFLAGS) -c) $<
1570 ifeq ($(HAS_SOLIB_VERSION),1)
1571 $(info WARNING: Only the symlinks to the shared-object library have been updated.)
1572 $(info WARNING: If the library is installed in a system directory you will need)
1573 $(info WARNING: to run 'ldconfig' to update the shared-object library cache.)