Cleaned up and re-organized the makefile. There are now sections, with some comments calling out what various sections do and the work arounds that are in effect

pull/35/head
Jeffrey Walton 2015-07-24 23:08:18 -04:00
parent f4b44dfea8
commit d6f5ed03bf
1 changed files with 218 additions and 110 deletions

View File

@ -1,22 +1,27 @@
#################################################################
# 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
#########################
# CXXFLAGS
CXXFLAGS ?= -DNDEBUG -g2 -O3
# -fPIC is supported, and enabled by default for x86_64.
# 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
ARFLAGS = -cr # ar needs the dash on OpenBSD
RANLIB ?= ranlib
STRIP ?= strip
CP = cp
MKDIR = mkdir
EGREP = egrep
UNAME = $(shell uname)
IS_X86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64")
IS_X86_64 = $(shell uname -m | $(EGREP) -c "_64|d64")
IS_DARWIN = $(shell uname -s | $(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")
#########################
# 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")
@ -25,12 +30,107 @@ SUN_COMPILER = $(shell $(CXX) -V 2>&1 | $(EGREP) -i -c "CC: Sun")
# 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
IS_X86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64")
IS_X86_64 = $(shell uname -m | $(EGREP) -c "_64|d64")
IS_DARWIN = $(shell uname -s | $(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 uname -s | $(EGREP) -i -c "SunOS")
IS_FEDORA22_i686 = $(shell uname -r | $(EGREP) -i -c "f22.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
ifeq ($(IS_X86),1)
# 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])")
@ -54,32 +154,7 @@ ifneq ($(IS_X86_64),0)
CXXFLAGS += -fPIC
endif # PIC for x86_64 targets
# Undefined Behavior Sanitizer (Clang 3.2 and GCC 4.8 and above)
ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
CXXFLAGS += -fsanitize=undefined
# CXXFLAGS += -fsanitize-undefined-trap-on-error
endif # UBsan
# Address Sanitizer (Clang 3.2 and GCC 4.8 and above)
ifeq ($(findstring asan,$(MAKECMDGOALS)),asan)
CXXFLAGS += -fsanitize=address
endif # Asan
# Test CXXFLAGS in case the user passed the flags directly through it
ASAN = 0
UBSAN = 0
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
#########################
# Cygwin work arounds
ifneq ($(IS_CYGWIN),0)
@ -88,7 +163,7 @@ ifeq ($(CXX),gcc)
CXX = g++
endif # CXX
# -fPIC causes spurious output during compile
# -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
@ -103,15 +178,23 @@ endif # GCC 4.5
endif # Cygwin work arounds
# Build a boolean circuit that says "Darwin && (GCC 4.2 || Clang)"
# MULTIARCH_SUPPORT ?= $(shell echo $$(($(IS_DARWIN) * ($(GCC42_OR_LATER) + $(CLANG_COMPILER)))))
MULTIARCH_SUPPORT ?= 0
ifneq ($(MULTIARCH_SUPPORT),0)
CXXFLAGS += -arch i386 -arch x86_64
else
#########################
# F22/i386 crash
ifneq ($(IS_FEDORA22_i686),0)
ifeq ($(findstring -O3,$(CXXFLAGS)),-O3)
CXXFLAGS := $(subst -O3,-O2,$(CXXFLAGS))
endif # -O2
endif # Fedora 22/i686
#########################
# Original Crypto++ code. Way back when, this caused a compiler crash with GCC on Ubuntu 9 or 10
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)
@ -121,6 +204,9 @@ 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
@ -131,93 +217,103 @@ ifeq ($(GAS219_OR_LATER),0)
CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI
endif # GAS219_OR_LATER
endif # GAS217_OR_LATER
ifeq ($(UNAME),SunOS)
ifneq ($(IS_SUN),0)
CXXFLAGS += -Wa,--divide # allow use of "/" operator
endif # SunOS
endif # IS_SUN
endif # GAS210_OR_LATER
endif # IS_X86
#########################
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
ifneq ($(IS_X86_64),0)
M32OR64 = -m64
endif
ifeq ($(findstring -fopenmp,$(MAKECMDGOALS)),-fopenmp)
LDLIBS += -lgomp
endif # -fopenmp
endif # IS_LINUX
ifneq ($(IS_DARWIN),0)
AR ?= libtool
ARFLAGS ?= -static -o
CXX ?= c++
endif
ifeq ($(UNAME),SunOS)
ifneq ($(IS_SUN),0)
LDLIBS += -lnsl -lsocket
M32OR64 = -m$(shell isainfo -b)
endif
# -Wall 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 -Wno-type-limits -Wno-unknown-pragmas
endif
ifneq ($(CLANG_COMPILER),0)
CXXFLAGS += -Wall -Wno-tautological-compare
endif
ifeq ($(UNAME),) # for DJGPP, where uname doesn't exist
CXXFLAGS += -mbnu210
else
CXXFLAGS += -pipe
endif
ifneq ($(SUN_COMPILER),0) # override flags for CC Sun C++ compiler
CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef $(M32OR64)
LDFLAGS =
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
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
SRCS = $(filter-out pch.cpp cryptlib_bds.cpp winpipes.cpp, $(wildcard *.cpp))
ifneq ($(IS_MINGW),0)
SRCS += winpipes.cpp
# -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
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
#################################################################
# 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
@ -232,45 +328,52 @@ test check: cryptest.exe
.PHONY: clean
clean:
-$(RM) cryptest.exe libcryptopp.a libcrypto++.a libcryptopp.so libcrypto++.so libcryptopp.dylib $(LIBOBJS) $(TESTOBJS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTI MPORTOBJS) $(DLLTESTOBJS)
-$(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 *.exe \
a.out *~ \.*~ *\.h\. *\.cpp\. *.bu *.bak \
adhoc.cpp adhoc.cpp.copied *.diff *.patch cryptopp.zip \
*.dSYM .DS_Store TestVectors/.DS_Store TestData/.DS_Store
-$(RM) -r GNUmakefile.deps *.o *.obj *.a *.so *.exe 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) *.a $(PREFIX)/lib
-$(CP) *.so *.dylib $(PREFIX)/lib
-$(CP) *.exe $(PREFIX)/bin
-$(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: libcryptopp.a cryptest.exe
$(MKDIR) -p $(PREFIX)/include/cryptopp $(PREFIX)/lib $(PREFIX)/bin
-$(CP) *.h $(PREFIX)/include/cryptopp
-$(CP) *.a $(PREFIX)/lib
-$(CP) *.so $(PREFIX)/lib
-$(CP) *.exe $(PREFIX)/bin
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)/lib/libcryptopp.so
-$(RM) $(PREFIX)/lib/libcryptopp.dylib
-$(RM) $(PREFIX)/bin/cryptest.exe
ifeq ($(IS_DARWIN),0)
-$(RM) $(PREFIX)/lib/libcryptopp.so
else
-$(RM) $(PREFIX)/lib/libcryptopp.dylib
endif
.PHONY: dist
dist: distclean
.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 \
@ -284,7 +387,7 @@ libcryptopp.a: $(LIBOBJS)
libcryptopp.so: $(LIBOBJS)
$(CXX) -shared -o $@ $(CXXFLAGS) $(LIBOBJS)
libcryptopp.dylib: $(LIBOBJS)
$(CXX) -shared -dynamiclib -o $@ $(CXXFLAGS) $(LIBOBJS)
@ -326,14 +429,19 @@ endif
%.o : %.cpp
$(CXX) $(CXXFLAGS) -c $<
# Do not build dependencies when multiarch is in effect
ifeq ($(MULTIARCH_SUPPORT),0)
#################################################################
# Dependencies
# Do not build dependencies when cleaning
ifneq ($(findstring clean,$(MAKECMDGOALS)),clean)
# 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
endif # NO_DEPS