2 # Include user definition
5 # TO suppress recursive includes
12 ifndef NETLIB_LAPACK_DIR
13 NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-3.4.2
17 # - Only set if not specified on the command line or inherited from the environment.
18 # - CC is an implicit variable so neither '?=' or 'ifndef' can be used.
19 # http://stackoverflow.com/questions/4029274/mingw-and-make-variables
20 # - Default value is 'cc' which is not always a valid command (e.g. MinGW).
21 ifeq ($(origin CC),default)
25 # Default Fortran compiler (FC) is selected by f_check.
28 include $(TOPDIR)/Makefile.rule
30 include $(TOPDIR)/$(MAKEFILE_RULE)
34 # Beginning of system configuration
42 GETARCH_FLAGS := -DFORCE_$(TARGET)
45 #TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
48 GETARCH_FLAGS := -DFORCE_$(TARGET_CORE)
52 GETARCH_FLAGS += -DUSE64BITINT
55 ifndef GEMM_MULTITHREAD_THRESHOLD
56 GEMM_MULTITHREAD_THRESHOLD=4
58 GETARCH_FLAGS += -DGEMM_MULTITHREAD_THRESHOLD=$(GEMM_MULTITHREAD_THRESHOLD)
61 GETARCH_FLAGS += -DNO_AVX
68 ifndef NO_PARALLEL_MAKE
71 GETARCH_FLAGS += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE)
72 # This operation is expensive, so execution should be once.
73 ifndef GOTOBLAS_MAKEFILE
74 export GOTOBLAS_MAKEFILE = 1
76 # Generating Makefile.conf and config.h
77 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)
80 include $(TOPDIR)/Makefile.conf
82 include $(TOPDIR)/Makefile_kernel.conf
88 NUM_THREADS = $(NUM_CORES)
91 ifeq ($(NUM_THREADS), 1)
92 override USE_THREAD = 0
96 ifeq ($(USE_THREAD), 0)
102 ifeq ($(NUM_THREAD), 1)
115 AR = $(CROSS_SUFFIX)ar
116 AS = $(CROSS_SUFFIX)as
117 LD = $(CROSS_SUFFIX)ld
118 RANLIB = $(CROSS_SUFFIX)ranlib
119 NM = $(CROSS_SUFFIX)nm
120 DLLWRAP = $(CROSS_SUFFIX)dllwrap
123 # OS dependent settings
126 ifeq ($(OSNAME), Darwin)
127 export MACOSX_DEPLOYMENT_TARGET=10.2
131 ifeq ($(OSNAME), FreeBSD)
135 ifeq ($(OSNAME), NetBSD)
139 ifeq ($(OSNAME), Linux)
143 ifeq ($(OSNAME), AIX)
147 ifeq ($(OSNAME), WINNT)
151 EXTRALIB += -defaultlib:advapi32
157 ifeq ($(C_COMPILER), CLANG)
158 CCOMMON_OPT += -DMS_ABI
161 ifeq ($(C_COMPILER), GCC)
162 #Test for supporting MS_ABI
163 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
164 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
165 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
166 ifeq ($(GCCVERSIONGT4), 1)
167 # GCC Majar version > 4
168 # It is compatible with MSVC ABI.
169 CCOMMON_OPT += -DMS_ABI
172 ifeq ($(GCCVERSIONGTEQ4), 1)
173 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
175 # It is compatible with MSVC ABI.
176 CCOMMON_OPT += -DMS_ABI
183 ifeq ($(OSNAME), Interix)
187 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
190 ifeq ($(OSNAME), CYGWIN_NT)
195 ifneq ($(OSNAME), WINNT)
196 ifneq ($(OSNAME), CYGWIN_NT)
197 ifneq ($(OSNAME), Interix)
199 EXTRALIB += -lpthread
206 CCOMMON_OPT += -DQUAD_PRECISION
211 ifneq ($(ARCH), x86_64)
217 CCOMMON_OPT += -DUTEST_CHECK
222 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
226 # Architecture dependent settings
233 ifndef NO_EXPRECISION
234 ifeq ($(F_COMPILER), GFORTRAN)
235 ifeq ($(C_COMPILER), GCC)
237 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
238 FCOMMON_OPT += -m128bit-long-double
240 ifeq ($(C_COMPILER), CLANG)
242 CCOMMON_OPT += -DEXPRECISION
243 FCOMMON_OPT += -m128bit-long-double
249 ifeq ($(ARCH), x86_64)
250 ifndef NO_EXPRECISION
251 ifeq ($(F_COMPILER), GFORTRAN)
252 ifeq ($(C_COMPILER), GCC)
254 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
255 FCOMMON_OPT += -m128bit-long-double
257 ifeq ($(C_COMPILER), CLANG)
259 CCOMMON_OPT += -DEXPRECISION
260 FCOMMON_OPT += -m128bit-long-double
266 ifeq ($(C_COMPILER), INTEL)
267 CCOMMON_OPT += -wd981
270 ifeq ($(USE_OPENMP), 1)
271 ifeq ($(C_COMPILER), GCC)
272 CCOMMON_OPT += -fopenmp
275 ifeq ($(C_COMPILER), CLANG)
276 $(error OpenBLAS: Clang didn't support OpenMP yet.)
277 CCOMMON_OPT += -fopenmp
280 ifeq ($(C_COMPILER), INTEL)
281 CCOMMON_OPT += -openmp
284 ifeq ($(C_COMPILER), PGI)
288 ifeq ($(C_COMPILER), OPEN64)
290 CEXTRALIB += -lstdc++
293 ifeq ($(C_COMPILER), PATHSCALE)
299 ifeq ($(DYNAMIC_ARCH), 1)
301 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
302 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
304 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER
308 ifeq ($(ARCH), x86_64)
309 DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
311 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER
324 ifeq ($(F_COMPILER), GFORTRAN)
325 ifeq ($(C_COMPILER), GCC)
327 # CCOMMON_OPT += -DEXPRECISION
332 ifeq ($(ARCH), mips64)
336 ifeq ($(ARCH), alpha)
342 # C Compiler dependent settings
345 # ifeq logical or. GCC or CLANG
346 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
347 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG))
349 COMMON_PROF += -fno-inline
350 NO_UNINITIALIZED_WARN = -Wno-uninitialized
354 ifeq ($(ARCH), mips64)
356 CCOMMON_OPT += -mabi=64
358 CCOMMON_OPT += -mabi=n32
363 ifeq ($(CORE), LOONGSON3A)
364 CCOMMON_OPT += -march=mips64
365 FCOMMON_OPT += -march=mips64
368 ifeq ($(CORE), LOONGSON3B)
369 CCOMMON_OPT += -march=mips64
370 FCOMMON_OPT += -march=mips64
373 ifeq ($(OSNAME), AIX)
379 ifndef BINARY_DEFINED
389 ifeq ($(C_COMPILER), PGI)
391 CCOMMON_OPT += -tp p7-64
393 CCOMMON_OPT += -tp p7
397 ifeq ($(C_COMPILER), PATHSCALE)
406 # Fortran Compiler dependent settings
409 ifeq ($(F_COMPILER), G77)
410 CCOMMON_OPT += -DF_INTERFACE_G77
412 ifndef NO_BINARY_MODE
421 ifeq ($(F_COMPILER), G95)
422 CCOMMON_OPT += -DF_INTERFACE_G95
424 ifndef NO_BINARY_MODE
433 ifeq ($(F_COMPILER), GFORTRAN)
434 CCOMMON_OPT += -DF_INTERFACE_GFORT
436 EXTRALIB += -lgfortran
438 ifeq ($(ARCH), mips64)
440 FCOMMON_OPT += -mabi=64
442 FCOMMON_OPT += -mabi=n32
449 FCOMMON_OPT += -fdefault-integer-8
456 FCOMMON_OPT += -fopenmp
460 ifeq ($(F_COMPILER), INTEL)
461 CCOMMON_OPT += -DF_INTERFACE_INTEL
466 FCOMMON_OPT += -openmp
470 ifeq ($(F_COMPILER), FUJITSU)
471 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
473 FCOMMON_OPT += -openmp
477 ifeq ($(F_COMPILER), IBM)
478 CCOMMON_OPT += -DF_INTERFACE_IBM
479 # FCOMMON_OPT += -qarch=440
483 FCOMMON_OPT += -qintsize=8
489 FCOMMON_OPT += -openmp
493 ifeq ($(F_COMPILER), PGI)
494 CCOMMON_OPT += -DF_INTERFACE_PGI
495 COMMON_PROF += -DPGICOMPILER
500 FCOMMON_OPT += -tp p7-64
502 FCOMMON_OPT += -tp p7
509 ifeq ($(F_COMPILER), PATHSCALE)
510 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
517 ifneq ($(ARCH), mips64)
525 FCOMMON_OPT += -mabi=64
527 FCOMMON_OPT += -mabi=n32
536 ifeq ($(F_COMPILER), OPEN64)
537 CCOMMON_OPT += -DF_INTERFACE_OPEN64
550 FEXTRALIB += -lstdc++
555 ifeq ($(C_COMPILER), OPEN64)
563 ifeq ($(C_COMPILER), SUN)
572 ifeq ($(F_COMPILER), SUN)
573 CCOMMON_OPT += -DF_INTERFACE_SUN
580 FCOMMON_OPT += -xopenmp=parallel
584 ifeq ($(F_COMPILER), COMPAQ)
585 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
587 FCOMMON_OPT += -openmp
598 ifeq ($(NEED_PIC), 1)
599 ifeq ($(C_COMPILER), IBM)
600 CCOMMON_OPT += -qpic=large
604 ifeq ($(F_COMPILER), SUN)
611 ifeq ($(DYNAMIC_ARCH), 1)
612 CCOMMON_OPT += -DDYNAMIC_ARCH
615 ifeq ($(NO_LAPACK), 1)
616 CCOMMON_OPT += -DNO_LAPACK
617 #Disable LAPACK C interface
621 ifeq ($(NO_LAPACKE), 1)
622 CCOMMON_OPT += -DNO_LAPACKE
626 CCOMMON_OPT += -DNO_AVX
630 CCOMMON_OPT += -DSMP_SERVER
632 ifeq ($(ARCH), mips64)
633 ifneq ($(CORE), LOONGSON3B)
634 USE_SIMPLE_THREADED_LEVEL3 = 1
638 ifeq ($(USE_OPENMP), 1)
639 # USE_SIMPLE_THREADED_LEVEL3 = 1
641 CCOMMON_OPT += -DUSE_OPENMP
646 ifeq ($(NO_WARMUP), 1)
647 CCOMMON_OPT += -DNO_WARMUP
650 ifeq ($(CONSISTENT_FPCSR), 1)
651 CCOMMON_OPT += -DCONSISTENT_FPCSR
654 # Only for development
655 # CCOMMON_OPT += -DPARAMTEST
656 # CCOMMON_OPT += -DPREFETCHTEST
657 # CCOMMON_OPT += -DNO_SWITCHING
661 CCOMMON_OPT += -DUSE_PAPI
662 EXTRALIB += -lpapi -lperfctr
665 ifdef DYNAMIC_THREADS
666 CCOMMON_OPT += -DDYNAMIC_THREADS
669 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
671 ifdef USE_SIMPLE_THREADED_LEVEL3
672 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
676 LIBPREFIX = libopenblas
678 LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
681 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
683 include $(TOPDIR)/Makefile.$(ARCH)
685 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
687 ifeq ($(CORE), PPC440)
688 CCOMMON_OPT += -DALLOC_QALLOC
691 ifeq ($(CORE), PPC440FP2)
692 STATIC_ALLOCATION = 1
695 ifneq ($(OSNAME), Linux)
699 ifneq ($(ARCH), x86_64)
701 ifneq ($(CORE), LOONGSON3B)
708 CCOMMON_OPT += -DNO_AFFINITY
711 ifdef FUNCTION_PROFILE
712 CCOMMON_OPT += -DFUNCTION_PROFILE
715 ifdef HUGETLB_ALLOCATION
716 CCOMMON_OPT += -DALLOC_HUGETLB
719 ifdef HUGETLBFILE_ALLOCATION
720 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
723 ifdef STATIC_ALLOCATION
724 CCOMMON_OPT += -DALLOC_STATIC
727 ifdef DEVICEDRIVER_ALLOCATION
728 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
731 ifdef MIXED_MEMORY_ALLOCATION
732 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
735 ifeq ($(OSNAME), SunOS)
751 REVISION = -r$(VERSION)
752 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
763 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
764 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
766 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
767 override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
782 ifneq ($(DYNAMIC_ARCH), 1)
784 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
785 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
787 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
788 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
792 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
793 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
795 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
796 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
801 LIBDLLNAME = $(LIBPREFIX).dll
802 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
803 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
804 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
805 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
806 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
808 LIBS = $(TOPDIR)/$(LIBNAME)
809 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
849 export FUNCTION_PROFILE
852 export SGEMM_UNROLL_M
853 export SGEMM_UNROLL_N
854 export DGEMM_UNROLL_M
855 export DGEMM_UNROLL_N
856 export QGEMM_UNROLL_M
857 export QGEMM_UNROLL_N
858 export CGEMM_UNROLL_M
859 export CGEMM_UNROLL_N
860 export ZGEMM_UNROLL_M
861 export ZGEMM_UNROLL_N
862 export XGEMM_UNROLL_M
863 export XGEMM_UNROLL_N
872 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
875 $(FC) $(FFLAGS) -c $< -o $(@F)
878 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
882 PATHSCALEPATH = /opt/pathscale/lib/3.1
883 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
885 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
886 PGIPATH = /opt/pgi/linux86/7.1-5/lib
889 ACMLPATH = /opt/acml/4.3.0
890 ifneq ($(OSNAME), Darwin)
891 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
893 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
895 ATLASPATH = /opt/atlas/3.9.17/opteron
896 FLAMEPATH = $(HOME)/flame/lib
897 ifneq ($(OSNAME), SunOS)
898 SUNPATH = /opt/sunstudio12.1
900 SUNPATH = /opt/SUNWspro