+### 3.1 Selecting compiler (default = gcc)
+
+CXXFLAGS += -Wall -Wcast-qual -fno-exceptions -fno-rtti $(EXTRACXXFLAGS)
+LDFLAGS += $(EXTRALDFLAGS)
+
+ifeq ($(COMP),)
+ COMP=gcc
+endif
+
+ifeq ($(COMP),gcc)
+ comp=gcc
+ CXX=g++
+ CXXFLAGS += -ansi -pedantic -Wno-long-long -Wextra -Wshadow
+endif
+
+ifeq ($(COMP),mingw)
+ comp=mingw
+ CXX=g++
+ CXXFLAGS += -Wextra -Wshadow
+ LDFLAGS += -static-libstdc++ -static-libgcc
+endif
+
+ifeq ($(COMP),icc)
+ comp=icc
+ CXX=icpc
+ CXXFLAGS += -diag-disable 1476,10120 -Wcheck -Wabi -Wdeprecated -strict-ansi
+endif
+
+ifeq ($(COMP),clang)
+ comp=clang
+ CXX=clang++
+ CXXFLAGS += -pedantic -Wno-long-long -Wextra -Wshadow
+endif
+
+ifeq ($(comp),icc)
+ profile_prepare = icc-profile-prepare
+ profile_make = icc-profile-make
+ profile_use = icc-profile-use
+ profile_clean = icc-profile-clean
+else
+ profile_prepare = gcc-profile-prepare
+ profile_make = gcc-profile-make
+ profile_use = gcc-profile-use
+ profile_clean = gcc-profile-clean
+endif
+
+ifeq ($(UNAME),Darwin)
+ CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.6
+ LDFLAGS += -arch $(arch) -mmacosx-version-min=10.6
+endif
+
+### On mingw use Windows threads, otherwise POSIX
+ifneq ($(comp),mingw)
+ # On Android Bionic's C library comes with its own pthread implementation bundled in
+ ifneq ($(arch),armv7)
+ # Haiku has pthreads in its libroot, so only link it in on other platforms
+ ifneq ($(UNAME),Haiku)
+ LDFLAGS += -lpthread
+ endif
+ endif
+endif
+
+### 3.4 Debugging
+ifeq ($(debug),no)
+ CXXFLAGS += -DNDEBUG
+else
+ CXXFLAGS += -g
+endif
+
+### 3.5 Optimization
+ifeq ($(optimize),yes)
+
+ ifeq ($(comp),gcc)
+ CXXFLAGS += -O3
+
+ ifeq ($(UNAME),Darwin)
+ ifeq ($(arch),i386)
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+ ifeq ($(arch),x86_64)
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+ endif
+
+ ifeq ($(arch),armv7)
+ CXXFLAGS += -fno-gcse -mthumb -march=armv7-a -mfloat-abi=softfp
+ endif
+ endif
+
+ ifeq ($(comp),mingw)
+ CXXFLAGS += -O3
+ endif
+
+ ifeq ($(comp),icc)
+ ifeq ($(UNAME),Darwin)
+ CXXFLAGS += -fast -mdynamic-no-pic
+ else
+ CXXFLAGS += -fast
+ endif
+ endif
+
+ ifeq ($(comp),clang)
+ CXXFLAGS += -O3
+
+ ifeq ($(UNAME),Darwin)
+ ifeq ($(pext),no)
+ CXXFLAGS += -flto
+ LDFLAGS += $(CXXFLAGS)
+ endif
+ ifeq ($(arch),i386)
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+ ifeq ($(arch),x86_64)
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+ endif
+ endif
+endif
+
+### 3.6. Bits
+ifeq ($(bits),64)
+ CXXFLAGS += -DIS_64BIT
+endif
+
+### 3.7 prefetch
+ifeq ($(prefetch),yes)
+ ifeq ($(sse),yes)
+ CXXFLAGS += -msse
+ DEPENDFLAGS += -msse
+ endif
+else
+ CXXFLAGS += -DNO_PREFETCH
+endif
+
+### 3.8 bsfq
+ifeq ($(bsfq),yes)
+ CXXFLAGS += -DUSE_BSFQ
+endif
+
+### 3.9 popcnt
+ifeq ($(popcnt),yes)
+ CXXFLAGS += -msse3 -mpopcnt -DUSE_POPCNT
+endif
+
+### 3.10 pext
+ifeq ($(pext),yes)
+ CXXFLAGS += -DUSE_PEXT
+ ifeq ($(comp),$(filter $(comp),gcc clang mingw))
+ CXXFLAGS += -mbmi -mbmi2
+ endif
+endif
+
+### 3.11 Link Time Optimization, it works since gcc 4.5 but not on mingw.
+### This is a mix of compile and link time options because the lto link phase
+### needs access to the optimization flags.
+ifeq ($(comp),gcc)
+ ifeq ($(optimize),yes)
+ ifeq ($(debug),no)
+ GCC_MAJOR := `$(CXX) -dumpversion | cut -f1 -d.`
+ GCC_MINOR := `$(CXX) -dumpversion | cut -f2 -d.`
+ ifeq (1,$(shell expr \( $(GCC_MAJOR) \> 4 \) \| \( $(GCC_MAJOR) \= 4 \& $(GCC_MINOR) \>= 5 \)))
+ CXXFLAGS += -flto
+ LDFLAGS += $(CXXFLAGS)
+ endif
+ endif
+ endif
+endif