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