Fixed variable expansion issue on Cygwin (other shells on on OSes were fine, like Bash and C shell)

pull/35/head
Jeffrey Walton 2015-07-25 06:56:38 -04:00
parent e75cb8dd8b
commit ff8974f1fd
1 changed files with 486 additions and 485 deletions

971
GNUmakefile Normal file → Executable file
View File

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