FindBLAS.cmake 31 KB

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