FindBLAS.cmake 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindBLAS
  5. --------
  6. Find Basic Linear Algebra Subprograms (BLAS) library
  7. This module finds an installed Fortran library that implements the
  8. BLAS linear-algebra interface (see http://www.netlib.org/blas/).
  9. The approach follows that taken for the ``autoconf`` macro file,
  10. ``acx_blas.m4`` (distributed at
  11. http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
  12. Input Variables
  13. ^^^^^^^^^^^^^^^
  14. The following variables may be set to influence this module's behavior:
  15. ``BLA_STATIC``
  16. if ``ON`` use static linkage
  17. ``BLA_VENDOR``
  18. If set, checks only the specified vendor, if not set checks all the
  19. possibilities. List of vendors valid in this module:
  20. * ``Goto``
  21. * ``FlexiBLAS``
  22. * ``OpenBLAS``
  23. * ``FLAME``
  24. * ``ATLAS PhiPACK``
  25. * ``CXML``
  26. * ``DXML``
  27. * ``SunPerf``
  28. * ``SCSL``
  29. * ``SGIMATH``
  30. * ``IBMESSL``
  31. * ``Intel10_32`` (intel mkl v10 32 bit, threaded code)
  32. * ``Intel10_64lp`` (intel mkl v10+ 64 bit, threaded code, lp64 model)
  33. * ``Intel10_64lp_seq`` (intel mkl v10+ 64 bit, sequential code, lp64 model)
  34. * ``Intel10_64ilp`` (intel mkl v10+ 64 bit, threaded code, ilp64 model)
  35. * ``Intel10_64ilp_seq`` (intel mkl v10+ 64 bit, sequential code, ilp64 model)
  36. * ``Intel10_64_dyn`` (intel mkl v10+ 64 bit, single dynamic library)
  37. * ``Intel`` (obsolete versions of mkl 32 and 64 bit)
  38. * ``ACML``
  39. * ``ACML_MP``
  40. * ``ACML_GPU``
  41. * ``Apple``
  42. * ``NAS``
  43. * ``Arm``
  44. * ``Arm_mp``
  45. * ``Arm_ilp64``
  46. * ``Arm_ilp64_mp``
  47. * ``EML``
  48. * ``EML_mt``
  49. * ``Fujitsu_SSL2`` (Fujitsu serial blas / lapack)
  50. * ``Fujitsu_SSL2BLAMP`` (Fujitsu parallel blas / lapack)
  51. * ``NVHPC``
  52. * ``Generic``
  53. .. versionadded:: 3.6
  54. ``OpenBLAS`` support.
  55. .. versionadded:: 3.11
  56. ``FLAME`` support.
  57. .. versionadded:: 3.13
  58. Added ILP64 MKL variants (``Intel10_64ilp``, ``Intel10_64ilp_seq``).
  59. .. versionadded:: 3.17
  60. Added single dynamic library MKL variant (``Intel10_64_dyn``).
  61. .. versionadded:: 3.18
  62. Arm Performance Libraries support (``Arm``, ``Arm_mp``, ``Arm_ilp64``,
  63. ``Arm_ilp64_mp``).
  64. .. versionadded:: 3.19
  65. ``FlexiBLAS`` support.
  66. .. versionadded:: 3.20
  67. Elbrus Math Library support (``EML``, ``EML_mt``).
  68. Fujitsu SSL2 Library support (``Fujitsu_SSL2``, ``Fujitsu_SSL2BLAMP``)
  69. .. versionadded:: 3.21
  70. NVHPC support
  71. ``BLA_F95``
  72. if ``ON`` tries to find the BLAS95 interfaces
  73. ``BLA_PREFER_PKGCONFIG``
  74. .. versionadded:: 3.11
  75. if set ``pkg-config`` will be used to search for a BLAS library first
  76. and if one is found that is preferred
  77. Imported targets
  78. ^^^^^^^^^^^^^^^^
  79. .. versionadded:: 3.18
  80. This module defines the following :prop_tgt:`IMPORTED` target:
  81. ``BLAS::BLAS``
  82. The libraries to use for BLAS, if found.
  83. Result Variables
  84. ^^^^^^^^^^^^^^^^
  85. This module defines the following variables:
  86. ``BLAS_FOUND``
  87. library implementing the BLAS interface is found
  88. ``BLAS_LINKER_FLAGS``
  89. uncached list of required linker flags (excluding ``-l`` and ``-L``).
  90. ``BLAS_LIBRARIES``
  91. uncached list of libraries (using full path name) to link against
  92. to use BLAS (may be empty if compiler implicitly links BLAS)
  93. ``BLAS95_LIBRARIES``
  94. uncached list of libraries (using full path name) to link against
  95. to use BLAS95 interface
  96. ``BLAS95_FOUND``
  97. library implementing the BLAS95 interface is found
  98. .. note::
  99. C, CXX or Fortran must be enabled to detect a BLAS library.
  100. C or CXX must be enabled to use Intel Math Kernel Library (MKL).
  101. For example, to use Intel MKL libraries and/or Intel compiler:
  102. .. code-block:: cmake
  103. set(BLA_VENDOR Intel10_64lp)
  104. find_package(BLAS)
  105. Hints
  106. ^^^^^
  107. ``MKLROOT``
  108. .. versionadded:: 3.15
  109. Set this environment variable to a directory that contains an MKL
  110. installation, or add the directory to the dynamic library loader environment
  111. variable for your platform (``LIB``, ``DYLD_LIBRARY_PATH`` or
  112. ``LD_LIBRARY_PATH``).
  113. #]=======================================================================]
  114. # Check the language being used
  115. if(NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED))
  116. if(BLAS_FIND_REQUIRED)
  117. message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
  118. else()
  119. message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
  120. return()
  121. endif()
  122. endif()
  123. function(_add_blas_target)
  124. if(BLAS_FOUND AND NOT TARGET BLAS::BLAS)
  125. add_library(BLAS::BLAS INTERFACE IMPORTED)
  126. if(BLAS_LIBRARIES)
  127. set_target_properties(BLAS::BLAS PROPERTIES
  128. INTERFACE_LINK_LIBRARIES "${BLAS_LIBRARIES}"
  129. )
  130. endif()
  131. if(BLAS_LINKER_FLAGS)
  132. set_target_properties(BLAS::BLAS PROPERTIES
  133. INTERFACE_LINK_OPTIONS "${BLAS_LINKER_FLAGS}"
  134. )
  135. endif()
  136. endif()
  137. endfunction()
  138. if(CMAKE_Fortran_COMPILER_LOADED)
  139. include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
  140. else()
  141. include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
  142. endif()
  143. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  144. if(BLA_PREFER_PKGCONFIG)
  145. find_package(PkgConfig)
  146. pkg_check_modules(PKGC_BLAS blas)
  147. if(PKGC_BLAS_FOUND)
  148. set(BLAS_FOUND ${PKGC_BLAS_FOUND})
  149. set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}")
  150. _add_blas_target()
  151. return()
  152. endif()
  153. endif()
  154. # TODO: move this stuff to a separate module
  155. function(CHECK_BLAS_LIBRARIES LIBRARIES _prefix _name _flags _list _deps _addlibdir _subdirs)
  156. # This function checks for the existence of the combination of libraries
  157. # given by _list. If the combination is found, this checks whether can link
  158. # against that library combination using the name of a routine given by _name
  159. # using the linker flags given by _flags. If the combination of libraries is
  160. # found and passes the link test, ${LIBRARIES} is set to the list of complete
  161. # library paths that have been found. Otherwise, ${LIBRARIES} is set to FALSE.
  162. set(_libraries_work TRUE)
  163. set(_libraries)
  164. set(_combined_name)
  165. if(BLA_STATIC)
  166. if(WIN32)
  167. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  168. else()
  169. set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  170. endif()
  171. else()
  172. if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  173. # for ubuntu's libblas3gf and liblapack3gf packages
  174. set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
  175. endif()
  176. endif()
  177. set(_extaddlibdir "${_addlibdir}")
  178. if(WIN32)
  179. list(APPEND _extaddlibdir ENV LIB)
  180. elseif(APPLE)
  181. list(APPEND _extaddlibdir ENV DYLD_LIBRARY_PATH)
  182. else()
  183. list(APPEND _extaddlibdir ENV LD_LIBRARY_PATH)
  184. endif()
  185. list(APPEND _extaddlibdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
  186. foreach(_library ${_list})
  187. if(_library MATCHES "^-")
  188. # Respect linker flags as-is (required by MKL)
  189. list(APPEND _libraries "${_library}")
  190. else()
  191. string(REGEX REPLACE "[^A-Za-z0-9]" "_" _lib_var "${_library}")
  192. set(_combined_name ${_combined_name}_${_lib_var})
  193. if(NOT "${_deps}" STREQUAL "")
  194. set(_combined_name ${_combined_name}_deps)
  195. endif()
  196. if(_libraries_work)
  197. find_library(${_prefix}_${_lib_var}_LIBRARY
  198. NAMES ${_library}
  199. NAMES_PER_DIR
  200. PATHS ${_extaddlibdir}
  201. PATH_SUFFIXES ${_subdirs}
  202. )
  203. mark_as_advanced(${_prefix}_${_lib_var}_LIBRARY)
  204. list(APPEND _libraries ${${_prefix}_${_lib_var}_LIBRARY})
  205. set(_libraries_work ${${_prefix}_${_lib_var}_LIBRARY})
  206. endif()
  207. endif()
  208. endforeach()
  209. foreach(_flag ${_flags})
  210. string(REGEX REPLACE "[^A-Za-z0-9]" "_" _flag_var "${_flag}")
  211. set(_combined_name ${_combined_name}_${_flag_var})
  212. endforeach()
  213. if(_libraries_work)
  214. # Test this combination of libraries.
  215. set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${_libraries} ${_deps})
  216. set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY})
  217. if(CMAKE_Fortran_COMPILER_LOADED)
  218. check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
  219. else()
  220. check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
  221. endif()
  222. set(CMAKE_REQUIRED_LIBRARIES)
  223. set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
  224. endif()
  225. if(_libraries_work)
  226. if("${_list}" STREQUAL "")
  227. set(_libraries "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  228. else()
  229. list(APPEND _libraries ${_deps})
  230. endif()
  231. else()
  232. set(_libraries FALSE)
  233. endif()
  234. set(${LIBRARIES} "${_libraries}" PARENT_SCOPE)
  235. endfunction()
  236. set(BLAS_LINKER_FLAGS)
  237. set(BLAS_LIBRARIES)
  238. set(BLAS95_LIBRARIES)
  239. set(_blas_fphsa_req_var BLAS_LIBRARIES)
  240. if(NOT $ENV{BLA_VENDOR} STREQUAL "")
  241. set(BLA_VENDOR $ENV{BLA_VENDOR})
  242. else()
  243. if(NOT BLA_VENDOR)
  244. set(BLA_VENDOR "All")
  245. endif()
  246. endif()
  247. # Implicitly linked BLAS libraries?
  248. if(BLA_VENDOR STREQUAL "All")
  249. if(NOT BLAS_LIBRARIES)
  250. check_blas_libraries(
  251. BLAS_LIBRARIES
  252. BLAS
  253. sgemm
  254. ""
  255. ""
  256. ""
  257. ""
  258. ""
  259. )
  260. endif()
  261. if(BLAS_WORKS)
  262. set(_blas_fphsa_req_var BLAS_WORKS)
  263. endif()
  264. endif()
  265. # BLAS in the Intel MKL 10+ library?
  266. if(BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  267. if(NOT BLAS_LIBRARIES)
  268. if(CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
  269. # System-specific settings
  270. if(WIN32)
  271. if(BLA_STATIC)
  272. set(BLAS_mkl_DLL_SUFFIX "")
  273. else()
  274. set(BLAS_mkl_DLL_SUFFIX "_dll")
  275. endif()
  276. else()
  277. if(BLA_STATIC)
  278. set(BLAS_mkl_START_GROUP "-Wl,--start-group")
  279. set(BLAS_mkl_END_GROUP "-Wl,--end-group")
  280. else()
  281. set(BLAS_mkl_START_GROUP "")
  282. set(BLAS_mkl_END_GROUP "")
  283. endif()
  284. # Switch to GNU Fortran support layer if needed (but not on Apple, where MKL does not provide it)
  285. if(CMAKE_Fortran_COMPILER_LOADED AND CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND NOT APPLE)
  286. set(BLAS_mkl_INTFACE "gf")
  287. set(BLAS_mkl_THREADING "gnu")
  288. else()
  289. set(BLAS_mkl_INTFACE "intel")
  290. set(BLAS_mkl_THREADING "intel")
  291. endif()
  292. foreach(lang IN ITEMS C CXX Fortran)
  293. if(CMAKE_${lang}_COMPILER_LOADED)
  294. find_package(OpenMP COMPONENTS ${lang})
  295. if(${OpenMP_${lang}_FOUND})
  296. set(BLAS_mkl_OMP ${OpenMP_${lang}_LIBRARIES})
  297. break()
  298. endif()
  299. endif()
  300. endforeach()
  301. set(BLAS_mkl_LM "-lm")
  302. set(BLAS_mkl_LDL "-ldl")
  303. endif()
  304. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  305. find_package(Threads)
  306. else()
  307. find_package(Threads REQUIRED)
  308. endif()
  309. if(BLA_VENDOR MATCHES "_64ilp")
  310. set(BLAS_mkl_ILP_MODE "ilp64")
  311. else()
  312. set(BLAS_mkl_ILP_MODE "lp64")
  313. endif()
  314. set(BLAS_SEARCH_LIBS "")
  315. if(BLA_F95)
  316. set(BLAS_mkl_SEARCH_SYMBOL "sgemm_f95")
  317. set(_LIBRARIES BLAS95_LIBRARIES)
  318. if(WIN32)
  319. # Find the main file (32-bit or 64-bit)
  320. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  321. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  322. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  323. "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  324. endif()
  325. if(BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  326. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  327. "mkl_blas95_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX} mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  328. endif()
  329. # Add threading/sequential libs
  330. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  331. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  332. # old version
  333. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  334. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  335. # mkl >= 10.3
  336. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  337. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  338. endif()
  339. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  340. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  341. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  342. endif()
  343. # Cartesian product of the above
  344. foreach(MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  345. foreach(THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  346. list(APPEND BLAS_SEARCH_LIBS
  347. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  348. endforeach()
  349. endforeach()
  350. else()
  351. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  352. # old version
  353. list(APPEND BLAS_SEARCH_LIBS
  354. "mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  355. # mkl >= 10.3
  356. list(APPEND BLAS_SEARCH_LIBS
  357. "${BLAS_mkl_START_GROUP} mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP}")
  358. endif()
  359. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  360. # old version
  361. list(APPEND BLAS_SEARCH_LIBS
  362. "mkl_blas95 mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  363. # mkl >= 10.3
  364. list(APPEND BLAS_SEARCH_LIBS
  365. "${BLAS_mkl_START_GROUP} mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP}")
  366. endif()
  367. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  368. list(APPEND BLAS_SEARCH_LIBS
  369. "${BLAS_mkl_START_GROUP} mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core ${BLAS_mkl_END_GROUP}")
  370. endif()
  371. endif()
  372. else()
  373. set(BLAS_mkl_SEARCH_SYMBOL sgemm)
  374. set(_LIBRARIES BLAS_LIBRARIES)
  375. if(WIN32)
  376. # Find the main file (32-bit or 64-bit)
  377. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  378. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  379. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  380. "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  381. endif()
  382. if(BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  383. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  384. "mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  385. endif()
  386. # Add threading/sequential libs
  387. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  388. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  389. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  390. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  391. endif()
  392. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  393. # old version
  394. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  395. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  396. # mkl >= 10.3
  397. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  398. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  399. endif()
  400. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  401. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  402. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  403. endif()
  404. # Cartesian product of the above
  405. foreach(MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  406. foreach(THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  407. list(APPEND BLAS_SEARCH_LIBS
  408. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  409. endforeach()
  410. endforeach()
  411. else()
  412. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  413. # old version
  414. list(APPEND BLAS_SEARCH_LIBS
  415. "mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  416. # mkl >= 10.3
  417. list(APPEND BLAS_SEARCH_LIBS
  418. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP}")
  419. endif()
  420. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  421. # old version
  422. list(APPEND BLAS_SEARCH_LIBS
  423. "mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  424. # mkl >= 10.3
  425. list(APPEND BLAS_SEARCH_LIBS
  426. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP}")
  427. endif()
  428. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  429. list(APPEND BLAS_SEARCH_LIBS
  430. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core ${BLAS_mkl_END_GROUP}")
  431. endif()
  432. #older versions of intel mkl libs
  433. if(BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
  434. list(APPEND BLAS_SEARCH_LIBS
  435. "mkl")
  436. list(APPEND BLAS_SEARCH_LIBS
  437. "mkl_ia32")
  438. list(APPEND BLAS_SEARCH_LIBS
  439. "mkl_em64t")
  440. endif()
  441. endif()
  442. endif()
  443. if(BLA_VENDOR MATCHES "^Intel10_64_dyn$" OR BLA_VENDOR STREQUAL "All")
  444. # mkl >= 10.3 with single dynamic library
  445. list(APPEND BLAS_SEARCH_LIBS
  446. "mkl_rt")
  447. endif()
  448. # MKL uses a multitude of partially platform-specific subdirectories:
  449. if(BLA_VENDOR STREQUAL "Intel10_32")
  450. set(BLAS_mkl_ARCH_NAME "ia32")
  451. else()
  452. set(BLAS_mkl_ARCH_NAME "intel64")
  453. endif()
  454. if(WIN32)
  455. set(BLAS_mkl_OS_NAME "win")
  456. elseif(APPLE)
  457. set(BLAS_mkl_OS_NAME "mac")
  458. else()
  459. set(BLAS_mkl_OS_NAME "lin")
  460. endif()
  461. if(DEFINED ENV{MKLROOT})
  462. file(TO_CMAKE_PATH "$ENV{MKLROOT}" BLAS_mkl_MKLROOT)
  463. # If MKLROOT points to the subdirectory 'mkl', use the parent directory instead
  464. # so we can better detect other relevant libraries in 'compiler' or 'tbb':
  465. get_filename_component(BLAS_mkl_MKLROOT_LAST_DIR "${BLAS_mkl_MKLROOT}" NAME)
  466. if(BLAS_mkl_MKLROOT_LAST_DIR STREQUAL "mkl")
  467. get_filename_component(BLAS_mkl_MKLROOT "${BLAS_mkl_MKLROOT}" DIRECTORY)
  468. endif()
  469. endif()
  470. set(BLAS_mkl_LIB_PATH_SUFFIXES
  471. "compiler/lib" "compiler/lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}"
  472. "compiler/lib/${BLAS_mkl_ARCH_NAME}"
  473. "mkl/lib" "mkl/lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}"
  474. "mkl/lib/${BLAS_mkl_ARCH_NAME}"
  475. "lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}")
  476. foreach(IT ${BLAS_SEARCH_LIBS})
  477. string(REPLACE " " ";" SEARCH_LIBS ${IT})
  478. if(NOT ${_LIBRARIES})
  479. check_blas_libraries(
  480. ${_LIBRARIES}
  481. BLAS
  482. ${BLAS_mkl_SEARCH_SYMBOL}
  483. ""
  484. "${SEARCH_LIBS}"
  485. "${BLAS_mkl_OMP};${CMAKE_THREAD_LIBS_INIT};${BLAS_mkl_LM};${BLAS_mkl_LDL}"
  486. "${BLAS_mkl_MKLROOT}"
  487. "${BLAS_mkl_LIB_PATH_SUFFIXES}"
  488. )
  489. endif()
  490. endforeach()
  491. unset(BLAS_mkl_ILP_MODE)
  492. unset(BLAS_mkl_INTFACE)
  493. unset(BLAS_mkl_THREADING)
  494. unset(BLAS_mkl_OMP)
  495. unset(BLAS_mkl_DLL_SUFFIX)
  496. unset(BLAS_mkl_LM)
  497. unset(BLAS_mkl_LDL)
  498. unset(BLAS_mkl_MKLROOT)
  499. unset(BLAS_mkl_MKLROOT_LAST_DIR)
  500. unset(BLAS_mkl_ARCH_NAME)
  501. unset(BLAS_mkl_OS_NAME)
  502. unset(BLAS_mkl_LIB_PATH_SUFFIXES)
  503. endif()
  504. endif()
  505. endif()
  506. if(BLA_F95)
  507. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS95_LIBRARIES)
  508. set(BLAS95_FOUND ${BLAS_FOUND})
  509. if(BLAS_FOUND)
  510. set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
  511. endif()
  512. endif()
  513. # gotoblas? (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
  514. if(BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
  515. if(NOT BLAS_LIBRARIES)
  516. check_blas_libraries(
  517. BLAS_LIBRARIES
  518. BLAS
  519. sgemm
  520. ""
  521. "goto2"
  522. ""
  523. ""
  524. ""
  525. )
  526. endif()
  527. endif()
  528. # FlexiBLAS? (http://www.mpi-magdeburg.mpg.de/mpcsc/software/FlexiBLAS/)
  529. if(BLA_VENDOR STREQUAL "FlexiBLAS" OR BLA_VENDOR STREQUAL "All")
  530. if(NOT BLAS_LIBRARIES)
  531. check_blas_libraries(
  532. BLAS_LIBRARIES
  533. BLAS
  534. sgemm
  535. ""
  536. "flexiblas"
  537. ""
  538. ""
  539. ""
  540. )
  541. endif()
  542. endif()
  543. # OpenBLAS? (http://www.openblas.net)
  544. if(BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
  545. if(NOT BLAS_LIBRARIES)
  546. check_blas_libraries(
  547. BLAS_LIBRARIES
  548. BLAS
  549. sgemm
  550. ""
  551. "openblas"
  552. ""
  553. ""
  554. ""
  555. )
  556. endif()
  557. if(NOT BLAS_LIBRARIES AND (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED))
  558. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  559. find_package(Threads)
  560. else()
  561. find_package(Threads REQUIRED)
  562. endif()
  563. set(_threadlibs "${CMAKE_THREAD_LIBS_INIT}")
  564. if(BLA_STATIC)
  565. if (CMAKE_C_COMPILER_LOADED)
  566. find_package(OpenMP COMPONENTS C)
  567. list(PREPEND _threadlibs "${OpenMP_C_LIBRARIES}")
  568. elseif(CMAKE_CXX_COMPILER_LOADED)
  569. find_package(OpenMP COMPONENTS CXX)
  570. list(PREPEND _threadlibs "${OpenMP_CXX_LIBRARIES}")
  571. endif()
  572. endif()
  573. check_blas_libraries(
  574. BLAS_LIBRARIES
  575. BLAS
  576. sgemm
  577. ""
  578. "openblas"
  579. "${_threadlibs}"
  580. ""
  581. ""
  582. )
  583. unset(_threadlibs)
  584. endif()
  585. endif()
  586. # ArmPL blas library? (https://developer.arm.com/tools-and-software/server-and-hpc/compile/arm-compiler-for-linux/arm-performance-libraries)
  587. if(BLA_VENDOR MATCHES "Arm" OR BLA_VENDOR STREQUAL "All")
  588. # Check for 64bit Integer support
  589. if(BLA_VENDOR MATCHES "_ilp64")
  590. set(BLAS_armpl_LIB "armpl_ilp64")
  591. else()
  592. set(BLAS_armpl_LIB "armpl_lp64")
  593. endif()
  594. # Check for OpenMP support, VIA BLA_VENDOR of Arm_mp or Arm_ipl64_mp
  595. if(BLA_VENDOR MATCHES "_mp")
  596. set(BLAS_armpl_LIB "${BLAS_armpl_LIB}_mp")
  597. endif()
  598. if(NOT BLAS_LIBRARIES)
  599. check_blas_libraries(
  600. BLAS_LIBRARIES
  601. BLAS
  602. sgemm
  603. ""
  604. "${BLAS_armpl_LIB}"
  605. ""
  606. ""
  607. ""
  608. )
  609. endif()
  610. endif()
  611. # FLAME's blis library? (https://github.com/flame/blis)
  612. if(BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
  613. if(NOT BLAS_LIBRARIES)
  614. check_blas_libraries(
  615. BLAS_LIBRARIES
  616. BLAS
  617. sgemm
  618. ""
  619. "blis"
  620. ""
  621. ""
  622. ""
  623. )
  624. endif()
  625. endif()
  626. # BLAS in the ATLAS library? (http://math-atlas.sourceforge.net/)
  627. if(BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
  628. if(NOT BLAS_LIBRARIES)
  629. check_blas_libraries(
  630. BLAS_LIBRARIES
  631. BLAS
  632. dgemm
  633. ""
  634. "blas;f77blas;atlas"
  635. ""
  636. ""
  637. ""
  638. )
  639. endif()
  640. endif()
  641. # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
  642. if(BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
  643. if(NOT BLAS_LIBRARIES)
  644. check_blas_libraries(
  645. BLAS_LIBRARIES
  646. BLAS
  647. sgemm
  648. ""
  649. "sgemm;dgemm;blas"
  650. ""
  651. ""
  652. ""
  653. )
  654. endif()
  655. endif()
  656. # BLAS in Alpha CXML library?
  657. if(BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
  658. if(NOT BLAS_LIBRARIES)
  659. check_blas_libraries(
  660. BLAS_LIBRARIES
  661. BLAS
  662. sgemm
  663. ""
  664. "cxml"
  665. ""
  666. ""
  667. ""
  668. )
  669. endif()
  670. endif()
  671. # BLAS in Alpha DXML library? (now called CXML, see above)
  672. if(BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
  673. if(NOT BLAS_LIBRARIES)
  674. check_blas_libraries(
  675. BLAS_LIBRARIES
  676. BLAS
  677. sgemm
  678. ""
  679. "dxml"
  680. ""
  681. ""
  682. ""
  683. )
  684. endif()
  685. endif()
  686. # BLAS in Sun Performance library?
  687. if(BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
  688. if(NOT BLAS_LIBRARIES)
  689. check_blas_libraries(
  690. BLAS_LIBRARIES
  691. BLAS
  692. sgemm
  693. "-xlic_lib=sunperf"
  694. "sunperf;sunmath"
  695. ""
  696. ""
  697. ""
  698. )
  699. if(BLAS_LIBRARIES)
  700. set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
  701. endif()
  702. endif()
  703. endif()
  704. # BLAS in SCSL library? (SGI/Cray Scientific Library)
  705. if(BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
  706. if(NOT BLAS_LIBRARIES)
  707. check_blas_libraries(
  708. BLAS_LIBRARIES
  709. BLAS
  710. sgemm
  711. ""
  712. "scsl"
  713. ""
  714. ""
  715. ""
  716. )
  717. endif()
  718. endif()
  719. # BLAS in SGIMATH library?
  720. if(BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
  721. if(NOT BLAS_LIBRARIES)
  722. check_blas_libraries(
  723. BLAS_LIBRARIES
  724. BLAS
  725. sgemm
  726. ""
  727. "complib.sgimath"
  728. ""
  729. ""
  730. ""
  731. )
  732. endif()
  733. endif()
  734. # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
  735. if(BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
  736. if(NOT BLAS_LIBRARIES)
  737. check_blas_libraries(
  738. BLAS_LIBRARIES
  739. BLAS
  740. sgemm
  741. ""
  742. "essl;blas"
  743. ""
  744. ""
  745. ""
  746. )
  747. endif()
  748. endif()
  749. # BLAS in acml library?
  750. if(BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
  751. if(((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
  752. ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
  753. ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))
  754. )
  755. # try to find acml in "standard" paths
  756. if(WIN32)
  757. file(GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt")
  758. else()
  759. file(GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt")
  760. endif()
  761. if(WIN32)
  762. file(GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples")
  763. else()
  764. file(GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples")
  765. endif()
  766. list(GET _ACML_ROOT 0 _ACML_ROOT)
  767. list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
  768. if(_ACML_ROOT)
  769. get_filename_component(_ACML_ROOT ${_ACML_ROOT} PATH)
  770. if(SIZEOF_INTEGER EQUAL 8)
  771. set(_ACML_PATH_SUFFIX "_int64")
  772. else()
  773. set(_ACML_PATH_SUFFIX "")
  774. endif()
  775. if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
  776. set(_ACML_COMPILER32 "ifort32")
  777. set(_ACML_COMPILER64 "ifort64")
  778. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
  779. # 32-bit not supported
  780. set(_ACML_COMPILER64 "ifx")
  781. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro")
  782. set(_ACML_COMPILER32 "sun32")
  783. set(_ACML_COMPILER64 "sun64")
  784. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI")
  785. set(_ACML_COMPILER32 "pgi32")
  786. if(WIN32)
  787. set(_ACML_COMPILER64 "win64")
  788. else()
  789. set(_ACML_COMPILER64 "pgi64")
  790. endif()
  791. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Open64")
  792. # 32 bit builds not supported on Open64 but for code simplicity
  793. # We'll just use the same directory twice
  794. set(_ACML_COMPILER32 "open64_64")
  795. set(_ACML_COMPILER64 "open64_64")
  796. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG")
  797. set(_ACML_COMPILER32 "nag32")
  798. set(_ACML_COMPILER64 "nag64")
  799. else()
  800. set(_ACML_COMPILER32 "gfortran32")
  801. set(_ACML_COMPILER64 "gfortran64")
  802. endif()
  803. if(BLA_VENDOR STREQUAL "ACML_MP")
  804. set(_ACML_MP_LIB_DIRS
  805. "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
  806. "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib")
  807. else()
  808. set(_ACML_LIB_DIRS
  809. "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
  810. "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib")
  811. endif()
  812. endif()
  813. elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
  814. set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
  815. endif()
  816. if(BLA_VENDOR STREQUAL "ACML_MP")
  817. foreach(BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
  818. check_blas_libraries(
  819. BLAS_LIBRARIES
  820. BLAS
  821. sgemm
  822. "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS} ""
  823. )
  824. if(BLAS_LIBRARIES)
  825. break()
  826. endif()
  827. endforeach()
  828. elseif(BLA_VENDOR STREQUAL "ACML_GPU")
  829. foreach(BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
  830. check_blas_libraries(
  831. BLAS_LIBRARIES
  832. BLAS
  833. sgemm
  834. "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS} ""
  835. )
  836. if(BLAS_LIBRARIES)
  837. break()
  838. endif()
  839. endforeach()
  840. else()
  841. foreach(BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS})
  842. check_blas_libraries(
  843. BLAS_LIBRARIES
  844. BLAS
  845. sgemm
  846. "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS} ""
  847. )
  848. if(BLAS_LIBRARIES)
  849. break()
  850. endif()
  851. endforeach()
  852. endif()
  853. # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
  854. if(NOT BLAS_LIBRARIES)
  855. check_blas_libraries(
  856. BLAS_LIBRARIES
  857. BLAS
  858. sgemm
  859. ""
  860. "acml;acml_mv"
  861. ""
  862. ""
  863. ""
  864. )
  865. endif()
  866. if(NOT BLAS_LIBRARIES)
  867. check_blas_libraries(
  868. BLAS_LIBRARIES
  869. BLAS
  870. sgemm
  871. ""
  872. "acml_mp;acml_mv"
  873. ""
  874. ""
  875. ""
  876. )
  877. endif()
  878. if(NOT BLAS_LIBRARIES)
  879. check_blas_libraries(
  880. BLAS_LIBRARIES
  881. BLAS
  882. sgemm
  883. ""
  884. "acml;acml_mv;CALBLAS"
  885. ""
  886. ""
  887. ""
  888. )
  889. endif()
  890. endif() # ACML
  891. # Apple BLAS library?
  892. if(BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
  893. if(NOT BLAS_LIBRARIES)
  894. check_blas_libraries(
  895. BLAS_LIBRARIES
  896. BLAS
  897. dgemm
  898. ""
  899. "Accelerate"
  900. ""
  901. ""
  902. ""
  903. )
  904. endif()
  905. endif()
  906. # Apple NAS (vecLib) library?
  907. if(BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  908. if(NOT BLAS_LIBRARIES)
  909. check_blas_libraries(
  910. BLAS_LIBRARIES
  911. BLAS
  912. dgemm
  913. ""
  914. "vecLib"
  915. ""
  916. ""
  917. ""
  918. )
  919. endif()
  920. endif()
  921. # Elbrus Math Library?
  922. if(BLA_VENDOR MATCHES "EML" OR BLA_VENDOR STREQUAL "All")
  923. set(BLAS_EML_LIB "eml")
  924. # Check for OpenMP support, VIA BLA_VENDOR of eml_mt
  925. if(BLA_VENDOR MATCHES "_mt")
  926. set(BLAS_EML_LIB "${BLAS_EML_LIB}_mt")
  927. endif()
  928. if(NOT BLAS_LIBRARIES)
  929. check_blas_libraries(
  930. BLAS_LIBRARIES
  931. BLAS
  932. sgemm
  933. ""
  934. "${BLAS_EML_LIB}"
  935. ""
  936. ""
  937. ""
  938. )
  939. endif()
  940. endif()
  941. # Fujitsu SSL2 Library?
  942. if(NOT BLAS_LIBRARIES AND
  943. BLA_VENDOR MATCHES "Fujitsu_SSL2" OR BLA_VENDOR STREQUAL "All")
  944. if(BLA_VENDOR STREQUAL "Fujitsu_SSL2BLAMP")
  945. set(_ssl2_suffix BLAMP)
  946. else()
  947. set(_ssl2_suffix)
  948. endif()
  949. check_blas_libraries(
  950. BLAS_LIBRARIES
  951. BLAS
  952. sgemm
  953. "-SSL2${_ssl2_suffix}"
  954. ""
  955. ""
  956. ""
  957. ""
  958. )
  959. if(BLAS_LIBRARIES)
  960. set(BLAS_LINKER_FLAGS "-SSL2${_ssl2_suffix}")
  961. set(_blas_fphsa_req_var BLAS_LINKER_FLAGS)
  962. endif()
  963. unset(_ssl2_suffix)
  964. endif()
  965. # Generic BLAS library?
  966. if(BLA_VENDOR STREQUAL "Generic" OR
  967. BLA_VENDOR STREQUAL "NVHPC" OR
  968. BLA_VENDOR STREQUAL "All")
  969. if(NOT BLAS_LIBRARIES)
  970. check_blas_libraries(
  971. BLAS_LIBRARIES
  972. BLAS
  973. sgemm
  974. ""
  975. "blas"
  976. ""
  977. ""
  978. ""
  979. )
  980. endif()
  981. endif()
  982. # On compilers that implicitly link BLAS (i.e. CrayPrgEnv) we used a
  983. # placeholder for empty BLAS_LIBRARIES to get through our logic above.
  984. if(BLAS_LIBRARIES STREQUAL "BLAS_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  985. set(BLAS_LIBRARIES "")
  986. endif()
  987. if(NOT BLA_F95)
  988. find_package_handle_standard_args(BLAS REQUIRED_VARS ${_blas_fphsa_req_var})
  989. endif()
  990. _add_blas_target()