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)
163 ifeq ($(OSNAME), AIX)
167 ifeq ($(OSNAME), WINNT)
171 EXTRALIB += -defaultlib:advapi32
177 ifeq ($(C_COMPILER), CLANG)
178 CCOMMON_OPT += -DMS_ABI
181 ifeq ($(C_COMPILER), GCC)
182 #Test for supporting MS_ABI
183 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
184 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
185 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
186 ifeq ($(GCCVERSIONGT4), 1)
187 # GCC Majar version > 4
188 # It is compatible with MSVC ABI.
189 CCOMMON_OPT += -DMS_ABI
192 ifeq ($(GCCVERSIONGTEQ4), 1)
193 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
195 # It is compatible with MSVC ABI.
196 CCOMMON_OPT += -DMS_ABI
201 # Ensure the correct stack alignment on Win32
202 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
204 CCOMMON_OPT += -mincoming-stack-boundary=2
205 FCOMMON_OPT += -mincoming-stack-boundary=2
210 ifeq ($(OSNAME), Interix)
214 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
217 ifeq ($(OSNAME), CYGWIN_NT)
222 ifneq ($(OSNAME), WINNT)
223 ifneq ($(OSNAME), CYGWIN_NT)
224 ifneq ($(OSNAME), Interix)
226 EXTRALIB += -lpthread
233 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
238 CCOMMON_OPT += -DQUAD_PRECISION
243 ifneq ($(ARCH), x86_64)
249 CCOMMON_OPT += -DUTEST_CHECK
254 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
258 # Architecture dependent settings
265 ifndef NO_EXPRECISION
266 ifeq ($(F_COMPILER), GFORTRAN)
267 # ifeq logical or. GCC or LSB
268 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
270 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
271 FCOMMON_OPT += -m128bit-long-double
273 ifeq ($(C_COMPILER), CLANG)
275 CCOMMON_OPT += -DEXPRECISION
276 FCOMMON_OPT += -m128bit-long-double
282 ifeq ($(ARCH), x86_64)
283 ifndef NO_EXPRECISION
284 ifeq ($(F_COMPILER), GFORTRAN)
285 # ifeq logical or. GCC or LSB
286 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
288 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
289 FCOMMON_OPT += -m128bit-long-double
291 ifeq ($(C_COMPILER), CLANG)
293 CCOMMON_OPT += -DEXPRECISION
294 FCOMMON_OPT += -m128bit-long-double
300 ifeq ($(C_COMPILER), INTEL)
301 CCOMMON_OPT += -wd981
304 ifeq ($(USE_OPENMP), 1)
305 # ifeq logical or. GCC or LSB
306 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
307 CCOMMON_OPT += -fopenmp
310 ifeq ($(C_COMPILER), CLANG)
311 $(error OpenBLAS: Clang didn't support OpenMP yet.)
312 CCOMMON_OPT += -fopenmp
315 ifeq ($(C_COMPILER), INTEL)
316 CCOMMON_OPT += -openmp
319 ifeq ($(C_COMPILER), PGI)
323 ifeq ($(C_COMPILER), OPEN64)
325 CEXTRALIB += -lstdc++
328 ifeq ($(C_COMPILER), PATHSCALE)
334 ifeq ($(DYNAMIC_ARCH), 1)
336 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
337 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
339 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER HASWELL
343 ifeq ($(ARCH), x86_64)
344 DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
346 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER HASWELL
359 ifeq ($(F_COMPILER), GFORTRAN)
360 ifeq ($(C_COMPILER), GCC)
362 # CCOMMON_OPT += -DEXPRECISION
367 ifeq ($(ARCH), mips64)
371 ifeq ($(ARCH), alpha)
381 ifeq ($(ARCH), arm64)
390 # C Compiler dependent settings
394 # ifeq logical or. GCC or CLANG or LSB
395 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
396 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
398 COMMON_PROF += -fno-inline
399 NO_UNINITIALIZED_WARN = -Wno-uninitialized
401 ifeq ($(QUIET_MAKE), 1)
402 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
407 ifeq ($(ARCH), mips64)
409 CCOMMON_OPT += -mabi=64
411 CCOMMON_OPT += -mabi=n32
416 ifeq ($(CORE), LOONGSON3A)
417 CCOMMON_OPT += -march=mips64
418 FCOMMON_OPT += -march=mips64
421 ifeq ($(CORE), LOONGSON3B)
422 CCOMMON_OPT += -march=mips64
423 FCOMMON_OPT += -march=mips64
426 ifeq ($(OSNAME), AIX)
432 ifndef BINARY_DEFINED
442 ifeq ($(C_COMPILER), PGI)
444 CCOMMON_OPT += -tp p7-64
446 CCOMMON_OPT += -tp p7
450 ifeq ($(C_COMPILER), PATHSCALE)
459 # Fortran Compiler dependent settings
462 ifeq ($(F_COMPILER), G77)
463 CCOMMON_OPT += -DF_INTERFACE_G77
465 ifndef NO_BINARY_MODE
474 ifeq ($(F_COMPILER), G95)
475 CCOMMON_OPT += -DF_INTERFACE_G95
477 ifndef NO_BINARY_MODE
486 ifeq ($(F_COMPILER), GFORTRAN)
487 CCOMMON_OPT += -DF_INTERFACE_GFORT
489 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
490 ifneq ($(NO_LAPACK), 1)
491 EXTRALIB += -lgfortran
494 ifeq ($(ARCH), mips64)
496 FCOMMON_OPT += -mabi=64
498 FCOMMON_OPT += -mabi=n32
505 FCOMMON_OPT += -fdefault-integer-8
512 FCOMMON_OPT += -fopenmp
516 ifeq ($(F_COMPILER), INTEL)
517 CCOMMON_OPT += -DF_INTERFACE_INTEL
522 FCOMMON_OPT += -openmp
526 ifeq ($(F_COMPILER), FUJITSU)
527 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
529 FCOMMON_OPT += -openmp
533 ifeq ($(F_COMPILER), IBM)
534 CCOMMON_OPT += -DF_INTERFACE_IBM
535 # FCOMMON_OPT += -qarch=440
539 FCOMMON_OPT += -qintsize=8
545 FCOMMON_OPT += -openmp
549 ifeq ($(F_COMPILER), PGI)
550 CCOMMON_OPT += -DF_INTERFACE_PGI
551 COMMON_PROF += -DPGICOMPILER
556 FCOMMON_OPT += -tp p7-64
558 FCOMMON_OPT += -tp p7
565 ifeq ($(F_COMPILER), PATHSCALE)
566 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
573 ifneq ($(ARCH), mips64)
581 FCOMMON_OPT += -mabi=64
583 FCOMMON_OPT += -mabi=n32
592 ifeq ($(F_COMPILER), OPEN64)
593 CCOMMON_OPT += -DF_INTERFACE_OPEN64
600 ifeq ($(ARCH), mips64)
606 ifeq ($(CORE), LOONGSON3A)
607 FCOMMON_OPT += -loongson3 -static
610 ifeq ($(CORE), LOONGSON3B)
611 FCOMMON_OPT += -loongson3 -static
623 FEXTRALIB += -lstdc++
628 ifeq ($(C_COMPILER), OPEN64)
630 ifeq ($(ARCH), mips64)
636 ifeq ($(CORE), LOONGSON3A)
637 CCOMMON_OPT += -loongson3 -static
640 ifeq ($(CORE), LOONGSON3B)
641 CCOMMON_OPT += -loongson3 -static
654 ifeq ($(C_COMPILER), SUN)
663 ifeq ($(F_COMPILER), SUN)
664 CCOMMON_OPT += -DF_INTERFACE_SUN
671 FCOMMON_OPT += -xopenmp=parallel
675 ifeq ($(F_COMPILER), COMPAQ)
676 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
678 FCOMMON_OPT += -openmp
689 ifeq ($(NEED_PIC), 1)
690 ifeq ($(C_COMPILER), IBM)
691 CCOMMON_OPT += -qpic=large
695 ifeq ($(F_COMPILER), SUN)
702 ifeq ($(DYNAMIC_ARCH), 1)
703 CCOMMON_OPT += -DDYNAMIC_ARCH
706 ifeq ($(NO_LAPACK), 1)
707 CCOMMON_OPT += -DNO_LAPACK
708 #Disable LAPACK C interface
712 ifeq ($(NO_LAPACKE), 1)
713 CCOMMON_OPT += -DNO_LAPACKE
717 CCOMMON_OPT += -DNO_AVX
721 CCOMMON_OPT += -DSMP_SERVER
723 ifeq ($(ARCH), mips64)
724 ifneq ($(CORE), LOONGSON3B)
725 USE_SIMPLE_THREADED_LEVEL3 = 1
729 ifeq ($(USE_OPENMP), 1)
730 # USE_SIMPLE_THREADED_LEVEL3 = 1
732 CCOMMON_OPT += -DUSE_OPENMP
737 ifeq ($(NO_WARMUP), 1)
738 CCOMMON_OPT += -DNO_WARMUP
741 ifeq ($(CONSISTENT_FPCSR), 1)
742 CCOMMON_OPT += -DCONSISTENT_FPCSR
745 # Only for development
746 # CCOMMON_OPT += -DPARAMTEST
747 # CCOMMON_OPT += -DPREFETCHTEST
748 # CCOMMON_OPT += -DNO_SWITCHING
752 CCOMMON_OPT += -DUSE_PAPI
753 EXTRALIB += -lpapi -lperfctr
756 ifdef DYNAMIC_THREADS
757 CCOMMON_OPT += -DDYNAMIC_THREADS
760 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
762 ifdef USE_SIMPLE_THREADED_LEVEL3
763 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
767 LIBPREFIX = libopenblas
769 LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
772 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
774 include $(TOPDIR)/Makefile.$(ARCH)
776 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
778 ifeq ($(CORE), PPC440)
779 CCOMMON_OPT += -DALLOC_QALLOC
782 ifeq ($(CORE), PPC440FP2)
783 STATIC_ALLOCATION = 1
786 ifneq ($(OSNAME), Linux)
790 ifneq ($(ARCH), x86_64)
792 ifneq ($(CORE), LOONGSON3B)
799 CCOMMON_OPT += -DNO_AFFINITY
802 ifdef FUNCTION_PROFILE
803 CCOMMON_OPT += -DFUNCTION_PROFILE
806 ifdef HUGETLB_ALLOCATION
807 CCOMMON_OPT += -DALLOC_HUGETLB
810 ifdef HUGETLBFILE_ALLOCATION
811 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
814 ifdef STATIC_ALLOCATION
815 CCOMMON_OPT += -DALLOC_STATIC
818 ifdef DEVICEDRIVER_ALLOCATION
819 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
822 ifdef MIXED_MEMORY_ALLOCATION
823 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
826 ifeq ($(OSNAME), SunOS)
842 REVISION = -r$(VERSION)
843 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
856 ifeq ($(ARCH), arm64)
867 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
868 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
870 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
871 override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
874 #For LAPACK Fortran codes.
875 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
876 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
878 LAPACK_CFLAGS = $(CFLAGS)
879 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
881 LAPACK_CFLAGS += -DLAPACK_ILP64
884 LAPACK_CFLAGS += -DOPENBLAS_OS_WINDOWS
886 ifeq ($(C_COMPILER), LSB)
887 LAPACK_CFLAGS += -DLAPACK_COMPLEX_STRUCTURE
902 ifneq ($(DYNAMIC_ARCH), 1)
904 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
905 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
907 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
908 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
912 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
913 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
915 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
916 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
921 LIBDLLNAME = $(LIBPREFIX).dll
922 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
923 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
924 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
925 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
926 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
928 LIBS = $(TOPDIR)/$(LIBNAME)
929 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
932 LIB_COMPONENTS = BLAS
933 ifneq ($(NO_CBLAS), 1)
934 LIB_COMPONENTS += CBLAS
937 ifneq ($(NO_LAPACK), 1)
938 LIB_COMPONENTS += LAPACK
939 ifneq ($(NO_LAPACKE), 1)
940 LIB_COMPONENTS += LAPACKE
944 ifeq ($(ONLY_CBLAS), 1)
945 LIB_COMPONENTS = CBLAS
958 export NEED2UNDERSCORES
992 export FUNCTION_PROFILE
995 export SGEMM_UNROLL_M
996 export SGEMM_UNROLL_N
997 export DGEMM_UNROLL_M
998 export DGEMM_UNROLL_N
999 export QGEMM_UNROLL_M
1000 export QGEMM_UNROLL_N
1001 export CGEMM_UNROLL_M
1002 export CGEMM_UNROLL_N
1003 export ZGEMM_UNROLL_M
1004 export ZGEMM_UNROLL_N
1005 export XGEMM_UNROLL_M
1006 export XGEMM_UNROLL_N
1007 export CGEMM3M_UNROLL_M
1008 export CGEMM3M_UNROLL_N
1009 export ZGEMM3M_UNROLL_M
1010 export ZGEMM3M_UNROLL_N
1011 export XGEMM3M_UNROLL_M
1012 export XGEMM3M_UNROLL_N
1022 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1025 $(FC) $(FFLAGS) -c $< -o $(@F)
1028 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
1032 PATHSCALEPATH = /opt/pathscale/lib/3.1
1033 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
1035 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
1036 PGIPATH = /opt/pgi/linux86/7.1-5/lib
1039 ACMLPATH = /opt/acml/4.3.0
1040 ifneq ($(OSNAME), Darwin)
1041 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
1043 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1045 ATLASPATH = /opt/atlas/3.9.17/opteron
1046 FLAMEPATH = $(HOME)/flame/lib
1047 ifneq ($(OSNAME), SunOS)
1048 SUNPATH = /opt/sunstudio12.1
1050 SUNPATH = /opt/SUNWspro