2 # Include user definition
5 # TO suppress recursive includes
12 NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-netlib
15 # - Only set if not specified on the command line or inherited from the environment.
16 # - CC is an implicit variable so neither '?=' or 'ifndef' can be used.
17 # http://stackoverflow.com/questions/4029274/mingw-and-make-variables
18 # - Default value is 'cc' which is not always a valid command (e.g. MinGW).
19 ifeq ($(origin CC),default)
21 # Change the default compile to clang on Mac OSX.
22 # http://stackoverflow.com/questions/714100/os-detecting-makefile
23 UNAME_S := $(shell uname -s)
24 ifeq ($(UNAME_S),Darwin)
29 # Default Fortran compiler (FC) is selected by f_check.
32 include $(TOPDIR)/Makefile.rule
34 include $(TOPDIR)/$(MAKEFILE_RULE)
38 # Beginning of system configuration
46 GETARCH_FLAGS := -DFORCE_$(TARGET)
49 #TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
52 GETARCH_FLAGS := -DFORCE_$(TARGET_CORE)
56 GETARCH_FLAGS += -DUSE64BITINT
59 ifndef GEMM_MULTITHREAD_THRESHOLD
60 GEMM_MULTITHREAD_THRESHOLD=4
62 GETARCH_FLAGS += -DGEMM_MULTITHREAD_THRESHOLD=$(GEMM_MULTITHREAD_THRESHOLD)
65 GETARCH_FLAGS += -DNO_AVX
72 ifeq ($(QUIET_MAKE), 1)
76 ifndef NO_PARALLEL_MAKE
79 GETARCH_FLAGS += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE)
81 ifeq ($(HOSTCC), loongcc)
82 GETARCH_FLAGS += -static
85 #if don't use Fortran, it will only compile CBLAS.
86 ifeq ($(ONLY_CBLAS), 1)
92 # This operation is expensive, so execution should be once.
93 ifndef GOTOBLAS_MAKEFILE
94 export GOTOBLAS_MAKEFILE = 1
96 # Generating Makefile.conf and config.h
97 DUMMY := $(shell $(MAKE) -C $(TOPDIR) -f Makefile.prebuild CC="$(CC)" FC="$(FC)" HOSTCC="$(HOSTCC)" CFLAGS="$(GETARCH_FLAGS)" BINARY=$(BINARY) USE_OPENMP=$(USE_OPENMP) TARGET_CORE=$(TARGET_CORE) ONLY_CBLAS=$(ONLY_CBLAS) all)
100 include $(TOPDIR)/Makefile.conf
102 include $(TOPDIR)/Makefile_kernel.conf
108 NUM_THREADS = $(NUM_CORES)
111 ifeq ($(NUM_THREADS), 1)
112 override USE_THREAD = 0
116 ifeq ($(USE_THREAD), 0)
122 ifeq ($(NUM_THREAD), 1)
135 AR = $(CROSS_SUFFIX)ar
136 AS = $(CROSS_SUFFIX)as
137 LD = $(CROSS_SUFFIX)ld
138 RANLIB = $(CROSS_SUFFIX)ranlib
139 NM = $(CROSS_SUFFIX)nm
140 DLLWRAP = $(CROSS_SUFFIX)dllwrap
143 # OS dependent settings
146 ifeq ($(OSNAME), Darwin)
147 export MACOSX_DEPLOYMENT_TARGET=10.2
151 ifeq ($(OSNAME), FreeBSD)
155 ifeq ($(OSNAME), NetBSD)
159 ifeq ($(OSNAME), Linux)
164 ifeq ($(OSNAME), AIX)
168 ifeq ($(OSNAME), WINNT)
172 EXTRALIB += -defaultlib:advapi32
178 ifeq ($(C_COMPILER), CLANG)
179 CCOMMON_OPT += -DMS_ABI
182 ifeq ($(C_COMPILER), GCC)
183 #Test for supporting MS_ABI
184 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
185 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
186 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
187 ifeq ($(GCCVERSIONGT4), 1)
188 # GCC Majar version > 4
189 # It is compatible with MSVC ABI.
190 CCOMMON_OPT += -DMS_ABI
193 ifeq ($(GCCVERSIONGTEQ4), 1)
194 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
196 # It is compatible with MSVC ABI.
197 CCOMMON_OPT += -DMS_ABI
202 # Ensure the correct stack alignment on Win32
203 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
205 CCOMMON_OPT += -mincoming-stack-boundary=2
206 FCOMMON_OPT += -mincoming-stack-boundary=2
211 ifeq ($(OSNAME), Interix)
215 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
218 ifeq ($(OSNAME), CYGWIN_NT)
223 ifneq ($(OSNAME), WINNT)
224 ifneq ($(OSNAME), CYGWIN_NT)
225 ifneq ($(OSNAME), Interix)
227 EXTRALIB += -lpthread
234 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
239 CCOMMON_OPT += -DQUAD_PRECISION
244 ifneq ($(ARCH), x86_64)
250 CCOMMON_OPT += -DUTEST_CHECK
255 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
259 # Architecture dependent settings
266 ifndef NO_EXPRECISION
267 ifeq ($(F_COMPILER), GFORTRAN)
268 # ifeq logical or. GCC or LSB
269 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
271 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
272 FCOMMON_OPT += -m128bit-long-double
274 ifeq ($(C_COMPILER), CLANG)
276 CCOMMON_OPT += -DEXPRECISION
277 FCOMMON_OPT += -m128bit-long-double
283 ifeq ($(ARCH), x86_64)
284 ifndef NO_EXPRECISION
285 ifeq ($(F_COMPILER), GFORTRAN)
286 # ifeq logical or. GCC or LSB
287 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
289 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
290 FCOMMON_OPT += -m128bit-long-double
292 ifeq ($(C_COMPILER), CLANG)
294 CCOMMON_OPT += -DEXPRECISION
295 FCOMMON_OPT += -m128bit-long-double
301 ifeq ($(C_COMPILER), INTEL)
302 CCOMMON_OPT += -wd981
305 ifeq ($(USE_OPENMP), 1)
306 # ifeq logical or. GCC or LSB
307 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
308 CCOMMON_OPT += -fopenmp
311 ifeq ($(C_COMPILER), CLANG)
312 $(error OpenBLAS: Clang didn't support OpenMP yet.)
313 CCOMMON_OPT += -fopenmp
316 ifeq ($(C_COMPILER), INTEL)
317 CCOMMON_OPT += -openmp
320 ifeq ($(C_COMPILER), PGI)
324 ifeq ($(C_COMPILER), OPEN64)
326 CEXTRALIB += -lstdc++
329 ifeq ($(C_COMPILER), PATHSCALE)
335 ifeq ($(DYNAMIC_ARCH), 1)
337 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
338 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
340 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER HASWELL
344 ifeq ($(ARCH), x86_64)
345 DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
347 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER HASWELL
360 ifeq ($(F_COMPILER), GFORTRAN)
361 ifeq ($(C_COMPILER), GCC)
363 # CCOMMON_OPT += -DEXPRECISION
368 ifeq ($(ARCH), mips64)
372 ifeq ($(ARCH), alpha)
382 ifeq ($(ARCH), arm64)
391 # C Compiler dependent settings
395 # ifeq logical or. GCC or CLANG or LSB
396 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
397 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
399 COMMON_PROF += -fno-inline
400 NO_UNINITIALIZED_WARN = -Wno-uninitialized
402 ifeq ($(QUIET_MAKE), 1)
403 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
408 ifeq ($(ARCH), mips64)
410 CCOMMON_OPT += -mabi=64
412 CCOMMON_OPT += -mabi=n32
417 ifeq ($(CORE), LOONGSON3A)
418 CCOMMON_OPT += -march=mips64
419 FCOMMON_OPT += -march=mips64
422 ifeq ($(CORE), LOONGSON3B)
423 CCOMMON_OPT += -march=mips64
424 FCOMMON_OPT += -march=mips64
427 ifeq ($(OSNAME), AIX)
433 ifndef BINARY_DEFINED
443 ifeq ($(C_COMPILER), PGI)
445 CCOMMON_OPT += -tp p7-64
447 CCOMMON_OPT += -tp p7
451 ifeq ($(C_COMPILER), PATHSCALE)
460 # Fortran Compiler dependent settings
463 ifeq ($(F_COMPILER), G77)
464 CCOMMON_OPT += -DF_INTERFACE_G77
466 ifndef NO_BINARY_MODE
475 ifeq ($(F_COMPILER), G95)
476 CCOMMON_OPT += -DF_INTERFACE_G95
478 ifndef NO_BINARY_MODE
487 ifeq ($(F_COMPILER), GFORTRAN)
488 CCOMMON_OPT += -DF_INTERFACE_GFORT
490 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
491 ifneq ($(NO_LAPACK), 1)
492 EXTRALIB += -lgfortran
495 ifeq ($(ARCH), mips64)
497 FCOMMON_OPT += -mabi=64
499 FCOMMON_OPT += -mabi=n32
506 FCOMMON_OPT += -fdefault-integer-8
513 FCOMMON_OPT += -fopenmp
517 ifeq ($(F_COMPILER), INTEL)
518 CCOMMON_OPT += -DF_INTERFACE_INTEL
523 FCOMMON_OPT += -openmp
527 ifeq ($(F_COMPILER), FUJITSU)
528 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
530 FCOMMON_OPT += -openmp
534 ifeq ($(F_COMPILER), IBM)
535 CCOMMON_OPT += -DF_INTERFACE_IBM
536 # FCOMMON_OPT += -qarch=440
540 FCOMMON_OPT += -qintsize=8
546 FCOMMON_OPT += -openmp
550 ifeq ($(F_COMPILER), PGI)
551 CCOMMON_OPT += -DF_INTERFACE_PGI
552 COMMON_PROF += -DPGICOMPILER
557 FCOMMON_OPT += -tp p7-64
559 FCOMMON_OPT += -tp p7
566 ifeq ($(F_COMPILER), PATHSCALE)
567 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
574 ifneq ($(ARCH), mips64)
582 FCOMMON_OPT += -mabi=64
584 FCOMMON_OPT += -mabi=n32
593 ifeq ($(F_COMPILER), OPEN64)
594 CCOMMON_OPT += -DF_INTERFACE_OPEN64
601 ifeq ($(ARCH), mips64)
607 ifeq ($(CORE), LOONGSON3A)
608 FCOMMON_OPT += -loongson3 -static
611 ifeq ($(CORE), LOONGSON3B)
612 FCOMMON_OPT += -loongson3 -static
624 FEXTRALIB += -lstdc++
629 ifeq ($(C_COMPILER), OPEN64)
631 ifeq ($(ARCH), mips64)
637 ifeq ($(CORE), LOONGSON3A)
638 CCOMMON_OPT += -loongson3 -static
641 ifeq ($(CORE), LOONGSON3B)
642 CCOMMON_OPT += -loongson3 -static
655 ifeq ($(C_COMPILER), SUN)
664 ifeq ($(F_COMPILER), SUN)
665 CCOMMON_OPT += -DF_INTERFACE_SUN
672 FCOMMON_OPT += -xopenmp=parallel
676 ifeq ($(F_COMPILER), COMPAQ)
677 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
679 FCOMMON_OPT += -openmp
690 ifeq ($(NEED_PIC), 1)
691 ifeq ($(C_COMPILER), IBM)
692 CCOMMON_OPT += -qpic=large
696 ifeq ($(F_COMPILER), SUN)
703 ifeq ($(DYNAMIC_ARCH), 1)
704 CCOMMON_OPT += -DDYNAMIC_ARCH
707 ifeq ($(NO_LAPACK), 1)
708 CCOMMON_OPT += -DNO_LAPACK
709 #Disable LAPACK C interface
713 ifeq ($(NO_LAPACKE), 1)
714 CCOMMON_OPT += -DNO_LAPACKE
718 CCOMMON_OPT += -DNO_AVX
722 CCOMMON_OPT += -DSMP_SERVER
724 ifeq ($(ARCH), mips64)
725 ifneq ($(CORE), LOONGSON3B)
726 USE_SIMPLE_THREADED_LEVEL3 = 1
730 ifeq ($(USE_OPENMP), 1)
731 # USE_SIMPLE_THREADED_LEVEL3 = 1
733 CCOMMON_OPT += -DUSE_OPENMP
738 ifeq ($(NO_WARMUP), 1)
739 CCOMMON_OPT += -DNO_WARMUP
742 ifeq ($(CONSISTENT_FPCSR), 1)
743 CCOMMON_OPT += -DCONSISTENT_FPCSR
746 # Only for development
747 # CCOMMON_OPT += -DPARAMTEST
748 # CCOMMON_OPT += -DPREFETCHTEST
749 # CCOMMON_OPT += -DNO_SWITCHING
753 CCOMMON_OPT += -DUSE_PAPI
754 EXTRALIB += -lpapi -lperfctr
757 ifdef DYNAMIC_THREADS
758 CCOMMON_OPT += -DDYNAMIC_THREADS
761 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
763 ifdef USE_SIMPLE_THREADED_LEVEL3
764 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
768 LIBPREFIX = libopenblas
770 LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
773 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
775 include $(TOPDIR)/Makefile.$(ARCH)
777 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
779 ifeq ($(CORE), PPC440)
780 CCOMMON_OPT += -DALLOC_QALLOC
783 ifeq ($(CORE), PPC440FP2)
784 STATIC_ALLOCATION = 1
787 ifneq ($(OSNAME), Linux)
791 ifneq ($(ARCH), x86_64)
793 ifneq ($(CORE), LOONGSON3B)
800 CCOMMON_OPT += -DNO_AFFINITY
803 ifdef FUNCTION_PROFILE
804 CCOMMON_OPT += -DFUNCTION_PROFILE
807 ifdef HUGETLB_ALLOCATION
808 CCOMMON_OPT += -DALLOC_HUGETLB
811 ifdef HUGETLBFILE_ALLOCATION
812 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
815 ifdef STATIC_ALLOCATION
816 CCOMMON_OPT += -DALLOC_STATIC
819 ifdef DEVICEDRIVER_ALLOCATION
820 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
823 ifdef MIXED_MEMORY_ALLOCATION
824 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
827 ifeq ($(OSNAME), SunOS)
843 REVISION = -r$(VERSION)
844 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
857 ifeq ($(ARCH), arm64)
868 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
869 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
871 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
872 override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
875 #For LAPACK Fortran codes.
876 #Disable -fopenmp for LAPACK Fortran codes on Windows.
878 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
879 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
881 LAPACK_FFLAGS := $(FFLAGS)
882 LAPACK_FPFLAGS := $(FPFLAGS)
885 LAPACK_CFLAGS = $(CFLAGS)
886 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
888 LAPACK_CFLAGS += -DLAPACK_ILP64
891 LAPACK_CFLAGS += -DOPENBLAS_OS_WINDOWS
893 ifeq ($(C_COMPILER), LSB)
894 LAPACK_CFLAGS += -DLAPACK_COMPLEX_STRUCTURE
909 ifneq ($(DYNAMIC_ARCH), 1)
911 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
912 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
914 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
915 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
919 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
920 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
922 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
923 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
928 LIBDLLNAME = $(LIBPREFIX).dll
929 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
930 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
931 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
932 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
933 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
935 LIBS = $(TOPDIR)/$(LIBNAME)
936 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
939 LIB_COMPONENTS = BLAS
940 ifneq ($(NO_CBLAS), 1)
941 LIB_COMPONENTS += CBLAS
944 ifneq ($(NO_LAPACK), 1)
945 LIB_COMPONENTS += LAPACK
946 ifneq ($(NO_LAPACKE), 1)
947 LIB_COMPONENTS += LAPACKE
951 ifeq ($(ONLY_CBLAS), 1)
952 LIB_COMPONENTS = CBLAS
965 export NEED2UNDERSCORES
999 export FUNCTION_PROFILE
1002 export SGEMM_UNROLL_M
1003 export SGEMM_UNROLL_N
1004 export DGEMM_UNROLL_M
1005 export DGEMM_UNROLL_N
1006 export QGEMM_UNROLL_M
1007 export QGEMM_UNROLL_N
1008 export CGEMM_UNROLL_M
1009 export CGEMM_UNROLL_N
1010 export ZGEMM_UNROLL_M
1011 export ZGEMM_UNROLL_N
1012 export XGEMM_UNROLL_M
1013 export XGEMM_UNROLL_N
1014 export CGEMM3M_UNROLL_M
1015 export CGEMM3M_UNROLL_N
1016 export ZGEMM3M_UNROLL_M
1017 export ZGEMM3M_UNROLL_N
1018 export XGEMM3M_UNROLL_M
1019 export XGEMM3M_UNROLL_N
1029 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1032 $(FC) $(FFLAGS) -c $< -o $(@F)
1035 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
1039 PATHSCALEPATH = /opt/pathscale/lib/3.1
1040 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
1042 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
1043 PGIPATH = /opt/pgi/linux86/7.1-5/lib
1046 ACMLPATH = /opt/acml/4.3.0
1047 ifneq ($(OSNAME), Darwin)
1048 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
1050 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1052 ATLASPATH = /opt/atlas/3.9.17/opteron
1053 FLAMEPATH = $(HOME)/flame/lib
1054 ifneq ($(OSNAME), SunOS)
1055 SUNPATH = /opt/sunstudio12.1
1057 SUNPATH = /opt/SUNWspro