From d6f5ed03bf6ec88ea130800cdd7e37b99cf06253 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Fri, 24 Jul 2015 23:08:18 -0400 Subject: [PATCH] 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 --- GNUmakefile | 328 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 218 insertions(+), 110 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index b37c949c..7d5fe115 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -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