2 ## Author: Hank Anderson <hank@statease.com>
3 ## Description: Ported from OpenBLAS/Makefile.system
6 set(NETLIB_LAPACK_DIR "${CMAKE_SOURCE_DIR}/lapack-netlib")
8 # TODO: Makefile.system detects Darwin (mac) and switches to clang here -hpa
9 # http://stackoverflow.com/questions/714100/os-detecting-makefile
11 # TODO: Makefile.system sets HOSTCC = $(CC) here if not already set -hpa
13 # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
14 if (DEFINED TARGET_CORE)
15 set(TARGET ${TARGET_CORE})
18 # Force fallbacks for 32bit
19 if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
20 message(STATUS "Compiling a ${BINARY}-bit binary.")
22 if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE")
25 if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER")
26 set(TARGET "BARCELONA")
31 message(STATUS "Targetting the ${TARGET} architecture.")
32 set(GETARCH_FLAGS "-DFORCE_${TARGET}")
36 message(STATUS "Using 64-bit integers.")
37 set(GETARCH_FLAGS "${GETARCH_FLAGS} -DUSE64BITINT")
40 if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
41 set(GEMM_MULTITHREAD_THRESHOLD 4)
43 message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
44 set(GETARCH_FLAGS "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
47 message(STATUS "Disabling Advanced Vector Extensions (AVX).")
48 set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
52 message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
53 set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
56 if (CMAKE_BUILD_TYPE STREQUAL Debug)
57 set(GETARCH_FLAGS "${GETARCH_FLAGS} -g")
60 # TODO: let CMake handle this? -hpa
62 # set(MAKE "${MAKE} -s")
65 if (NOT DEFINED NO_PARALLEL_MAKE)
66 set(NO_PARALLEL_MAKE 0)
68 set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
70 if (CMAKE_CXX_COMPILER STREQUAL loongcc)
71 set(GETARCH_FLAGS "${GETARCH_FLAGS} -static")
74 #if don't use Fortran, it will only compile CBLAS.
81 include("${CMAKE_SOURCE_DIR}/cmake/prebuild.cmake")
83 if (NOT DEFINED NUM_THREADS)
84 set(NUM_THREADS ${NUM_CORES})
87 if (${NUM_THREADS} EQUAL 1)
91 if (DEFINED USE_THREAD)
92 if (NOT ${USE_THREAD})
98 # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
99 if (${NUM_THREADS} EQUAL 1)
107 message(STATUS "SMP enabled.")
110 if (NOT DEFINED NEED_PIC)
114 # TODO: I think CMake should be handling all this stuff -hpa
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")
126 # OS dependent settings
127 include("${CMAKE_SOURCE_DIR}/cmake/os.cmake")
129 # Architecture dependent settings
130 include("${CMAKE_SOURCE_DIR}/cmake/arch.cmake")
132 # C Compiler dependent settings
133 include("${CMAKE_SOURCE_DIR}/cmake/cc.cmake")
136 # Fortran Compiler dependent settings
137 include("${CMAKE_SOURCE_DIR}/cmake/fc.cmake")
142 # CCOMMON_OPT += -DUSE64BITINT
147 if (${CMAKE_C_COMPILER} STREQUAL "IBM")
148 set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
150 set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
153 if (${F_COMPILER} STREQUAL "SUN")
154 set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
156 set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
161 set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
165 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
166 #Disable LAPACK C interface
171 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
175 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
178 if (${ARCH} STREQUAL "x86")
179 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
183 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
187 set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
189 if (${ARCH} STREQUAL "mips64")
190 if (NOT ${CORE} STREQUAL "LOONGSON3B")
191 set(USE_SIMPLE_THREADED_LEVEL3 1)
196 # USE_SIMPLE_THREADED_LEVEL3 = 1
198 set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP")
202 set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
208 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
211 if (CONSISTENT_FPCSR)
212 set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
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")
222 set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
223 set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
227 set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
230 set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
232 if (USE_SIMPLE_THREADED_LEVEL3)
233 set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
236 if (DEFINED LIBNAMESUFFIX)
237 set(LIBPREFIX "libopenblas_${LIBNAMESUFFIX}")
239 set(LIBPREFIX "libopenblas")
242 if (NOT DEFINED SYMBOLPREFIX)
246 if (NOT DEFINED SYMBOLSUFFIX)
250 set(KERNELDIR "${CMAKE_SOURCE_DIR}/kernel/${ARCH}")
252 # TODO: nead to convert these Makefiles
253 # include ${CMAKE_SOURCE_DIR}/cmake/${ARCH}.cmake
255 if (${CORE} STREQUAL "PPC440")
256 set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
259 if (${CORE} STREQUAL "PPC440FP2")
260 set(STATIC_ALLOCATION 1)
263 if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
267 if (NOT ${ARCH} STREQUAL "x86_64" AND NOT ${ARCH} STREQUAL "x86" AND NOT ${CORE} STREQUAL "LOONGSON3B")
272 set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
275 if (FUNCTION_PROFILE)
276 set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
279 if (HUGETLB_ALLOCATION)
280 set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
283 if (DEFINED HUGETLBFILE_ALLOCATION)
284 set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
287 if (STATIC_ALLOCATION)
288 set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
291 if (DEVICEDRIVER_ALLOCATION)
292 set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
295 if (MIXED_MEMORY_ALLOCATION)
296 set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
299 if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
309 if (NOT DEFINED MD5SUM)
315 set(REVISION "-r${OpenBLAS_VERSION}")
316 set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
319 set(COMMON_OPT "${COMMON_OPT} -g")
322 if (NOT DEFINED COMMON_OPT)
323 set(COMMON_OPT "-O2")
327 if (DEFINED BINARY AND BINARY EQUAL 32)
329 set(COMMON_OPT "${COMMON_OPT} -m32")
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}")
335 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}")
337 # TODO: not sure what PFLAGS is -hpa
338 set(PFLAGS "${PFLAGS} ${COMMON_OPT} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
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}")
344 #For LAPACK Fortran codes.
345 set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}")
346 set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
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})
357 if ("${F_COMPILER}" STREQUAL "GFORTRAN")
358 # lapack-netlib is rife with uninitialized warnings -hpa
359 set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
362 set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
364 set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
367 if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
368 set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
371 if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
372 set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
375 if (NOT DEFINED SUFFIX)
379 if (NOT DEFINED PSUFFIX)
383 if (NOT DEFINED LIBSUFFIX)
389 set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
390 set(LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
392 set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
393 set(LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
397 set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
398 set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
400 set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
401 set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
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")
413 set(LIBS "${CMAKE_SOURCE_DIR}/${LIBNAME}")
414 set(LIBS_P "${CMAKE_SOURCE_DIR}/${LIBNAME_P}")
417 set(LIB_COMPONENTS BLAS)
419 set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
423 set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
425 set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
430 set(LIB_COMPONENTS CBLAS)
438 if (${ARCH} STREQUAL "x86" OR ${ARCH} STREQUAL "x86_64" OR ${ARCH} STREQUAL "ia64" OR ${ARCH} STREQUAL "MIPS")
442 if (${CORE} STREQUAL "generic")
458 #export NEED2UNDERSCORES
463 #export MAKEFILE_RULE
492 #export FUNCTION_PROFILE
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
522 #.SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
525 # $(FC) $(FFLAGS) -c $< -o $(@F)
528 # $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
530 # these are not cross-platform
532 #PATHSCALEPATH = /opt/pathscale/lib/3.1
533 #PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
535 #PATHSCALEPATH = /opt/pathscale/lib/3.1/32
536 #PGIPATH = /opt/pgi/linux86/7.1-5/lib
539 #ACMLPATH = /opt/acml/4.3.0
540 #ifneq ($(OSNAME), Darwin)
541 #MKLPATH = /opt/intel/mkl/10.2.2.025/lib
543 #MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
545 #ATLASPATH = /opt/atlas/3.9.17/opteron
546 #FLAMEPATH = $(HOME)/flame/lib
547 #ifneq ($(OSNAME), SunOS)
548 #SUNPATH = /opt/sunstudio12.1
550 #SUNPATH = /opt/SUNWspro