2 # Include user definition
5 # TO suppress recursive includes
12 # If ARCH is not set, we use the host system's architecture for getarch compile options.
14 HOSTARCH := $(shell uname -m)
19 # Catch conflicting usage of ARCH in some BSD environments
22 else ifeq ($(ARCH), powerpc64)
24 else ifeq ($(ARCH), powerpc64le)
26 else ifeq ($(ARCH), powerpc)
28 else ifeq ($(ARCH), i386)
30 else ifeq ($(ARCH), armv6)
32 else ifeq ($(ARCH), armv7)
34 else ifeq ($(ARCH), aarch64)
36 else ifeq ($(ARCH), zarch)
40 NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-netlib
43 # - Only set if not specified on the command line or inherited from the environment.
44 # - CC is an implicit variable so neither '?=' or 'ifndef' can be used.
45 # http://stackoverflow.com/questions/4029274/mingw-and-make-variables
46 # - Default value is 'cc' which is not always a valid command (e.g. MinGW).
47 ifeq ($(origin CC),default)
49 # Check if $(CC) refers to a valid command and set the value to gcc if not
50 ifneq ($(findstring cmd.exe,$(SHELL)),)
51 ifeq ($(shell where $(CC) 2>NUL),)
55 ifeq ($(shell command -v $(CC) 2>/dev/null),)
56 ifeq ($(shell uname -s),Darwin)
58 # EXTRALIB += -Wl,-no_compact_unwind
65 endif # CC is set to default
67 # Default Fortran compiler (FC) is selected by f_check.
70 include $(TOPDIR)/Makefile.rule
72 include $(TOPDIR)/$(MAKEFILE_RULE)
76 # Beginning of system configuration
78 ifneq ($(BUILD_SINGLE),1)
79 ifneq ($(BUILD_DOUBLE),1)
80 ifneq ($(BUILD_COMPLEX),1)
81 ifneq ($(BUILD_COMPLEX16),1)
82 override BUILD_SINGLE=1
83 override BUILD_DOUBLE=1
84 override BUILD_COMPLEX=1
85 override BUILD_COMPLEX16=1
96 GETARCH_FLAGS := -DFORCE_$(TARGET)
97 GETARCH_FLAGS += -DUSER_TARGET
98 ifeq ($(TARGET), GENERIC)
99 ifeq ($(DYNAMIC_ARCH), 1)
100 override NO_EXPRECISION=1
101 export NO_EXPRECiSION
106 # Force fallbacks for 32bit
109 ifeq ($(TARGET), HASWELL)
110 GETARCH_FLAGS := -DFORCE_NEHALEM
112 ifeq ($(TARGET), SKYLAKEX)
113 GETARCH_FLAGS := -DFORCE_NEHALEM
115 ifeq ($(TARGET), COOPERLAKE)
116 GETARCH_FLAGS := -DFORCE_NEHALEM
118 ifeq ($(TARGET), SANDYBRIDGE)
119 GETARCH_FLAGS := -DFORCE_NEHALEM
121 ifeq ($(TARGET), BULLDOZER)
122 GETARCH_FLAGS := -DFORCE_BARCELONA
124 ifeq ($(TARGET), PILEDRIVER)
125 GETARCH_FLAGS := -DFORCE_BARCELONA
127 ifeq ($(TARGET), STEAMROLLER)
128 GETARCH_FLAGS := -DFORCE_BARCELONA
130 ifeq ($(TARGET), EXCAVATOR)
131 GETARCH_FLAGS := -DFORCE_BARCELONA
133 ifeq ($(TARGET), ZEN)
134 GETARCH_FLAGS := -DFORCE_BARCELONA
136 ifeq ($(TARGET), ARMV8)
137 GETARCH_FLAGS := -DFORCE_ARMV7
139 ifeq ($(TARGET), POWER8)
140 GETARCH_FLAGS := -DFORCE_POWER6
145 #TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
148 GETARCH_FLAGS := -DFORCE_$(TARGET_CORE)
151 # Force fallbacks for 32bit
154 ifeq ($(TARGET_CORE), HASWELL)
155 GETARCH_FLAGS := -DFORCE_NEHALEM
157 ifeq ($(TARGET_CORE), SKYLAKEX)
158 GETARCH_FLAGS := -DFORCE_NEHALEM
160 ifeq ($(TARGET_CORE), COOPERLAKE)
161 GETARCH_FLAGS := -DFORCE_NEHALEM
163 ifeq ($(TARGET_CORE), SANDYBRIDGE)
164 GETARCH_FLAGS := -DFORCE_NEHALEM
166 ifeq ($(TARGET_CORE), BULLDOZER)
167 GETARCH_FLAGS := -DFORCE_BARCELONA
169 ifeq ($(TARGET_CORE), PILEDRIVER)
170 GETARCH_FLAGS := -DFORCE_BARCELONA
172 ifeq ($(TARGET_CORE), STEAMROLLER)
173 GETARCH_FLAGS := -DFORCE_BARCELONA
175 ifeq ($(TARGET_CORE), EXCAVATOR)
176 GETARCH_FLAGS := -DFORCE_BARCELONA
178 ifeq ($(TARGET_CORE), ZEN)
179 GETARCH_FLAGS := -DFORCE_BARCELONA
184 # On x86_64 build getarch with march=native unless the compiler is PGI. This is required to detect AVX512 support in getarch.
185 ifeq ($(HOSTARCH), x86_64)
186 ifeq ($(findstring pgcc,$(HOSTCC))$(findstring nvc,$(HOSTCC)),)
187 GETARCH_FLAGS += -march=native
192 ifneq ($(INTERFACE64), 0)
193 GETARCH_FLAGS += -DUSE64BITINT
197 ifndef GEMM_MULTITHREAD_THRESHOLD
198 GEMM_MULTITHREAD_THRESHOLD=4
200 GETARCH_FLAGS += -DGEMM_MULTITHREAD_THRESHOLD=$(GEMM_MULTITHREAD_THRESHOLD)
203 GETARCH_FLAGS += -DNO_AVX
207 GETARCH_FLAGS += -DNO_AVX -DNO_AVX2 -DNO_AVX512
212 GETARCH_FLAGS += -DNO_AVX2
215 ifeq ($(NO_AVX512), 1)
216 GETARCH_FLAGS += -DNO_AVX512
223 ifeq ($(QUIET_MAKE), 1)
227 ifndef NO_PARALLEL_MAKE
230 GETARCH_FLAGS += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE)
233 GETARCH_FLAGS += -DMAKE_NB_JOBS=$(MAKE_NB_JOBS)
236 ifeq ($(HOSTCC), loongcc)
237 GETARCH_FLAGS += -static
240 #if don't use Fortran, it will only compile CBLAS.
241 ifeq ($(ONLY_CBLAS), 1)
247 # This operation is expensive, so execution should be once.
248 ifndef GOTOBLAS_MAKEFILE
249 export GOTOBLAS_MAKEFILE = 1
251 # Generating Makefile.conf and config.h
252 DUMMY := $(shell $(MAKE) -C $(TOPDIR) -f Makefile.prebuild CC="$(CC)" FC="$(FC)" HOSTCC="$(HOSTCC)" HOST_CFLAGS="$(GETARCH_FLAGS)" CFLAGS="$(CFLAGS)" BINARY=$(BINARY) USE_OPENMP=$(USE_OPENMP) TARGET_CORE=$(TARGET_CORE) ONLY_CBLAS=$(ONLY_CBLAS) TARGET=$(TARGET) all)
255 include $(TOPDIR)/Makefile.conf
273 include $(TOPDIR)/Makefile_kernel.conf
283 NUM_THREADS = $(NUM_CORES)
286 ifeq ($(NUM_THREADS), 1)
287 override USE_THREAD = 0
288 override USE_OPENMP = 0
292 ifeq ($(USE_THREAD), 0)
298 ifeq ($(NUM_THREAD), 1)
315 AR ?= $(CROSS_SUFFIX)ar
316 AS ?= $(CROSS_SUFFIX)as
317 LD ?= $(CROSS_SUFFIX)ld
318 RANLIB ?= $(CROSS_SUFFIX)ranlib
319 NM = $(CROSS_SUFFIX)nm
320 DLLWRAP = $(CROSS_SUFFIX)dllwrap
321 OBJCOPY = $(CROSS_SUFFIX)objcopy
322 OBJCONV = $(CROSS_SUFFIX)objconv
325 # When fortran support was either not detected or actively deselected, only build BLAS.
326 ifeq ($(NOFORTRAN), 1)
331 ifeq ($(C_COMPILER), GCC)
332 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
333 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
334 GCCVERSIONGT5 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 5)
335 GCCVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 7)
336 GCCVERSIONGTEQ9 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 9)
337 GCCVERSIONGTEQ11 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 11)
338 GCCVERSIONGTEQ10 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 10)
339 # Note that the behavior of -dumpversion is compile-time-configurable for
340 # gcc-7.x and newer. Use -dumpfullversion there
341 ifeq ($(GCCVERSIONGTEQ7),1)
342 GCCDUMPVERSION_PARAM := -dumpfullversion
344 GCCDUMPVERSION_PARAM := -dumpversion
346 GCCMINORVERSIONGTEQ1 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 1)
347 GCCMINORVERSIONGTEQ2 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 2)
348 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 7)
352 # OS dependent settings
355 ifeq ($(OSNAME), Darwin)
356 ifndef MACOSX_DEPLOYMENT_TARGET
357 export MACOSX_DEPLOYMENT_TARGET=10.8
362 ifneq (,$(findstring $(OSNAME), FreeBSD OpenBSD DragonFly))
366 ifeq ($(OSNAME), NetBSD)
370 ifeq ($(OSNAME), Linux)
375 ifeq ($(OSNAME), Android)
379 ifeq ($(OSNAME), AIX)
383 ifeq ($(OSNAME), WINNT)
387 EXTRALIB += -defaultlib:advapi32
393 ifeq ($(C_COMPILER), CLANG)
394 CCOMMON_OPT += -DMS_ABI
397 #Version tests for supporting specific features (MS_ABI, POWER9 intrinsics)
398 ifeq ($(GCCVERSIONGT4), 1)
399 # GCC Major version > 4
400 # It is compatible with MSVC ABI.
401 CCOMMON_OPT += -DMS_ABI
404 ifeq ($(GCCVERSIONGTEQ4), 1)
405 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
407 # It is compatible with MSVC ABI.
408 CCOMMON_OPT += -DMS_ABI
412 # Ensure the correct stack alignment on Win32
413 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
415 CCOMMON_OPT += -mincoming-stack-boundary=2
416 FCOMMON_OPT += -mincoming-stack-boundary=2
421 ifeq ($(OSNAME), Interix)
425 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
428 ifeq ($(OSNAME), CYGWIN_NT)
434 ifneq ($(OSNAME), WINNT)
435 ifneq ($(OSNAME), CYGWIN_NT)
436 ifneq ($(OSNAME), Interix)
437 ifneq ($(OSNAME), Android)
439 EXTRALIB += -lpthread
447 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
452 CCOMMON_OPT += -DQUAD_PRECISION
457 ifneq ($(ARCH), x86_64)
463 CCOMMON_OPT += -DUTEST_CHECK
468 CCOMMON_OPT += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
471 MAX_STACK_ALLOC ?= 2048
472 ifneq ($(MAX_STACK_ALLOC), 0)
473 CCOMMON_OPT += -DMAX_STACK_ALLOC=$(MAX_STACK_ALLOC)
477 ifneq ($(USE_LOCKING), 0)
478 CCOMMON_OPT += -DUSE_LOCKING
483 # Architecture dependent settings
491 ifeq ($(CORE), generic)
495 ifndef NO_EXPRECISION
496 ifeq ($(F_COMPILER), GFORTRAN)
497 # ifeq logical or. GCC or LSB
498 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
500 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
501 FCOMMON_OPT += -m128bit-long-double
503 ifeq ($(C_COMPILER), CLANG)
505 CCOMMON_OPT += -DEXPRECISION
506 FCOMMON_OPT += -m128bit-long-double
512 ifeq ($(ARCH), x86_64)
514 ifeq ($(CORE), generic)
518 ifndef NO_EXPRECISION
519 ifeq ($(F_COMPILER), GFORTRAN)
520 # ifeq logical or. GCC or LSB
521 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
523 CCOMMON_OPT += -DEXPRECISION -m128bit-long-double
524 FCOMMON_OPT += -m128bit-long-double
526 ifeq ($(C_COMPILER), CLANG)
528 CCOMMON_OPT += -DEXPRECISION
529 FCOMMON_OPT += -m128bit-long-double
535 ifeq ($(C_COMPILER), INTEL)
536 CCOMMON_OPT += -wd981
540 ifeq ($(USE_OPENMP), 1)
543 ifeq ($(USE_THREAD), 0)
544 $(error OpenBLAS: Cannot set both USE_OPENMP=1 and USE_THREAD=0. The USE_THREAD=0 is only for building single thread version.)
547 # ifeq logical or. GCC or LSB
548 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
549 CCOMMON_OPT += -fopenmp
552 ifeq ($(C_COMPILER), CLANG)
553 CCOMMON_OPT += -fopenmp
556 ifeq ($(C_COMPILER), INTEL)
557 CCOMMON_OPT += -fopenmp
560 ifeq ($(C_COMPILER), PGI)
564 ifeq ($(C_COMPILER), OPEN64)
566 CEXTRALIB += -lstdc++
569 ifeq ($(C_COMPILER), PATHSCALE)
575 ifeq ($(DYNAMIC_ARCH), 1)
577 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
578 CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
581 ifeq ($(ARCH), x86_64)
582 DYNAMIC_CORE = PRESCOTT CORE2
583 ifeq ($(DYNAMIC_OLDER), 1)
584 DYNAMIC_CORE += PENRYN DUNNINGTON
586 DYNAMIC_CORE += NEHALEM
587 ifeq ($(DYNAMIC_OLDER), 1)
588 DYNAMIC_CORE += OPTERON OPTERON_SSE3
590 DYNAMIC_CORE += BARCELONA
591 ifeq ($(DYNAMIC_OLDER), 1)
592 DYNAMIC_CORE += BOBCAT ATOM NANO
595 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER STEAMROLLER EXCAVATOR
597 ifneq ($(NO_AVX2), 1)
598 DYNAMIC_CORE += HASWELL ZEN
600 ifneq ($(NO_AVX512), 1)
601 ifneq ($(NO_AVX2), 1)
602 DYNAMIC_CORE += SKYLAKEX COOPERLAKE
608 override DYNAMIC_CORE = PRESCOTT $(DYNAMIC_LIST)
609 XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_PRESCOTT
610 XCCOMMON_OPT += $(foreach dcore,$(DYNAMIC_LIST),-DDYN_$(dcore))
611 CCOMMON_OPT += $(XCCOMMON_OPT)
612 #CCOMMON_OPT += -DDYNAMIC_LIST='$(DYNAMIC_LIST)'
615 ifeq ($(ARCH), arm64)
617 DYNAMIC_CORE += CORTEXA53
618 DYNAMIC_CORE += CORTEXA57
619 DYNAMIC_CORE += CORTEXA72
620 DYNAMIC_CORE += CORTEXA73
621 DYNAMIC_CORE += NEOVERSEN1
622 DYNAMIC_CORE += FALKOR
623 DYNAMIC_CORE += THUNDERX
624 DYNAMIC_CORE += THUNDERX2T99
625 DYNAMIC_CORE += TSV110
626 DYNAMIC_CORE += EMAG8180
627 DYNAMIC_CORE += THUNDERX3T110
630 ifeq ($(ARCH), mips64)
631 DYNAMIC_CORE = LOONGSON3R3 LOONGSON3R4
634 ifeq ($(ARCH), zarch)
635 DYNAMIC_CORE = ZARCH_GENERIC
637 # if the compiler accepts -march=arch11 or -march=z13 and can compile a file
638 # with z13-specific inline assembly, then we can include support for Z13.
639 # note: -march=z13 is equivalent to -march=arch11 yet some compiler releases
640 # only support one or the other.
641 # note: LLVM version 6.x supported -march=z13 yet could not handle vector
642 # registers in inline assembly, so the check for supporting the -march flag is
644 ZARCH_TEST_COMPILE=-c $(TOPDIR)/kernel/zarch/damin_z13.c -I$(TOPDIR) -o /dev/null > /dev/null 2> /dev/null
645 ZARCH_CC_SUPPORTS_ARCH11=$(shell $(CC) -march=arch11 $(ZARCH_TEST_COMPILE) && echo 1)
646 ZARCH_CC_SUPPORTS_Z13=$(shell $(CC) -march=z13 $(ZARCH_TEST_COMPILE) && echo 1)
648 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH11), $(ZARCH_CC_SUPPORTS_Z13)), 1)
650 CCOMMON_OPT += -DDYN_Z13
652 $(info OpenBLAS: Not building Z13 kernels because the compiler $(CC) does not support it)
655 # as above for z13, check for -march=arch12 and z14 support in the compiler.
656 ZARCH_CC_SUPPORTS_ARCH12=$(shell $(CC) -march=arch12 $(ZARCH_TEST_COMPILE) && echo 1)
657 ZARCH_CC_SUPPORTS_Z14=$(shell $(CC) -march=z14 $(ZARCH_TEST_COMPILE) && echo 1)
658 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH12), $(ZARCH_CC_SUPPORTS_Z14)), 1)
660 CCOMMON_OPT += -DDYN_Z14
662 $(info OpenBLAS: Not building Z14 kernels because the compiler $(CC) does not support it)
667 ifeq ($(ARCH), power)
668 ifneq ($(C_COMPILER), PGI)
669 DYNAMIC_CORE = POWER6
670 DYNAMIC_CORE += POWER8
671 ifneq ($(C_COMPILER), GCC)
672 DYNAMIC_CORE += POWER9
673 DYNAMIC_CORE += POWER10
674 CCOMMON_OPT += -DHAVE_P10_SUPPORT
676 ifeq ($(C_COMPILER), GCC)
677 ifeq ($(GCCVERSIONGT5), 1)
678 DYNAMIC_CORE += POWER9
680 $(info, OpenBLAS: Your gcc version is too old to build the POWER9 kernels.)
682 LDVERSIONGTEQ35 := $(shell expr `$(CC) -Wl,--version 2> /dev/null | head -1 | cut -f2 -d "." | cut -f1 -d "-"` \>= 35)
683 ifeq ($(GCCVERSIONGTEQ11)$(LDVERSIONGTEQ35), 11)
684 DYNAMIC_CORE += POWER10
685 CCOMMON_OPT += -DHAVE_P10_SUPPORT
686 else ifeq ($(GCCVERSIONGTEQ10), 1)
687 ifeq ($(GCCMINORVERSIONGTEQ2)$(LDVERSIONGTEQ35), 11)
688 DYNAMIC_CORE += POWER10
689 CCOMMON_OPT += -DHAVE_P10_SUPPORT
692 $(info, OpenBLAS: Your gcc version is too old to build the POWER10 kernels.)
696 DYNAMIC_CORE = POWER8
697 DYNAMIC_CORE += POWER9
701 # If DYNAMIC_CORE is not set, DYNAMIC_ARCH cannot do anything, so force it to empty
703 override DYNAMIC_ARCH=
711 ifeq ($(F_COMPILER), GFORTRAN)
712 ifeq ($(C_COMPILER), GCC)
714 # CCOMMON_OPT += -DEXPRECISION
719 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
723 ifeq ($(ARCH), alpha)
735 # If softfp abi is mentioned on the command line, force it.
736 ifeq ($(ARM_SOFTFP_ABI), 1)
737 CCOMMON_OPT += -mfloat-abi=softfp
738 FCOMMON_OPT += -mfloat-abi=softfp
741 ifeq ($(OSNAME), Android)
742 ifeq ($(ARM_SOFTFP_ABI), 1)
745 EXTRALIB += -Wl,-lm_hard
750 ifeq ($(ARCH), arm64)
754 ifneq ($(INTERFACE64), 0)
755 ifeq ($(F_COMPILER), GFORTRAN)
756 FCOMMON_OPT += -fdefault-integer-8
758 ifeq ($(F_COMPILER), FLANG)
765 ifeq ($(ARCH), riscv64)
772 # C Compiler dependent settings
776 # ifeq logical or. GCC or CLANG or LSB
777 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
778 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
780 COMMON_PROF += -fno-inline
781 NO_UNINITIALIZED_WARN = -Wno-uninitialized
783 ifeq ($(QUIET_MAKE), 1)
784 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
789 ifeq ($(ARCH), $(filter $(ARCH),mips64))
791 CCOMMON_OPT += -mabi=64
793 CCOMMON_OPT += -mabi=n32
796 else ifeq ($(ARCH), $(filter $(ARCH),mips))
797 CCOMMON_OPT += -mabi=32
801 ifeq ($(CORE), $(filter $(CORE),LOONGSON3R3 LOONGSON3R4))
802 CCOMMON_OPT += -march=loongson3a
803 FCOMMON_OPT += -march=loongson3a
806 ifeq ($(CORE), MIPS24K)
807 CCOMMON_OPT += -mips32r2 -mtune=24kc $(MSA_FLAGS)
808 FCOMMON_OPT += -mips32r2 -mtune=24kc $(MSA_FLAGS)
811 ifeq ($(CORE), MIPS1004K)
812 CCOMMON_OPT += -mips32r2 $(MSA_FLAGS)
813 FCOMMON_OPT += -mips32r2 $(MSA_FLAGS)
816 ifeq ($(CORE), P5600)
817 CCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600 $(MSA_FLAGS)
818 FCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600 $(MSA_FLAGS)
821 ifeq ($(CORE), I6400)
822 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
823 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
826 ifeq ($(CORE), P6600)
827 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
828 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
831 ifeq ($(CORE), I6500)
832 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
833 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
836 ifeq ($(OSNAME), AIX)
842 ifndef BINARY_DEFINED
843 ifneq ($(OSNAME), AIX)
845 ifneq ($(ARCH), riscv64)
856 ifeq ($(C_COMPILER), PGI)
857 PGCVERSIONGT20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \> 20)
858 PGCVERSIONGTEQ20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \>= 20)
859 PGCMINORVERSIONGE11 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -c 4-5` == 11)
860 PGCVERSIONCHECK := $(PGCVERSIONGT20)$(PGCVERSIONEQ20)$(PGCMINORVERSIONGE11)
861 ifeq ($(PGCVERSIONCHECK), $(filter $(PGCVERSIONCHECK), 110 111 011))
865 ifeq ($(ARCH), x86_64)
866 CCOMMON_OPT += -tp p7-64
868 CCOMMON_OPT += -D__MMX__ -Mnollvm
871 ifeq ($(ARCH), power)
872 ifeq ($(CORE), POWER8)
873 CCOMMON_OPT += -tp pwr8
875 ifeq ($(CORE), POWER9)
876 CCOMMON_OPT += -tp pwr9
881 CCOMMON_OPT += -tp p7
885 ifeq ($(C_COMPILER), PATHSCALE)
894 # Fortran Compiler dependent settings
897 ifeq ($(F_COMPILER), FLANG)
898 CCOMMON_OPT += -DF_INTERFACE_FLANG
899 FCOMMON_OPT += -Mrecursive -Kieee
900 ifeq ($(OSNAME), Linux)
901 ifeq ($(ARCH), x86_64)
902 FLANG_VENDOR := $(shell `$(FC) --version|cut -f 1 -d "."|head -1`)
903 ifeq ($(FLANG_VENDOR),AOCC)
904 FCOMMON_OPT += -fno-unroll-loops
910 ifneq ($(INTERFACE64), 0)
918 ifeq ($(USE_OPENMP), 1)
919 FCOMMON_OPT += -fopenmp
923 ifeq ($(F_COMPILER), G77)
924 CCOMMON_OPT += -DF_INTERFACE_G77
926 ifndef NO_BINARY_MODE
927 ifneq ($(OSNAME), AIX)
937 ifeq ($(F_COMPILER), G95)
938 CCOMMON_OPT += -DF_INTERFACE_G95
940 ifneq ($(OSNAME), AIX)
941 ifndef NO_BINARY_MODE
948 ifneq ($(NO_LAPACKE), 1)
949 FCOMMON_OPT += -fno-second-underscore
954 ifeq ($(F_COMPILER), GFORTRAN)
955 CCOMMON_OPT += -DF_INTERFACE_GFORT
957 # make single-threaded LAPACK calls thread-safe #1847
958 FCOMMON_OPT += -frecursive
959 # work around ABI problem with passing single-character arguments
960 FCOMMON_OPT += -fno-optimize-sibling-calls
961 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
962 ifneq ($(NO_LAPACK), 1)
963 EXTRALIB += -lgfortran
966 ifeq ($(ARCH), $(filter $(ARCH),mips64))
968 FCOMMON_OPT += -mabi=64
970 FCOMMON_OPT += -mabi=n32
972 else ifeq ($(ARCH), $(filter $(ARCH),mips))
973 FCOMMON_OPT += -mabi=32
977 ifneq ($(OSNAME), AIX)
978 ifneq ($(ARCH), riscv64)
983 ifneq ($(INTERFACE64), 0)
984 FCOMMON_OPT += -fdefault-integer-8
988 ifneq ($(OSNAME), AIX)
993 ifeq ($(USE_OPENMP), 1)
994 FCOMMON_OPT += -fopenmp
998 ifeq ($(F_COMPILER), INTEL)
999 CCOMMON_OPT += -DF_INTERFACE_INTEL
1001 ifneq ($(INTERFACE64), 0)
1005 FCOMMON_OPT += -recursive -fp-model strict -assume protect-parens
1006 ifeq ($(USE_OPENMP), 1)
1007 FCOMMON_OPT += -fopenmp
1011 ifeq ($(F_COMPILER), FUJITSU)
1012 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
1013 ifeq ($(USE_OPENMP), 1)
1014 FCOMMON_OPT += -openmp
1018 ifeq ($(F_COMPILER), IBM)
1019 CCOMMON_OPT += -DF_INTERFACE_IBM
1020 # FCOMMON_OPT += -qarch=440
1024 ifneq ($(INTERFACE64), 0)
1025 FCOMMON_OPT += -qintsize=8
1031 ifeq ($(USE_OPENMP), 1)
1032 FCOMMON_OPT += -openmp
1036 ifeq ($(F_COMPILER), PGI)
1037 CCOMMON_OPT += -DF_INTERFACE_PGI
1038 COMMON_PROF += -DPGICOMPILER
1041 ifneq ($(INTERFACE64), 0)
1045 ifeq ($(ARCH), x86_64)
1046 FCOMMON_OPT += -tp p7-64
1048 ifeq ($(ARCH), power)
1049 ifeq ($(CORE), POWER6)
1050 $(warning NVIDIA HPC compilers do not support POWER6.)
1052 ifeq ($(CORE), POWER8)
1053 FCOMMON_OPT += -tp pwr8
1055 ifeq ($(CORE), POWER9)
1056 FCOMMON_OPT += -tp pwr9
1058 ifeq ($(CORE), POWER10)
1059 $(warning NVIDIA HPC compilers do not support POWER10.)
1064 FCOMMON_OPT += -tp p7
1066 FCOMMON_OPT += -Mrecursive -Kieee
1067 ifeq ($(USE_OPENMP), 1)
1072 ifeq ($(F_COMPILER), PATHSCALE)
1073 CCOMMON_OPT += -DF_INTERFACE_PATHSCALE
1076 ifneq ($(INTERFACE64), 0)
1082 ifeq ($(USE_OPENMP), 1)
1087 ifeq ($(F_COMPILER), OPEN64)
1088 CCOMMON_OPT += -DF_INTERFACE_OPEN64
1091 ifneq ($(INTERFACE64), 0)
1097 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1103 ifeq ($(CORE), LOONGSON3R3)
1104 FCOMMON_OPT += -loongson3 -static
1107 ifeq ($(CORE), LOONGSON3R4)
1108 FCOMMON_OPT += -loongson3 -static
1119 ifeq ($(USE_OPENMP), 1)
1120 FEXTRALIB += -lstdc++
1125 ifeq ($(C_COMPILER), OPEN64)
1127 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1133 ifeq ($(CORE), LOONGSON3R3)
1134 CCOMMON_OPT += -loongson3 -static
1137 ifeq ($(CORE), LOONGSON3R4)
1138 CCOMMON_OPT += -loongson3 -static
1151 ifeq ($(C_COMPILER), SUN)
1164 ifeq ($(F_COMPILER), SUN)
1165 CCOMMON_OPT += -DF_INTERFACE_SUN
1166 FCOMMON_OPT += -ftrap=%none -xrecursive
1176 ifeq ($(USE_OPENMP), 1)
1177 FCOMMON_OPT += -xopenmp=parallel
1181 ifeq ($(F_COMPILER), COMPAQ)
1182 CCOMMON_OPT += -DF_INTERFACE_COMPAQ
1183 ifeq ($(USE_OPENMP), 1)
1184 FCOMMON_OPT += -openmp
1190 ifneq ($(INTERFACE64), 0)
1197 ifeq ($(NEED_PIC), 1)
1198 ifeq ($(C_COMPILER), IBM)
1199 CCOMMON_OPT += -qpic=large
1201 CCOMMON_OPT += -fPIC
1203 ifeq ($(F_COMPILER), SUN)
1206 FCOMMON_OPT += -fPIC
1210 ifeq ($(DYNAMIC_ARCH), 1)
1211 CCOMMON_OPT += -DDYNAMIC_ARCH
1214 ifeq ($(DYNAMIC_OLDER), 1)
1215 CCOMMON_OPT += -DDYNAMIC_OLDER
1218 ifeq ($(NO_LAPACK), 1)
1219 CCOMMON_OPT += -DNO_LAPACK
1220 #Disable LAPACK C interface
1224 ifeq ($(NO_LAPACKE), 1)
1225 CCOMMON_OPT += -DNO_LAPACKE
1229 CCOMMON_OPT += -DNO_AVX
1233 CCOMMON_OPT += -DNO_AVX
1236 ifeq ($(NO_AVX2), 1)
1237 CCOMMON_OPT += -DNO_AVX2
1240 ifeq ($(NO_AVX512), 1)
1241 CCOMMON_OPT += -DNO_AVX512
1245 CCOMMON_OPT += -DSMP_SERVER
1247 ifeq ($(ARCH), mips64)
1248 USE_SIMPLE_THREADED_LEVEL3 = 1
1251 ifeq ($(USE_OPENMP), 1)
1252 # USE_SIMPLE_THREADED_LEVEL3 = 1
1254 CCOMMON_OPT += -DUSE_OPENMP
1257 ifeq ($(BIGNUMA), 1)
1258 CCOMMON_OPT += -DBIGNUMA
1263 ifeq ($(NO_WARMUP), 1)
1264 CCOMMON_OPT += -DNO_WARMUP
1267 ifeq ($(CONSISTENT_FPCSR), 1)
1268 CCOMMON_OPT += -DCONSISTENT_FPCSR
1271 # Only for development
1272 # CCOMMON_OPT += -DPARAMTEST
1273 # CCOMMON_OPT += -DPREFETCHTEST
1274 # CCOMMON_OPT += -DNO_SWITCHING
1278 CCOMMON_OPT += -DUSE_PAPI
1279 EXTRALIB += -lpapi -lperfctr
1283 CCOMMON_OPT += -DBUFFERSIZE=$(BUFFERSIZE)
1286 ifdef DYNAMIC_THREADS
1287 CCOMMON_OPT += -DDYNAMIC_THREADS
1290 CCOMMON_OPT += -DMAX_CPU_NUMBER=$(NUM_THREADS)
1292 CCOMMON_OPT += -DMAX_PARALLEL_NUMBER=$(NUM_PARALLEL)
1294 ifdef USE_SIMPLE_THREADED_LEVEL3
1295 CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
1298 ifeq ($(USE_TLS), 1)
1299 CCOMMON_OPT += -DUSE_TLS
1302 ifeq ($(BUILD_BFLOAT16), 1)
1303 CCOMMON_OPT += -DBUILD_BFLOAT16
1305 ifeq ($(BUILD_SINGLE), 1)
1306 CCOMMON_OPT += -DBUILD_SINGLE=1
1308 ifeq ($(BUILD_DOUBLE), 1)
1309 CCOMMON_OPT += -DBUILD_DOUBLE=1
1311 ifeq ($(BUILD_COMPLEX), 1)
1312 CCOMMON_OPT += -DBUILD_COMPLEX=1
1314 ifeq ($(BUILD_COMPLEX16), 1)
1315 CCOMMON_OPT += -DBUILD_COMPLEX16=1
1318 CCOMMON_OPT += -DVERSION=\"$(VERSION)\"
1328 ifndef LIBSONAMEBASE
1329 LIBSONAMEBASE = openblas
1332 ifndef LIBNAMESUFFIX
1333 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)
1335 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)_$(LIBNAMESUFFIX)
1338 ifeq ($(OSNAME), CYGWIN_NT)
1339 LIBPREFIX = cyg$(LIBNAMEBASE)
1341 LIBPREFIX = lib$(LIBNAMEBASE)
1344 KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
1346 include $(TOPDIR)/Makefile.$(ARCH)
1348 ifneq ($(C_COMPILER), PGI)
1349 ifneq ($(C_COMPILER), SUN)
1350 CCOMMON_OPT += -UASMNAME -UASMFNAME -UNAME -UCNAME -UCHAR_NAME -UCHAR_CNAME
1353 CCOMMON_OPT += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
1355 ifeq ($(CORE), PPC440)
1356 CCOMMON_OPT += -DALLOC_QALLOC
1359 ifeq ($(CORE), PPC440FP2)
1360 STATIC_ALLOCATION = 1
1363 ifneq ($(OSNAME), Linux)
1367 ifneq ($(ARCH), x86_64)
1368 ifneq ($(ARCH), x86)
1374 ifeq ($(NO_AFFINITY), 0)
1375 override undefine NO_AFFINITY
1377 CCOMMON_OPT += -DNO_AFFINITY
1381 ifdef FUNCTION_PROFILE
1382 CCOMMON_OPT += -DFUNCTION_PROFILE
1385 ifdef HUGETLB_ALLOCATION
1386 CCOMMON_OPT += -DALLOC_HUGETLB
1389 ifdef HUGETLBFILE_ALLOCATION
1390 CCOMMON_OPT += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
1393 ifdef STATIC_ALLOCATION
1394 CCOMMON_OPT += -DALLOC_STATIC
1397 ifdef DEVICEDRIVER_ALLOCATION
1398 CCOMMON_OPT += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
1401 ifdef MIXED_MEMORY_ALLOCATION
1402 CCOMMON_OPT += -DMIXED_MEMORY_ALLOCATION
1405 ifeq ($(OSNAME), SunOS)
1422 REVISION = -r$(VERSION)
1423 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
1438 FCOMMON_OPT = -O2 -frecursive
1441 override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
1442 override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
1443 override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
1444 override FPFLAGS += $(FCOMMON_OPT) $(COMMON_PROF)
1448 ifeq (,$(findstring PIC,$(FFLAGS)))
1449 override FFLAGS += -fPIC
1453 #For LAPACK Fortran codes.
1454 #Disable -fopenmp for LAPACK Fortran codes on Windows.
1456 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
1457 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
1459 LAPACK_FFLAGS := $(FFLAGS)
1460 LAPACK_FPFLAGS := $(FPFLAGS)
1463 LAPACK_CFLAGS = $(CFLAGS)
1464 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
1466 ifneq ($(INTERFACE64), 0)
1467 LAPACK_CFLAGS += -DLAPACK_ILP64
1472 LAPACK_CFLAGS += -DOPENBLAS_OS_WINDOWS
1474 ifeq ($(C_COMPILER), LSB)
1475 LAPACK_CFLAGS += -DLAPACK_COMPLEX_STRUCTURE
1490 ifneq ($(DYNAMIC_ARCH), 1)
1492 LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
1493 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
1495 LIBNAME = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
1496 LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
1500 LIBNAME = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
1501 LIBNAME_P = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
1503 LIBNAME = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
1504 LIBNAME_P = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
1509 LIBDLLNAME = $(LIBPREFIX).dll
1510 IMPLIBNAME = lib$(LIBNAMEBASE).dll.a
1511 ifneq ($(OSNAME), AIX)
1512 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
1514 LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.a)
1516 LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
1517 LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
1518 LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
1519 LIBZIPNAME = $(LIBNAME:.$(LIBSUFFIX)=.zip)
1521 LIBS = $(TOPDIR)/$(LIBNAME)
1522 LIBS_P = $(TOPDIR)/$(LIBNAME_P)
1525 LIB_COMPONENTS = BLAS
1526 ifneq ($(NO_CBLAS), 1)
1527 LIB_COMPONENTS += CBLAS
1530 ifneq ($(NO_LAPACK), 1)
1531 LIB_COMPONENTS += LAPACK
1532 ifneq ($(NO_LAPACKE), 1)
1533 LIB_COMPONENTS += LAPACKE
1535 ifeq ($(BUILD_RELAPACK), 1)
1536 LIB_COMPONENTS += ReLAPACK
1540 ifeq ($(ONLY_CBLAS), 1)
1541 LIB_COMPONENTS = CBLAS
1548 export __BYTE_ORDER__
1556 export NEED2UNDERSCORES
1561 export MAKEFILE_RULE
1594 export FUNCTION_PROFILE
1598 export BUILD_BFLOAT16
1600 export SBGEMM_UNROLL_M
1601 export SBGEMM_UNROLL_N
1602 export SGEMM_UNROLL_M
1603 export SGEMM_UNROLL_N
1604 export DGEMM_UNROLL_M
1605 export DGEMM_UNROLL_N
1606 export QGEMM_UNROLL_M
1607 export QGEMM_UNROLL_N
1608 export CGEMM_UNROLL_M
1609 export CGEMM_UNROLL_N
1610 export ZGEMM_UNROLL_M
1611 export ZGEMM_UNROLL_N
1612 export XGEMM_UNROLL_M
1613 export XGEMM_UNROLL_N
1614 export CGEMM3M_UNROLL_M
1615 export CGEMM3M_UNROLL_N
1616 export ZGEMM3M_UNROLL_M
1617 export ZGEMM3M_UNROLL_N
1618 export XGEMM3M_UNROLL_M
1619 export XGEMM3M_UNROLL_N
1629 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1632 $(FC) $(FFLAGS) -c $< -o $(@F)
1635 $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
1639 PATHSCALEPATH = /opt/pathscale/lib/3.1
1640 PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
1642 PATHSCALEPATH = /opt/pathscale/lib/3.1/32
1643 PGIPATH = /opt/pgi/linux86/7.1-5/lib
1646 ACMLPATH = /opt/acml/4.3.0
1647 ifneq ($(OSNAME), Darwin)
1648 MKLPATH = /opt/intel/mkl/10.2.2.025/lib
1650 MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1652 ATLASPATH = /opt/atlas/3.9.17/opteron
1653 FLAMEPATH = $(HOME)/flame/lib
1654 ifneq ($(OSNAME), SunOS)
1655 SUNPATH = /opt/sunstudio12.1
1657 SUNPATH = /opt/SUNWspro