Replace CMAKE_SOURCE_DIR/CMAKE_BINARY_DIR with PROJECT_SOURCE_DIR/PROJECT_BINARY_DIR
[platform/upstream/openblas.git] / cmake / system.cmake
1 ##
2 ## Author: Hank Anderson <hank@statease.com>
3 ## Description: Ported from OpenBLAS/Makefile.system
4 ##
5
6 set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib")
7
8 # TODO: Makefile.system detects Darwin (mac) and switches to clang here -hpa
9 # http://stackoverflow.com/questions/714100/os-detecting-makefile
10
11 # TODO: Makefile.system sets HOSTCC = $(CC) here if not already set -hpa
12
13 # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
14 if (DEFINED TARGET_CORE)
15   set(TARGET ${TARGET_CORE})
16 endif ()
17
18 # Force fallbacks for 32bit
19 if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
20   message(STATUS "Compiling a ${BINARY}-bit binary.")
21   set(NO_AVX 1)
22   if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE")
23     set(TARGET "NEHALEM")
24   endif ()
25   if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER")
26     set(TARGET "BARCELONA")
27   endif ()
28 endif ()
29
30 if (DEFINED TARGET)
31   message(STATUS "Targetting the ${TARGET} architecture.")
32   set(GETARCH_FLAGS "-DFORCE_${TARGET}")
33 endif ()
34
35 if (INTERFACE64)
36   message(STATUS "Using 64-bit integers.")
37   set(GETARCH_FLAGS     "${GETARCH_FLAGS} -DUSE64BITINT")
38 endif ()
39
40 if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
41   set(GEMM_MULTITHREAD_THRESHOLD 4)
42 endif ()
43 message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
44 set(GETARCH_FLAGS       "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
45
46 if (NO_AVX)
47   message(STATUS "Disabling Advanced Vector Extensions (AVX).")
48   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
49 endif ()
50
51 if (NO_AVX2)
52   message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
53   set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
54 endif ()
55
56 if (CMAKE_BUILD_TYPE STREQUAL Debug)
57   set(GETARCH_FLAGS "${GETARCH_FLAGS} -g")
58 endif ()
59
60 # TODO: let CMake handle this? -hpa
61 #if (${QUIET_MAKE})
62 #  set(MAKE "${MAKE} -s")
63 #endif()
64
65 if (NOT DEFINED NO_PARALLEL_MAKE)
66   set(NO_PARALLEL_MAKE 0)
67 endif ()
68 set(GETARCH_FLAGS       "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
69
70 if (CMAKE_CXX_COMPILER STREQUAL loongcc)
71   set(GETARCH_FLAGS     "${GETARCH_FLAGS} -static")
72 endif ()
73
74 #if don't use Fortran, it will only compile CBLAS.
75 if (ONLY_CBLAS)
76   set(NO_LAPACK 1)
77 else ()
78   set(ONLY_CBLAS 0)
79 endif ()
80
81 include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake")
82
83 if (NOT DEFINED NUM_THREADS)
84   set(NUM_THREADS ${NUM_CORES})
85 endif ()
86
87 if (${NUM_THREADS} EQUAL 1)
88   set(USE_THREAD 0)
89 endif ()
90
91 if (DEFINED USE_THREAD)
92   if (NOT ${USE_THREAD})
93     unset(SMP)
94   else ()
95     set(SMP 1)
96   endif ()
97 else ()
98   # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
99   if (${NUM_THREADS} EQUAL 1)
100     unset(SMP)
101   else ()
102     set(SMP 1)
103   endif ()
104 endif ()
105
106 if (${SMP})
107   message(STATUS "SMP enabled.")
108 endif ()
109
110 if (NOT DEFINED NEED_PIC)
111   set(NEED_PIC 1)
112 endif ()
113
114 # TODO: I think CMake should be handling all this stuff -hpa
115 unset(ARFLAGS)
116 set(CPP "${COMPILER} -E")
117 set(AR "${CROSS_SUFFIX}ar")
118 set(AS "${CROSS_SUFFIX}as")
119 set(LD "${CROSS_SUFFIX}ld")
120 set(RANLIB "${CROSS_SUFFIX}ranlib")
121 set(NM "${CROSS_SUFFIX}nm")
122 set(DLLWRAP "${CROSS_SUFFIX}dllwrap")
123 set(OBJCOPY "${CROSS_SUFFIX}objcopy")
124 set(OBJCONV "${CROSS_SUFFIX}objconv")
125
126 # OS dependent settings
127 include("${PROJECT_SOURCE_DIR}/cmake/os.cmake")
128
129 # Architecture dependent settings
130 include("${PROJECT_SOURCE_DIR}/cmake/arch.cmake")
131
132 # C Compiler dependent settings
133 include("${PROJECT_SOURCE_DIR}/cmake/cc.cmake")
134
135 if (NOT NOFORTRAN)
136   # Fortran Compiler dependent settings
137   include("${PROJECT_SOURCE_DIR}/cmake/fc.cmake")
138 endif ()
139
140 if (BINARY64)
141   if (INTERFACE64)
142     # CCOMMON_OPT += -DUSE64BITINT
143   endif ()
144 endif ()
145
146 if (NEED_PIC)
147   if (${CMAKE_C_COMPILER} STREQUAL "IBM")
148     set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
149   else ()
150     set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
151   endif ()
152
153   if (${F_COMPILER} STREQUAL "SUN")
154     set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
155   else ()
156     set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
157   endif ()
158 endif ()
159
160 if (DYNAMIC_ARCH)
161   set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
162 endif ()
163
164 if (NO_LAPACK)
165   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
166   #Disable LAPACK C interface
167   set(NO_LAPACKE 1)
168 endif ()
169
170 if (NO_LAPACKE)
171   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
172 endif ()
173
174 if (NO_AVX)
175   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
176 endif ()
177
178 if (${ARCH} STREQUAL "x86")
179   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
180 endif ()
181
182 if (NO_AVX2)
183   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
184 endif ()
185
186 if (SMP)
187   set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
188
189   if (${ARCH} STREQUAL "mips64")
190     if (NOT ${CORE} STREQUAL "LOONGSON3B")
191       set(USE_SIMPLE_THREADED_LEVEL3 1)
192     endif ()
193   endif ()
194
195   if (USE_OPENMP)
196     # USE_SIMPLE_THREADED_LEVEL3 = 1
197     # NO_AFFINITY = 1
198     set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP")
199   endif ()
200
201   if (BIGNUMA)
202     set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
203   endif ()
204
205 endif ()
206
207 if (NO_WARMUP)
208   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
209 endif ()
210
211 if (CONSISTENT_FPCSR)
212   set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
213 endif ()
214
215 # Only for development
216 # set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
217 # set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
218 # set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
219 # set(USE_PAPI 1)
220
221 if (USE_PAPI)
222   set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
223   set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
224 endif ()
225
226 if (DYNAMIC_THREADS)
227   set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
228 endif ()
229
230 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
231
232 if (USE_SIMPLE_THREADED_LEVEL3)
233   set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
234 endif ()
235
236 if (DEFINED LIBNAMESUFFIX)
237   set(LIBPREFIX "libopenblas_${LIBNAMESUFFIX}")
238 else ()
239   set(LIBPREFIX "libopenblas")
240 endif ()
241
242 if (NOT DEFINED SYMBOLPREFIX)
243   set(SYMBOLPREFIX "")
244 endif ()
245
246 if (NOT DEFINED SYMBOLSUFFIX)
247   set(SYMBOLSUFFIX "")
248 endif ()
249
250 set(KERNELDIR   "${PROJECT_SOURCE_DIR}/kernel/${ARCH}")
251
252 # TODO: nead to convert these Makefiles
253 # include ${PROJECT_SOURCE_DIR}/cmake/${ARCH}.cmake
254
255 if (${CORE} STREQUAL "PPC440")
256   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
257 endif ()
258
259 if (${CORE} STREQUAL "PPC440FP2")
260   set(STATIC_ALLOCATION 1)
261 endif ()
262
263 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
264   set(NO_AFFINITY 1)
265 endif ()
266
267 if (NOT ${ARCH} STREQUAL "x86_64" AND NOT ${ARCH} STREQUAL "x86" AND NOT ${CORE} STREQUAL "LOONGSON3B")
268   set(NO_AFFINITY 1)
269 endif ()
270
271 if (NO_AFFINITY)
272   set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
273 endif ()
274
275 if (FUNCTION_PROFILE)
276   set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
277 endif ()
278
279 if (HUGETLB_ALLOCATION)
280   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
281 endif ()
282
283 if (DEFINED HUGETLBFILE_ALLOCATION)
284   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
285 endif ()
286
287 if (STATIC_ALLOCATION)
288   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
289 endif ()
290
291 if (DEVICEDRIVER_ALLOCATION)
292   set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
293 endif ()
294
295 if (MIXED_MEMORY_ALLOCATION)
296   set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
297 endif ()
298
299 if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
300   set(TAR       gtar)
301   set(PATCH     gpatch)
302   set(GREP ggrep)
303 else ()
304   set(TAR tar)
305   set(PATCH patch)
306   set(GREP grep)
307 endif ()
308
309 if (NOT DEFINED MD5SUM)
310   set(MD5SUM md5sum)
311 endif ()
312
313 set(AWK awk)
314
315 set(REVISION "-r${OpenBLAS_VERSION}")
316 set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
317
318 if (DEBUG)
319   set(COMMON_OPT "${COMMON_OPT} -g")
320 endif ()
321
322 if (NOT DEFINED COMMON_OPT)
323   set(COMMON_OPT "-O2")
324 endif ()
325
326 #For x86 32-bit
327 if (DEFINED BINARY AND BINARY EQUAL 32)
328 if (NOT MSVC)
329   set(COMMON_OPT "${COMMON_OPT} -m32")
330 endif()
331 endif()
332
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}")
334 if(NOT MSVC)
335 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}")
336 endif()
337 # TODO: not sure what PFLAGS is -hpa
338 set(PFLAGS "${PFLAGS} ${COMMON_OPT} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
339
340 set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COMMON_OPT} ${FCOMMON_OPT}")
341 # TODO: not sure what FPFLAGS is -hpa
342 set(FPFLAGS "${FPFLAGS} ${COMMON_OPT} ${FCOMMON_OPT} ${COMMON_PROF}")
343
344 #For LAPACK Fortran codes.
345 set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}")
346 set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
347
348 #Disable -fopenmp for LAPACK Fortran codes on Windows.
349 if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
350   set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parralel")
351   foreach (FILTER_FLAG ${FILTER_FLAGS})
352     string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
353     string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
354   endforeach ()
355 endif ()
356
357 if ("${F_COMPILER}" STREQUAL "GFORTRAN")
358   # lapack-netlib is rife with uninitialized warnings -hpa
359   set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
360 endif ()
361
362 set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
363 if (INTERFACE64)
364   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
365 endif ()
366
367 if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
368   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
369 endif ()
370
371 if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
372   set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
373 endif ()
374
375 if (NOT DEFINED SUFFIX)
376   set(SUFFIX o)
377 endif ()
378
379 if (NOT DEFINED PSUFFIX)
380   set(PSUFFIX po)
381 endif ()
382
383 if (NOT DEFINED LIBSUFFIX)
384   set(LIBSUFFIX a)
385 endif ()
386
387 if (DYNAMIC_ARCH)
388   if (DEFINED SMP)
389     set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
390     set(LIBNAME_P       "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
391   else ()
392     set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
393     set(LIBNAME_P       "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
394   endif ()
395 else ()
396   if (DEFINED SMP)
397     set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
398     set(LIBNAME_P       "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
399   else ()
400     set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
401     set(LIBNAME_P       "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
402   endif ()
403 endif ()
404
405
406 set(LIBDLLNAME "${LIBPREFIX}.dll")
407 set(LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so")
408 set(LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib")
409 set(LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def")
410 set(LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp")
411 set(LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip")
412
413 set(LIBS "${PROJECT_SOURCE_DIR}/${LIBNAME}")
414 set(LIBS_P "${PROJECT_SOURCE_DIR}/${LIBNAME_P}")
415
416
417 set(LIB_COMPONENTS BLAS)
418 if (NOT NO_CBLAS)
419   set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
420 endif ()
421
422 if (NOT NO_LAPACK)
423   set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
424   if (NOT NO_LAPACKE)
425     set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
426   endif ()
427 endif ()
428
429 if (ONLY_CBLAS)
430   set(LIB_COMPONENTS CBLAS)
431 endif ()
432
433
434 # For GEMM3M
435 set(USE_GEMM3M 0)
436
437 if (DEFINED ARCH)
438   if (${ARCH} STREQUAL "x86" OR ${ARCH} STREQUAL "x86_64" OR ${ARCH} STREQUAL "ia64" OR ${ARCH} STREQUAL "MIPS")
439     set(USE_GEMM3M 1)
440   endif ()
441
442   if (${CORE} STREQUAL "generic")
443     set(USE_GEMM3M 0)
444   endif ()
445 endif ()
446
447
448 #export OSNAME
449 #export ARCH
450 #export CORE
451 #export LIBCORE
452 #export PGCPATH
453 #export CONFIG
454 #export CC
455 #export FC
456 #export BU
457 #export FU
458 #export NEED2UNDERSCORES
459 #export USE_THREAD
460 #export NUM_THREADS
461 #export NUM_CORES
462 #export SMP
463 #export MAKEFILE_RULE
464 #export NEED_PIC
465 #export BINARY
466 #export BINARY32
467 #export BINARY64
468 #export F_COMPILER
469 #export C_COMPILER
470 #export USE_OPENMP
471 #export CROSS
472 #export CROSS_SUFFIX
473 #export NOFORTRAN
474 #export NO_FBLAS
475 #export EXTRALIB
476 #export CEXTRALIB
477 #export FEXTRALIB
478 #export HAVE_SSE
479 #export HAVE_SSE2
480 #export HAVE_SSE3
481 #export HAVE_SSSE3
482 #export HAVE_SSE4_1
483 #export HAVE_SSE4_2
484 #export HAVE_SSE4A
485 #export HAVE_SSE5
486 #export HAVE_AVX
487 #export HAVE_VFP
488 #export HAVE_VFPV3
489 #export HAVE_VFPV4
490 #export HAVE_NEON
491 #export KERNELDIR
492 #export FUNCTION_PROFILE
493 #export TARGET_CORE
494 #
495 #export SGEMM_UNROLL_M
496 #export SGEMM_UNROLL_N
497 #export DGEMM_UNROLL_M
498 #export DGEMM_UNROLL_N
499 #export QGEMM_UNROLL_M
500 #export QGEMM_UNROLL_N
501 #export CGEMM_UNROLL_M
502 #export CGEMM_UNROLL_N
503 #export ZGEMM_UNROLL_M
504 #export ZGEMM_UNROLL_N
505 #export XGEMM_UNROLL_M
506 #export XGEMM_UNROLL_N
507 #export CGEMM3M_UNROLL_M
508 #export CGEMM3M_UNROLL_N
509 #export ZGEMM3M_UNROLL_M
510 #export ZGEMM3M_UNROLL_N
511 #export XGEMM3M_UNROLL_M
512 #export XGEMM3M_UNROLL_N
513
514
515 #if (USE_CUDA)
516 #  export CUDADIR
517 #  export CUCC
518 #  export CUFLAGS
519 #  export CULIB
520 #endif
521
522 #.SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
523 #
524 #.f.$(SUFFIX):
525 #       $(FC) $(FFLAGS) -c $<  -o $(@F)
526 #
527 #.f.$(PSUFFIX):
528 #       $(FC) $(FPFLAGS) -pg -c $<  -o $(@F)
529
530 # these are not cross-platform
531 #ifdef BINARY64
532 #PATHSCALEPATH  = /opt/pathscale/lib/3.1
533 #PGIPATH                = /opt/pgi/linux86-64/7.1-5/lib
534 #else
535 #PATHSCALEPATH  = /opt/pathscale/lib/3.1/32
536 #PGIPATH                = /opt/pgi/linux86/7.1-5/lib
537 #endif
538
539 #ACMLPATH       = /opt/acml/4.3.0
540 #ifneq ($(OSNAME), Darwin)
541 #MKLPATH         = /opt/intel/mkl/10.2.2.025/lib
542 #else
543 #MKLPATH         = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
544 #endif
545 #ATLASPATH      = /opt/atlas/3.9.17/opteron
546 #FLAMEPATH      = $(HOME)/flame/lib
547 #ifneq ($(OSNAME), SunOS)
548 #SUNPATH                = /opt/sunstudio12.1
549 #else
550 #SUNPATH                = /opt/SUNWspro
551 #endif
552