You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

system.cmake 18 kB

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