Merge pull request #3633 from martin-frbg/perl_fallback
[platform/upstream/openblas.git] / Makefile.system
1 #
2 # Include user definition
3 #
4
5 # TO suppress recursive includes
6 INCLUDED = 1
7
8 ifndef TOPDIR
9 TOPDIR = . 
10 endif
11
12 # we need to use the host system's architecture for getarch compile options even especially when cross-compiling
13 HOSTARCH := $(shell uname -m)
14 ifeq ($(HOSTARCH), amd64)
15 HOSTARCH=x86_64
16 endif
17
18 # Catch conflicting usage of ARCH in some BSD environments
19 ifeq ($(ARCH), amd64)
20 override ARCH=x86_64
21 else ifeq ($(ARCH), powerpc64)
22 override ARCH=power
23 else ifeq ($(ARCH), powerpc64le)
24 override ARCH=power
25 else ifeq ($(ARCH), powerpc)
26 override ARCH=power
27 else ifeq ($(ARCH), i386)
28 override ARCH=x86
29 else ifeq ($(ARCH), armv6)
30 override ARCH=arm
31 else ifeq ($(ARCH), armv7)
32 override ARCH=arm
33 else ifeq ($(ARCH), aarch64)
34 override ARCH=arm64
35 else ifeq ($(ARCH), mipsel)
36 override ARCH=mips
37 else ifeq ($(ARCH), mips64el)
38 override ARCH=mips64
39 else ifeq ($(ARCH), zarch)
40 override ARCH=zarch
41 endif
42
43 NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-netlib
44
45 # Default C compiler
46 # - Only set if not specified on the command line or inherited from the environment.
47 # - CC is an implicit variable so neither '?=' or 'ifndef' can be used.
48 #   http://stackoverflow.com/questions/4029274/mingw-and-make-variables
49 # - Default value is 'cc' which is not always a valid command (e.g. MinGW).
50 ifeq ($(origin CC),default)
51
52 # Check if $(CC) refers to a valid command and set the value to gcc if not
53 ifneq ($(findstring cmd.exe,$(SHELL)),)
54 ifeq ($(shell where $(CC) 2>NUL),)
55 CC = gcc
56 endif
57 else # POSIX-ish
58 ifeq ($(shell command -v $(CC) 2>/dev/null),)
59 ifeq ($(shell uname -s),Darwin)
60 CC = clang
61 # EXTRALIB += -Wl,-no_compact_unwind
62 else
63 CC = gcc
64 endif # Darwin
65 endif # CC exists
66 endif # Shell is sane
67
68 endif # CC is set to default
69
70 # Default Fortran compiler (FC) is selected by f_check.
71
72 ifndef MAKEFILE_RULE
73 include $(TOPDIR)/Makefile.rule
74 else
75 include $(TOPDIR)/$(MAKEFILE_RULE)
76 endif
77
78 #
79 #  Beginning of system configuration
80 #
81 ifneq ($(BUILD_SINGLE),1)
82 ifneq ($(BUILD_DOUBLE),1)
83 ifneq ($(BUILD_COMPLEX),1)
84 ifneq ($(BUILD_COMPLEX16),1)
85 override BUILD_SINGLE=1
86 override BUILD_DOUBLE=1
87 override BUILD_COMPLEX=1
88 override BUILD_COMPLEX16=1
89 endif
90 endif
91 endif
92 endif
93
94 ifndef HOSTCC
95 HOSTCC   = $(CC)
96 endif
97
98 ifdef TARGET
99 GETARCH_FLAGS := -DFORCE_$(TARGET)
100 GETARCH_FLAGS += -DUSER_TARGET
101 ifeq ($(TARGET), GENERIC)
102 ifeq ($(DYNAMIC_ARCH), 1)
103 override NO_EXPRECISION=1
104 export NO_EXPRECISION
105 endif
106 endif
107 endif
108
109 # Force fallbacks for 32bit
110
111 ifeq ($(BINARY), 32)
112 ifeq ($(TARGET), HASWELL)
113 GETARCH_FLAGS := -DFORCE_NEHALEM
114 endif
115 ifeq ($(TARGET), SKYLAKEX)
116 GETARCH_FLAGS := -DFORCE_NEHALEM
117 endif
118 ifeq ($(TARGET), COOPERLAKE)
119 GETARCH_FLAGS := -DFORCE_NEHALEM
120 endif
121 ifeq ($(TARGET), SAPPHIRERAPIDS)
122 GETARCH_FLAGS := -DFORCE_NEHALEM
123 endif
124 ifeq ($(TARGET), SANDYBRIDGE)
125 GETARCH_FLAGS := -DFORCE_NEHALEM
126 endif
127 ifeq ($(TARGET), BULLDOZER)
128 GETARCH_FLAGS := -DFORCE_BARCELONA
129 endif
130 ifeq ($(TARGET), PILEDRIVER)
131 GETARCH_FLAGS := -DFORCE_BARCELONA
132 endif
133 ifeq ($(TARGET), STEAMROLLER)
134 GETARCH_FLAGS := -DFORCE_BARCELONA
135 endif
136 ifeq ($(TARGET), EXCAVATOR)
137 GETARCH_FLAGS := -DFORCE_BARCELONA
138 endif
139 ifeq ($(TARGET), ZEN)
140 GETARCH_FLAGS := -DFORCE_BARCELONA
141 endif
142 ifeq ($(TARGET), ARMV8)
143 GETARCH_FLAGS := -DFORCE_ARMV7
144 endif
145 ifeq ($(TARGET), POWER8)
146 GETARCH_FLAGS := -DFORCE_POWER6
147 endif
148 ifeq ($(TARGET), POWER9)
149 GETARCH_FLAGS := -DFORCE_POWER6
150 endif
151 ifeq ($(TARGET), POWER10)
152 GETARCH_FLAGS := -DFORCE_POWER6
153 endif
154 endif
155
156 #TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
157 #
158 ifdef TARGET_CORE
159 GETARCH_FLAGS := -DFORCE_$(TARGET_CORE)
160 endif
161
162 # Force fallbacks for 32bit
163
164 ifeq ($(BINARY), 32)
165 ifeq ($(TARGET_CORE), HASWELL)
166 GETARCH_FLAGS := -DFORCE_NEHALEM
167 endif
168 ifeq ($(TARGET_CORE), SKYLAKEX)
169 GETARCH_FLAGS := -DFORCE_NEHALEM
170 endif
171 ifeq ($(TARGET_CORE), COOPERLAKE)
172 GETARCH_FLAGS := -DFORCE_NEHALEM
173 endif
174 ifeq ($(TARGET_CORE), SAPPHIRERAPIDS)
175 GETARCH_FLAGS := -DFORCE_NEHALEM
176 endif
177 ifeq ($(TARGET_CORE), SANDYBRIDGE)
178 GETARCH_FLAGS := -DFORCE_NEHALEM
179 endif
180 ifeq ($(TARGET_CORE), BULLDOZER)
181 GETARCH_FLAGS := -DFORCE_BARCELONA
182 endif
183 ifeq ($(TARGET_CORE), PILEDRIVER)
184 GETARCH_FLAGS := -DFORCE_BARCELONA
185 endif
186 ifeq ($(TARGET_CORE), STEAMROLLER)
187 GETARCH_FLAGS := -DFORCE_BARCELONA
188 endif
189 ifeq ($(TARGET_CORE), EXCAVATOR)
190 GETARCH_FLAGS := -DFORCE_BARCELONA
191 endif
192 ifeq ($(TARGET_CORE), ZEN)
193 GETARCH_FLAGS := -DFORCE_BARCELONA
194 endif
195 endif
196
197
198 # On x86_64 build getarch with march=native unless the compiler is PGI. This is required to detect AVX512 support in getarch.
199 ifeq ($(HOSTARCH), x86_64)
200 ifeq ($(findstring pgcc,$(HOSTCC))$(findstring nvc,$(HOSTCC)),)
201 GETARCH_FLAGS += -march=native
202 endif
203 endif
204
205 ifdef INTERFACE64
206 ifneq ($(INTERFACE64), 0)
207 GETARCH_FLAGS   += -DUSE64BITINT
208 endif
209 endif
210
211 ifndef GEMM_MULTITHREAD_THRESHOLD
212 GEMM_MULTITHREAD_THRESHOLD=4
213 endif
214 GETARCH_FLAGS   += -DGEMM_MULTITHREAD_THRESHOLD=$(GEMM_MULTITHREAD_THRESHOLD)
215
216 ifeq ($(NO_AVX), 1)
217 GETARCH_FLAGS   += -DNO_AVX
218 endif
219
220 ifeq ($(BINARY), 32)
221 GETARCH_FLAGS   += -DNO_AVX -DNO_AVX2 -DNO_AVX512
222 NO_AVX512 = 1
223 endif
224
225 ifeq ($(NO_AVX2), 1)
226 GETARCH_FLAGS   += -DNO_AVX2
227 endif
228
229 ifeq ($(NO_AVX512), 1)
230 GETARCH_FLAGS   += -DNO_AVX512
231 endif
232
233 ifeq ($(DEBUG), 1)
234 GETARCH_FLAGS   += -g
235 endif
236
237 ifeq ($(QUIET_MAKE), 1)
238 MAKE += -s
239 endif
240
241 ifndef NO_PARALLEL_MAKE
242 NO_PARALLEL_MAKE=0
243 endif
244 GETARCH_FLAGS   += -DNO_PARALLEL_MAKE=$(NO_PARALLEL_MAKE)
245
246 ifdef MAKE_NB_JOBS
247 GETARCH_FLAGS += -DMAKE_NB_JOBS=$(MAKE_NB_JOBS)
248 endif
249
250 ifeq ($(HOSTCC), loongcc)
251 GETARCH_FLAGS  += -static
252 endif
253
254 #if don't use Fortran, it will only compile CBLAS.
255 ifeq ($(ONLY_CBLAS), 1)
256 NO_LAPACK = 1
257 else
258 ONLY_CBLAS = 0
259 endif
260
261 #For small matrix optimization
262 ifeq ($(ARCH), x86_64)
263 SMALL_MATRIX_OPT = 1
264 else ifeq ($(CORE), POWER10)
265 SMALL_MATRIX_OPT = 1
266 endif
267 ifeq ($(SMALL_MATRIX_OPT), 1)
268 CCOMMON_OPT += -DSMALL_MATRIX_OPT
269 endif
270
271 # This operation is expensive, so execution should be once.
272 ifndef GOTOBLAS_MAKEFILE
273 export GOTOBLAS_MAKEFILE = 1
274
275 # Determine if the assembler is GNU Assembler
276 HAVE_GAS := $(shell $(AS) -v < /dev/null 2>&1 | grep GNU 2>&1 >/dev/null ; echo $$?)
277 GETARCH_FLAGS += -DHAVE_GAS=$(HAVE_GAS)
278
279 # Generating Makefile.conf and config.h
280 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) DYNAMIC_ARCH=$(DYNAMIC_ARCH) TARGET_CORE=$(TARGET_CORE) ONLY_CBLAS=$(ONLY_CBLAS) TARGET=$(TARGET) all)
281
282 ifndef TARGET_CORE
283 include $(TOPDIR)/Makefile.conf
284 else
285 HAVE_NEON=
286 HAVE_VFP=
287 HAVE_VFPV3=
288 HAVE_VFPV4=
289 HAVE_MMX=
290 HAVE_SSE=
291 HAVE_SSE2=
292 HAVE_SSE3=
293 HAVE_SSSE3=
294 HAVE_SSE4_1=
295 HAVE_SSE4_2=
296 HAVE_SSE4A=
297 HAVE_SSE5=
298 HAVE_AVX=
299 HAVE_AVX2=
300 HAVE_FMA3=
301 include $(TOPDIR)/Makefile_kernel.conf
302 endif
303
304 endif
305
306 ifndef NUM_PARALLEL
307 NUM_PARALLEL = 1
308 endif
309
310 ifndef NUM_THREADS
311 NUM_THREADS = $(NUM_CORES)
312 endif
313
314 ifeq ($(NUM_THREADS), 1)
315 override USE_THREAD = 0
316 override USE_OPENMP = 0
317 endif
318
319 ifdef USE_THREAD
320 ifeq ($(USE_THREAD), 0)
321 SMP =
322 else
323 SMP = 1
324 endif
325 else
326 ifeq ($(NUM_THREADS), 1)
327 SMP =
328 else
329 SMP = 1
330 endif
331 endif
332
333 ifeq ($(SMP), 1)
334 USE_LOCKING = 
335 endif
336
337 ifndef NEED_PIC
338 NEED_PIC = 1
339 endif
340
341 ARFLAGS =
342 CPP     = $(COMPILER) -E
343 AR      ?= $(CROSS_SUFFIX)ar
344 AS      ?= $(CROSS_SUFFIX)as
345 LD      ?= $(CROSS_SUFFIX)ld
346 RANLIB  ?= $(CROSS_SUFFIX)ranlib
347 NM      = $(CROSS_SUFFIX)nm
348 DLLWRAP = $(CROSS_SUFFIX)dllwrap
349 OBJCOPY = $(CROSS_SUFFIX)objcopy
350 OBJCONV = $(CROSS_SUFFIX)objconv
351
352
353 # When fortran support was either not detected or actively deselected, only build BLAS.
354 ifeq ($(NOFORTRAN), 1)
355 C_LAPACK = 1
356 override FEXTRALIB = 
357 endif
358
359 ifeq ($(C_COMPILER), GCC)
360 GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
361 GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
362 GCCVERSIONGT5 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 5)
363 GCCVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 7)
364 GCCVERSIONGTEQ8 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 8)
365 GCCVERSIONGTEQ9 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 9)
366 GCCVERSIONGTEQ11 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 11)
367 GCCVERSIONGTEQ10 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 10)
368 # Note that the behavior of -dumpversion is compile-time-configurable for
369 # gcc-7.x and newer. Use -dumpfullversion there
370 ifeq ($(GCCVERSIONGTEQ7),1)
371         GCCDUMPVERSION_PARAM := -dumpfullversion
372 else
373         GCCDUMPVERSION_PARAM := -dumpversion
374 endif
375 GCCMINORVERSIONGTEQ1 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 1)
376 GCCMINORVERSIONGTEQ2 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 2)
377 GCCMINORVERSIONGTEQ4 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 4)
378 GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) $(GCCDUMPVERSION_PARAM) | cut -f2 -d.` \>= 7)
379 endif
380
381 #
382 #  OS dependent settings
383 #
384
385 ifeq ($(OSNAME), Darwin)
386 ifndef MACOSX_DEPLOYMENT_TARGET
387 export MACOSX_DEPLOYMENT_TARGET=10.8
388 endif
389 MD5SUM = md5 -r
390 endif
391
392 ifneq (,$(findstring $(OSNAME), FreeBSD OpenBSD DragonFly))
393 MD5SUM = md5 -r
394 endif
395
396 ifeq ($(OSNAME), NetBSD)
397 MD5SUM = md5 -n
398 endif
399
400 ifeq ($(OSNAME), Linux)
401 EXTRALIB        += -lm
402 NO_EXPRECISION = 1
403 endif
404
405 ifeq ($(OSNAME), Android)
406 EXTRALIB        += -lm
407 endif
408
409 ifeq ($(OSNAME), AIX)
410 EXTRALIB        += -lm
411 endif
412
413 ifeq ($(OSNAME), FreeBSD)
414 ifeq ($(ARCH), $(filter $(ARCH),arm arm64))
415 EXTRALIB        += -lm
416 endif
417 endif
418
419 ifeq ($(OSNAME), WINNT)
420 NEED_PIC = 0
421 NO_EXPRECISION = 1
422
423 EXTRALIB        += -defaultlib:advapi32
424
425 SUFFIX  = obj
426 PSUFFIX = pobj
427 LIBSUFFIX = a
428
429 ifeq ($(C_COMPILER), CLANG)
430 CCOMMON_OPT     += -DMS_ABI
431 endif
432
433 #Version tests for supporting specific features (MS_ABI, POWER9 intrinsics)
434 ifeq ($(GCCVERSIONGT4), 1)
435 # GCC Major version > 4
436 # It is compatible with MSVC ABI.
437 CCOMMON_OPT     += -DMS_ABI
438 endif
439
440 ifeq ($(GCCVERSIONGTEQ4), 1)
441 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
442 # GCC Version >=4.7
443 # It is compatible with MSVC ABI.
444 CCOMMON_OPT     += -DMS_ABI
445 endif
446 endif
447
448 # Ensure the correct stack alignment on Win32
449 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
450 ifeq ($(ARCH), x86)
451 CCOMMON_OPT += -mincoming-stack-boundary=2
452 FCOMMON_OPT += -mincoming-stack-boundary=2
453 endif
454
455 endif
456
457 ifeq ($(OSNAME), Interix)
458 NEED_PIC = 0
459 NO_EXPRECISION = 1
460
461 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
462 endif
463
464 ifeq ($(OSNAME), CYGWIN_NT)
465 NEED_PIC = 0
466 NO_EXPRECISION = 1
467 OS_CYGWIN_NT = 1
468 endif
469
470 ifneq ($(OSNAME), WINNT)
471 ifneq ($(OSNAME), CYGWIN_NT)
472 ifneq ($(OSNAME), Interix)
473 ifneq ($(OSNAME), Android)
474 ifdef SMP
475 EXTRALIB   += -lpthread
476 endif
477 endif
478 endif
479 endif
480 endif
481
482 # ifeq logical or
483 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
484 OS_WINDOWS=1
485 endif
486
487 ifdef QUAD_PRECISION
488 CCOMMON_OPT     += -DQUAD_PRECISION
489 NO_EXPRECISION = 1
490 endif
491
492 ifneq ($(ARCH), x86)
493 ifneq ($(ARCH), x86_64)
494 NO_EXPRECISION = 1
495 endif
496 endif
497
498 ifdef UTEST_CHECK
499 CCOMMON_OPT     += -DUTEST_CHECK
500 SANITY_CHECK = 1
501 endif
502
503 ifdef SANITY_CHECK
504 CCOMMON_OPT     += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
505 endif
506
507 MAX_STACK_ALLOC ?= 2048
508 ifneq ($(MAX_STACK_ALLOC), 0)
509 CCOMMON_OPT     += -DMAX_STACK_ALLOC=$(MAX_STACK_ALLOC)
510 endif
511
512 ifdef USE_LOCKING
513 ifneq ($(USE_LOCKING), 0)
514 CCOMMON_OPT     += -DUSE_LOCKING
515 endif
516 endif
517
518 #
519 #  Architecture dependent settings
520 #
521
522 ifeq ($(ARCH), x86)
523 ifndef BINARY
524 NO_BINARY_MODE  = 1
525 endif
526
527 ifeq ($(CORE), generic)
528 NO_EXPRECISION = 1
529 endif
530
531 ifndef NO_EXPRECISION
532 ifeq ($(F_COMPILER), GFORTRAN)
533 # ifeq logical or. GCC or LSB
534 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
535 EXPRECISION     = 1
536 CCOMMON_OPT     += -DEXPRECISION -m128bit-long-double
537 FCOMMON_OPT     += -m128bit-long-double
538 endif
539 ifeq ($(C_COMPILER), CLANG)
540 EXPRECISION     = 1
541 CCOMMON_OPT     += -DEXPRECISION
542 FCOMMON_OPT     += -m128bit-long-double
543 endif
544 endif
545 endif
546 endif
547
548 ifeq ($(ARCH), x86_64)
549
550 ifeq ($(CORE), generic)
551 NO_EXPRECISION = 1
552 endif
553
554 ifndef NO_EXPRECISION
555 ifeq ($(F_COMPILER), GFORTRAN)
556 # ifeq logical or. GCC or LSB
557 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
558 EXPRECISION     = 1
559 CCOMMON_OPT     += -DEXPRECISION -m128bit-long-double
560 FCOMMON_OPT     += -m128bit-long-double
561 endif
562 ifeq ($(C_COMPILER), CLANG)
563 EXPRECISION     = 1
564 CCOMMON_OPT     += -DEXPRECISION
565 FCOMMON_OPT     += -m128bit-long-double
566 endif
567 endif
568 endif
569 endif
570
571 ifeq ($(C_COMPILER), INTEL)
572 CCOMMON_OPT    += -wd981
573 endif
574
575
576 ifeq ($(USE_OPENMP), 1)
577
578 #check
579 ifeq ($(USE_THREAD), 0)
580 $(error OpenBLAS: Cannot set both USE_OPENMP=1 and USE_THREAD=0. The USE_THREAD=0 is only for building single thread version.)
581 endif
582
583 # ifeq logical or. GCC or LSB
584 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
585 CCOMMON_OPT    += -fopenmp
586 endif
587
588 ifeq ($(C_COMPILER), CLANG)
589 CCOMMON_OPT    += -fopenmp
590 endif
591
592 ifeq ($(C_COMPILER), INTEL)
593 CCOMMON_OPT    += -fopenmp
594 endif
595
596 ifeq ($(C_COMPILER), PGI)
597 CCOMMON_OPT    += -mp
598 endif
599
600 ifeq ($(C_COMPILER), OPEN64)
601 CCOMMON_OPT    += -mp
602 CEXTRALIB   += -lstdc++
603 endif
604
605 ifeq ($(C_COMPILER), PATHSCALE)
606 CCOMMON_OPT    += -mp
607 endif
608 endif
609
610
611 ifeq ($(DYNAMIC_ARCH), 1)
612 ifeq ($(ARCH), x86)
613 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
614                CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
615 endif
616
617 ifeq ($(ARCH), x86_64)
618 DYNAMIC_CORE = PRESCOTT CORE2 
619 ifeq ($(DYNAMIC_OLDER), 1)
620 DYNAMIC_CORE += PENRYN DUNNINGTON 
621 endif
622 DYNAMIC_CORE += NEHALEM 
623 ifeq ($(DYNAMIC_OLDER), 1)
624 DYNAMIC_CORE += OPTERON OPTERON_SSE3 
625 endif
626 DYNAMIC_CORE += BARCELONA 
627 ifeq ($(DYNAMIC_OLDER), 1)
628 DYNAMIC_CORE += BOBCAT ATOM NANO
629 endif
630 ifneq ($(NO_AVX), 1)
631 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER STEAMROLLER EXCAVATOR
632 endif
633 ifneq ($(NO_AVX2), 1)
634 DYNAMIC_CORE += HASWELL ZEN
635 endif
636 ifneq ($(NO_AVX512), 1)
637 ifneq ($(NO_AVX2), 1)
638 DYNAMIC_CORE += SKYLAKEX COOPERLAKE
639 endif
640 endif
641 endif
642
643 ifdef DYNAMIC_LIST
644 override DYNAMIC_CORE = PRESCOTT $(DYNAMIC_LIST)
645 XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_PRESCOTT
646 XCCOMMON_OPT += $(foreach dcore,$(DYNAMIC_LIST),-DDYN_$(dcore))
647 CCOMMON_OPT += $(XCCOMMON_OPT)
648 #CCOMMON_OPT    += -DDYNAMIC_LIST='$(DYNAMIC_LIST)'
649 endif
650
651 ifeq ($(ARCH), arm64)
652 DYNAMIC_CORE =  ARMV8
653 DYNAMIC_CORE += CORTEXA53
654 DYNAMIC_CORE += CORTEXA57
655 DYNAMIC_CORE += CORTEXA72
656 DYNAMIC_CORE += CORTEXA73
657 DYNAMIC_CORE += NEOVERSEN1
658 DYNAMIC_CORE += NEOVERSEV1
659 DYNAMIC_CORE += NEOVERSEN2
660 DYNAMIC_CORE += CORTEXA55
661 DYNAMIC_CORE += FALKOR
662 DYNAMIC_CORE += THUNDERX
663 DYNAMIC_CORE += THUNDERX2T99
664 DYNAMIC_CORE += TSV110
665 DYNAMIC_CORE += EMAG8180
666 DYNAMIC_CORE += THUNDERX3T110
667 ifdef DYNAMIC_LIST
668 override DYNAMIC_CORE = ARMV8 $(DYNAMIC_LIST)
669 XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_ARMV8
670 XCCOMMON_OPT += $(foreach dcore,$(DYNAMIC_LIST),-DDYN_$(dcore))
671 endif
672 endif
673
674 ifeq ($(ARCH), mips64)
675 DYNAMIC_CORE = LOONGSON3R3 LOONGSON3R4
676 endif
677
678 ifeq ($(ARCH), zarch)
679 DYNAMIC_CORE = ZARCH_GENERIC
680
681 # if the compiler accepts -march=arch11 or -march=z13 and can compile a file
682 # with z13-specific inline assembly, then we can include support for Z13.
683 # note: -march=z13 is equivalent to -march=arch11 yet some compiler releases
684 # only support one or the other.
685 # note: LLVM version 6.x supported -march=z13 yet could not handle vector
686 # registers in inline assembly, so the check for supporting the -march flag is
687 # not enough.
688 ZARCH_TEST_COMPILE=-c $(TOPDIR)/kernel/zarch/damin_z13.c -I$(TOPDIR) -o /dev/null > /dev/null 2> /dev/null
689 ZARCH_CC_SUPPORTS_ARCH11=$(shell $(CC) -march=arch11 $(ZARCH_TEST_COMPILE) && echo 1)
690 ZARCH_CC_SUPPORTS_Z13=$(shell $(CC) -march=z13 $(ZARCH_TEST_COMPILE) && echo 1)
691
692 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH11), $(ZARCH_CC_SUPPORTS_Z13)), 1)
693 DYNAMIC_CORE += Z13
694 CCOMMON_OPT += -DDYN_Z13
695 else
696 $(info OpenBLAS: Not building Z13 kernels because the compiler $(CC) does not support it)
697 endif
698
699 # as above for z13, check for -march=arch12 and z14 support in the compiler.
700 ZARCH_CC_SUPPORTS_ARCH12=$(shell $(CC) -march=arch12 $(ZARCH_TEST_COMPILE) && echo 1)
701 ZARCH_CC_SUPPORTS_Z14=$(shell $(CC) -march=z14 $(ZARCH_TEST_COMPILE) && echo 1)
702 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH12), $(ZARCH_CC_SUPPORTS_Z14)), 1)
703 DYNAMIC_CORE += Z14
704 CCOMMON_OPT += -DDYN_Z14
705 else
706 $(info OpenBLAS: Not building Z14 kernels because the compiler $(CC) does not support it)
707 endif
708
709 endif # ARCH zarch
710
711 ifeq ($(ARCH), power)
712 ifneq ($(C_COMPILER), PGI)
713 DYNAMIC_CORE = POWER6
714 DYNAMIC_CORE += POWER8
715 ifneq ($(C_COMPILER), GCC)
716 DYNAMIC_CORE += POWER9
717 DYNAMIC_CORE += POWER10
718 CCOMMON_OPT += -DHAVE_P10_SUPPORT
719 endif
720 ifeq ($(C_COMPILER), GCC)
721 ifeq ($(GCCVERSIONGT5), 1)
722 DYNAMIC_CORE += POWER9
723 else
724 $(info, OpenBLAS: Your gcc version is too old to build the POWER9 kernels.)
725 endif
726 LDVERSIONGTEQ35 := $(shell expr `$(CC) -Wl,--version 2> /dev/null | head -1 | cut -f2 -d "." | cut -f1 -d "-"` \>= 35)
727 ifeq ($(GCCVERSIONGTEQ11)$(LDVERSIONGTEQ35), 11)
728 DYNAMIC_CORE += POWER10
729 CCOMMON_OPT += -DHAVE_P10_SUPPORT
730 else ifeq ($(GCCVERSIONGTEQ10), 1)
731 ifeq ($(GCCMINORVERSIONGTEQ2)$(LDVERSIONGTEQ35), 11)
732 DYNAMIC_CORE += POWER10
733 CCOMMON_OPT += -DHAVE_P10_SUPPORT
734 endif
735 else
736 $(info, OpenBLAS: Your gcc version is too old to build the POWER10 kernels.)
737 endif
738 endif
739 else
740 DYNAMIC_CORE = POWER8
741 DYNAMIC_CORE += POWER9
742 endif
743 endif
744
745 # If DYNAMIC_CORE is not set, DYNAMIC_ARCH cannot do anything, so force it to empty
746 ifndef DYNAMIC_CORE
747 override DYNAMIC_ARCH=
748 endif
749 endif
750
751 ifeq ($(ARCH), ia64)
752 NO_BINARY_MODE  = 1
753 BINARY_DEFINED  = 1
754
755 ifeq ($(F_COMPILER), GFORTRAN)
756 ifeq ($(C_COMPILER), GCC)
757 # EXPRECISION   = 1
758 # CCOMMON_OPT   += -DEXPRECISION
759 endif
760 endif
761 endif
762
763 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
764 NO_BINARY_MODE  = 1
765 endif
766
767 ifeq ($(ARCH), alpha)
768 NO_BINARY_MODE  = 1
769 BINARY_DEFINED  = 1
770 endif
771
772 ifeq ($(ARCH), arm)
773 NO_BINARY_MODE  = 1
774 BINARY_DEFINED  = 1
775
776 CCOMMON_OPT += -marm
777 FCOMMON_OPT += -marm
778
779 # If softfp abi is mentioned on the command line, force it.
780 ifeq ($(ARM_SOFTFP_ABI), 1)
781 CCOMMON_OPT += -mfloat-abi=softfp
782 FCOMMON_OPT += -mfloat-abi=softfp
783 endif
784
785 ifeq ($(OSNAME), Android)
786 ifeq ($(ARM_SOFTFP_ABI), 1)
787 EXTRALIB        += -lm
788 else
789 EXTRALIB        += -Wl,-lm_hard
790 endif
791 endif
792 endif
793
794 ifeq ($(ARCH), arm64)
795 NO_BINARY_MODE  = 1
796 BINARY_DEFINED  = 1
797 ifdef INTERFACE64
798 ifneq ($(INTERFACE64), 0)
799 ifeq ($(F_COMPILER), GFORTRAN)
800 FCOMMON_OPT +=  -fdefault-integer-8
801 endif
802 ifeq ($(F_COMPILER), FLANG)
803 FCOMMON_OPT += -i8
804 endif
805 endif
806 endif
807 endif
808
809 ifeq ($(ARCH), riscv64)
810 NO_BINARY_MODE  = 1
811 BINARY_DEFINED  = 1
812 endif
813
814 ifeq ($(ARCH), loongarch64)
815 NO_BINARY_MODE  = 1
816 BINARY_DEFINED  = 1
817 endif
818
819
820 #
821 #  C Compiler dependent settings
822 #
823
824
825 # ifeq logical or. GCC or CLANG or LSB
826 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
827 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
828 CCOMMON_OPT += -Wall
829 COMMON_PROF += -fno-inline
830 NO_UNINITIALIZED_WARN =  -Wno-uninitialized
831
832 ifeq ($(QUIET_MAKE), 1)
833 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
834 endif
835
836 ifdef NO_BINARY_MODE
837
838 ifeq ($(ARCH), $(filter $(ARCH),mips64))
839 ifdef BINARY64
840 CCOMMON_OPT += -mabi=64
841 else
842 CCOMMON_OPT += -mabi=n32
843 endif
844 BINARY_DEFINED = 1
845 else ifeq ($(ARCH), $(filter $(ARCH),mips))
846 CCOMMON_OPT += -mabi=32
847 BINARY_DEFINED = 1
848 endif
849
850 ifneq (, $(filter $(CORE),LOONGSON3R3 LOONGSON3R4))
851 CCOMMON_OPT += -march=loongson3a
852 FCOMMON_OPT += -march=loongson3a
853 endif
854
855 ifeq ($(CORE), MIPS24K)
856 CCOMMON_OPT += -mips32r2 -mtune=24kc  $(MSA_FLAGS)
857 FCOMMON_OPT += -mips32r2 -mtune=24kc  $(MSA_FLAGS)
858 endif
859
860 ifeq ($(CORE), MIPS1004K)
861 CCOMMON_OPT += -mips32r2   $(MSA_FLAGS)
862 FCOMMON_OPT += -mips32r2   $(MSA_FLAGS)
863 endif
864
865 ifeq ($(CORE), P5600)
866 CCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
867 FCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
868 endif
869
870 ifeq ($(CORE), I6400)
871 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
872 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
873 endif
874
875 ifeq ($(CORE), P6600)
876 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
877 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
878 endif
879
880 ifeq ($(CORE), I6500)
881 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
882 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
883 endif
884
885 ifeq ($(OSNAME), AIX)
886 BINARY_DEFINED = 1
887 endif
888
889 ifeq ($(ARCH), loongarch64)
890 ifeq ($(CORE), LOONGSON3R5)
891 CCOMMON_OPT += -march=loongarch64 -mabi=lp64
892 FCOMMON_OPT += -march=loongarch64 -mabi=lp64
893 endif
894 endif
895
896 endif
897
898 ifndef BINARY_DEFINED
899 ifneq ($(OSNAME), AIX)
900 ifdef BINARY64
901 ifneq ($(ARCH), riscv64)
902 CCOMMON_OPT += -m64
903 endif
904 else
905 CCOMMON_OPT += -m32
906 endif
907 endif
908 endif
909
910 endif
911
912 ifeq ($(C_COMPILER), PGI)
913 PGCVERSIONGT20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \> 20)
914 PGCVERSIONEQ20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` == 20)
915 PGCMINORVERSIONGE11 := $(shell expr `$(CC) --version|sed -n "2p" |cut -d "-" -f 1 |sed -e "s/[^0-9.]//g" |cut -c 4-5` \>= 11)
916 PGCVERSIONCHECK := $(PGCVERSIONGT20)$(PGCVERSIONEQ20)$(PGCMINORVERSIONGE11)
917 ifeq ($(PGCVERSIONCHECK), $(filter $(PGCVERSIONCHECK), 100 101 011))
918 NEWPGI := 1
919 PGCVERSIONGT21 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \> 21)
920 PGCVERSIONEQ21 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` == 21)
921 PGCVERSIONCHECK2 := $(PGCVERSIONGT21)$(PGCVERSIONEQ21)$(PGCMINORVERSIONGE11)
922 ifeq ($(PGCVERSIONCHECK2), $(filter $(PGCVERSIONCHECK2), 100 101 011))
923 NEWPGI2 := 1
924 endif
925 endif
926 ifdef BINARY64
927 ifeq ($(ARCH), x86_64)
928 ifneq ($(NEWPGI2),1)
929 CCOMMON_OPT += -tp p7-64
930 else
931 CCOMMON_OPT += -tp px
932 endif
933 ifneq ($(NEWPGI),1)
934 CCOMMON_OPT +=  -D__MMX__ -Mnollvm
935 endif
936 else
937 ifeq ($(ARCH), power)
938 ifeq ($(CORE), POWER8)
939 CCOMMON_OPT += -tp pwr8
940 endif
941 ifeq ($(CORE), POWER9)
942 CCOMMON_OPT += -tp pwr9
943 endif
944 endif
945 endif
946 else
947 ifneq ($(NEWPGI2),1)
948 CCOMMON_OPT += -tp p7
949 else
950 CCOMMON_OPT += -tp px
951 endif
952 endif
953 endif
954
955 ifeq ($(C_COMPILER), PATHSCALE)
956 ifdef BINARY64
957 CCOMMON_OPT += -m64
958 else
959 CCOMMON_OPT += -m32
960 endif
961 endif
962
963 #
964 #  Fortran Compiler dependent settings
965 #
966
967 ifeq ($(F_COMPILER), NAG)
968 FCOMMON_OPT += -dcfuns -recursive -ieee=full -w=obs -thread_safe
969 ifdef INTERFACE64
970 ifneq ($(INTERFACE64), 0)
971 FCOMMON_OPT += -i8
972 endif
973 endif
974 ifeq ($(USE_OPENMP), 1)
975 FCOMMON_OPT += -openmp
976 endif
977 endif
978
979 ifeq ($(F_COMPILER), FLANG)
980 CCOMMON_OPT += -DF_INTERFACE_FLANG
981 FCOMMON_OPT += -Mrecursive -Kieee
982 ifeq ($(OSNAME), Linux)
983 ifeq ($(ARCH), x86_64)
984 FLANG_VENDOR := $(shell $(FC) --version|head -1 |cut -f 1 -d " ")
985 ifeq ($(FLANG_VENDOR), AMD)
986 FCOMMON_OPT += -fno-unroll-loops
987 endif
988 endif
989 endif
990 ifdef BINARY64
991 ifdef INTERFACE64
992 ifneq ($(INTERFACE64), 0)
993 FCOMMON_OPT += -i8
994 endif
995 endif
996 FCOMMON_OPT += -Wall
997 else
998 FCOMMON_OPT += -Wall
999 endif
1000 ifeq ($(USE_OPENMP), 1)
1001 FCOMMON_OPT += -fopenmp
1002 endif
1003 endif
1004
1005 ifeq ($(F_COMPILER), G77)
1006 CCOMMON_OPT += -DF_INTERFACE_G77
1007 FCOMMON_OPT += -Wall
1008 ifndef NO_BINARY_MODE
1009 ifneq ($(OSNAME), AIX)
1010 ifdef BINARY64
1011 FCOMMON_OPT += -m64
1012 else
1013 FCOMMON_OPT += -m32
1014 endif
1015 endif
1016 endif
1017 endif
1018
1019 ifeq ($(F_COMPILER), G95)
1020 CCOMMON_OPT += -DF_INTERFACE_G95
1021 FCOMMON_OPT += -Wall
1022 ifneq ($(OSNAME), AIX)
1023 ifndef NO_BINARY_MODE
1024 ifdef BINARY64
1025 FCOMMON_OPT += -m64
1026 else
1027 FCOMMON_OPT += -m32
1028 endif
1029 endif
1030 ifneq ($(NO_LAPACKE), 1)
1031 FCOMMON_OPT += -fno-second-underscore
1032 endif
1033 endif
1034 endif
1035
1036 ifeq ($(F_COMPILER), GFORTRAN)
1037 CCOMMON_OPT += -DF_INTERFACE_GFORT
1038 FCOMMON_OPT += -Wall
1039 # make single-threaded LAPACK calls thread-safe #1847
1040 FCOMMON_OPT += -frecursive
1041 # work around ABI problem with passing single-character arguments
1042 FCOMMON_OPT += -fno-optimize-sibling-calls
1043 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
1044 ifneq ($(NOFORTRAN), 1)
1045 ifneq ($(NO_LAPACK), 1)
1046 EXTRALIB += -lgfortran
1047 endif
1048 endif
1049 ifdef NO_BINARY_MODE
1050 ifeq ($(ARCH), $(filter $(ARCH),mips64))
1051 ifdef BINARY64
1052 FCOMMON_OPT += -mabi=64
1053 else
1054 FCOMMON_OPT += -mabi=n32
1055 endif
1056 else ifeq ($(ARCH), $(filter $(ARCH),mips))
1057 FCOMMON_OPT += -mabi=32
1058 endif
1059 else
1060 ifdef BINARY64
1061 ifneq ($(OSNAME), AIX)
1062 ifneq ($(ARCH), riscv64)
1063 FCOMMON_OPT += -m64
1064 endif
1065 endif
1066 ifdef INTERFACE64
1067 ifneq ($(INTERFACE64), 0)
1068 FCOMMON_OPT +=  -fdefault-integer-8
1069 endif
1070 endif
1071 else
1072 ifneq ($(OSNAME), AIX)
1073 FCOMMON_OPT += -m32
1074 endif
1075 endif
1076 endif
1077 ifeq ($(USE_OPENMP), 1)
1078 FCOMMON_OPT += -fopenmp
1079 endif
1080 endif
1081
1082 ifeq ($(F_COMPILER), INTEL)
1083 CCOMMON_OPT += -DF_INTERFACE_INTEL
1084 ifdef INTERFACE64
1085 ifneq ($(INTERFACE64), 0)
1086 FCOMMON_OPT += -i8
1087 endif
1088 endif
1089 FCOMMON_OPT += -recursive -fp-model strict -assume protect-parens
1090 ifeq ($(USE_OPENMP), 1)
1091 FCOMMON_OPT += -fopenmp
1092 endif
1093 endif
1094
1095 ifeq ($(F_COMPILER), FUJITSU)
1096 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
1097 ifeq ($(USE_OPENMP), 1)
1098 FCOMMON_OPT += -openmp
1099 endif
1100 endif
1101
1102 ifeq ($(F_COMPILER), IBM)
1103 CCOMMON_OPT += -DF_INTERFACE_IBM
1104 # FCOMMON_OPT   += -qarch=440
1105 ifdef BINARY64
1106 FCOMMON_OPT += -q64
1107 ifdef INTERFACE64
1108 ifneq ($(INTERFACE64), 0)
1109 FCOMMON_OPT += -qintsize=8
1110 endif
1111 endif
1112 else
1113 FCOMMON_OPT += -q32
1114 endif
1115 ifeq ($(USE_OPENMP), 1)
1116 FCOMMON_OPT += -openmp
1117 endif
1118 endif
1119
1120 ifeq ($(F_COMPILER), PGI)
1121 CCOMMON_OPT  += -DF_INTERFACE_PGI
1122 COMMON_PROF +=  -DPGICOMPILER
1123 ifdef BINARY64
1124 ifdef INTERFACE64
1125 ifneq ($(INTERFACE64), 0)
1126 FCOMMON_OPT += -i8
1127 endif
1128 endif
1129 ifeq ($(ARCH), x86_64)
1130 ifneq ($(NEWPGI2),1)
1131 FCOMMON_OPT += -tp p7-64
1132 else
1133 FCOMMON_OPT += -tp px
1134 endif
1135 else
1136 ifeq ($(ARCH), power)
1137 ifeq ($(CORE), POWER6)
1138 $(warning NVIDIA HPC compilers do not support POWER6.)
1139 endif
1140 ifeq ($(CORE), POWER8)
1141 FCOMMON_OPT += -tp pwr8
1142 endif
1143 ifeq ($(CORE), POWER9)
1144 FCOMMON_OPT += -tp pwr9
1145 endif
1146 ifeq ($(CORE), POWER10)
1147 $(warning NVIDIA HPC compilers do not support POWER10.)
1148 endif
1149 endif
1150 endif
1151 else
1152 FCOMMON_OPT += -tp p7
1153 endif
1154 FCOMMON_OPT += -Mrecursive -Kieee
1155 ifeq ($(USE_OPENMP), 1)
1156 FCOMMON_OPT += -mp
1157 endif
1158 endif
1159
1160 ifeq ($(F_COMPILER), PATHSCALE)
1161 CCOMMON_OPT  += -DF_INTERFACE_PATHSCALE
1162 ifdef BINARY64
1163 ifdef INTERFACE64
1164 ifneq ($(INTERFACE64), 0)
1165 FCOMMON_OPT += -i8
1166 endif
1167 endif
1168 endif
1169  
1170 ifeq ($(USE_OPENMP), 1)
1171 FCOMMON_OPT += -mp
1172 endif
1173 endif
1174
1175 ifeq ($(F_COMPILER), OPEN64)
1176 CCOMMON_OPT  += -DF_INTERFACE_OPEN64
1177 ifdef BINARY64
1178 ifdef INTERFACE64
1179 ifneq ($(INTERFACE64), 0)
1180 FCOMMON_OPT += -i8
1181 endif
1182 endif
1183 endif
1184
1185 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1186 ifndef BINARY64
1187 FCOMMON_OPT += -n32
1188 else
1189 FCOMMON_OPT += -n64
1190 endif
1191 ifeq ($(CORE), LOONGSON3R3)
1192 FCOMMON_OPT += -loongson3 -static
1193 endif
1194
1195 ifeq ($(CORE), LOONGSON3R4)
1196 FCOMMON_OPT += -loongson3 -static
1197 endif
1198
1199 else
1200 ifndef BINARY64
1201 FCOMMON_OPT += -m32
1202 else
1203 FCOMMON_OPT += -m64
1204 endif
1205 endif
1206
1207 ifeq ($(USE_OPENMP), 1)
1208 FEXTRALIB   += -lstdc++
1209 FCOMMON_OPT += -mp
1210 endif
1211 endif
1212
1213 ifeq ($(C_COMPILER), OPEN64)
1214
1215 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1216 ifndef BINARY64
1217 CCOMMON_OPT += -n32
1218 else
1219 CCOMMON_OPT += -n64
1220 endif
1221 ifeq ($(CORE), LOONGSON3R3)
1222 CCOMMON_OPT += -loongson3 -static
1223 endif
1224
1225 ifeq ($(CORE), LOONGSON3R4)
1226 CCOMMON_OPT += -loongson3 -static
1227 endif
1228
1229 else
1230
1231 ifndef BINARY64
1232 CCOMMON_OPT += -m32
1233 else
1234 CCOMMON_OPT += -m64
1235 endif
1236 endif
1237 endif
1238
1239 ifeq ($(C_COMPILER), SUN)
1240 CCOMMON_OPT  += -w
1241 ifeq ($(ARCH), x86)
1242 CCOMMON_OPT  += -m32
1243 else
1244 ifdef BINARY64
1245 CCOMMON_OPT  += -m64
1246 else
1247 CCOMMON_OPT  += -m32
1248 endif
1249 endif
1250 endif
1251
1252 ifeq ($(F_COMPILER), SUN)
1253 CCOMMON_OPT  += -DF_INTERFACE_SUN
1254 FCOMMON_OPT  += -ftrap=%none -xrecursive
1255 ifeq ($(ARCH), x86)
1256 FCOMMON_OPT  += -m32
1257 else
1258 ifdef BINARY64
1259 FCOMMON_OPT  += -m64
1260 else
1261 FCOMMON_OPT  += -m32
1262 endif
1263 endif
1264 ifeq ($(USE_OPENMP), 1)
1265 FCOMMON_OPT += -xopenmp=parallel
1266 endif
1267 endif
1268
1269 ifeq ($(F_COMPILER), COMPAQ)
1270 CCOMMON_OPT  += -DF_INTERFACE_COMPAQ
1271 ifeq ($(USE_OPENMP), 1)
1272 FCOMMON_OPT += -openmp
1273 endif
1274 endif
1275
1276 ifdef BINARY64
1277 ifdef INTERFACE64
1278 ifneq ($(INTERFACE64), 0)
1279 CCOMMON_OPT     +=
1280 #-DUSE64BITINT
1281 endif
1282 endif
1283 endif
1284
1285 ifeq ($(NEED_PIC), 1)
1286 ifeq ($(C_COMPILER), IBM)
1287 CCOMMON_OPT += -qpic=large
1288 else
1289 CCOMMON_OPT += -fPIC
1290 endif
1291 ifeq ($(F_COMPILER), SUN)
1292 FCOMMON_OPT  += -pic
1293 else ifeq ($(F_COMPILER), NAG)
1294 FCOMMON_OPT += -PIC
1295 else
1296 FCOMMON_OPT += -fPIC
1297 endif
1298 endif
1299
1300 ifeq ($(DYNAMIC_ARCH), 1)
1301 CCOMMON_OPT     += -DDYNAMIC_ARCH
1302 endif
1303
1304 ifeq ($(DYNAMIC_OLDER), 1)
1305 CCOMMON_OPT     += -DDYNAMIC_OLDER
1306 endif
1307
1308 ifeq ($(C_LAPACK), 1)
1309 CCOMMON_OPT     += -DC_LAPACK
1310 endif
1311
1312 ifeq ($(NO_LAPACK), 1)
1313 CCOMMON_OPT     += -DNO_LAPACK
1314 #Disable LAPACK C interface
1315 NO_LAPACKE = 1
1316 endif
1317
1318 ifeq ($(NO_LAPACKE), 1)
1319 CCOMMON_OPT     += -DNO_LAPACKE
1320 endif
1321
1322 ifeq ($(NO_AVX), 1)
1323 CCOMMON_OPT     += -DNO_AVX
1324 endif
1325
1326 ifeq ($(ARCH), x86)
1327 CCOMMON_OPT     += -DNO_AVX
1328 endif
1329
1330 ifeq ($(NO_AVX2), 1)
1331 CCOMMON_OPT     += -DNO_AVX2
1332 endif
1333
1334 ifeq ($(NO_AVX512), 1)
1335 CCOMMON_OPT     += -DNO_AVX512
1336 endif
1337
1338 ifdef SMP
1339 CCOMMON_OPT     += -DSMP_SERVER
1340
1341 ifeq ($(ARCH), mips64)
1342 USE_SIMPLE_THREADED_LEVEL3 = 1
1343 endif
1344
1345 ifeq ($(USE_OPENMP), 1)
1346 # USE_SIMPLE_THREADED_LEVEL3 = 1
1347 # NO_AFFINITY = 1
1348 CCOMMON_OPT     += -DUSE_OPENMP
1349 endif
1350
1351 ifeq ($(BIGNUMA), 1)
1352 CCOMMON_OPT     += -DBIGNUMA
1353 endif
1354
1355 endif
1356
1357 ifeq ($(NO_WARMUP), 1)
1358 CCOMMON_OPT     += -DNO_WARMUP
1359 endif
1360
1361 ifeq ($(CONSISTENT_FPCSR), 1)
1362 CCOMMON_OPT     += -DCONSISTENT_FPCSR
1363 endif
1364
1365 # Only for development
1366 # CCOMMON_OPT    += -DPARAMTEST
1367 # CCOMMON_OPT    += -DPREFETCHTEST
1368 # CCOMMON_OPT    += -DNO_SWITCHING
1369 # USE_PAPI = 1
1370
1371 ifdef USE_PAPI
1372 CCOMMON_OPT      += -DUSE_PAPI
1373 EXTRALIB         += -lpapi -lperfctr
1374 endif
1375
1376 ifdef BUFFERSIZE
1377 CCOMMON_OPT      += -DBUFFERSIZE=$(BUFFERSIZE)
1378 endif
1379
1380 ifdef DYNAMIC_THREADS
1381 CCOMMON_OPT      += -DDYNAMIC_THREADS
1382 endif
1383
1384 CCOMMON_OPT     += -DMAX_CPU_NUMBER=$(NUM_THREADS)
1385
1386 CCOMMON_OPT     += -DMAX_PARALLEL_NUMBER=$(NUM_PARALLEL)
1387
1388 ifdef USE_SIMPLE_THREADED_LEVEL3
1389 CCOMMON_OPT     += -DUSE_SIMPLE_THREADED_LEVEL3
1390 endif
1391
1392 ifeq ($(USE_TLS), 1)
1393 CCOMMON_OPT += -DUSE_TLS
1394 endif
1395
1396 ifeq ($(BUILD_BFLOAT16), 1)
1397 CCOMMON_OPT += -DBUILD_BFLOAT16
1398 endif
1399 ifeq ($(BUILD_SINGLE), 1)
1400 CCOMMON_OPT += -DBUILD_SINGLE=1
1401 endif
1402 ifeq ($(BUILD_DOUBLE), 1)
1403 CCOMMON_OPT += -DBUILD_DOUBLE=1
1404 endif
1405 ifeq ($(BUILD_COMPLEX), 1)
1406 CCOMMON_OPT += -DBUILD_COMPLEX=1
1407 endif
1408 ifeq ($(BUILD_COMPLEX16), 1)
1409 CCOMMON_OPT += -DBUILD_COMPLEX16=1
1410 endif
1411
1412 CCOMMON_OPT += -DVERSION=\"$(VERSION)\"
1413
1414 ifndef SYMBOLPREFIX
1415 SYMBOLPREFIX =
1416 endif
1417
1418 ifndef SYMBOLSUFFIX
1419 SYMBOLSUFFIX =
1420 endif
1421
1422 ifndef LIBSONAMEBASE
1423 LIBSONAMEBASE = openblas
1424 endif
1425
1426 ifndef LIBNAMESUFFIX
1427 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)
1428 else
1429 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)_$(LIBNAMESUFFIX)
1430 endif
1431
1432 ifeq ($(OSNAME), CYGWIN_NT)
1433 LIBPREFIX = cyg$(LIBNAMEBASE)
1434 else
1435 LIBPREFIX = lib$(LIBNAMEBASE)
1436 endif
1437
1438 KERNELDIR       = $(TOPDIR)/kernel/$(ARCH)
1439
1440 include $(TOPDIR)/Makefile.$(ARCH)
1441
1442 ifneq ($(C_COMPILER), PGI)
1443 ifneq ($(C_COMPILER), SUN)
1444 CCOMMON_OPT     += -UASMNAME -UASMFNAME -UNAME -UCNAME -UCHAR_NAME -UCHAR_CNAME
1445 endif
1446 endif
1447 CCOMMON_OPT     += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
1448
1449 ifeq ($(CORE), PPC440)
1450 CCOMMON_OPT     += -DALLOC_QALLOC
1451 endif
1452
1453 ifeq ($(CORE), PPC440FP2)
1454 STATIC_ALLOCATION = 1
1455 endif
1456
1457 ifneq ($(OSNAME), Linux)
1458 NO_AFFINITY = 1
1459 endif
1460
1461 ifneq ($(ARCH), x86_64)
1462 ifneq ($(ARCH), x86)
1463 NO_AFFINITY = 1
1464 endif
1465 endif
1466
1467 ifdef NO_AFFINITY
1468 ifeq ($(NO_AFFINITY), 0)
1469 override undefine NO_AFFINITY
1470 else
1471 CCOMMON_OPT     += -DNO_AFFINITY
1472 endif
1473 endif
1474
1475 ifdef FUNCTION_PROFILE
1476 CCOMMON_OPT     += -DFUNCTION_PROFILE
1477 endif
1478
1479 ifdef HUGETLB_ALLOCATION
1480 CCOMMON_OPT     += -DALLOC_HUGETLB
1481 endif
1482
1483 ifdef HUGETLBFILE_ALLOCATION
1484 CCOMMON_OPT     += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
1485 endif
1486
1487 ifdef STATIC_ALLOCATION
1488 CCOMMON_OPT     += -DALLOC_STATIC
1489 endif
1490
1491 ifdef DEVICEDRIVER_ALLOCATION
1492 CCOMMON_OPT     += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
1493 endif
1494
1495 ifdef MIXED_MEMORY_ALLOCATION
1496 CCOMMON_OPT     += -DMIXED_MEMORY_ALLOCATION
1497 endif
1498
1499 ifeq ($(OSNAME), SunOS)
1500 TAR     = gtar
1501 PATCH   = gpatch
1502 GREP    = ggrep
1503 AWK     = nawk
1504 else
1505 TAR     = tar
1506 PATCH   = patch
1507 GREP    = grep
1508 AWK     = awk
1509 endif
1510
1511 ifndef MD5SUM
1512 MD5SUM  = md5sum
1513 endif
1514
1515
1516 REVISION = -r$(VERSION)
1517 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
1518
1519 ifeq ($(DEBUG), 1)
1520 COMMON_OPT += -g
1521 endif
1522
1523 ifeq ($(DEBUG), 1)
1524 FCOMMON_OPT += -g
1525 endif
1526
1527 ifndef COMMON_OPT
1528 COMMON_OPT = -O2
1529 endif
1530
1531 ifndef FCOMMON_OPT
1532 FCOMMON_OPT = -O2 -frecursive
1533 endif
1534
1535 override CFLAGS     += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
1536 override PFLAGS     += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
1537 override FFLAGS     += $(COMMON_OPT) $(FCOMMON_OPT)
1538 override FPFLAGS    += $(FCOMMON_OPT) $(COMMON_PROF)
1539 #MAKEOVERRIDES =
1540
1541 ifeq ($(NEED_PIC), 1)
1542 ifeq (,$(findstring PIC,$(FFLAGS)))
1543 override FFLAGS += -fPIC
1544 endif
1545 endif
1546
1547 #For LAPACK Fortran codes.
1548 #Disable -fopenmp for LAPACK Fortran codes on Windows.
1549 ifdef OS_WINDOWS
1550 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
1551 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
1552 else
1553 LAPACK_FFLAGS := $(FFLAGS)
1554 LAPACK_FPFLAGS := $(FPFLAGS)
1555 endif
1556
1557 ifeq ($(F_COMPILER),NAG)
1558 LAPACK_FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
1559 endif
1560
1561 LAPACK_CFLAGS = $(CFLAGS)
1562 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
1563 ifdef INTERFACE64
1564 ifneq ($(INTERFACE64), 0)
1565 LAPACK_CFLAGS +=  -DLAPACK_ILP64
1566 endif
1567 endif
1568
1569 ifdef OS_WINDOWS
1570 LAPACK_CFLAGS +=  -DOPENBLAS_OS_WINDOWS
1571 LAPACK_CFLAGS +=  -DLAPACK_COMPLEX_STRUCTURE
1572 endif
1573 ifeq ($(C_COMPILER), LSB)
1574 LAPACK_CFLAGS +=  -DLAPACK_COMPLEX_STRUCTURE
1575 endif
1576
1577 ifndef SUFFIX
1578 SUFFIX  = o
1579 endif
1580
1581 ifndef PSUFFIX
1582 PSUFFIX = po
1583 endif
1584
1585 ifndef LIBSUFFIX
1586 LIBSUFFIX = a
1587 endif
1588
1589 ifneq ($(DYNAMIC_ARCH), 1)
1590 ifndef SMP
1591 LIBNAME         = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
1592 LIBNAME_P       = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
1593 else
1594 LIBNAME         = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
1595 LIBNAME_P       = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
1596 endif
1597 else
1598 ifndef SMP
1599 LIBNAME         = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
1600 LIBNAME_P       = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
1601 else
1602 LIBNAME         = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
1603 LIBNAME_P       = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
1604 endif
1605 endif
1606
1607
1608 LIBDLLNAME   = $(LIBPREFIX).dll
1609 IMPLIBNAME   = lib$(LIBNAMEBASE).dll.a
1610 ifneq ($(OSNAME), AIX)
1611 LIBSONAME    = $(LIBNAME:.$(LIBSUFFIX)=.so)
1612 else
1613 LIBSONAME    = $(LIBNAME:.$(LIBSUFFIX)=.a)
1614 endif
1615 LIBDYNNAME   = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
1616 LIBDEFNAME   = $(LIBNAME:.$(LIBSUFFIX)=.def)
1617 LIBEXPNAME   = $(LIBNAME:.$(LIBSUFFIX)=.exp)
1618 LIBZIPNAME   = $(LIBNAME:.$(LIBSUFFIX)=.zip)
1619
1620 LIBS            = $(TOPDIR)/$(LIBNAME)
1621 LIBS_P          = $(TOPDIR)/$(LIBNAME_P)
1622
1623
1624 LIB_COMPONENTS = BLAS
1625 ifneq ($(NO_CBLAS), 1)
1626 LIB_COMPONENTS += CBLAS
1627 endif
1628
1629 ifneq ($(NO_LAPACK), 1)
1630 LIB_COMPONENTS += LAPACK
1631 ifneq ($(NO_LAPACKE), 1)
1632 LIB_COMPONENTS += LAPACKE
1633 endif
1634 ifeq ($(BUILD_RELAPACK), 1)
1635 LIB_COMPONENTS += ReLAPACK
1636 endif
1637 endif
1638
1639 ifeq ($(ONLY_CBLAS), 1)
1640 LIB_COMPONENTS = CBLAS
1641 endif
1642
1643 export OSNAME
1644 export ARCH
1645 export CORE
1646 export LIBCORE
1647 export __BYTE_ORDER__
1648 export ELF_VERSION
1649 export PGCPATH
1650 export CONFIG
1651 export CC
1652 export FC
1653 export BU
1654 export FU
1655 export NEED2UNDERSCORES
1656 export USE_THREAD
1657 export NUM_THREADS
1658 export NUM_CORES
1659 export SMP
1660 export MAKEFILE_RULE
1661 export NEED_PIC
1662 export BINARY
1663 export BINARY32
1664 export BINARY64
1665 export F_COMPILER
1666 export C_COMPILER
1667 export USE_OPENMP
1668 export CROSS
1669 export CROSS_SUFFIX
1670 export NOFORTRAN
1671 export C_LAPACK
1672 export NO_FBLAS
1673 export EXTRALIB
1674 export CEXTRALIB
1675 export FEXTRALIB
1676 export HAVE_SSE
1677 export HAVE_SSE2
1678 export HAVE_SSE3
1679 export HAVE_SSSE3
1680 export HAVE_SSE4_1
1681 export HAVE_SSE4_2
1682 export HAVE_SSE4A
1683 export HAVE_SSE5
1684 export HAVE_AVX
1685 export HAVE_AVX2
1686 export HAVE_FMA3
1687 export HAVE_VFP
1688 export HAVE_VFPV3
1689 export HAVE_VFPV4
1690 export HAVE_NEON
1691 ifndef NO_MSA
1692   export HAVE_MSA
1693   export MSA_FLAGS
1694 endif
1695 export KERNELDIR
1696 export FUNCTION_PROFILE
1697 export TARGET_CORE
1698 export NO_AVX512
1699 export NO_AVX2
1700 export BUILD_BFLOAT16
1701
1702 export SBGEMM_UNROLL_M
1703 export SBGEMM_UNROLL_N
1704 export SGEMM_UNROLL_M
1705 export SGEMM_UNROLL_N
1706 export DGEMM_UNROLL_M
1707 export DGEMM_UNROLL_N
1708 export QGEMM_UNROLL_M
1709 export QGEMM_UNROLL_N
1710 export CGEMM_UNROLL_M
1711 export CGEMM_UNROLL_N
1712 export ZGEMM_UNROLL_M
1713 export ZGEMM_UNROLL_N
1714 export XGEMM_UNROLL_M
1715 export XGEMM_UNROLL_N
1716 export CGEMM3M_UNROLL_M
1717 export CGEMM3M_UNROLL_N
1718 export ZGEMM3M_UNROLL_M
1719 export ZGEMM3M_UNROLL_N
1720 export XGEMM3M_UNROLL_M
1721 export XGEMM3M_UNROLL_N
1722
1723
1724 ifdef USE_CUDA
1725 export CUDADIR
1726 export CUCC
1727 export CUFLAGS
1728 export CULIB
1729 endif
1730
1731 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1732
1733 .f.$(SUFFIX):
1734         $(FC) $(FFLAGS) -c $<  -o $(@F)
1735
1736 .f.$(PSUFFIX):
1737         $(FC) $(FPFLAGS) -pg -c $<  -o $(@F)
1738
1739
1740 ifdef BINARY64
1741 PATHSCALEPATH   = /opt/pathscale/lib/3.1
1742 PGIPATH         = /opt/pgi/linux86-64/7.1-5/lib
1743 else
1744 PATHSCALEPATH   = /opt/pathscale/lib/3.1/32
1745 PGIPATH         = /opt/pgi/linux86/7.1-5/lib
1746 endif
1747
1748 ACMLPATH        = /opt/acml/4.3.0
1749 ifneq ($(OSNAME), Darwin)
1750 MKLPATH         = /opt/intel/mkl/10.2.2.025/lib
1751 else
1752 MKLPATH         = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1753 endif
1754 ATLASPATH       = /opt/atlas/3.9.17/opteron
1755 FLAMEPATH       = $(HOME)/flame/lib
1756 ifneq ($(OSNAME), SunOS)
1757 SUNPATH         = /opt/sunstudio12.1
1758 else
1759 SUNPATH         = /opt/SUNWspro
1760 endif