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)
80 # This operation is expensive, so execution should be once.
81 ifndef GOTOBLAS_MAKEFILE
82 export GOTOBLAS_MAKEFILE = 1
84 # Generating Makefile.conf and config.h
85 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)
88 include $(TOPDIR)/Makefile.conf
90 include $(TOPDIR)/Makefile_kernel.conf
96 NUM_THREADS = $(NUM_CORES)
99 ifeq ($(NUM_THREADS), 1)
100 override USE_THREAD = 0
104 ifeq ($(USE_THREAD), 0)
110 ifeq ($(NUM_THREAD), 1)
123 AR = $(CROSS_SUFFIX)ar
124 AS = $(CROSS_SUFFIX)as
125 LD = $(CROSS_SUFFIX)ld
126 RANLIB = $(CROSS_SUFFIX)ranlib
127 NM = $(CROSS_SUFFIX)nm
128 DLLWRAP = $(CROSS_SUFFIX)dllwrap
131 # OS dependent settings
134 ifeq ($(OSNAME), Darwin)
135 export MACOSX_DEPLOYMENT_TARGET=10.2
139 ifeq ($(OSNAME), FreeBSD)
143 ifeq ($(OSNAME), NetBSD)
147 ifeq ($(OSNAME), Linux)
151 ifeq ($(OSNAME), AIX)
155 ifeq ($(OSNAME), WINNT)
159 EXTRALIB += -defaultlib:advapi32
165 ifeq ($(C_COMPILER), CLANG)
166 CCOMMON_OPT += -DMS_ABI
169 ifeq ($(C_COMPILER), GCC)
170 #Test for supporting MS_ABI
171 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
172 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
173 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
174 ifeq ($(GCCVERSIONGT4), 1)
175 # GCC Majar version > 4
176 # It is compatible with MSVC ABI.
177 CCOMMON_OPT += -DMS_ABI
180 ifeq ($(GCCVERSIONGTEQ4), 1)
181 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
183 # It is compatible with MSVC ABI.
184 CCOMMON_OPT += -DMS_ABI
189 # Ensure the correct stack alignment on Win32
190 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
192 CCOMMON_OPT += -mincoming-stack-boundary=2
193 FCOMMON_OPT += -mincoming-stack-boundary=2
198 ifeq ($(OSNAME), Interix)
202 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
205 ifeq ($(OSNAME), CYGWIN_NT)
210 ifneq ($(OSNAME), WINNT)
211 ifneq ($(OSNAME), CYGWIN_NT)
212 ifneq ($(OSNAME), Interix)
214 EXTRALIB += -lpthread
221 CCOMMON_OPT += -DQUAD_PRECISION
226 ifneq ($(ARCH), x86_64)
232 CCOMMON_OPT += -DUTEST_CHECK
237 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
241 # Architecture dependent settings
248 ifndef NO_EXPRECISION
249 ifeq ($(F_COMPILER), GFORTRAN)
250 # ifeq logical or. GCC or LSB
251 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
253 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
254 FCOMMON_OPT += -m128bit-long-double
256 ifeq ($(C_COMPILER), CLANG)
258 CCOMMON_OPT += -DEXPRECISION
259 FCOMMON_OPT += -m128bit-long-double
265 ifeq ($(ARCH), x86_64)
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 ($(C_COMPILER), INTEL)
284 CCOMMON_OPT += -wd981
287 ifeq ($(USE_OPENMP), 1)
288 # ifeq logical or. GCC or LSB
289 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
290 CCOMMON_OPT += -fopenmp
293 ifeq ($(C_COMPILER), CLANG)
294 $(error OpenBLAS: Clang didn't support OpenMP yet.)
295 CCOMMON_OPT += -fopenmp
298 ifeq ($(C_COMPILER), INTEL)
299 CCOMMON_OPT += -openmp
302 ifeq ($(C_COMPILER), PGI)
306 ifeq ($(C_COMPILER), OPEN64)
308 CEXTRALIB += -lstdc++
311 ifeq ($(C_COMPILER), PATHSCALE)
317 ifeq ($(DYNAMIC_ARCH), 1)
319 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
320 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
322 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER
326 ifeq ($(ARCH), x86_64)
327 DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
329 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER
342 ifeq ($(F_COMPILER), GFORTRAN)
343 ifeq ($(C_COMPILER), GCC)
345 # CCOMMON_OPT += -DEXPRECISION
350 ifeq ($(ARCH), mips64)
354 ifeq ($(ARCH), alpha)
360 # C Compiler dependent settings
364 # ifeq logical or. GCC or CLANG or LSB
365 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
366 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
368 COMMON_PROF += -fno-inline
369 NO_UNINITIALIZED_WARN = -Wno-uninitialized
371 ifeq ($(QUIET_MAKE), 1)
372 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
377 ifeq ($(ARCH), mips64)
379 CCOMMON_OPT += -mabi=64
381 CCOMMON_OPT += -mabi=n32
386 ifeq ($(CORE), LOONGSON3A)
387 CCOMMON_OPT += -march=mips64
388 FCOMMON_OPT += -march=mips64
391 ifeq ($(CORE), LOONGSON3B)
392 CCOMMON_OPT += -march=mips64
393 FCOMMON_OPT += -march=mips64
396 ifeq ($(OSNAME), AIX)
402 ifndef BINARY_DEFINED
412 ifeq ($(C_COMPILER), PGI)
414 CCOMMON_OPT += -tp p7-64
416 CCOMMON_OPT += -tp p7
420 ifeq ($(C_COMPILER), PATHSCALE)
429 # Fortran Compiler dependent settings
432 ifeq ($(F_COMPILER), G77)
433 CCOMMON_OPT += -DF_INTERFACE_G77
435 ifndef NO_BINARY_MODE
444 ifeq ($(F_COMPILER), G95)
445 CCOMMON_OPT += -DF_INTERFACE_G95
447 ifndef NO_BINARY_MODE
456 ifeq ($(F_COMPILER), GFORTRAN)
457 CCOMMON_OPT += -DF_INTERFACE_GFORT
459 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
460 ifneq ($(NO_LAPACK), 1)
461 ifneq ($(C_COMPILER), LSB)
462 EXTRALIB += -lgfortran
466 ifeq ($(ARCH), mips64)
468 FCOMMON_OPT += -mabi=64
470 FCOMMON_OPT += -mabi=n32
477 FCOMMON_OPT += -fdefault-integer-8
484 FCOMMON_OPT += -fopenmp
488 ifeq ($(F_COMPILER), INTEL)
489 CCOMMON_OPT += -DF_INTERFACE_INTEL
494 FCOMMON_OPT += -openmp
498 ifeq ($(F_COMPILER), FUJITSU)
499 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
501 FCOMMON_OPT += -openmp
505 ifeq ($(F_COMPILER), IBM)
506 CCOMMON_OPT += -DF_INTERFACE_IBM
507 # FCOMMON_OPT += -qarch=440
511 FCOMMON_OPT += -qintsize=8
517 FCOMMON_OPT += -openmp
521 ifeq ($(F_COMPILER), PGI)
522 CCOMMON_OPT += -DF_INTERFACE_PGI
523 COMMON_PROF += -DPGICOMPILER
528 FCOMMON_OPT += -tp p7-64
530 FCOMMON_OPT += -tp p7
537 ifeq ($(F_COMPILER), PATHSCALE)
538 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
545 ifneq ($(ARCH), mips64)
553 FCOMMON_OPT += -mabi=64
555 FCOMMON_OPT += -mabi=n32
564 ifeq ($(F_COMPILER), OPEN64)
565 CCOMMON_OPT += -DF_INTERFACE_OPEN64
578 FEXTRALIB += -lstdc++
583 ifeq ($(C_COMPILER), OPEN64)
591 ifeq ($(C_COMPILER), SUN)
600 ifeq ($(F_COMPILER), SUN)
601 CCOMMON_OPT += -DF_INTERFACE_SUN
608 FCOMMON_OPT += -xopenmp=parallel
612 ifeq ($(F_COMPILER), COMPAQ)
613 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
615 FCOMMON_OPT += -openmp
626 ifeq ($(NEED_PIC), 1)
627 ifeq ($(C_COMPILER), IBM)
628 CCOMMON_OPT += -qpic=large
632 ifeq ($(F_COMPILER), SUN)
639 ifeq ($(DYNAMIC_ARCH), 1)
640 CCOMMON_OPT += -DDYNAMIC_ARCH
643 ifeq ($(NO_LAPACK), 1)
644 CCOMMON_OPT += -DNO_LAPACK
645 #Disable LAPACK C interface
649 ifeq ($(NO_LAPACKE), 1)
650 CCOMMON_OPT += -DNO_LAPACKE
654 CCOMMON_OPT += -DNO_AVX
658 CCOMMON_OPT += -DSMP_SERVER
660 ifeq ($(ARCH), mips64)
661 ifneq ($(CORE), LOONGSON3B)
662 USE_SIMPLE_THREADED_LEVEL3 = 1
666 ifeq ($(USE_OPENMP), 1)
667 # USE_SIMPLE_THREADED_LEVEL3 = 1
669 CCOMMON_OPT += -DUSE_OPENMP
674 ifeq ($(NO_WARMUP), 1)
675 CCOMMON_OPT += -DNO_WARMUP
678 ifeq ($(CONSISTENT_FPCSR), 1)
679 CCOMMON_OPT += -DCONSISTENT_FPCSR
682 # Only for development
683 # CCOMMON_OPT += -DPARAMTEST
684 # CCOMMON_OPT += -DPREFETCHTEST
685 # CCOMMON_OPT += -DNO_SWITCHING
689 CCOMMON_OPT += -DUSE_PAPI
690 EXTRALIB += -lpapi -lperfctr
693 ifdef DYNAMIC_THREADS
694 CCOMMON_OPT += -DDYNAMIC_THREADS
697 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
699 ifdef USE_SIMPLE_THREADED_LEVEL3
700 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
704 LIBPREFIX = libopenblas
706 LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
709 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
711 include $(TOPDIR)/Makefile.$(ARCH)
713 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
715 ifeq ($(CORE), PPC440)
716 CCOMMON_OPT += -DALLOC_QALLOC
719 ifeq ($(CORE), PPC440FP2)
720 STATIC_ALLOCATION = 1
723 ifneq ($(OSNAME), Linux)
727 ifneq ($(ARCH), x86_64)
729 ifneq ($(CORE), LOONGSON3B)
736 CCOMMON_OPT += -DNO_AFFINITY
739 ifdef FUNCTION_PROFILE
740 CCOMMON_OPT += -DFUNCTION_PROFILE
743 ifdef HUGETLB_ALLOCATION
744 CCOMMON_OPT += -DALLOC_HUGETLB
747 ifdef HUGETLBFILE_ALLOCATION
748 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
751 ifdef STATIC_ALLOCATION
752 CCOMMON_OPT += -DALLOC_STATIC
755 ifdef DEVICEDRIVER_ALLOCATION
756 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
759 ifdef MIXED_MEMORY_ALLOCATION
760 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
763 ifeq ($(OSNAME), SunOS)
779 REVISION = -r$(VERSION)
780 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
791 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
792 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
794 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
795 override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
798 LAPACK_CFLAGS = $(CFLAGS)
799 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
801 LAPACK_CFLAGS += -DLAPACK_ILP64
803 ifeq ($(C_COMPILER), LSB)
804 LAPACK_CFLAGS += -DLAPACK_COMPLEX_STRUCTURE
819 ifneq ($(DYNAMIC_ARCH), 1)
821 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
822 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
824 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
825 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
829 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
830 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
832 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
833 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
838 LIBDLLNAME = $(LIBPREFIX).dll
839 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
840 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
841 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
842 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
843 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
845 LIBS = $(TOPDIR)/$(LIBNAME)
846 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
886 export FUNCTION_PROFILE
889 export SGEMM_UNROLL_M
890 export SGEMM_UNROLL_N
891 export DGEMM_UNROLL_M
892 export DGEMM_UNROLL_N
893 export QGEMM_UNROLL_M
894 export QGEMM_UNROLL_N
895 export CGEMM_UNROLL_M
896 export CGEMM_UNROLL_N
897 export ZGEMM_UNROLL_M
898 export ZGEMM_UNROLL_N
899 export XGEMM_UNROLL_M
900 export XGEMM_UNROLL_N
901 export CGEMM3M_UNROLL_M
902 export CGEMM3M_UNROLL_N
903 export ZGEMM3M_UNROLL_M
904 export ZGEMM3M_UNROLL_N
905 export XGEMM3M_UNROLL_M
906 export XGEMM3M_UNROLL_N
916 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
919 $(FC) $(FFLAGS) -c $< -o $(@F)
922 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
926 PATHSCALEPATH = /opt/pathscale/lib/3.1
927 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
929 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
930 PGIPATH = /opt/pgi/linux86/7.1-5/lib
933 ACMLPATH = /opt/acml/4.3.0
934 ifneq ($(OSNAME), Darwin)
935 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
937 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
939 ATLASPATH = /opt/atlas/3.9.17/opteron
940 FLAMEPATH = $(HOME)/flame/lib
941 ifneq ($(OSNAME), SunOS)
942 SUNPATH = /opt/sunstudio12.1
944 SUNPATH = /opt/SUNWspro