Merge pull request #3670 from martin-frbg/osxvermin
[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 ($(ARCH), power)
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 ifeq ($(ARCH), arm64)
388 export MACOSX_DEPLOYMENT_TARGET=11.0
389 else
390 export MACOSX_DEPLOYMENT_TARGET=10.8
391 endif
392 endif
393 MD5SUM = md5 -r
394 endif
395
396 ifneq (,$(findstring $(OSNAME), FreeBSD OpenBSD DragonFly))
397 MD5SUM = md5 -r
398 endif
399
400 ifeq ($(OSNAME), NetBSD)
401 MD5SUM = md5 -n
402 endif
403
404 ifeq ($(OSNAME), Linux)
405 EXTRALIB        += -lm
406 NO_EXPRECISION = 1
407 endif
408
409 ifeq ($(OSNAME), Android)
410 EXTRALIB        += -lm
411 endif
412
413 ifeq ($(OSNAME), AIX)
414 EXTRALIB        += -lm
415 endif
416
417 ifeq ($(OSNAME), FreeBSD)
418 ifeq ($(ARCH), $(filter $(ARCH),arm arm64))
419 EXTRALIB        += -lm
420 endif
421 endif
422
423 ifeq ($(OSNAME), WINNT)
424 NEED_PIC = 0
425 NO_EXPRECISION = 1
426
427 EXTRALIB        += -defaultlib:advapi32
428
429 SUFFIX  = obj
430 PSUFFIX = pobj
431 LIBSUFFIX = a
432
433 ifeq ($(C_COMPILER), CLANG)
434 CCOMMON_OPT     += -DMS_ABI
435 endif
436
437 #Version tests for supporting specific features (MS_ABI, POWER9 intrinsics)
438 ifeq ($(GCCVERSIONGT4), 1)
439 # GCC Major version > 4
440 # It is compatible with MSVC ABI.
441 CCOMMON_OPT     += -DMS_ABI
442 endif
443
444 ifeq ($(GCCVERSIONGTEQ4), 1)
445 ifeq ($(GCCMINORVERSIONGTEQ7), 1)
446 # GCC Version >=4.7
447 # It is compatible with MSVC ABI.
448 CCOMMON_OPT     += -DMS_ABI
449 endif
450 endif
451
452 # Ensure the correct stack alignment on Win32
453 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97
454 ifeq ($(ARCH), x86)
455 CCOMMON_OPT += -mincoming-stack-boundary=2
456 FCOMMON_OPT += -mincoming-stack-boundary=2
457 endif
458
459 endif
460
461 ifeq ($(OSNAME), Interix)
462 NEED_PIC = 0
463 NO_EXPRECISION = 1
464
465 INTERIX_TOOL_DIR = /opt/gcc.3.3/i586-pc-interix3/bin
466 endif
467
468 ifeq ($(OSNAME), CYGWIN_NT)
469 NEED_PIC = 0
470 NO_EXPRECISION = 1
471 OS_CYGWIN_NT = 1
472 endif
473
474 ifneq ($(OSNAME), WINNT)
475 ifneq ($(OSNAME), CYGWIN_NT)
476 ifneq ($(OSNAME), Interix)
477 ifneq ($(OSNAME), Android)
478 ifdef SMP
479 EXTRALIB   += -lpthread
480 endif
481 endif
482 endif
483 endif
484 endif
485
486 # ifeq logical or
487 ifeq ($(OSNAME), $(filter $(OSNAME),WINNT CYGWIN_NT Interix))
488 OS_WINDOWS=1
489 endif
490
491 ifdef QUAD_PRECISION
492 CCOMMON_OPT     += -DQUAD_PRECISION
493 NO_EXPRECISION = 1
494 endif
495
496 ifneq ($(ARCH), x86)
497 ifneq ($(ARCH), x86_64)
498 NO_EXPRECISION = 1
499 endif
500 endif
501
502 ifdef UTEST_CHECK
503 CCOMMON_OPT     += -DUTEST_CHECK
504 SANITY_CHECK = 1
505 endif
506
507 ifdef SANITY_CHECK
508 CCOMMON_OPT     += -DSANITY_CHECK -DREFNAME=$(*F)f$(BU)
509 endif
510
511 MAX_STACK_ALLOC ?= 2048
512 ifneq ($(MAX_STACK_ALLOC), 0)
513 CCOMMON_OPT     += -DMAX_STACK_ALLOC=$(MAX_STACK_ALLOC)
514 endif
515
516 ifdef USE_LOCKING
517 ifneq ($(USE_LOCKING), 0)
518 CCOMMON_OPT     += -DUSE_LOCKING
519 endif
520 endif
521
522 #
523 #  Architecture dependent settings
524 #
525
526 ifeq ($(ARCH), x86)
527 ifndef BINARY
528 NO_BINARY_MODE  = 1
529 endif
530
531 ifeq ($(CORE), generic)
532 NO_EXPRECISION = 1
533 endif
534
535 ifndef NO_EXPRECISION
536 ifeq ($(F_COMPILER), GFORTRAN)
537 # ifeq logical or. GCC or LSB
538 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
539 EXPRECISION     = 1
540 CCOMMON_OPT     += -DEXPRECISION -m128bit-long-double
541 FCOMMON_OPT     += -m128bit-long-double
542 endif
543 ifeq ($(C_COMPILER), CLANG)
544 EXPRECISION     = 1
545 CCOMMON_OPT     += -DEXPRECISION
546 FCOMMON_OPT     += -m128bit-long-double
547 endif
548 endif
549 endif
550 endif
551
552 ifeq ($(ARCH), x86_64)
553
554 ifeq ($(CORE), generic)
555 NO_EXPRECISION = 1
556 endif
557
558 ifndef NO_EXPRECISION
559 ifeq ($(F_COMPILER), GFORTRAN)
560 # ifeq logical or. GCC or LSB
561 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
562 EXPRECISION     = 1
563 CCOMMON_OPT     += -DEXPRECISION -m128bit-long-double
564 FCOMMON_OPT     += -m128bit-long-double
565 endif
566 ifeq ($(C_COMPILER), CLANG)
567 EXPRECISION     = 1
568 CCOMMON_OPT     += -DEXPRECISION
569 FCOMMON_OPT     += -m128bit-long-double
570 endif
571 endif
572 endif
573 endif
574
575 ifeq ($(C_COMPILER), INTEL)
576 CCOMMON_OPT    += -wd981
577 endif
578
579
580 ifeq ($(USE_OPENMP), 1)
581
582 #check
583 ifeq ($(USE_THREAD), 0)
584 $(error OpenBLAS: Cannot set both USE_OPENMP=1 and USE_THREAD=0. The USE_THREAD=0 is only for building single thread version.)
585 endif
586
587 # ifeq logical or. GCC or LSB
588 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC LSB))
589 CCOMMON_OPT    += -fopenmp
590 endif
591
592 ifeq ($(C_COMPILER), CLANG)
593 CCOMMON_OPT    += -fopenmp
594 endif
595
596 ifeq ($(C_COMPILER), INTEL)
597 CCOMMON_OPT    += -fopenmp
598 endif
599
600 ifeq ($(C_COMPILER), PGI)
601 CCOMMON_OPT    += -mp
602 endif
603
604 ifeq ($(C_COMPILER), OPEN64)
605 CCOMMON_OPT    += -mp
606 CEXTRALIB   += -lstdc++
607 endif
608
609 ifeq ($(C_COMPILER), PATHSCALE)
610 CCOMMON_OPT    += -mp
611 endif
612 endif
613
614
615 ifeq ($(DYNAMIC_ARCH), 1)
616 ifeq ($(ARCH), x86)
617 DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
618                CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
619 endif
620
621 ifeq ($(ARCH), x86_64)
622 DYNAMIC_CORE = PRESCOTT CORE2 
623 ifeq ($(DYNAMIC_OLDER), 1)
624 DYNAMIC_CORE += PENRYN DUNNINGTON 
625 endif
626 DYNAMIC_CORE += NEHALEM 
627 ifeq ($(DYNAMIC_OLDER), 1)
628 DYNAMIC_CORE += OPTERON OPTERON_SSE3 
629 endif
630 DYNAMIC_CORE += BARCELONA 
631 ifeq ($(DYNAMIC_OLDER), 1)
632 DYNAMIC_CORE += BOBCAT ATOM NANO
633 endif
634 ifneq ($(NO_AVX), 1)
635 DYNAMIC_CORE += SANDYBRIDGE BULLDOZER PILEDRIVER STEAMROLLER EXCAVATOR
636 endif
637 ifneq ($(NO_AVX2), 1)
638 DYNAMIC_CORE += HASWELL ZEN
639 endif
640 ifneq ($(NO_AVX512), 1)
641 ifneq ($(NO_AVX2), 1)
642 DYNAMIC_CORE += SKYLAKEX COOPERLAKE
643 endif
644 endif
645 endif
646
647 ifdef DYNAMIC_LIST
648 override DYNAMIC_CORE = PRESCOTT $(DYNAMIC_LIST)
649 XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_PRESCOTT
650 XCCOMMON_OPT += $(foreach dcore,$(DYNAMIC_LIST),-DDYN_$(dcore))
651 CCOMMON_OPT += $(XCCOMMON_OPT)
652 #CCOMMON_OPT    += -DDYNAMIC_LIST='$(DYNAMIC_LIST)'
653 endif
654
655 ifeq ($(ARCH), arm64)
656 DYNAMIC_CORE =  ARMV8
657 DYNAMIC_CORE += CORTEXA53
658 DYNAMIC_CORE += CORTEXA57
659 DYNAMIC_CORE += CORTEXA72
660 DYNAMIC_CORE += CORTEXA73
661 DYNAMIC_CORE += NEOVERSEN1
662 DYNAMIC_CORE += NEOVERSEV1
663 DYNAMIC_CORE += NEOVERSEN2
664 DYNAMIC_CORE += CORTEXA55
665 DYNAMIC_CORE += FALKOR
666 DYNAMIC_CORE += THUNDERX
667 DYNAMIC_CORE += THUNDERX2T99
668 DYNAMIC_CORE += TSV110
669 DYNAMIC_CORE += EMAG8180
670 DYNAMIC_CORE += THUNDERX3T110
671 ifdef DYNAMIC_LIST
672 override DYNAMIC_CORE = ARMV8 $(DYNAMIC_LIST)
673 XCCOMMON_OPT = -DDYNAMIC_LIST -DDYN_ARMV8
674 XCCOMMON_OPT += $(foreach dcore,$(DYNAMIC_LIST),-DDYN_$(dcore))
675 endif
676 endif
677
678 ifeq ($(ARCH), mips64)
679 DYNAMIC_CORE = LOONGSON3R3 LOONGSON3R4
680 endif
681
682 ifeq ($(ARCH), zarch)
683 DYNAMIC_CORE = ZARCH_GENERIC
684
685 # if the compiler accepts -march=arch11 or -march=z13 and can compile a file
686 # with z13-specific inline assembly, then we can include support for Z13.
687 # note: -march=z13 is equivalent to -march=arch11 yet some compiler releases
688 # only support one or the other.
689 # note: LLVM version 6.x supported -march=z13 yet could not handle vector
690 # registers in inline assembly, so the check for supporting the -march flag is
691 # not enough.
692 ZARCH_TEST_COMPILE=-c $(TOPDIR)/kernel/zarch/damin_z13.c -I$(TOPDIR) -o /dev/null > /dev/null 2> /dev/null
693 ZARCH_CC_SUPPORTS_ARCH11=$(shell $(CC) -march=arch11 $(ZARCH_TEST_COMPILE) && echo 1)
694 ZARCH_CC_SUPPORTS_Z13=$(shell $(CC) -march=z13 $(ZARCH_TEST_COMPILE) && echo 1)
695
696 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH11), $(ZARCH_CC_SUPPORTS_Z13)), 1)
697 DYNAMIC_CORE += Z13
698 CCOMMON_OPT += -DDYN_Z13
699 else
700 $(info OpenBLAS: Not building Z13 kernels because the compiler $(CC) does not support it)
701 endif
702
703 # as above for z13, check for -march=arch12 and z14 support in the compiler.
704 ZARCH_CC_SUPPORTS_ARCH12=$(shell $(CC) -march=arch12 $(ZARCH_TEST_COMPILE) && echo 1)
705 ZARCH_CC_SUPPORTS_Z14=$(shell $(CC) -march=z14 $(ZARCH_TEST_COMPILE) && echo 1)
706 ifeq ($(or $(ZARCH_CC_SUPPORTS_ARCH12), $(ZARCH_CC_SUPPORTS_Z14)), 1)
707 DYNAMIC_CORE += Z14
708 CCOMMON_OPT += -DDYN_Z14
709 else
710 $(info OpenBLAS: Not building Z14 kernels because the compiler $(CC) does not support it)
711 endif
712
713 endif # ARCH zarch
714
715 ifeq ($(ARCH), power)
716 ifneq ($(C_COMPILER), PGI)
717 DYNAMIC_CORE = POWER6
718 DYNAMIC_CORE += POWER8
719 ifneq ($(C_COMPILER), GCC)
720 DYNAMIC_CORE += POWER9
721 DYNAMIC_CORE += POWER10
722 CCOMMON_OPT += -DHAVE_P10_SUPPORT
723 endif
724 ifeq ($(C_COMPILER), GCC)
725 ifeq ($(GCCVERSIONGT5), 1)
726 DYNAMIC_CORE += POWER9
727 else
728 $(info, OpenBLAS: Your gcc version is too old to build the POWER9 kernels.)
729 endif
730 LDVERSIONGTEQ35 := $(shell expr `$(CC) -Wl,--version 2> /dev/null | head -1 | cut -f2 -d "." | cut -f1 -d "-"` \>= 35)
731 ifeq ($(GCCVERSIONGTEQ11)$(LDVERSIONGTEQ35), 11)
732 DYNAMIC_CORE += POWER10
733 CCOMMON_OPT += -DHAVE_P10_SUPPORT
734 else ifeq ($(GCCVERSIONGTEQ10), 1)
735 ifeq ($(GCCMINORVERSIONGTEQ2)$(LDVERSIONGTEQ35), 11)
736 DYNAMIC_CORE += POWER10
737 CCOMMON_OPT += -DHAVE_P10_SUPPORT
738 endif
739 else
740 $(info, OpenBLAS: Your gcc version is too old to build the POWER10 kernels.)
741 endif
742 endif
743 else
744 DYNAMIC_CORE = POWER8
745 DYNAMIC_CORE += POWER9
746 endif
747 endif
748
749 # If DYNAMIC_CORE is not set, DYNAMIC_ARCH cannot do anything, so force it to empty
750 ifndef DYNAMIC_CORE
751 override DYNAMIC_ARCH=
752 endif
753 endif
754
755 ifeq ($(ARCH), ia64)
756 NO_BINARY_MODE  = 1
757 BINARY_DEFINED  = 1
758
759 ifeq ($(F_COMPILER), GFORTRAN)
760 ifeq ($(C_COMPILER), GCC)
761 # EXPRECISION   = 1
762 # CCOMMON_OPT   += -DEXPRECISION
763 endif
764 endif
765 endif
766
767 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
768 NO_BINARY_MODE  = 1
769 endif
770
771 ifeq ($(ARCH), alpha)
772 NO_BINARY_MODE  = 1
773 BINARY_DEFINED  = 1
774 endif
775
776 ifeq ($(ARCH), arm)
777 NO_BINARY_MODE  = 1
778 BINARY_DEFINED  = 1
779
780 CCOMMON_OPT += -marm
781 FCOMMON_OPT += -marm
782
783 # If softfp abi is mentioned on the command line, force it.
784 ifeq ($(ARM_SOFTFP_ABI), 1)
785 CCOMMON_OPT += -mfloat-abi=softfp
786 FCOMMON_OPT += -mfloat-abi=softfp
787 endif
788
789 ifeq ($(OSNAME), Android)
790 ifeq ($(ARM_SOFTFP_ABI), 1)
791 EXTRALIB        += -lm
792 else
793 EXTRALIB        += -Wl,-lm_hard
794 endif
795 endif
796 endif
797
798 ifeq ($(ARCH), arm64)
799 NO_BINARY_MODE  = 1
800 BINARY_DEFINED  = 1
801 ifdef INTERFACE64
802 ifneq ($(INTERFACE64), 0)
803 ifeq ($(F_COMPILER), GFORTRAN)
804 FCOMMON_OPT +=  -fdefault-integer-8
805 endif
806 ifeq ($(F_COMPILER), FLANG)
807 FCOMMON_OPT += -i8
808 endif
809 endif
810 endif
811 endif
812
813 ifeq ($(ARCH), riscv64)
814 NO_BINARY_MODE  = 1
815 BINARY_DEFINED  = 1
816 endif
817
818 ifeq ($(ARCH), loongarch64)
819 NO_BINARY_MODE  = 1
820 BINARY_DEFINED  = 1
821 endif
822
823
824 #
825 #  C Compiler dependent settings
826 #
827
828
829 # ifeq logical or. GCC or CLANG or LSB
830 # http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
831 ifeq ($(C_COMPILER), $(filter $(C_COMPILER),GCC CLANG LSB))
832 CCOMMON_OPT += -Wall
833 COMMON_PROF += -fno-inline
834 NO_UNINITIALIZED_WARN =  -Wno-uninitialized
835
836 ifeq ($(QUIET_MAKE), 1)
837 CCOMMON_OPT += $(NO_UNINITIALIZED_WARN) -Wno-unused
838 endif
839
840 ifdef NO_BINARY_MODE
841
842 ifeq ($(ARCH), $(filter $(ARCH),mips64))
843 ifdef BINARY64
844 CCOMMON_OPT += -mabi=64
845 else
846 CCOMMON_OPT += -mabi=n32
847 endif
848 BINARY_DEFINED = 1
849 else ifeq ($(ARCH), $(filter $(ARCH),mips))
850 CCOMMON_OPT += -mabi=32
851 BINARY_DEFINED = 1
852 endif
853
854 ifneq (, $(filter $(CORE),LOONGSON3R3 LOONGSON3R4))
855 CCOMMON_OPT += -march=loongson3a
856 FCOMMON_OPT += -march=loongson3a
857 endif
858
859 ifeq ($(CORE), MIPS24K)
860 CCOMMON_OPT += -mips32r2 -mtune=24kc  $(MSA_FLAGS)
861 FCOMMON_OPT += -mips32r2 -mtune=24kc  $(MSA_FLAGS)
862 endif
863
864 ifeq ($(CORE), MIPS1004K)
865 CCOMMON_OPT += -mips32r2   $(MSA_FLAGS)
866 FCOMMON_OPT += -mips32r2   $(MSA_FLAGS)
867 endif
868
869 ifeq ($(CORE), P5600)
870 CCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
871 FCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
872 endif
873
874 ifeq ($(CORE), I6400)
875 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
876 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
877 endif
878
879 ifeq ($(CORE), P6600)
880 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
881 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=p6600 $(MSA_FLAGS)
882 endif
883
884 ifeq ($(CORE), I6500)
885 CCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
886 FCOMMON_OPT += -mips64r6 -mnan=2008 -mtune=i6400 $(MSA_FLAGS)
887 endif
888
889 ifeq ($(OSNAME), AIX)
890 BINARY_DEFINED = 1
891 endif
892
893 ifeq ($(ARCH), loongarch64)
894 ifeq ($(CORE), LOONGSON3R5)
895 CCOMMON_OPT += -march=loongarch64 -mabi=lp64
896 FCOMMON_OPT += -march=loongarch64 -mabi=lp64
897 endif
898 endif
899
900 endif
901
902 ifndef BINARY_DEFINED
903 ifneq ($(OSNAME), AIX)
904 ifdef BINARY64
905 ifneq ($(ARCH), riscv64)
906 CCOMMON_OPT += -m64
907 endif
908 else
909 CCOMMON_OPT += -m32
910 endif
911 endif
912 endif
913
914 endif
915
916 ifeq ($(C_COMPILER), PGI)
917 PGCVERSIONGT20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \> 20)
918 PGCVERSIONEQ20 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` == 20)
919 PGCMINORVERSIONGE11 := $(shell expr `$(CC) --version|sed -n "2p" |cut -d "-" -f 1 |sed -e "s/[^0-9.]//g" |cut -c 4-5` \>= 11)
920 PGCVERSIONCHECK := $(PGCVERSIONGT20)$(PGCVERSIONEQ20)$(PGCMINORVERSIONGE11)
921 ifeq ($(PGCVERSIONCHECK), $(filter $(PGCVERSIONCHECK), 100 101 011))
922 NEWPGI := 1
923 PGCVERSIONGT21 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` \> 21)
924 PGCVERSIONEQ21 := $(shell expr `$(CC) --version|sed -n "2p" |sed -e "s/[^0-9.]//g" |cut -d "." -f 1` == 21)
925 PGCVERSIONCHECK2 := $(PGCVERSIONGT21)$(PGCVERSIONEQ21)$(PGCMINORVERSIONGE11)
926 ifeq ($(PGCVERSIONCHECK2), $(filter $(PGCVERSIONCHECK2), 100 101 011))
927 NEWPGI2 := 1
928 endif
929 endif
930 ifdef BINARY64
931 ifeq ($(ARCH), x86_64)
932 ifneq ($(NEWPGI2),1)
933 CCOMMON_OPT += -tp p7-64
934 else
935 CCOMMON_OPT += -tp px
936 endif
937 ifneq ($(NEWPGI),1)
938 CCOMMON_OPT +=  -D__MMX__ -Mnollvm
939 endif
940 else
941 ifeq ($(ARCH), power)
942 ifeq ($(CORE), POWER8)
943 CCOMMON_OPT += -tp pwr8
944 endif
945 ifeq ($(CORE), POWER9)
946 CCOMMON_OPT += -tp pwr9
947 endif
948 endif
949 endif
950 else
951 ifneq ($(NEWPGI2),1)
952 CCOMMON_OPT += -tp p7
953 else
954 CCOMMON_OPT += -tp px
955 endif
956 endif
957 endif
958
959 ifeq ($(C_COMPILER), PATHSCALE)
960 ifdef BINARY64
961 CCOMMON_OPT += -m64
962 else
963 CCOMMON_OPT += -m32
964 endif
965 endif
966
967 #
968 #  Fortran Compiler dependent settings
969 #
970
971 ifeq ($(F_COMPILER), NAG)
972 FCOMMON_OPT += -dcfuns -recursive -ieee=full -w=obs -thread_safe
973 ifdef INTERFACE64
974 ifneq ($(INTERFACE64), 0)
975 FCOMMON_OPT += -i8
976 endif
977 endif
978 ifeq ($(USE_OPENMP), 1)
979 FCOMMON_OPT += -openmp
980 endif
981 endif
982
983 ifeq ($(F_COMPILER), FLANG)
984 CCOMMON_OPT += -DF_INTERFACE_FLANG
985 FCOMMON_OPT += -Mrecursive -Kieee
986 ifeq ($(OSNAME), Linux)
987 ifeq ($(ARCH), x86_64)
988 FLANG_VENDOR := $(shell $(FC) --version|head -1 |cut -f 1 -d " ")
989 ifeq ($(FLANG_VENDOR), AMD)
990 FCOMMON_OPT += -fno-unroll-loops
991 endif
992 endif
993 endif
994 ifdef BINARY64
995 ifdef INTERFACE64
996 ifneq ($(INTERFACE64), 0)
997 FCOMMON_OPT += -i8
998 endif
999 endif
1000 FCOMMON_OPT += -Wall
1001 else
1002 FCOMMON_OPT += -Wall
1003 endif
1004 ifeq ($(USE_OPENMP), 1)
1005 FCOMMON_OPT += -fopenmp
1006 endif
1007 endif
1008
1009 ifeq ($(F_COMPILER), G77)
1010 CCOMMON_OPT += -DF_INTERFACE_G77
1011 FCOMMON_OPT += -Wall
1012 ifndef NO_BINARY_MODE
1013 ifneq ($(OSNAME), AIX)
1014 ifdef BINARY64
1015 FCOMMON_OPT += -m64
1016 else
1017 FCOMMON_OPT += -m32
1018 endif
1019 endif
1020 endif
1021 endif
1022
1023 ifeq ($(F_COMPILER), G95)
1024 CCOMMON_OPT += -DF_INTERFACE_G95
1025 FCOMMON_OPT += -Wall
1026 ifneq ($(OSNAME), AIX)
1027 ifndef NO_BINARY_MODE
1028 ifdef BINARY64
1029 FCOMMON_OPT += -m64
1030 else
1031 FCOMMON_OPT += -m32
1032 endif
1033 endif
1034 ifneq ($(NO_LAPACKE), 1)
1035 FCOMMON_OPT += -fno-second-underscore
1036 endif
1037 endif
1038 endif
1039
1040 ifeq ($(F_COMPILER), GFORTRAN)
1041 CCOMMON_OPT += -DF_INTERFACE_GFORT
1042 FCOMMON_OPT += -Wall
1043 # make single-threaded LAPACK calls thread-safe #1847
1044 FCOMMON_OPT += -frecursive
1045 # work around ABI problem with passing single-character arguments
1046 FCOMMON_OPT += -fno-optimize-sibling-calls
1047 #Don't include -lgfortran, when NO_LAPACK=1 or lsbcc
1048 ifneq ($(NOFORTRAN), 1)
1049 ifneq ($(NOFORTRAN), 2)
1050 ifneq ($(NO_LAPACK), 1)
1051 EXTRALIB += -lgfortran
1052 endif
1053 endif
1054 endif
1055 ifdef NO_BINARY_MODE
1056 ifeq ($(ARCH), $(filter $(ARCH),mips64))
1057 ifdef BINARY64
1058 FCOMMON_OPT += -mabi=64
1059 else
1060 FCOMMON_OPT += -mabi=n32
1061 endif
1062 else ifeq ($(ARCH), $(filter $(ARCH),mips))
1063 FCOMMON_OPT += -mabi=32
1064 endif
1065 else
1066 ifdef BINARY64
1067 ifneq ($(OSNAME), AIX)
1068 ifneq ($(ARCH), riscv64)
1069 FCOMMON_OPT += -m64
1070 endif
1071 endif
1072 ifdef INTERFACE64
1073 ifneq ($(INTERFACE64), 0)
1074 FCOMMON_OPT +=  -fdefault-integer-8
1075 endif
1076 endif
1077 else
1078 ifneq ($(OSNAME), AIX)
1079 FCOMMON_OPT += -m32
1080 endif
1081 endif
1082 endif
1083 ifeq ($(USE_OPENMP), 1)
1084 FCOMMON_OPT += -fopenmp
1085 endif
1086 endif
1087
1088 ifeq ($(F_COMPILER), INTEL)
1089 CCOMMON_OPT += -DF_INTERFACE_INTEL
1090 ifdef INTERFACE64
1091 ifneq ($(INTERFACE64), 0)
1092 FCOMMON_OPT += -i8
1093 endif
1094 endif
1095 FCOMMON_OPT += -recursive -fp-model strict -assume protect-parens
1096 ifeq ($(USE_OPENMP), 1)
1097 FCOMMON_OPT += -fopenmp
1098 endif
1099 endif
1100
1101 ifeq ($(F_COMPILER), FUJITSU)
1102 CCOMMON_OPT += -DF_INTERFACE_FUJITSU
1103 ifeq ($(USE_OPENMP), 1)
1104 FCOMMON_OPT += -openmp
1105 endif
1106 endif
1107
1108 ifeq ($(F_COMPILER), IBM)
1109 CCOMMON_OPT += -DF_INTERFACE_IBM
1110 # FCOMMON_OPT   += -qarch=440
1111 ifdef BINARY64
1112 FCOMMON_OPT += -q64
1113 ifdef INTERFACE64
1114 ifneq ($(INTERFACE64), 0)
1115 FCOMMON_OPT += -qintsize=8
1116 endif
1117 endif
1118 else
1119 FCOMMON_OPT += -q32
1120 endif
1121 ifeq ($(USE_OPENMP), 1)
1122 FCOMMON_OPT += -openmp
1123 endif
1124 endif
1125
1126 ifeq ($(F_COMPILER), PGI)
1127 CCOMMON_OPT  += -DF_INTERFACE_PGI
1128 COMMON_PROF +=  -DPGICOMPILER
1129 ifdef BINARY64
1130 ifdef INTERFACE64
1131 ifneq ($(INTERFACE64), 0)
1132 FCOMMON_OPT += -i8
1133 endif
1134 endif
1135 ifeq ($(ARCH), x86_64)
1136 ifneq ($(NEWPGI2),1)
1137 FCOMMON_OPT += -tp p7-64
1138 else
1139 FCOMMON_OPT += -tp px
1140 endif
1141 else
1142 ifeq ($(ARCH), power)
1143 ifeq ($(CORE), POWER6)
1144 $(warning NVIDIA HPC compilers do not support POWER6.)
1145 endif
1146 ifeq ($(CORE), POWER8)
1147 FCOMMON_OPT += -tp pwr8
1148 endif
1149 ifeq ($(CORE), POWER9)
1150 FCOMMON_OPT += -tp pwr9
1151 endif
1152 ifeq ($(CORE), POWER10)
1153 $(warning NVIDIA HPC compilers do not support POWER10.)
1154 endif
1155 endif
1156 endif
1157 else
1158 FCOMMON_OPT += -tp p7
1159 endif
1160 FCOMMON_OPT += -Mrecursive -Kieee
1161 ifeq ($(USE_OPENMP), 1)
1162 FCOMMON_OPT += -mp
1163 endif
1164 endif
1165
1166 ifeq ($(F_COMPILER), PATHSCALE)
1167 CCOMMON_OPT  += -DF_INTERFACE_PATHSCALE
1168 ifdef BINARY64
1169 ifdef INTERFACE64
1170 ifneq ($(INTERFACE64), 0)
1171 FCOMMON_OPT += -i8
1172 endif
1173 endif
1174 endif
1175  
1176 ifeq ($(USE_OPENMP), 1)
1177 FCOMMON_OPT += -mp
1178 endif
1179 endif
1180
1181 ifeq ($(F_COMPILER), OPEN64)
1182 CCOMMON_OPT  += -DF_INTERFACE_OPEN64
1183 ifdef BINARY64
1184 ifdef INTERFACE64
1185 ifneq ($(INTERFACE64), 0)
1186 FCOMMON_OPT += -i8
1187 endif
1188 endif
1189 endif
1190
1191 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1192 ifndef BINARY64
1193 FCOMMON_OPT += -n32
1194 else
1195 FCOMMON_OPT += -n64
1196 endif
1197 ifeq ($(CORE), LOONGSON3R3)
1198 FCOMMON_OPT += -loongson3 -static
1199 endif
1200
1201 ifeq ($(CORE), LOONGSON3R4)
1202 FCOMMON_OPT += -loongson3 -static
1203 endif
1204
1205 else
1206 ifndef BINARY64
1207 FCOMMON_OPT += -m32
1208 else
1209 FCOMMON_OPT += -m64
1210 endif
1211 endif
1212
1213 ifeq ($(USE_OPENMP), 1)
1214 FEXTRALIB   += -lstdc++
1215 FCOMMON_OPT += -mp
1216 endif
1217 endif
1218
1219 ifeq ($(C_COMPILER), OPEN64)
1220
1221 ifeq ($(ARCH), $(filter $(ARCH),mips64 mips))
1222 ifndef BINARY64
1223 CCOMMON_OPT += -n32
1224 else
1225 CCOMMON_OPT += -n64
1226 endif
1227 ifeq ($(CORE), LOONGSON3R3)
1228 CCOMMON_OPT += -loongson3 -static
1229 endif
1230
1231 ifeq ($(CORE), LOONGSON3R4)
1232 CCOMMON_OPT += -loongson3 -static
1233 endif
1234
1235 else
1236
1237 ifndef BINARY64
1238 CCOMMON_OPT += -m32
1239 else
1240 CCOMMON_OPT += -m64
1241 endif
1242 endif
1243 endif
1244
1245 ifeq ($(C_COMPILER), SUN)
1246 CCOMMON_OPT  += -w
1247 ifeq ($(ARCH), x86)
1248 CCOMMON_OPT  += -m32
1249 else
1250 ifdef BINARY64
1251 CCOMMON_OPT  += -m64
1252 else
1253 CCOMMON_OPT  += -m32
1254 endif
1255 endif
1256 endif
1257
1258 ifeq ($(F_COMPILER), SUN)
1259 CCOMMON_OPT  += -DF_INTERFACE_SUN
1260 FCOMMON_OPT  += -ftrap=%none -xrecursive
1261 ifeq ($(ARCH), x86)
1262 FCOMMON_OPT  += -m32
1263 else
1264 ifdef BINARY64
1265 FCOMMON_OPT  += -m64
1266 else
1267 FCOMMON_OPT  += -m32
1268 endif
1269 endif
1270 ifeq ($(USE_OPENMP), 1)
1271 FCOMMON_OPT += -xopenmp=parallel
1272 endif
1273 endif
1274
1275 ifeq ($(F_COMPILER), COMPAQ)
1276 CCOMMON_OPT  += -DF_INTERFACE_COMPAQ
1277 ifeq ($(USE_OPENMP), 1)
1278 FCOMMON_OPT += -openmp
1279 endif
1280 endif
1281
1282 ifdef BINARY64
1283 ifdef INTERFACE64
1284 ifneq ($(INTERFACE64), 0)
1285 CCOMMON_OPT     +=
1286 #-DUSE64BITINT
1287 endif
1288 endif
1289 endif
1290
1291 ifeq ($(NEED_PIC), 1)
1292 ifeq ($(C_COMPILER), IBM)
1293 CCOMMON_OPT += -qpic=large
1294 else
1295 CCOMMON_OPT += -fPIC
1296 endif
1297 ifeq ($(F_COMPILER), SUN)
1298 FCOMMON_OPT  += -pic
1299 else ifeq ($(F_COMPILER), NAG)
1300 FCOMMON_OPT += -PIC
1301 else
1302 FCOMMON_OPT += -fPIC
1303 endif
1304 endif
1305
1306 ifeq ($(DYNAMIC_ARCH), 1)
1307 CCOMMON_OPT     += -DDYNAMIC_ARCH
1308 endif
1309
1310 ifeq ($(DYNAMIC_OLDER), 1)
1311 CCOMMON_OPT     += -DDYNAMIC_OLDER
1312 endif
1313
1314 ifeq ($(C_LAPACK), 1)
1315 CCOMMON_OPT     += -DC_LAPACK
1316 endif
1317
1318 ifeq ($(NO_LAPACK), 1)
1319 CCOMMON_OPT     += -DNO_LAPACK
1320 #Disable LAPACK C interface
1321 NO_LAPACKE = 1
1322 endif
1323
1324 ifeq ($(NO_LAPACKE), 1)
1325 CCOMMON_OPT     += -DNO_LAPACKE
1326 endif
1327
1328 ifeq ($(NO_AVX), 1)
1329 CCOMMON_OPT     += -DNO_AVX
1330 endif
1331
1332 ifeq ($(ARCH), x86)
1333 CCOMMON_OPT     += -DNO_AVX
1334 endif
1335
1336 ifeq ($(NO_AVX2), 1)
1337 CCOMMON_OPT     += -DNO_AVX2
1338 endif
1339
1340 ifeq ($(NO_AVX512), 1)
1341 CCOMMON_OPT     += -DNO_AVX512
1342 endif
1343
1344 ifdef SMP
1345 CCOMMON_OPT     += -DSMP_SERVER
1346
1347 ifeq ($(ARCH), mips64)
1348 USE_SIMPLE_THREADED_LEVEL3 = 1
1349 endif
1350
1351 ifeq ($(USE_OPENMP), 1)
1352 # USE_SIMPLE_THREADED_LEVEL3 = 1
1353 # NO_AFFINITY = 1
1354 CCOMMON_OPT     += -DUSE_OPENMP
1355 endif
1356
1357 ifeq ($(BIGNUMA), 1)
1358 CCOMMON_OPT     += -DBIGNUMA
1359 endif
1360
1361 endif
1362
1363 ifeq ($(NO_WARMUP), 1)
1364 CCOMMON_OPT     += -DNO_WARMUP
1365 endif
1366
1367 ifeq ($(CONSISTENT_FPCSR), 1)
1368 CCOMMON_OPT     += -DCONSISTENT_FPCSR
1369 endif
1370
1371 # Only for development
1372 # CCOMMON_OPT    += -DPARAMTEST
1373 # CCOMMON_OPT    += -DPREFETCHTEST
1374 # CCOMMON_OPT    += -DNO_SWITCHING
1375 # USE_PAPI = 1
1376
1377 ifdef USE_PAPI
1378 CCOMMON_OPT      += -DUSE_PAPI
1379 EXTRALIB         += -lpapi -lperfctr
1380 endif
1381
1382 ifdef BUFFERSIZE
1383 CCOMMON_OPT      += -DBUFFERSIZE=$(BUFFERSIZE)
1384 endif
1385
1386 ifdef DYNAMIC_THREADS
1387 CCOMMON_OPT      += -DDYNAMIC_THREADS
1388 endif
1389
1390 CCOMMON_OPT     += -DMAX_CPU_NUMBER=$(NUM_THREADS)
1391
1392 CCOMMON_OPT     += -DMAX_PARALLEL_NUMBER=$(NUM_PARALLEL)
1393
1394 ifdef USE_SIMPLE_THREADED_LEVEL3
1395 CCOMMON_OPT     += -DUSE_SIMPLE_THREADED_LEVEL3
1396 endif
1397
1398 ifeq ($(USE_TLS), 1)
1399 CCOMMON_OPT += -DUSE_TLS
1400 endif
1401
1402 ifeq ($(BUILD_BFLOAT16), 1)
1403 CCOMMON_OPT += -DBUILD_BFLOAT16
1404 endif
1405 ifeq ($(BUILD_SINGLE), 1)
1406 CCOMMON_OPT += -DBUILD_SINGLE=1
1407 endif
1408 ifeq ($(BUILD_DOUBLE), 1)
1409 CCOMMON_OPT += -DBUILD_DOUBLE=1
1410 endif
1411 ifeq ($(BUILD_COMPLEX), 1)
1412 CCOMMON_OPT += -DBUILD_COMPLEX=1
1413 endif
1414 ifeq ($(BUILD_COMPLEX16), 1)
1415 CCOMMON_OPT += -DBUILD_COMPLEX16=1
1416 endif
1417
1418 CCOMMON_OPT += -DVERSION=\"$(VERSION)\"
1419
1420 ifndef SYMBOLPREFIX
1421 SYMBOLPREFIX =
1422 endif
1423
1424 ifndef SYMBOLSUFFIX
1425 SYMBOLSUFFIX =
1426 endif
1427
1428 ifndef LIBSONAMEBASE
1429 LIBSONAMEBASE = openblas
1430 endif
1431
1432 ifndef LIBNAMESUFFIX
1433 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)
1434 else
1435 LIBNAMEBASE = $(SYMBOLPREFIX)$(LIBSONAMEBASE)$(SYMBOLSUFFIX)_$(LIBNAMESUFFIX)
1436 endif
1437
1438 ifeq ($(OSNAME), CYGWIN_NT)
1439 LIBPREFIX = cyg$(LIBNAMEBASE)
1440 else
1441 LIBPREFIX = lib$(LIBNAMEBASE)
1442 endif
1443
1444 KERNELDIR       = $(TOPDIR)/kernel/$(ARCH)
1445
1446 include $(TOPDIR)/Makefile.$(ARCH)
1447
1448 ifneq ($(C_COMPILER), PGI)
1449 ifneq ($(C_COMPILER), SUN)
1450 CCOMMON_OPT     += -UASMNAME -UASMFNAME -UNAME -UCNAME -UCHAR_NAME -UCHAR_CNAME
1451 endif
1452 endif
1453 CCOMMON_OPT     += -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F) -DCHAR_NAME=\"$(*F)$(BU)\" -DCHAR_CNAME=\"$(*F)\"
1454
1455 ifeq ($(CORE), PPC440)
1456 CCOMMON_OPT     += -DALLOC_QALLOC
1457 endif
1458
1459 ifeq ($(CORE), PPC440FP2)
1460 STATIC_ALLOCATION = 1
1461 endif
1462
1463 ifneq ($(OSNAME), Linux)
1464 NO_AFFINITY = 1
1465 endif
1466
1467 ifneq ($(ARCH), x86_64)
1468 ifneq ($(ARCH), x86)
1469 NO_AFFINITY = 1
1470 endif
1471 endif
1472
1473 ifdef NO_AFFINITY
1474 ifeq ($(NO_AFFINITY), 0)
1475 override undefine NO_AFFINITY
1476 else
1477 CCOMMON_OPT     += -DNO_AFFINITY
1478 endif
1479 endif
1480
1481 ifdef FUNCTION_PROFILE
1482 CCOMMON_OPT     += -DFUNCTION_PROFILE
1483 endif
1484
1485 ifdef HUGETLB_ALLOCATION
1486 CCOMMON_OPT     += -DALLOC_HUGETLB
1487 endif
1488
1489 ifdef HUGETLBFILE_ALLOCATION
1490 CCOMMON_OPT     += -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=$(HUGETLBFILE_ALLOCATION)
1491 endif
1492
1493 ifdef STATIC_ALLOCATION
1494 CCOMMON_OPT     += -DALLOC_STATIC
1495 endif
1496
1497 ifdef DEVICEDRIVER_ALLOCATION
1498 CCOMMON_OPT     += -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"
1499 endif
1500
1501 ifdef MIXED_MEMORY_ALLOCATION
1502 CCOMMON_OPT     += -DMIXED_MEMORY_ALLOCATION
1503 endif
1504
1505 ifeq ($(OSNAME), SunOS)
1506 TAR     = gtar
1507 PATCH   = gpatch
1508 GREP    = ggrep
1509 AWK     = nawk
1510 else
1511 TAR     = tar
1512 PATCH   = patch
1513 GREP    = grep
1514 AWK     = awk
1515 endif
1516
1517 ifndef MD5SUM
1518 MD5SUM  = md5sum
1519 endif
1520
1521
1522 REVISION = -r$(VERSION)
1523 MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
1524
1525 ifeq ($(DEBUG), 1)
1526 COMMON_OPT += -g
1527 endif
1528
1529 ifeq ($(DEBUG), 1)
1530 FCOMMON_OPT += -g
1531 endif
1532
1533 ifndef COMMON_OPT
1534 COMMON_OPT = -O2
1535 endif
1536
1537 ifndef FCOMMON_OPT
1538 FCOMMON_OPT = -O2 -frecursive
1539 endif
1540
1541 override CFLAGS     += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
1542 override PFLAGS     += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
1543 override FFLAGS     += $(COMMON_OPT) $(FCOMMON_OPT)
1544 override FPFLAGS    += $(FCOMMON_OPT) $(COMMON_PROF)
1545 #MAKEOVERRIDES =
1546
1547 ifeq ($(NEED_PIC), 1)
1548 ifeq (,$(findstring PIC,$(FFLAGS)))
1549 override FFLAGS += -fPIC
1550 endif
1551 endif
1552
1553 #For LAPACK Fortran codes.
1554 #Disable -fopenmp for LAPACK Fortran codes on Windows.
1555 ifdef OS_WINDOWS
1556 LAPACK_FFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FFLAGS))
1557 LAPACK_FPFLAGS := $(filter-out -fopenmp -mp -openmp -xopenmp=parallel,$(FPFLAGS))
1558 else
1559 LAPACK_FFLAGS := $(FFLAGS)
1560 LAPACK_FPFLAGS := $(FPFLAGS)
1561 endif
1562
1563 ifeq ($(F_COMPILER),NAG)
1564 LAPACK_FFLAGS := $(filter-out -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mskylake-avx512 ,$(FFLAGS))
1565 endif
1566
1567 LAPACK_CFLAGS = $(CFLAGS)
1568 LAPACK_CFLAGS += -DHAVE_LAPACK_CONFIG_H
1569 ifdef INTERFACE64
1570 ifneq ($(INTERFACE64), 0)
1571 LAPACK_CFLAGS +=  -DLAPACK_ILP64
1572 endif
1573 endif
1574
1575 ifdef OS_WINDOWS
1576 LAPACK_CFLAGS +=  -DOPENBLAS_OS_WINDOWS
1577 LAPACK_CFLAGS +=  -DLAPACK_COMPLEX_STRUCTURE
1578 endif
1579 ifeq ($(C_COMPILER), LSB)
1580 LAPACK_CFLAGS +=  -DLAPACK_COMPLEX_STRUCTURE
1581 endif
1582
1583 ifndef SUFFIX
1584 SUFFIX  = o
1585 endif
1586
1587 ifndef PSUFFIX
1588 PSUFFIX = po
1589 endif
1590
1591 ifndef LIBSUFFIX
1592 LIBSUFFIX = a
1593 endif
1594
1595 ifneq ($(DYNAMIC_ARCH), 1)
1596 ifndef SMP
1597 LIBNAME         = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
1598 LIBNAME_P       = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
1599 else
1600 LIBNAME         = $(LIBPREFIX)_$(LIBCORE)p$(REVISION).$(LIBSUFFIX)
1601 LIBNAME_P       = $(LIBPREFIX)_$(LIBCORE)p$(REVISION)_p.$(LIBSUFFIX)
1602 endif
1603 else
1604 ifndef SMP
1605 LIBNAME         = $(LIBPREFIX)$(REVISION).$(LIBSUFFIX)
1606 LIBNAME_P       = $(LIBPREFIX)$(REVISION)_p.$(LIBSUFFIX)
1607 else
1608 LIBNAME         = $(LIBPREFIX)p$(REVISION).$(LIBSUFFIX)
1609 LIBNAME_P       = $(LIBPREFIX)p$(REVISION)_p.$(LIBSUFFIX)
1610 endif
1611 endif
1612
1613
1614 LIBDLLNAME   = $(LIBPREFIX).dll
1615 IMPLIBNAME   = lib$(LIBNAMEBASE).dll.a
1616 ifneq ($(OSNAME), AIX)
1617 LIBSONAME    = $(LIBNAME:.$(LIBSUFFIX)=.so)
1618 else
1619 LIBSONAME    = $(LIBNAME:.$(LIBSUFFIX)=.a)
1620 endif
1621 LIBDYNNAME   = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
1622 LIBDEFNAME   = $(LIBNAME:.$(LIBSUFFIX)=.def)
1623 LIBEXPNAME   = $(LIBNAME:.$(LIBSUFFIX)=.exp)
1624 LIBZIPNAME   = $(LIBNAME:.$(LIBSUFFIX)=.zip)
1625
1626 LIBS            = $(TOPDIR)/$(LIBNAME)
1627 LIBS_P          = $(TOPDIR)/$(LIBNAME_P)
1628
1629
1630 LIB_COMPONENTS = BLAS
1631 ifneq ($(NO_CBLAS), 1)
1632 LIB_COMPONENTS += CBLAS
1633 endif
1634
1635 ifneq ($(NO_LAPACK), 1)
1636 LIB_COMPONENTS += LAPACK
1637 ifneq ($(NO_LAPACKE), 1)
1638 LIB_COMPONENTS += LAPACKE
1639 endif
1640 ifeq ($(BUILD_RELAPACK), 1)
1641 LIB_COMPONENTS += ReLAPACK
1642 endif
1643 endif
1644
1645 ifeq ($(ONLY_CBLAS), 1)
1646 LIB_COMPONENTS = CBLAS
1647 endif
1648
1649 export OSNAME
1650 export ARCH
1651 export CORE
1652 export LIBCORE
1653 export __BYTE_ORDER__
1654 export ELF_VERSION
1655 export PGCPATH
1656 export CONFIG
1657 export CC
1658 export FC
1659 export BU
1660 export FU
1661 export NEED2UNDERSCORES
1662 export USE_THREAD
1663 export NUM_THREADS
1664 export NUM_CORES
1665 export SMP
1666 export MAKEFILE_RULE
1667 export NEED_PIC
1668 export BINARY
1669 export BINARY32
1670 export BINARY64
1671 export F_COMPILER
1672 export C_COMPILER
1673 export USE_OPENMP
1674 export CROSS
1675 export CROSS_SUFFIX
1676 export NOFORTRAN
1677 export C_LAPACK
1678 export NO_FBLAS
1679 export EXTRALIB
1680 export CEXTRALIB
1681 export FEXTRALIB
1682 export HAVE_SSE
1683 export HAVE_SSE2
1684 export HAVE_SSE3
1685 export HAVE_SSSE3
1686 export HAVE_SSE4_1
1687 export HAVE_SSE4_2
1688 export HAVE_SSE4A
1689 export HAVE_SSE5
1690 export HAVE_AVX
1691 export HAVE_AVX2
1692 export HAVE_FMA3
1693 export HAVE_VFP
1694 export HAVE_VFPV3
1695 export HAVE_VFPV4
1696 export HAVE_NEON
1697 ifndef NO_MSA
1698   export HAVE_MSA
1699   export MSA_FLAGS
1700 endif
1701 export KERNELDIR
1702 export FUNCTION_PROFILE
1703 export TARGET_CORE
1704 export NO_AVX512
1705 export NO_AVX2
1706 export BUILD_BFLOAT16
1707
1708 export SBGEMM_UNROLL_M
1709 export SBGEMM_UNROLL_N
1710 export SGEMM_UNROLL_M
1711 export SGEMM_UNROLL_N
1712 export DGEMM_UNROLL_M
1713 export DGEMM_UNROLL_N
1714 export QGEMM_UNROLL_M
1715 export QGEMM_UNROLL_N
1716 export CGEMM_UNROLL_M
1717 export CGEMM_UNROLL_N
1718 export ZGEMM_UNROLL_M
1719 export ZGEMM_UNROLL_N
1720 export XGEMM_UNROLL_M
1721 export XGEMM_UNROLL_N
1722 export CGEMM3M_UNROLL_M
1723 export CGEMM3M_UNROLL_N
1724 export ZGEMM3M_UNROLL_M
1725 export ZGEMM3M_UNROLL_N
1726 export XGEMM3M_UNROLL_M
1727 export XGEMM3M_UNROLL_N
1728
1729
1730 ifdef USE_CUDA
1731 export CUDADIR
1732 export CUCC
1733 export CUFLAGS
1734 export CULIB
1735 endif
1736
1737 .SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
1738
1739 .f.$(SUFFIX):
1740         $(FC) $(FFLAGS) -c $<  -o $(@F)
1741
1742 .f.$(PSUFFIX):
1743         $(FC) $(FPFLAGS) -pg -c $<  -o $(@F)
1744
1745
1746 ifdef BINARY64
1747 PATHSCALEPATH   = /opt/pathscale/lib/3.1
1748 PGIPATH         = /opt/pgi/linux86-64/7.1-5/lib
1749 else
1750 PATHSCALEPATH   = /opt/pathscale/lib/3.1/32
1751 PGIPATH         = /opt/pgi/linux86/7.1-5/lib
1752 endif
1753
1754 ACMLPATH        = /opt/acml/4.3.0
1755 ifneq ($(OSNAME), Darwin)
1756 MKLPATH         = /opt/intel/mkl/10.2.2.025/lib
1757 else
1758 MKLPATH         = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
1759 endif
1760 ATLASPATH       = /opt/atlas/3.9.17/opteron
1761 FLAMEPATH       = $(HOME)/flame/lib
1762 ifneq ($(OSNAME), SunOS)
1763 SUNPATH         = /opt/sunstudio12.1
1764 else
1765 SUNPATH         = /opt/SUNWspro
1766 endif