diff options
-rwxr-xr-x[-rw-r--r--] | GNUmakefile | 971 |
1 files changed, 486 insertions, 485 deletions
diff --git a/GNUmakefile b/GNUmakefile index 3e9fc070..d8720388 100644..100755 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,485 +1,486 @@ -################################################################# -# Tool and flag setup - -AS ?= as -AR ?= ar -ARFLAGS ?= -cr # ar needs the dash on OpenBSD -RANLIB ?= ranlib -STRIP ?= strip -s -CP ?= cp -MKDIR ?= mkdir -EGREP ?= egrep -UNAME ?= uname - -# Default setting from environment. Disable verbose flag, add create flag -ifeq ($(findstring rv,$(ARFLAGS)),rv) -ARFLAGS = cr -endif - -######################### -# CXXFLAGS -# -fPIC is supported, and enabled by default for x86_64. - -# We can augment CXXFLAGS if the user exports them in the shell, or if the user -# omits them. However, if the user `make CXXFLAGS="-g1"`, then that's what -# the user gets. Make does not override them, and does not honor our '+='. -CXXFLAGS ?= -DNDEBUG -g2 -O3 - -# Add -DNDEBUG if nothing specified -ifeq ($(filter -DDEBUG -DNDEBUG,$(CXXFLAGS)),) -CXXFLAGS += -DNDEBUG -endif - -# Add a symolize if nothing specified -ifeq ($(filter -g -g1 -g2 -g3 -Oz,$(CXXFLAGS)),) -CXXFLAGS += -g2 -endif - -# Add an optimize if nothing specified -ifeq ($(filter -O -O0 -O1 -O2 -O3 -Og -Os -Oz -Ofast,$(CXXFLAGS)),) -CXXFLAGS += -O3 -endif - -# the following options reduce code size, but breaks link or makes link very slow on some systems -# CXXFLAGS += -ffunction-sections -fdata-sections -# LDFLAGS += -Wl,--gc-sections - -######################### -# Compilers - -CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang") -INTEL_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "\(ICC\)") -SUN_COMPILER = $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: Sun") - -# Also see LLVM Bug 24200 (https://llvm.org/bugs/show_bug.cgi?id=24200) -# CLANG_ASSEMBLER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -i -c "^clang") -# TODO: Uncomment the line above when Clang's integrated assembler can parse and generate code that passes the self tests. - -################################################################# -# Platform detection - -MACHINE ?= $(shell $(UNAME) -m) -SYSTEM ?= $(shell $(UNAME) -s) -RELEASE ?= $(shell $(UNAME) -r) - -IS_X86 = $(shell echo $(MACHINE) | $(EGREP) -c "i.86|x86|i86|amd64") -IS_X86_64 = $(shell echo $(MACHINE) | $(EGREP) -c "_64|d64") -IS_DARWIN = $(shell echo $(SYSTEM) | $(EGREP) -i -c "darwin") -IS_LINUX = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "linux") -IS_MINGW = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "mingw") -IS_CYGWIN = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "cygwin") -IS_OPENBSD = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "openbsd") -IS_SUN = $(shell echo $(SYSTEM) | $(EGREP) -i -c "SunOS") -IS_FEDORA22_i686 = $(shell echo $(RELEASE) | $(EGREP) -i -c "fc22.i686") - -################################################################# -# Architecture detection - -######################### -# May (or may not) be used below -ifeq ($(findstring -m32 -m64,$(CXXFLAGS)),) -ifneq ($(IS_X86_64),0) -M32OR64 = -m64 -endif -endif # -m32 or -m64 - -################################################################# -# User install preferences - -# Pick up the user's choice (lower prefix is the standard name) -ifneq ($(prefix),) -PREFIX = $(prefix) -else - -# Default prefix for make install -ifeq ($(PREFIX),) -PREFIX = /usr -endif - -# Can't put C++ headers in system include -ifneq ($(IS_OPENBSD),0) -PREFIX = /usr/local -endif - -endif # prefix - -################################################################# -# Undefined behavior and Address sanitizer -# Clang 3.2 and GCC 4.8 and above, i386/i686/x86_64 - -ifneq ($(IS_X86),0) - -# Undefined Behavior Sanitizer (UBsan) -ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan) -CXXFLAGS += -fsanitize=undefined -# CXXFLAGS += -fsanitize-undefined-trap-on-error -endif # UBsan - -# Address Sanitizer (Asan) -ifeq ($(findstring asan,$(MAKECMDGOALS)),asan) -CXXFLAGS += -fsanitize=address -endif # Asan - -# Test CXXFLAGS in case the user passed the flags directly through it -ifeq ($(findstring -fsanitize=address,$(CXXFLAGS)),-fsanitize=address) -ASAN = 1 -endif -ifeq ($(findstring -fsanitize=undefined,$(CXXFLAGS)),-fsanitize=undefined) -UBSAN = 1 -endif - -# Enforce Sanitizer business logic... -ifeq ($(ASAN)$(UBSAN),11) -$(error Asan and UBsan are mutually exclusive) -endif - -endif # IS_X86 - -################################################################# -# Darwin tweaks - -ifneq ($(IS_DARWIN),0) - -CXX ?= c++ -ifeq ($(AR),ar) -AR = libtool -ARFLAGS = -static -o -endif - -######################### -# Build a boolean circuit that says "Darwin && (GCC 4.2 || Clang)" -# MULTIARCH ?= $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER))))) -MULTIARCH ?= 0 -ifneq ($(MULTIARCH),0) -CXXFLAGS += -arch i386 -arch x86_64 -endif # MULTIARCH - -endif # IS_DARWIN - -################################################################# -# i386, i686, x86_64 and friends - -ifneq ($(IS_X86),0) - -GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4.[2-9]|[5-9])") -ICC111_OR_LATER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\) ([2-9][0-9]|1[2-9]|11\.[1-9])") - -# Using system provided assembler. It may be GNU AS (GAS). -GAS210_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.[1-9][0-9]|[3-9])") -GAS217_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])") -GAS219_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])") - -# For testing and development. If CXX=clang++, then it effectively -# enables ASM code paths and engages the integrated assembler. -FORCE_ASM ?= 0 -ifneq ($(FORCE_ASM),0) - GAS210_OR_LATER = 1 - GAS217_OR_LATER = 1 - GAS219_OR_LATER = 1 -endif - -# Enable PIC for x86_64 targets -ifneq ($(IS_X86_64),0) -CXXFLAGS += -fPIC -endif # PIC for x86_64 targets - -######################### -# Cygwin work arounds -ifneq ($(IS_CYGWIN),0) - -# CXX is gcc on Cygwin 1.1.4 -ifeq ($(CXX),gcc) -CXX = g++ -endif # CXX - -# -fPIC causes spurious output during compile. Remove it even if the user passed it in. -ifeq ($(findstring -fPIC,$(CXXFLAGS)),-fPIC) -CXXFLAGS := $(subst -fPIC,,$(CXXFLAGS)) -endif # -fPIC - -# -O3 fails to link with GCC 4.5.3 -IS_GCC45 = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version 4\.5\.[0-9]") -ifneq ($(IS_GCC45),0) -ifeq ($(findstring -O3,$(CXXFLAGS)),-O3) -CXXFLAGS := $(subst -O3,-O2,$(CXXFLAGS)) -endif # -O3 -endif # GCC 4.5 - -endif # Cygwin work arounds - -######################### -# F22/i386 crash -ifneq ($(IS_FEDORA22_i686),0) -ifeq ($(findstring -O3,$(CXXFLAGS)),-O3) -CXXFLAGS := $(subst -O3,-O2,$(CXXFLAGS)) -endif # -O2 -endif # Fedora 22/i686 - -######################### -# Way back when, '-march=native' caused a compiler crash with GCC on Ubuntu 9 or 10 -# Add -march=native if the user did not specify an architecture. -ifeq ($(findstring -m32 -m64,$(CXXFLAGS)),) -CXXFLAGS += -march=native -endif - -######################### -# Intel work arounds. -# Should this be moved to outside of i386/i686/x86_64 block? -ifneq ($(INTEL_COMPILER),0) -CXXFLAGS += -wd68 -wd186 -wd279 -wd327 -ifeq ($(ICC111_OR_LATER),0) -# "internal error: backend signals" occurs on some x86 inline assembly with ICC 9 and some x64 inline assembly with ICC 11.0 -# if you want to use Crypto++'s assembly code with ICC, try enabling it on individual files -CXXFLAGS += -DCRYPTOPP_DISABLE_ASM -endif -endif - -######################### -# GAS work arounds. -# Should this be moved to outside of i386/i686/x86_64 block? -ifeq ($(GAS210_OR_LATER),0) -CXXFLAGS += -DCRYPTOPP_DISABLE_ASM -else -ifeq ($(GAS217_OR_LATER),0) -CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3 -else -ifeq ($(GAS219_OR_LATER),0) -CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI -endif # GAS219_OR_LATER -endif # GAS217_OR_LATER -ifneq ($(IS_SUN),0) -CXXFLAGS += -Wa,--divide # allow use of "/" operator -endif # IS_SUN -endif # GAS210_OR_LATER - -######################### -ifeq ($(IS_MINGW),1) -LDLIBS += -lws2_32 -endif # IS_MINGW - -endif # IS_X86 - -# Should most of this be moved to outside of i386/i686/x86_64 block? -ifeq ($(IS_LINUX),1) -LDFLAGS += -pthread -ifeq ($(findstring -fopenmp,$(MAKECMDGOALS)),-fopenmp) -LDLIBS += -lgomp -endif # -fopenmp -endif # IS_LINUX - -ifneq ($(IS_SUN),0) -LDLIBS += -lnsl -lsocket -M32OR64 = -m$(shell isainfo -b) -endif - -ifneq ($(SUN_COMPILER),0) # override flags for CC Sun C++ compiler -CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef $(M32OR64) -AR = $(CXX) -ARFLAGS = -xar -o -RANLIB = true -LDFLAGS = -SUN_CC10_BUGGY = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun .* 5\.10 .* (2009|2010/0[1-4])") -ifneq ($(SUN_CC10_BUGGY),0) -# -DCRYPTOPP_INCLUDE_VECTOR_CC is needed for Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21 and was fixed in May 2010 -# remove it if you get "already had a body defined" errors in vector.cc -CXXFLAGS += -DCRYPTOPP_INCLUDE_VECTOR_CC -endif # SUN_CC10_BUGGY -endif # SUN_COMPILER - -################################################################# -# Compiler diagnostics and warnings - -# -Wall, -Wextra and -Wno-type-limits for GCC 4.3 and above. It needs -Wno-unknown-pragmas due -# to bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431. We can't use -Wall -# unguarded because it lights up CentOS 5 (GCC 4.1) and OpenBSD (4.2.1) -GCC43_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4\.[3-9]|[5-9])") -ifneq ($(GCC43_OR_LATER),0) -CXXFLAGS += -Wall -Wextra -Wno-type-limits -Wno-unknown-pragmas -endif - -# -Wall, -Wextra and -Wno-tautological-compare for Clang -ifneq ($(CLANG_COMPILER),0) -CXXFLAGS += -Wall -Wextra -Wno-tautological-compare -endif - -ifeq ($(findstring -pipe,$(CXXFLAGS)),) -CXXFLAGS += -pipe -endif - -################################################################# -# Sources, objects and temporaries - -WIN_SRCS = pch.cpp cryptlib_bds.cpp -ifeq ($(IS_MINGW),0) -WIN_SRCS += winpipes.cpp -endif - -# List of sources to compile and objects to link -SRCS = $(filter-out $(WIN_SRCS), $(wildcard *.cpp)) -OBJS = $(SRCS:.cpp=.o) - -# Compiling with --save-temps creates these -TEMPS = $(SRCS:.cpp=.s) $(SRCS:.cpp=.ii) - -# test.o needs to be after bench.o for cygwin 1.1.4 (possible ld bug?) -TESTOBJS = bench.o bench2.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o -LIBOBJS = $(filter-out $(TESTOBJS),$(OBJS)) - -DLLSRCS = algebra.cpp algparam.cpp asn.cpp basecode.cpp cbcmac.cpp channels.cpp cryptlib.cpp des.cpp dessp.cpp dh.cpp \ - dll.cpp dsa.cpp ec2n.cpp eccrypto.cpp ecp.cpp eprecomp.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp \ - gf2n.cpp gfpcrypt.cpp hex.cpp hmac.cpp integer.cpp iterhash.cpp misc.cpp modes.cpp modexppc.cpp mqueue.cpp \ - nbtheory.cpp oaep.cpp osrng.cpp pch.cpp pkcspad.cpp pubkey.cpp queue.cpp randpool.cpp rdtables.cpp \ - rijndael.cpp rng.cpp rsa.cpp sha.cpp simple.cpp skipjack.cpp strciphr.cpp trdlocal.cpp -DLLOBJS = $(DLLSRCS:.cpp=.export.o) -LIBIMPORTOBJS = $(LIBOBJS:.o=.import.o) -TESTIMPORTOBJS = $(TESTOBJS:.o=.import.o) -DLLTESTOBJS = dlltest.dllonly.o - -################################################################# -# Public service announcement - -ALIGNED_ACCESS = $(shell cat config.h | $(EGREP) -c "^\#define CRYPTOPP_NO_UNALIGNED_DATA_ACCESS") -ifeq ($(ALIGNED_ACCESS),0) -$(info WARNING: CRYPTOPP_NO_UNALIGNED_DATA_ACCESS is not defined in config.h) -endif - -################################################################# -# Recipes - -# For various targets, see https://www.gnu.org/prep/standards/html_node/Standard-Targets.html -# We want to include libcryptopp, cryptest, clean, distclean, install, install-strip, uninstall - -all cryptest: cryptest.exe -static: libcryptopp.a - -ifeq ($(IS_DARWIN),0) -shared dynamic: libcryptopp.so -else -shared dynamic: libcryptopp.dylib -endif - -asan ubsan: libcryptopp.a cryptest.exe - -.PHONY: test check -test check: cryptest.exe - ./cryptest.exe v - -.PHONY: clean -clean: - -$(RM) cryptest.exe libcryptopp.a libcrypto++.a libcryptopp.so libcrypto++.so libcryptopp.dylib $(LIBOBJS) $(TESTOBJS) $(TEMPS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTI MPORTOBJS) $(DLLTESTOBJS) -ifneq ($(IS_DARWIN),0) - -$(RM) -r cryptest.exe.dSYM -endif - -.PHONY: distclean -distclean: - -$(RM) -r GNUmakefile.deps *.o *.obj *.a *.so *.dll *.dylib *.exe *.s *.ii a.out *~ \.*~ *\.h\. *\.cpp\. *.bu *.bak adhoc.cpp adhoc.cpp.copied *.diff *.patch cryptopp.zip -ifneq ($(IS_DARWIN),0) - -$(RM) *.dSYM .DS_Store TestVectors/.DS_Store TestData/.DS_Store -endif - -.PHONY: install -install: - $(MKDIR) -p $(PREFIX)/include/cryptopp $(PREFIX)/lib $(PREFIX)/bin - -$(CP) *.h $(PREFIX)/include/cryptopp - -$(CP) libcryptopp.a $(PREFIX)/lib - -$(CP) cryptest.exe $(PREFIX)/bin -ifeq ($(IS_DARWIN),0) - -$(CP) *.so $(PREFIX)/lib -else - -$(CP) *.dylib $(PREFIX)/lib -endif - -.PHONY: install-strip -install-strip: install - -$(STRIP) -s $(PREFIX)/bin/cryptest.exe -ifeq ($(IS_DARWIN),0) - -$(STRIP) -s $(PREFIX)/lib/libcryptopp.so -else - -$(STRIP) -s $(PREFIX)/lib/libcryptopp.dylib -endif - -.PHONY: uninstall remove -uninstall remove: - -$(RM) -rf $(PREFIX)/include/cryptopp - -$(RM) $(PREFIX)/lib/libcryptopp.a - -$(RM) $(PREFIX)/bin/cryptest.exe -ifeq ($(IS_DARWIN),0) - -$(RM) $(PREFIX)/lib/libcryptopp.so -else - -$(RM) $(PREFIX)/lib/libcryptopp.dylib -endif - -.PHONY: zip dist -zip dist: distclean - -zip -9 cryptopp.zip *.h *.cpp *.asm License.txt Readme.txt \ - GNUmakefile GNUmakefile-cross Doxyfile \ - cryptest_bds.bdsgroup cryptest_bds.bdsproj cryptest_bds.bpf cryptlib_bds.bdsproj \ - cryptest.sln cryptest.dsp cryptest.dsw cryptest.vcproj \ - dlltest.dsp dlltest.vcproj cryptlib.dsp cryptlib.vcproj cryptopp.rc \ - TestVectors/*.txt TestVectors/*.dat TestData/*.txt TestData/*.dat - -libcryptopp.a: $(LIBOBJS) - $(AR) $(ARFLAGS) $@ $(LIBOBJS) - $(RANLIB) $@ - -libcryptopp.so: $(LIBOBJS) - $(CXX) -shared -o $@ $(CXXFLAGS) $(LIBOBJS) - -libcryptopp.dylib: $(LIBOBJS) - $(CXX) -shared -dynamiclib -o $@ $(CXXFLAGS) $(LIBOBJS) - -.PHONY: cryptest.exe -cryptest.exe: libcryptopp.a $(TESTOBJS) - $(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) ./libcryptopp.a $(LDFLAGS) $(LDLIBS) - -dll: cryptest.import.exe dlltest.exe - -cryptopp.dll: $(DLLOBJS) - $(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a - -libcryptopp.import.a: $(LIBIMPORTOBJS) - $(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS) - $(RANLIB) $@ - -cryptest.import.exe: cryptopp.dll libcryptopp.import.a $(TESTIMPORTOBJS) - $(CXX) -o $@ $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS) - -dlltest.exe: cryptopp.dll $(DLLTESTOBJS) - $(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS) - -adhoc.cpp: adhoc.cpp.proto -ifeq ($(wildcard adhoc.cpp),) - cp adhoc.cpp.proto adhoc.cpp -else - touch adhoc.cpp -endif - -%.dllonly.o : %.cpp - $(CXX) $(CXXFLAGS) -DCRYPTOPP_DLL_ONLY -c $< -o $@ - -%.import.o : %.cpp - $(CXX) $(CXXFLAGS) -DCRYPTOPP_IMPORTS -c $< -o $@ - -%.export.o : %.cpp - $(CXX) $(CXXFLAGS) -DCRYPTOPP_EXPORTS -c $< -o $@ - -%.o : %.cpp - $(CXX) $(CXXFLAGS) -c $< - -################################################################# -# Dependencies - -# Do not build dependencies for some targets -NO_DEPS = dist install install-strip uninstall remove clean distclean -ifeq ($(findstring $(MAKECMDGOALS),$(NO_DEPS)),) - -# Do not build dependencies when multiarch is in effect -ifeq ($(MULTIARCH),0) --include GNUmakefile.deps -endif - -GNUmakefile.deps: - $(CXX) $(CXXFLAGS) -MM *.cpp > GNUmakefile.deps - -endif # NO_DEPS +
+#################################################################
+# Tool and flag setup
+
+AS ?= as
+AR ?= ar
+ARFLAGS ?= -cr # ar needs the dash on OpenBSD
+RANLIB ?= ranlib
+STRIP ?= strip -s
+CP ?= cp
+MKDIR ?= mkdir
+EGREP ?= egrep
+UNAME ?= uname
+
+# Default setting from environment. Disable verbose flag, add create flag
+ifeq ($(findstring rv,$(ARFLAGS)),rv)
+ARFLAGS = cr
+endif
+
+#########################
+# CXXFLAGS
+# -fPIC is supported, and enabled by default for x86_64.
+
+# We can augment CXXFLAGS if the user exports them in the shell, or if the user
+# omits them. However, if the user `make CXXFLAGS="-g1"`, then that's what
+# the user gets. Make does not override them, and does not honor our '+='.
+CXXFLAGS ?= -DNDEBUG -g2 -O3
+
+# Add -DNDEBUG if nothing specified
+ifeq ($(filter -DDEBUG -DNDEBUG,$(CXXFLAGS)),)
+CXXFLAGS += -DNDEBUG
+endif
+
+# Add a symolize if nothing specified
+ifeq ($(filter -g -g1 -g2 -g3 -Oz,$(CXXFLAGS)),)
+CXXFLAGS += -g2
+endif
+
+# Add an optimize if nothing specified
+ifeq ($(filter -O -O0 -O1 -O2 -O3 -Og -Os -Oz -Ofast,$(CXXFLAGS)),)
+CXXFLAGS += -O3
+endif
+
+# the following options reduce code size, but breaks link or makes link very slow on some systems
+# CXXFLAGS += -ffunction-sections -fdata-sections
+# LDFLAGS += -Wl,--gc-sections
+
+#########################
+# Compilers
+
+CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang")
+INTEL_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "\(ICC\)")
+SUN_COMPILER = $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: Sun")
+
+# Also see LLVM Bug 24200 (https://llvm.org/bugs/show_bug.cgi?id=24200)
+# CLANG_ASSEMBLER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -i -c "^clang")
+# TODO: Uncomment the line above when Clang's integrated assembler can parse and generate code that passes the self tests.
+
+#################################################################
+# Platform detection
+
+MACHINE ?= $(shell $(UNAME) -m)
+SYSTEM ?= $(shell $(UNAME) -s)
+RELEASE ?= $(shell $(UNAME) -r)
+
+IS_X86 = $(shell echo $MACHINE | $(EGREP) -c "i.86|x86|i86|amd64")
+IS_X86_64 = $(shell echo $MACHINE | $(EGREP) -c "_64|d64")
+IS_DARWIN = $(shell echo $SYSTEM | $(EGREP) -i -c "darwin")
+IS_LINUX = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "linux")
+IS_MINGW = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "mingw")
+IS_CYGWIN = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "cygwin")
+IS_OPENBSD = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c "openbsd")
+IS_SUN = $(shell echo $SYSTEM | $(EGREP) -i -c "SunOS")
+IS_FEDORA22_i686 = $(shell echo $RELEASE | $(EGREP) -i -c "fc22.i686")
+
+#################################################################
+# Architecture detection
+
+#########################
+# May (or may not) be used below
+ifeq ($(findstring -m32 -m64,$(CXXFLAGS)),)
+ifneq ($(IS_X86_64),0)
+M32OR64 = -m64
+endif
+endif # -m32 or -m64
+
+#################################################################
+# User install preferences
+
+# Pick up the user's choice (lower prefix is the standard name)
+ifneq ($(prefix),)
+PREFIX = $(prefix)
+else
+
+# Default prefix for make install
+ifeq ($(PREFIX),)
+PREFIX = /usr
+endif
+
+# Can't put C++ headers in system include
+ifneq ($(IS_OPENBSD),0)
+PREFIX = /usr/local
+endif
+
+endif # prefix
+
+#################################################################
+# Undefined behavior and Address sanitizer
+# Clang 3.2 and GCC 4.8 and above, i386/i686/x86_64
+
+ifneq ($(IS_X86),0)
+
+# Undefined Behavior Sanitizer (UBsan)
+ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
+CXXFLAGS += -fsanitize=undefined
+# CXXFLAGS += -fsanitize-undefined-trap-on-error
+endif # UBsan
+
+# Address Sanitizer (Asan)
+ifeq ($(findstring asan,$(MAKECMDGOALS)),asan)
+CXXFLAGS += -fsanitize=address
+endif # Asan
+
+# Test CXXFLAGS in case the user passed the flags directly through it
+ifeq ($(findstring -fsanitize=address,$(CXXFLAGS)),-fsanitize=address)
+ASAN = 1
+endif
+ifeq ($(findstring -fsanitize=undefined,$(CXXFLAGS)),-fsanitize=undefined)
+UBSAN = 1
+endif
+
+# Enforce Sanitizer business logic...
+ifeq ($(ASAN)$(UBSAN),11)
+$(error Asan and UBsan are mutually exclusive)
+endif
+
+endif # IS_X86
+
+#################################################################
+# Darwin tweaks
+
+ifneq ($(IS_DARWIN),0)
+
+CXX ?= c++
+ifeq ($(AR),ar)
+AR = libtool
+ARFLAGS = -static -o
+endif
+
+#########################
+# Build a boolean circuit that says "Darwin && (GCC 4.2 || Clang)"
+# MULTIARCH ?= $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER)))))
+MULTIARCH ?= 0
+ifneq ($(MULTIARCH),0)
+CXXFLAGS += -arch i386 -arch x86_64
+endif # MULTIARCH
+
+endif # IS_DARWIN
+
+#################################################################
+# i386, i686, x86_64 and friends
+
+ifneq ($(IS_X86),0)
+
+GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4.[2-9]|[5-9])")
+ICC111_OR_LATER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\) ([2-9][0-9]|1[2-9]|11\.[1-9])")
+
+# Using system provided assembler. It may be GNU AS (GAS).
+GAS210_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.[1-9][0-9]|[3-9])")
+GAS217_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])")
+GAS219_OR_LATER ?= $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])")
+
+# For testing and development. If CXX=clang++, then it effectively
+# enables ASM code paths and engages the integrated assembler.
+FORCE_ASM ?= 0
+ifneq ($(FORCE_ASM),0)
+ GAS210_OR_LATER = 1
+ GAS217_OR_LATER = 1
+ GAS219_OR_LATER = 1
+endif
+
+# Enable PIC for x86_64 targets
+ifneq ($(IS_X86_64),0)
+CXXFLAGS += -fPIC
+endif # PIC for x86_64 targets
+
+#########################
+# Cygwin work arounds
+ifneq ($(IS_CYGWIN),0)
+
+# CXX is gcc on Cygwin 1.1.4
+ifeq ($(CXX),gcc)
+CXX = g++
+endif # CXX
+
+# -fPIC causes spurious output during compile. Remove it even if the user passed it in.
+ifeq ($(findstring -fPIC,$(CXXFLAGS)),-fPIC)
+CXXFLAGS := $(subst -fPIC,,$(CXXFLAGS))
+endif # -fPIC
+
+# -O3 fails to link with GCC 4.5.3
+IS_GCC45 = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version 4\.5\.[0-9]")
+ifneq ($(IS_GCC45),0)
+ifeq ($(findstring -O3,$(CXXFLAGS)),-O3)
+CXXFLAGS := $(subst -O3,-O2,$(CXXFLAGS))
+endif # -O3
+endif # GCC 4.5
+
+endif # Cygwin work arounds
+
+#########################
+# F22/i386 crash
+ifneq ($(IS_FEDORA22_i686),0)
+ifeq ($(findstring -O3,$(CXXFLAGS)),-O3)
+CXXFLAGS := $(subst -O3,-O2,$(CXXFLAGS))
+endif # -O2
+endif # Fedora 22/i686
+
+#########################
+# Way back when, '-march=native' caused a compiler crash with GCC on Ubuntu 9 or 10
+# Add -march=native if the user did not specify an architecture.
+ifeq ($(findstring -m32 -m64,$(CXXFLAGS)),)
+CXXFLAGS += -march=native
+endif
+
+#########################
+# Intel work arounds.
+# Should this be moved to outside of i386/i686/x86_64 block?
+ifneq ($(INTEL_COMPILER),0)
+CXXFLAGS += -wd68 -wd186 -wd279 -wd327
+ifeq ($(ICC111_OR_LATER),0)
+# "internal error: backend signals" occurs on some x86 inline assembly with ICC 9 and some x64 inline assembly with ICC 11.0
+# if you want to use Crypto++'s assembly code with ICC, try enabling it on individual files
+CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
+endif
+endif
+
+#########################
+# GAS work arounds.
+# Should this be moved to outside of i386/i686/x86_64 block?
+ifeq ($(GAS210_OR_LATER),0)
+CXXFLAGS += -DCRYPTOPP_DISABLE_ASM
+else
+ifeq ($(GAS217_OR_LATER),0)
+CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3
+else
+ifeq ($(GAS219_OR_LATER),0)
+CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI
+endif # GAS219_OR_LATER
+endif # GAS217_OR_LATER
+ifneq ($(IS_SUN),0)
+CXXFLAGS += -Wa,--divide # allow use of "/" operator
+endif # IS_SUN
+endif # GAS210_OR_LATER
+
+#########################
+ifeq ($(IS_MINGW),1)
+LDLIBS += -lws2_32
+endif # IS_MINGW
+
+endif # IS_X86
+
+# Should most of this be moved to outside of i386/i686/x86_64 block?
+ifeq ($(IS_LINUX),1)
+LDFLAGS += -pthread
+ifeq ($(findstring -fopenmp,$(MAKECMDGOALS)),-fopenmp)
+LDLIBS += -lgomp
+endif # -fopenmp
+endif # IS_LINUX
+
+ifneq ($(IS_SUN),0)
+LDLIBS += -lnsl -lsocket
+M32OR64 = -m$(shell isainfo -b)
+endif
+
+ifneq ($(SUN_COMPILER),0) # override flags for CC Sun C++ compiler
+CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef $(M32OR64)
+AR = $(CXX)
+ARFLAGS = -xar -o
+RANLIB = true
+LDFLAGS =
+SUN_CC10_BUGGY = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun .* 5\.10 .* (2009|2010/0[1-4])")
+ifneq ($(SUN_CC10_BUGGY),0)
+# -DCRYPTOPP_INCLUDE_VECTOR_CC is needed for Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21 and was fixed in May 2010
+# remove it if you get "already had a body defined" errors in vector.cc
+CXXFLAGS += -DCRYPTOPP_INCLUDE_VECTOR_CC
+endif # SUN_CC10_BUGGY
+endif # SUN_COMPILER
+
+#################################################################
+# Compiler diagnostics and warnings
+
+# -Wall, -Wextra and -Wno-type-limits for GCC 4.3 and above. It needs -Wno-unknown-pragmas due
+# to bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431. We can't use -Wall
+# unguarded because it lights up CentOS 5 (GCC 4.1) and OpenBSD (4.2.1)
+GCC43_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -i -c "^gcc version (4\.[3-9]|[5-9])")
+ifneq ($(GCC43_OR_LATER),0)
+CXXFLAGS += -Wall -Wextra -Wno-type-limits -Wno-unknown-pragmas
+endif
+
+# -Wall, -Wextra and -Wno-tautological-compare for Clang
+ifneq ($(CLANG_COMPILER),0)
+CXXFLAGS += -Wall -Wextra -Wno-tautological-compare
+endif
+
+ifeq ($(findstring -pipe,$(CXXFLAGS)),)
+CXXFLAGS += -pipe
+endif
+
+#################################################################
+# Sources, objects and temporaries
+
+WIN_SRCS = pch.cpp cryptlib_bds.cpp
+ifeq ($(IS_MINGW),0)
+WIN_SRCS += winpipes.cpp
+endif
+
+# List of sources to compile and objects to link
+SRCS = $(filter-out $(WIN_SRCS), $(wildcard *.cpp))
+OBJS = $(SRCS:.cpp=.o)
+
+# Compiling with --save-temps creates these
+TEMPS = $(SRCS:.cpp=.s) $(SRCS:.cpp=.ii)
+
+# test.o needs to be after bench.o for cygwin 1.1.4 (possible ld bug?)
+TESTOBJS = bench.o bench2.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o
+LIBOBJS = $(filter-out $(TESTOBJS),$(OBJS))
+
+DLLSRCS = algebra.cpp algparam.cpp asn.cpp basecode.cpp cbcmac.cpp channels.cpp cryptlib.cpp des.cpp dessp.cpp dh.cpp \
+ dll.cpp dsa.cpp ec2n.cpp eccrypto.cpp ecp.cpp eprecomp.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp \
+ gf2n.cpp gfpcrypt.cpp hex.cpp hmac.cpp integer.cpp iterhash.cpp misc.cpp modes.cpp modexppc.cpp mqueue.cpp \
+ nbtheory.cpp oaep.cpp osrng.cpp pch.cpp pkcspad.cpp pubkey.cpp queue.cpp randpool.cpp rdtables.cpp \
+ rijndael.cpp rng.cpp rsa.cpp sha.cpp simple.cpp skipjack.cpp strciphr.cpp trdlocal.cpp
+DLLOBJS = $(DLLSRCS:.cpp=.export.o)
+LIBIMPORTOBJS = $(LIBOBJS:.o=.import.o)
+TESTIMPORTOBJS = $(TESTOBJS:.o=.import.o)
+DLLTESTOBJS = dlltest.dllonly.o
+
+#################################################################
+# Public service announcement
+
+ALIGNED_ACCESS = $(shell cat config.h | $(EGREP) -c "^\#define CRYPTOPP_NO_UNALIGNED_DATA_ACCESS")
+ifeq ($(ALIGNED_ACCESS),0)
+$(info WARNING: CRYPTOPP_NO_UNALIGNED_DATA_ACCESS is not defined in config.h)
+endif
+
+#################################################################
+# Recipes
+
+# For various targets, see https://www.gnu.org/prep/standards/html_node/Standard-Targets.html
+# We want to include libcryptopp, cryptest, clean, distclean, install, install-strip, uninstall
+
+all cryptest: cryptest.exe
+static: libcryptopp.a
+
+ifeq ($(IS_DARWIN),0)
+shared dynamic: libcryptopp.so
+else
+shared dynamic: libcryptopp.dylib
+endif
+
+asan ubsan: libcryptopp.a cryptest.exe
+
+.PHONY: test check
+test check: cryptest.exe
+ ./cryptest.exe v
+
+.PHONY: clean
+clean:
+ -$(RM) cryptest.exe libcryptopp.a libcrypto++.a libcryptopp.so libcrypto++.so libcryptopp.dylib $(LIBOBJS) $(TESTOBJS) $(TEMPS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTI MPORTOBJS) $(DLLTESTOBJS)
+ifneq ($(IS_DARWIN),0)
+ -$(RM) -r cryptest.exe.dSYM
+endif
+
+.PHONY: distclean
+distclean:
+ -$(RM) -r GNUmakefile.deps *.o *.obj *.a *.so *.dll *.dylib *.exe *.s *.ii a.out *~ \.*~ *\.h\. *\.cpp\. *.bu *.bak adhoc.cpp adhoc.cpp.copied *.diff *.patch cryptopp.zip
+ifneq ($(IS_DARWIN),0)
+ -$(RM) *.dSYM .DS_Store TestVectors/.DS_Store TestData/.DS_Store
+endif
+
+.PHONY: install
+install:
+ $(MKDIR) -p $(PREFIX)/include/cryptopp $(PREFIX)/lib $(PREFIX)/bin
+ -$(CP) *.h $(PREFIX)/include/cryptopp
+ -$(CP) libcryptopp.a $(PREFIX)/lib
+ -$(CP) cryptest.exe $(PREFIX)/bin
+ifeq ($(IS_DARWIN),0)
+ -$(CP) *.so $(PREFIX)/lib
+else
+ -$(CP) *.dylib $(PREFIX)/lib
+endif
+
+.PHONY: install-strip
+install-strip: install
+ -$(STRIP) -s $(PREFIX)/bin/cryptest.exe
+ifeq ($(IS_DARWIN),0)
+ -$(STRIP) -s $(PREFIX)/lib/libcryptopp.so
+else
+ -$(STRIP) -s $(PREFIX)/lib/libcryptopp.dylib
+endif
+
+.PHONY: uninstall remove
+uninstall remove:
+ -$(RM) -rf $(PREFIX)/include/cryptopp
+ -$(RM) $(PREFIX)/lib/libcryptopp.a
+ -$(RM) $(PREFIX)/bin/cryptest.exe
+ifeq ($(IS_DARWIN),0)
+ -$(RM) $(PREFIX)/lib/libcryptopp.so
+else
+ -$(RM) $(PREFIX)/lib/libcryptopp.dylib
+endif
+
+.PHONY: zip dist
+zip dist: distclean
+ -zip -9 cryptopp.zip *.h *.cpp *.asm License.txt Readme.txt \
+ GNUmakefile GNUmakefile-cross Doxyfile \
+ cryptest_bds.bdsgroup cryptest_bds.bdsproj cryptest_bds.bpf cryptlib_bds.bdsproj \
+ cryptest.sln cryptest.dsp cryptest.dsw cryptest.vcproj \
+ dlltest.dsp dlltest.vcproj cryptlib.dsp cryptlib.vcproj cryptopp.rc \
+ TestVectors/*.txt TestVectors/*.dat TestData/*.txt TestData/*.dat
+
+libcryptopp.a: $(LIBOBJS)
+ $(AR) $(ARFLAGS) $@ $(LIBOBJS)
+ $(RANLIB) $@
+
+libcryptopp.so: $(LIBOBJS)
+ $(CXX) -shared -o $@ $(CXXFLAGS) $(LIBOBJS)
+
+libcryptopp.dylib: $(LIBOBJS)
+ $(CXX) -shared -dynamiclib -o $@ $(CXXFLAGS) $(LIBOBJS)
+
+.PHONY: cryptest.exe
+cryptest.exe: libcryptopp.a $(TESTOBJS)
+ $(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) ./libcryptopp.a $(LDFLAGS) $(LDLIBS)
+
+dll: cryptest.import.exe dlltest.exe
+
+cryptopp.dll: $(DLLOBJS)
+ $(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a
+
+libcryptopp.import.a: $(LIBIMPORTOBJS)
+ $(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
+ $(RANLIB) $@
+
+cryptest.import.exe: cryptopp.dll libcryptopp.import.a $(TESTIMPORTOBJS)
+ $(CXX) -o $@ $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS)
+
+dlltest.exe: cryptopp.dll $(DLLTESTOBJS)
+ $(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS)
+
+adhoc.cpp: adhoc.cpp.proto
+ifeq ($(wildcard adhoc.cpp),)
+ cp adhoc.cpp.proto adhoc.cpp
+else
+ touch adhoc.cpp
+endif
+
+%.dllonly.o : %.cpp
+ $(CXX) $(CXXFLAGS) -DCRYPTOPP_DLL_ONLY -c $< -o $@
+
+%.import.o : %.cpp
+ $(CXX) $(CXXFLAGS) -DCRYPTOPP_IMPORTS -c $< -o $@
+
+%.export.o : %.cpp
+ $(CXX) $(CXXFLAGS) -DCRYPTOPP_EXPORTS -c $< -o $@
+
+%.o : %.cpp
+ $(CXX) $(CXXFLAGS) -c $<
+
+#################################################################
+# Dependencies
+
+# Do not build dependencies for some targets
+NO_DEPS = dist install install-strip uninstall remove clean distclean
+ifeq ($(findstring $(MAKECMDGOALS),$(NO_DEPS)),)
+
+# Do not build dependencies when multiarch is in effect
+ifeq ($(MULTIARCH),0)
+-include GNUmakefile.deps
+endif
+
+GNUmakefile.deps:
+ $(CXX) $(CXXFLAGS) -MM *.cpp > GNUmakefile.deps
+
+endif # NO_DEPS
|