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 # This operation is expensive, so execution should be once.
86 ifndef GOTOBLAS_MAKEFILE
87 export GOTOBLAS_MAKEFILE = 1
89 # Generating Makefile.conf and config.h
90 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) all)
93 include $(TOPDIR)/Makefile.conf
95 include $(TOPDIR)/Makefile_kernel.conf
101 NUM_THREADS = $(NUM_CORES)
104 ifeq ($(NUM_THREADS), 1)
105 override USE_THREAD = 0
109 ifeq ($(USE_THREAD), 0)
115 ifeq ($(NUM_THREAD), 1)
128 AR = $(CROSS_SUFFIX)ar
129 AS = $(CROSS_SUFFIX)as
130 LD = $(CROSS_SUFFIX)ld
131 RANLIB = $(CROSS_SUFFIX)ranlib
132 NM = $(CROSS_SUFFIX)nm
133 DLLWRAP = $(CROSS_SUFFIX)dllwrap
136 # OS dependent settings
139 ifeq ($(OSNAME), Darwin)
140 export MACOSX_DEPLOYMENT_TARGET=10.2
144 ifeq ($(OSNAME), FreeBSD)
148 ifeq ($(OSNAME), NetBSD)
152 ifeq ($(OSNAME), Linux)
156 ifeq ($(OSNAME), AIX)
160 ifeq ($(OSNAME), WINNT)
164 EXTRALIB += -defaultlib:advapi32
170 ifeq ($(C_COMPILER), CLANG)
171 CCOMMON_OPT += -DMS_ABI
174 ifeq ($(C_COMPILER), GCC)
175 #Test for supporting MS_ABI
176 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
177 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
178 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
179 ifeq ($(GCCVERSIONGT4), 1)
180 # GCC Majar version > 4
181 # It is compatible with MSVC ABI.
182 CCOMMON_OPT += -DMS_ABI
185 ifeq ($(GCCVERSIONGTEQ4), 1)
186 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
188 # It is compatible with MSVC ABI.
189 CCOMMON_OPT += -DMS_ABI
194 # Ensure the correct stack alignment on Win32
195 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
197 CCOMMON_OPT += -mincoming-stack-boundary=2
198 FCOMMON_OPT += -mincoming-stack-boundary=2
203 ifeq ($(OSNAME), Interix)
207 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
210 ifeq ($(OSNAME), CYGWIN_NT)
215 ifneq ($(OSNAME), WINNT)
216 ifneq ($(OSNAME), CYGWIN_NT)
217 ifneq ($(OSNAME), Interix)
219 EXTRALIB += -lpthread
226 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
231 CCOMMON_OPT += -DQUAD_PRECISION
236 ifneq ($(ARCH), x86_64)
242 CCOMMON_OPT += -DUTEST_CHECK
247 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
251 # Architecture dependent settings
258 ifndef NO_EXPRECISION
259 ifeq ($(F_COMPILER), GFORTRAN)
260 # ifeq logical or. GCC or LSB
261 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
263 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
264 FCOMMON_OPT += -m128bit-long-double
266 ifeq ($(C_COMPILER), CLANG)
268 CCOMMON_OPT += -DEXPRECISION
269 FCOMMON_OPT += -m128bit-long-double
275 ifeq ($(ARCH), x86_64)
276 ifndef NO_EXPRECISION
277 ifeq ($(F_COMPILER), GFORTRAN)
278 # ifeq logical or. GCC or LSB
279 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
281 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
282 FCOMMON_OPT += -m128bit-long-double
284 ifeq ($(C_COMPILER), CLANG)
286 CCOMMON_OPT += -DEXPRECISION
287 FCOMMON_OPT += -m128bit-long-double
293 ifeq ($(C_COMPILER), INTEL)
294 CCOMMON_OPT += -wd981
297 ifeq ($(USE_OPENMP), 1)
298 # ifeq logical or. GCC or LSB
299 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
300 CCOMMON_OPT += -fopenmp
303 ifeq ($(C_COMPILER), CLANG)
304 $(error OpenBLAS: Clang didn't support OpenMP yet.)
305 CCOMMON_OPT += -fopenmp
308 ifeq ($(C_COMPILER), INTEL)
309 CCOMMON_OPT += -openmp
312 ifeq ($(C_COMPILER), PGI)
316 ifeq ($(C_COMPILER), OPEN64)
318 CEXTRALIB += -lstdc++
321 ifeq ($(C_COMPILER), PATHSCALE)
327 ifeq ($(DYNAMIC_ARCH), 1)
329 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
330 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
332 DYNAMIC_CORE += SANDYBRIDGE
333 #BULLDOZER PILEDRIVER
337 ifeq ($(ARCH), x86_64)
338 DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
340 DYNAMIC_CORE += SANDYBRIDGE
341 #BULLDOZER PILEDRIVER
354 ifeq ($(F_COMPILER), GFORTRAN)
355 ifeq ($(C_COMPILER), GCC)
357 # CCOMMON_OPT += -DEXPRECISION
362 ifeq ($(ARCH), mips64)
366 ifeq ($(ARCH), alpha)
376 ifeq ($(ARCH), arm64)
384 # C Compiler dependent settings
388 # ifeq logical or. GCC or CLANG or LSB
389 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
390 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
392 COMMON_PROF += -fno-inline
393 NO_UNINITIALIZED_WARN = -Wno-uninitialized
395 ifeq ($(QUIET_MAKE), 1)
396 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
401 ifeq ($(ARCH), mips64)
403 CCOMMON_OPT += -mabi=64
405 CCOMMON_OPT += -mabi=n32
410 ifeq ($(CORE), LOONGSON3A)
411 CCOMMON_OPT += -march=mips64
412 FCOMMON_OPT += -march=mips64
415 ifeq ($(CORE), LOONGSON3B)
416 CCOMMON_OPT += -march=mips64
417 FCOMMON_OPT += -march=mips64
420 ifeq ($(OSNAME), AIX)
426 ifndef BINARY_DEFINED
436 ifeq ($(C_COMPILER), PGI)
438 CCOMMON_OPT += -tp p7-64
440 CCOMMON_OPT += -tp p7
444 ifeq ($(C_COMPILER), PATHSCALE)
453 # Fortran Compiler dependent settings
456 ifeq ($(F_COMPILER), G77)
457 CCOMMON_OPT += -DF_INTERFACE_G77
459 ifndef NO_BINARY_MODE
468 ifeq ($(F_COMPILER), G95)
469 CCOMMON_OPT += -DF_INTERFACE_G95
471 ifndef NO_BINARY_MODE
480 ifeq ($(F_COMPILER), GFORTRAN)
481 CCOMMON_OPT += -DF_INTERFACE_GFORT
483 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
484 ifneq ($(NO_LAPACK), 1)
485 EXTRALIB += -lgfortran
488 ifeq ($(ARCH), mips64)
490 FCOMMON_OPT += -mabi=64
492 FCOMMON_OPT += -mabi=n32
499 FCOMMON_OPT += -fdefault-integer-8
506 FCOMMON_OPT += -fopenmp
510 ifeq ($(F_COMPILER), INTEL)
511 CCOMMON_OPT += -DF_INTERFACE_INTEL
516 FCOMMON_OPT += -openmp
520 ifeq ($(F_COMPILER), FUJITSU)
521 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
523 FCOMMON_OPT += -openmp
527 ifeq ($(F_COMPILER), IBM)
528 CCOMMON_OPT += -DF_INTERFACE_IBM
529 # FCOMMON_OPT += -qarch=440
533 FCOMMON_OPT += -qintsize=8
539 FCOMMON_OPT += -openmp
543 ifeq ($(F_COMPILER), PGI)
544 CCOMMON_OPT += -DF_INTERFACE_PGI
545 COMMON_PROF += -DPGICOMPILER
550 FCOMMON_OPT += -tp p7-64
552 FCOMMON_OPT += -tp p7
559 ifeq ($(F_COMPILER), PATHSCALE)
560 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
567 ifneq ($(ARCH), mips64)
575 FCOMMON_OPT += -mabi=64
577 FCOMMON_OPT += -mabi=n32
586 ifeq ($(F_COMPILER), OPEN64)
587 CCOMMON_OPT += -DF_INTERFACE_OPEN64
594 ifeq ($(ARCH), mips64)
600 ifeq ($(CORE), LOONGSON3A)
601 FCOMMON_OPT += -loongson3 -static
604 ifeq ($(CORE), LOONGSON3B)
605 FCOMMON_OPT += -loongson3 -static
617 FEXTRALIB += -lstdc++
622 ifeq ($(C_COMPILER), OPEN64)
624 ifeq ($(ARCH), mips64)
630 ifeq ($(CORE), LOONGSON3A)
631 CCOMMON_OPT += -loongson3 -static
634 ifeq ($(CORE), LOONGSON3B)
635 CCOMMON_OPT += -loongson3 -static
648 ifeq ($(C_COMPILER), SUN)
657 ifeq ($(F_COMPILER), SUN)
658 CCOMMON_OPT += -DF_INTERFACE_SUN
665 FCOMMON_OPT += -xopenmp=parallel
669 ifeq ($(F_COMPILER), COMPAQ)
670 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
672 FCOMMON_OPT += -openmp
683 ifeq ($(NEED_PIC), 1)
684 ifeq ($(C_COMPILER), IBM)
685 CCOMMON_OPT += -qpic=large
689 ifeq ($(F_COMPILER), SUN)
696 ifeq ($(DYNAMIC_ARCH), 1)
697 CCOMMON_OPT += -DDYNAMIC_ARCH
700 ifeq ($(NO_LAPACK), 1)
701 CCOMMON_OPT += -DNO_LAPACK
702 #Disable LAPACK C interface
706 ifeq ($(NO_LAPACKE), 1)
707 CCOMMON_OPT += -DNO_LAPACKE
711 CCOMMON_OPT += -DNO_AVX
715 CCOMMON_OPT += -DSMP_SERVER
717 ifeq ($(ARCH), mips64)
718 ifneq ($(CORE), LOONGSON3B)
719 USE_SIMPLE_THREADED_LEVEL3 = 1
723 ifeq ($(USE_OPENMP), 1)
724 # USE_SIMPLE_THREADED_LEVEL3 = 1
726 CCOMMON_OPT += -DUSE_OPENMP
731 ifeq ($(NO_WARMUP), 1)
732 CCOMMON_OPT += -DNO_WARMUP
735 ifeq ($(CONSISTENT_FPCSR), 1)
736 CCOMMON_OPT += -DCONSISTENT_FPCSR
739 # Only for development
740 # CCOMMON_OPT += -DPARAMTEST
741 # CCOMMON_OPT += -DPREFETCHTEST
742 # CCOMMON_OPT += -DNO_SWITCHING
746 CCOMMON_OPT += -DUSE_PAPI
747 EXTRALIB += -lpapi -lperfctr
750 ifdef DYNAMIC_THREADS
751 CCOMMON_OPT += -DDYNAMIC_THREADS
754 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
756 ifdef USE_SIMPLE_THREADED_LEVEL3
757 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
761 LIBPREFIX = libopenblas
763 LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
766 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
768 include $(TOPDIR)/Makefile.$(ARCH)
770 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
772 ifeq ($(CORE), PPC440)
773 CCOMMON_OPT += -DALLOC_QALLOC
776 ifeq ($(CORE), PPC440FP2)
777 STATIC_ALLOCATION = 1
780 ifneq ($(OSNAME), Linux)
784 ifneq ($(ARCH), x86_64)
786 ifneq ($(CORE), LOONGSON3B)
793 CCOMMON_OPT += -DNO_AFFINITY
796 ifdef FUNCTION_PROFILE
797 CCOMMON_OPT += -DFUNCTION_PROFILE
800 ifdef HUGETLB_ALLOCATION
801 CCOMMON_OPT += -DALLOC_HUGETLB
804 ifdef HUGETLBFILE_ALLOCATION
805 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
808 ifdef STATIC_ALLOCATION
809 CCOMMON_OPT += -DALLOC_STATIC
812 ifdef DEVICEDRIVER_ALLOCATION
813 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
816 ifdef MIXED_MEMORY_ALLOCATION
817 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
820 ifeq ($(OSNAME), SunOS)
836 REVISION = -r$(VERSION)
837 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
850 ifeq ($(ARCH), arm64)
860 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
861 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
863 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
864 override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
867 #For LAPACK Fortran codes.
868 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
869 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
871 LAPACK_CFLAGS = $(CFLAGS)
872 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
874 LAPACK_CFLAGS += -DLAPACK_ILP64
877 LAPACK_CFLAGS += -DOPENBLAS_OS_WINDOWS
879 ifeq ($(C_COMPILER), LSB)
880 LAPACK_CFLAGS += -DLAPACK_COMPLEX_STRUCTURE
895 ifneq ($(DYNAMIC_ARCH), 1)
897 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
898 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
900 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
901 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
905 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
906 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
908 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
909 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
914 LIBDLLNAME = $(LIBPREFIX).dll
915 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
916 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
917 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
918 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
919 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
921 LIBS = $(TOPDIR)/$(LIBNAME)
922 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
934 export NEED2UNDERSCORES
967 export FUNCTION_PROFILE
970 export SGEMM_UNROLL_M
971 export SGEMM_UNROLL_N
972 export DGEMM_UNROLL_M
973 export DGEMM_UNROLL_N
974 export QGEMM_UNROLL_M
975 export QGEMM_UNROLL_N
976 export CGEMM_UNROLL_M
977 export CGEMM_UNROLL_N
978 export ZGEMM_UNROLL_M
979 export ZGEMM_UNROLL_N
980 export XGEMM_UNROLL_M
981 export XGEMM_UNROLL_N
982 export CGEMM3M_UNROLL_M
983 export CGEMM3M_UNROLL_N
984 export ZGEMM3M_UNROLL_M
985 export ZGEMM3M_UNROLL_N
986 export XGEMM3M_UNROLL_M
987 export XGEMM3M_UNROLL_N
997 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1000 $(FC) $(FFLAGS) -c $< -o $(@F)
1003 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
1007 PATHSCALEPATH = /opt/pathscale/lib/3.1
1008 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
1010 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
1011 PGIPATH = /opt/pgi/linux86/7.1-5/lib
1014 ACMLPATH = /opt/acml/4.3.0
1015 ifneq ($(OSNAME), Darwin)
1016 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
1018 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1020 ATLASPATH = /opt/atlas/3.9.17/opteron
1021 FLAMEPATH = $(HOME)/flame/lib
1022 ifneq ($(OSNAME), SunOS)
1023 SUNPATH = /opt/sunstudio12.1
1025 SUNPATH = /opt/SUNWspro