C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / cmake / system.cmake
1 ##
2 ## Author: Hank Anderson <hank@statease.com>
3 ## Description: Ported from OpenBLAS/Makefile.system
4 ##
5 set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib")
6
7 # System detection, via CMake.
8 include("${PROJECT_SOURCE_DIR}/cmake/system_check.cmake")
9
10 if(CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET)
11   # Detect target without running getarch
12   if (ARM64)
13     set(TARGET "ARMV8")
14   elseif(ARM)
15     set(TARGET "ARMV7") # TODO: Ask compiler which arch this is
16   else()
17     message(FATAL_ERROR "When cross compiling, a TARGET is required.")
18   endif()
19 endif()
20
21 # Other files expect CORE, which is actually TARGET and will become TARGET_CORE for kernel build. Confused yet?
22 # It seems we are meant to use TARGET as input and CORE internally as kernel.
23 if(NOT DEFINED CORE AND DEFINED TARGET)
24   set(CORE ${TARGET})
25 endif()
26
27 # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
28 if (DEFINED TARGET_CORE)
29   set(TARGET ${TARGET_CORE})
30 endif ()
31
32 # Force fallbacks for 32bit
33 if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
34   message(STATUS "Compiling a ${BINARY}-bit binary.")
35   set(NO_AVX 1)
36   if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE" OR ${TARGET} STREQUAL "SKYLAKEX" OR ${TARGET} STREQUAL "COOPERLAKE" OR ${TARGET} STREQUAL "SAPPHIRERAPIDS")
37     set(TARGET "NEHALEM")
38   endif ()
39   if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER" OR ${TARGET} STREQUAL "ZEN")
40     set(TARGET "BARCELONA")
41   endif ()
42   if (${TARGET} STREQUAL "ARMV8" OR ${TARGET} STREQUAL "CORTEXA57" OR ${TARGET} STREQUAL "CORTEXA53" OR ${TARGET} STREQUAL "CORTEXA55")
43     set(TARGET "ARMV7")
44   endif ()
45   if (${TARGET} STREQUAL "POWER8" OR ${TARGET} STREQUAL "POWER9" OR ${TARGET} STREQUAL "POWER10")
46     set(TARGET "POWER6")
47   endif ()
48 endif ()
49
50
51 if (DEFINED TARGET)
52   message(STATUS "-- -- -- -- -- -- -- -- -- -- -- -- --")
53   message(STATUS "Targeting the ${TARGET} architecture.")
54   set(GETARCH_FLAGS "-DFORCE_${TARGET}")
55 endif ()
56
57 # On x86_64 build getarch with march=native. This is required to detect AVX512 support in getarch.
58 if (X86_64 AND NOT ${CMAKE_C_COMPILER_ID} STREQUAL "PGI")
59   set(GETARCH_FLAGS "${GETARCH_FLAGS} -march=native")
60 endif ()
61
62 # On x86 no AVX support is available
63 if (X86 OR X86_64)
64 if ((DEFINED BINARY AND BINARY EQUAL 32) OR ("$CMAKE_SIZEOF_VOID_P}" EQUAL "4"))
65   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX -DNO_AVX2 -DNO_AVX512")
66 endif ()
67 endif ()
68
69 if (INTERFACE64)
70   message(STATUS "Using 64-bit integers.")
71   set(GETARCH_FLAGS     "${GETARCH_FLAGS} -DUSE64BITINT")
72 endif ()
73
74 if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
75   set(GEMM_MULTITHREAD_THRESHOLD 4)
76 endif ()
77 message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
78 set(GETARCH_FLAGS       "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
79
80 if (NO_AVX)
81   message(STATUS "Disabling Advanced Vector Extensions (AVX).")
82   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
83 endif ()
84
85 if (NO_AVX2)
86   message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
87   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
88 endif ()
89
90 if (NO_AVX512)
91   message(STATUS "Disabling Advanced Vector Extensions 512 (AVX512).")
92   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX512")
93 endif ()
94
95 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
96   set(GETARCH_FLAGS "${GETARCH_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
97 endif ()
98
99 if (NOT DEFINED NO_PARALLEL_MAKE)
100   set(NO_PARALLEL_MAKE 0)
101 endif ()
102 set(GETARCH_FLAGS       "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
103
104 if (CMAKE_C_COMPILER STREQUAL loongcc)
105   set(GETARCH_FLAGS     "${GETARCH_FLAGS} -static")
106 endif ()
107
108 if (POWER)
109   set(NO_WARMUP 1)
110   set(HAVE_GAS 1)
111   if (CMAKE_ASM_COMPILER_ID STREQUAL "GNU")
112     set(HAVE_GAS 0)
113   elseif (CMAKE_ASM_COMPILER_ID STREQUAL "Clang")
114     set(CCOMMON_OPT "${CCOMMON_OPT} -fno-integrated-as")
115     set(HAVE_GAS 0)
116   endif ()
117   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}")
118 endif ()
119
120 #if don't use Fortran, it will only compile CBLAS.
121 if (ONLY_CBLAS)
122   set(NO_LAPACK 1)
123 else ()
124   set(ONLY_CBLAS 0)
125 endif ()
126
127 # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
128 if (NOT CMAKE_CROSSCOMPILING)
129   if (NOT DEFINED NUM_CORES)
130     include(ProcessorCount)
131     ProcessorCount(NUM_CORES)
132   endif()
133
134 endif()
135
136 if (NOT DEFINED NUM_PARALLEL)
137   set(NUM_PARALLEL 1)
138 endif()
139
140 if (NOT DEFINED NUM_THREADS)
141   if (DEFINED NUM_CORES AND NOT NUM_CORES EQUAL 0)
142     # HT?
143     set(NUM_THREADS ${NUM_CORES})
144   else ()
145     set(NUM_THREADS 0)
146   endif ()
147 endif()
148
149 if (${NUM_THREADS} LESS 2)
150   set(USE_THREAD 0)
151 elseif(NOT DEFINED USE_THREAD)
152   set(USE_THREAD 1)
153 endif ()
154
155 if (USE_THREAD)
156   message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.")
157 else()
158   if (${USE_LOCKING})
159     set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_LOCKING")
160   endif ()
161 endif ()
162
163 include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake")
164 if (DEFINED TARGET)
165   if (${TARGET} STREQUAL COOPERLAKE AND NOT NO_AVX512)
166     if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
167       execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
168         if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 10.09)
169           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake")
170         else()
171           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
172         endif()
173     elseif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
174          if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 8.99)
175           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake")
176         else()
177           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
178         endif()
179     endif()    
180   endif()
181   if (${TARGET} STREQUAL SAPPHIRERAPIDS AND NOT NO_AVX512)
182     if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
183       execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
184         if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 11.0)
185           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids")
186         else()
187           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
188         endif()
189     elseif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_C_COMPILER_ID} STREQUAL "AppleClang")
190          if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 12.0)
191           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids")
192         else()
193           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
194         endif()
195     endif()    
196   endif()
197   if (${TARGET} STREQUAL SKYLAKEX AND NOT NO_AVX512)
198     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512")
199   endif()
200   if (${TARGET} STREQUAL HASWELL AND NOT NO_AVX2)
201     if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
202       execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
203       if (${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
204         set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2")
205       endif()
206     elseif (${CMAKE_C_COMPILER_ID} STREQUAL "CLANG")
207       set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2")
208     endif()
209   endif()
210   if (DEFINED HAVE_AVX)
211         if (NOT NO_AVX)
212     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx")
213         endif()
214   endif()
215   if (DEFINED HAVE_AVX2)
216         if (NOT NO_AVX2)
217           set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2")
218         endif()
219   endif()
220   #  if (DEFINED HAVE_FMA3)
221   #     if (NOT NO_AVX2)
222   #  set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mfma")
223   #     endif()
224   #  endif()
225     if (DEFINED HAVE_SSE)
226     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse")
227   endif()
228   if (DEFINED HAVE_SSE2)
229     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse2")
230   endif()
231   if (DEFINED HAVE_SSE3)
232     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse3")
233   endif()
234     if (DEFINED HAVE_SSSE3)
235     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mssse3")
236   endif()
237     if (DEFINED HAVE_SSE4_1)
238     set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse4.1")
239   endif()
240
241   if (${TARGET} STREQUAL POWER10)
242     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
243     if (${GCC_VERSION} VERSION_GREATER 10.2 OR ${GCC_VERSION} VERSION_EQUAL 10.2)
244       set (KERNEL_DEFINITIONS  "${KERNEL_DEFINITIONS} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math")
245     else ()
246       message(FATAL_ERROR "Compiler GCC.${GCC_VERSION} does not support Power10.")
247     endif()
248   endif()
249   if (${TARGET} STREQUAL POWER9)
250     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
251     if (${GCC_VERSION} VERSION_GREATER 5.0 OR ${GCC_VERSION} VERSION_EQUAL 5.0)
252       set (KERNEL_DEFINITIONS  "${KERNEL_DEFINITIONS} -mcpu=power9 -mtune=power9 -mvsx -fno-fast-math")
253     else ()
254       set (KERNEL_DEFINITIONS  "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
255       message(WARNING "Compiler GCC.${GCC_VERSION} does not support fully Power9.")
256     endif()
257   endif()
258   if (${TARGET} STREQUAL POWER8)
259     set (KERNEL_DEFINITIONS  "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math")
260   endif()
261 endif()
262 if (DEFINED BINARY)
263   message(STATUS "Compiling a ${BINARY}-bit binary.")
264 endif ()
265 if (NOT DEFINED NEED_PIC)
266   set(NEED_PIC 1)
267 endif ()
268
269 # OS dependent settings
270 include("${PROJECT_SOURCE_DIR}/cmake/os.cmake")
271
272 # Architecture dependent settings
273 include("${PROJECT_SOURCE_DIR}/cmake/arch.cmake")
274
275 # C Compiler dependent settings
276 include("${PROJECT_SOURCE_DIR}/cmake/cc.cmake")
277
278 if (INTERFACE64)
279   set(SUFFIX64 64)
280   set(SUFFIX64_UNDERSCORE _64)
281 endif()
282
283 if (NOT NOFORTRAN)
284   # Fortran Compiler dependent settings
285   include("${PROJECT_SOURCE_DIR}/cmake/fc.cmake")
286 else ()
287   if (NOT XXXX)
288     set(C_LAPACK 1)
289     if (INTERFACE64)
290       set (CCOMMON_OPT "${CCOMMON_OPT} -DLAPACK_ILP64")
291     endif ()
292     set(TIMER "NONE")
293   else ()
294     set (NO_LAPACK 1)
295   endif ()
296 endif ()
297
298 if (BINARY64)
299   if (INTERFACE64)
300     # CCOMMON_OPT += -DUSE64BITINT
301   endif ()
302 endif ()
303
304 if(EMBEDDED)
305   set(CCOMMON_OPT "${CCOMMON_OPT} -DOS_EMBEDDED")
306   set(CCOMMON_OPT "${CCOMMON_OPT} -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16")
307 endif()
308
309 if (NEED_PIC)
310   if (${CMAKE_C_COMPILER} STREQUAL "IBM")
311     set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
312   else ()
313     set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
314   endif ()
315
316   if (NOT NOFORTRAN)
317     if (${F_COMPILER} STREQUAL "SUN")
318       set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
319     else ()
320       set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
321     endif ()
322   endif()
323 endif ()
324
325 if (X86_64 OR ${CORE} STREQUAL POWER10)
326   set(SMALL_MATRIX_OPT TRUE)
327 endif ()
328 if (SMALL_MATRIX_OPT)
329   set(CCOMMON_OPT "${CCOMMON_OPT} -DSMALL_MATRIX_OPT")
330 endif ()
331
332 if (DYNAMIC_ARCH)
333   if (X86 OR X86_64 OR ARM64 OR POWER)
334     set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
335     if (DYNAMIC_OLDER)
336       set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_OLDER")
337     endif ()
338   else ()
339     unset (DYNAMIC_ARCH)
340     message (STATUS "DYNAMIC_ARCH is not supported on the target architecture, removing")
341   endif ()
342 endif ()
343
344 if (DYNAMIC_LIST)
345   set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_LIST")
346   foreach(DCORE ${DYNAMIC_LIST})
347     set(CCOMMON_OPT "${CCOMMON_OPT} -DDYN_${DCORE}")
348   endforeach ()
349 endif ()
350
351 if (NO_LAPACK)
352   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
353   #Disable LAPACK C interface
354   set(NO_LAPACKE 1)
355 endif ()
356
357 if (NO_LAPACKE)
358   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
359 endif ()
360
361 if (NO_AVX)
362   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
363 endif ()
364
365 if (X86)
366   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
367 endif ()
368
369 if (NO_AVX2)
370   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
371 endif ()
372
373 if (NO_AVX512)
374   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX512")
375 endif ()
376
377 if (USE_THREAD)
378   # USE_SIMPLE_THREADED_LEVEL3 = 1
379   # NO_AFFINITY = 1
380   set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
381
382   if (MIPS64)
383     if (NOT ${CORE} STREQUAL "LOONGSON3B")
384       set(USE_SIMPLE_THREADED_LEVEL3 1)
385     endif ()
386   endif ()
387
388   if (BIGNUMA)
389     set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
390   endif ()
391 endif ()
392
393 if (NO_WARMUP)
394   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
395 endif ()
396
397 if (CONSISTENT_FPCSR)
398   set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
399 endif ()
400
401 if (USE_TLS)
402   set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_TLS")
403 endif ()
404
405 # Only for development
406 # set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
407 # set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
408 # set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
409 # set(USE_PAPI 1)
410
411 if (USE_PAPI)
412   set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
413   set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
414 endif ()
415
416 if (DYNAMIC_THREADS)
417   set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
418 endif ()
419
420 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
421
422 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_PARALLEL_NUMBER=${NUM_PARALLEL}")
423
424 if (BUFFERSIZE)
425 set(CCOMMON_OPT "${CCOMMON_OPT} -DBUFFERSIZE=${BUFFERSIZE}")
426 endif ()
427
428 if (USE_SIMPLE_THREADED_LEVEL3)
429   set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
430 endif ()
431
432 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
433 if (DEFINED MAX_STACK_ALLOC)
434 if (NOT ${MAX_STACK_ALLOC} EQUAL 0)
435 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=${MAX_STACK_ALLOC}")
436 endif ()
437 else ()
438 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=2048")
439 endif ()
440 endif ()
441 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
442 if (DEFINED BLAS3_MEM_ALLOC_THRESHOLD)
443 if (NOT ${BLAS3_MEM_ALLOC_THRESHOLD} EQUAL 32)
444 set(CCOMMON_OPT "${CCOMMON_OPT} -DBLAS3_MEM_ALLOC_THRESHOLD=${BLAS3_MEM_ALLOC_THRESHOLD}")
445 endif()
446 endif()
447 endif()
448 if (DEFINED LIBNAMESUFFIX)
449   set(LIBPREFIX "libopenblas_${LIBNAMESUFFIX}")
450 else ()
451   set(LIBPREFIX "libopenblas")
452 endif ()
453
454 if (NOT DEFINED SYMBOLPREFIX)
455   set(SYMBOLPREFIX "")
456 endif ()
457
458 if (NOT DEFINED SYMBOLSUFFIX)
459   set(SYMBOLSUFFIX "")
460 endif ()
461
462 set(KERNELDIR   "${PROJECT_SOURCE_DIR}/kernel/${ARCH}")
463
464 # TODO: need to convert these Makefiles
465 # include ${PROJECT_SOURCE_DIR}/cmake/${ARCH}.cmake
466
467 if (${CORE} STREQUAL "PPC440")
468   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
469 endif ()
470
471 if (${CORE} STREQUAL "PPC440FP2")
472   set(STATIC_ALLOCATION 1)
473 endif ()
474
475 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
476   set(NO_AFFINITY 1)
477 endif ()
478
479 if (NOT X86_64 AND NOT X86 AND NOT ${CORE} STREQUAL "LOONGSON3B")
480   set(NO_AFFINITY 1)
481 endif ()
482
483 if (NO_AFFINITY)
484   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
485 endif ()
486
487 if (FUNCTION_PROFILE)
488   set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
489 endif ()
490
491 if (HUGETLB_ALLOCATION)
492   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
493 endif ()
494
495 if (DEFINED HUGETLBFILE_ALLOCATION)
496   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
497 endif ()
498
499 if (STATIC_ALLOCATION)
500   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
501 endif ()
502
503 if (DEVICEDRIVER_ALLOCATION)
504   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
505 endif ()
506
507 if (MIXED_MEMORY_ALLOCATION)
508   set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
509 endif ()
510
511 set(CCOMMON_OPT "${CCOMMON_OPT} -DVERSION=\"\\\"${OpenBLAS_VERSION}\\\"\"")
512
513 set(REVISION "-r${OpenBLAS_VERSION}")
514 set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
515
516 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CCOMMON_OPT}")
517
518 if (NOT BUILD_SINGLE AND NOT BUILD_DOUBLE AND NOT BUILD_COMPLEX AND NOT BUILD_COMPLEX16)
519         set (BUILD_SINGLE ON)
520         set (BUILD_DOUBLE ON)
521         set (BUILD_COMPLEX ON)
522         set (BUILD_COMPLEX16 ON)
523 endif()
524 if (BUILD_SINGLE)
525         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_SINGLE")
526 endif()
527 if (BUILD_DOUBLE)
528         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_DOUBLE")
529 endif()
530 if (BUILD_COMPLEX)
531         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX")
532 endif()
533 if (BUILD_COMPLEX16)
534         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX16")
535 endif()
536 if (BUILD_BFLOAT16)
537        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_BFLOAT16")
538 endif()
539 if(NOT MSVC)
540 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}")
541 endif()
542 # TODO: not sure what PFLAGS is -hpa
543 set(PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
544
545 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FCOMMON_OPT}")
546 # TODO: not sure what FPFLAGS is -hpa
547 set(FPFLAGS "${FPFLAGS} ${FCOMMON_OPT} ${COMMON_PROF}")
548
549 #For LAPACK Fortran codes.
550 set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}")
551 set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
552
553 #Disable -fopenmp for LAPACK Fortran codes on Windows.
554 if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
555   set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parallel")
556   foreach (FILTER_FLAG ${FILTER_FLAGS})
557     string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
558     string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
559   endforeach ()
560 endif ()
561
562 if ("${F_COMPILER}" STREQUAL "GFORTRAN")
563   # lapack-netlib is rife with uninitialized warnings -hpa
564   set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
565 endif ()
566
567 set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
568 if (INTERFACE64)
569   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
570 endif ()
571
572 if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
573   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
574 endif ()
575
576 if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
577   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
578 endif ()
579
580 if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
581 if ("${F_COMPILER}" STREQUAL "FLANG")
582 if (${CMAKE_Fortran_COMPILER_VERSION} VERSION_LESS_EQUAL 3)
583   set(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fno-unroll-loops")
584 endif ()
585 endif ()
586 endif ()
587
588 if (NOT DEFINED SUFFIX)
589   set(SUFFIX o)
590 endif ()
591
592 if (NOT DEFINED PSUFFIX)
593   set(PSUFFIX po)
594 endif ()
595
596 if (NOT DEFINED LIBSUFFIX)
597   set(LIBSUFFIX a)
598 endif ()
599
600 if (DYNAMIC_ARCH)
601   if (USE_THREAD)
602     set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
603     set(LIBNAME_P       "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
604   else ()
605     set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
606     set(LIBNAME_P       "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
607   endif ()
608 else ()
609   if (USE_THREAD)
610     set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
611     set(LIBNAME_P       "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
612   else ()
613     set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
614     set(LIBNAME_P       "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
615   endif ()
616 endif ()
617
618
619 set(LIBDLLNAME "${LIBPREFIX}.dll")
620 set(LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so")
621 set(LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib")
622 set(LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def")
623 set(LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp")
624 set(LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip")
625
626 set(LIBS "${PROJECT_SOURCE_DIR}/${LIBNAME}")
627 set(LIBS_P "${PROJECT_SOURCE_DIR}/${LIBNAME_P}")
628
629
630 set(LIB_COMPONENTS BLAS)
631 if (NOT NO_CBLAS)
632   set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
633 endif ()
634
635 if (NOT NO_LAPACK)
636   set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
637   if (NOT NO_LAPACKE)
638     set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
639   endif ()
640   if (BUILD_RELAPACK)
641     set(LIB_COMPONENTS "${LIB_COMPONENTS} ReLAPACK")
642   endif ()
643 endif ()
644
645 if (ONLY_CBLAS)
646   set(LIB_COMPONENTS CBLAS)
647 endif ()
648
649
650 # For GEMM3M
651 set(USE_GEMM3M 0)
652
653 if (DEFINED ARCH)
654   if (X86 OR X86_64 OR ${ARCH} STREQUAL "ia64" OR MIPS64)
655     set(USE_GEMM3M 1)
656   endif ()
657
658   if (${CORE} STREQUAL "generic")
659     set(USE_GEMM3M 0)
660   endif ()
661 endif ()
662
663
664 #export OSNAME
665 #export ARCH
666 #export CORE
667 #export LIBCORE
668 #export PGCPATH
669 #export CONFIG
670 #export CC
671 #export FC
672 #export BU
673 #export FU
674 #export NEED2UNDERSCORES
675 #export USE_THREAD
676 #export NUM_THREADS
677 #export NUM_CORES
678 #export SMP
679 #export MAKEFILE_RULE
680 #export NEED_PIC
681 #export BINARY
682 #export BINARY32
683 #export BINARY64
684 #export F_COMPILER
685 #export C_COMPILER
686 #export USE_OPENMP
687 #export CROSS
688 #export CROSS_SUFFIX
689 #export NOFORTRAN
690 #export NO_FBLAS
691 #export EXTRALIB
692 #export CEXTRALIB
693 #export FEXTRALIB
694 #export HAVE_SSE
695 #export HAVE_SSE2
696 #export HAVE_SSE3
697 #export HAVE_SSSE3
698 #export HAVE_SSE4_1
699 #export HAVE_SSE4_2
700 #export HAVE_SSE4A
701 #export HAVE_SSE5
702 #export HAVE_AVX
703 #export HAVE_VFP
704 #export HAVE_VFPV3
705 #export HAVE_VFPV4
706 #export HAVE_NEON
707 #export KERNELDIR
708 #export FUNCTION_PROFILE
709 #export TARGET_CORE
710 #
711 #export SBGEMM_UNROLL_M
712 #export SBGEMM_UNROLL_N
713 #export SGEMM_UNROLL_M
714 #export SGEMM_UNROLL_N
715 #export DGEMM_UNROLL_M
716 #export DGEMM_UNROLL_N
717 #export QGEMM_UNROLL_M
718 #export QGEMM_UNROLL_N
719 #export CGEMM_UNROLL_M
720 #export CGEMM_UNROLL_N
721 #export ZGEMM_UNROLL_M
722 #export ZGEMM_UNROLL_N
723 #export XGEMM_UNROLL_M
724 #export XGEMM_UNROLL_N
725 #export CGEMM3M_UNROLL_M
726 #export CGEMM3M_UNROLL_N
727 #export ZGEMM3M_UNROLL_M
728 #export ZGEMM3M_UNROLL_N
729 #export XGEMM3M_UNROLL_M
730 #export XGEMM3M_UNROLL_N
731
732
733 #if (USE_CUDA)
734 #  export CUDADIR
735 #  export CUCC
736 #  export CUFLAGS
737 #  export CULIB
738 #endif