FindBLAS.cmake 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  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. #
  7. # Find BLAS library
  8. #
  9. # This module finds an installed fortran library that implements the
  10. # BLAS linear-algebra interface (see http://www.netlib.org/blas/). The
  11. # list of libraries searched for is taken from the autoconf macro file,
  12. # acx_blas.m4 (distributed at
  13. # http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
  14. #
  15. # This module sets the following variables:
  16. #
  17. # ::
  18. #
  19. # BLAS_FOUND - set to true if a library implementing the BLAS interface
  20. # is found
  21. # BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l
  22. # and -L).
  23. # BLAS_LIBRARIES - uncached list of libraries (using full path name) to
  24. # link against to use BLAS (may be empty if compiler implicitly links
  25. # BLAS)
  26. # BLAS95_LIBRARIES - uncached list of libraries (using full path name)
  27. # to link against to use BLAS95 interface
  28. # BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface
  29. # is found
  30. #
  31. # The following variables can be used to control this module:
  32. #
  33. # ::
  34. #
  35. # BLA_STATIC if set on this determines what kind of linkage we do (static)
  36. # BLA_VENDOR if set checks only the specified vendor, if not set checks
  37. # all the possibilities
  38. # BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK
  39. # BLA_PREFER_PKGCONFIG if set pkg-config will be used to search for a BLAS
  40. # library first and if one is found that is preferred
  41. #
  42. # List of vendors (BLA_VENDOR) valid in this module:
  43. #
  44. # * Goto
  45. # * OpenBLAS
  46. # * FLAME
  47. # * ATLAS PhiPACK
  48. # * CXML
  49. # * DXML
  50. # * SunPerf
  51. # * SCSL
  52. # * SGIMATH
  53. # * IBMESSL
  54. # * Intel10_32 (intel mkl v10 32 bit)
  55. # * Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model)
  56. # * Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)
  57. # * Intel (older versions of mkl 32 and 64 bit)
  58. # * ACML
  59. # * ACML_MP
  60. # * ACML_GPU
  61. # * Apple
  62. # * NAS
  63. # * Generic
  64. #
  65. # .. note::
  66. #
  67. # C/CXX should be enabled to use Intel mkl
  68. #
  69. include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
  70. include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
  71. include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)
  72. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  73. cmake_push_check_state()
  74. set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY})
  75. set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  76. # Check the language being used
  77. if( NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED) )
  78. if(BLAS_FIND_REQUIRED)
  79. message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
  80. else()
  81. message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
  82. return()
  83. endif()
  84. endif()
  85. if(BLA_PREFER_PKGCONFIG)
  86. find_package(PkgConfig)
  87. pkg_check_modules(PKGC_BLAS blas)
  88. if(PKGC_BLAS_FOUND)
  89. set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}")
  90. return()
  91. endif()
  92. endif()
  93. macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
  94. # This macro checks for the existence of the combination of fortran libraries
  95. # given by _list. If the combination is found, this macro checks (using the
  96. # Check_Fortran_Function_Exists macro) whether can link against that library
  97. # combination using the name of a routine given by _name using the linker
  98. # flags given by _flags. If the combination of libraries is found and passes
  99. # the link test, LIBRARIES is set to the list of complete library paths that
  100. # have been found. Otherwise, LIBRARIES is set to FALSE.
  101. # N.B. _prefix is the prefix applied to the names of all cached variables that
  102. # are generated internally and marked advanced by this macro.
  103. set(_libdir ${ARGN})
  104. set(_libraries_work TRUE)
  105. set(${LIBRARIES})
  106. set(_combined_name)
  107. if (NOT _libdir)
  108. if (WIN32)
  109. set(_libdir ENV LIB)
  110. elseif (APPLE)
  111. set(_libdir ENV DYLD_LIBRARY_PATH)
  112. else ()
  113. set(_libdir ENV LD_LIBRARY_PATH)
  114. endif ()
  115. endif ()
  116. foreach(_library ${_list})
  117. set(_combined_name ${_combined_name}_${_library})
  118. if(_libraries_work)
  119. if (BLA_STATIC)
  120. if (WIN32)
  121. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  122. endif ()
  123. if (APPLE)
  124. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  125. else ()
  126. set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  127. endif ()
  128. else ()
  129. if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
  130. # for ubuntu's libblas3gf and liblapack3gf packages
  131. set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
  132. endif ()
  133. endif ()
  134. find_library(${_prefix}_${_library}_LIBRARY
  135. NAMES ${_library}
  136. PATHS ${_libdir}
  137. )
  138. mark_as_advanced(${_prefix}_${_library}_LIBRARY)
  139. set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
  140. set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
  141. endif()
  142. endforeach()
  143. if(_libraries_work)
  144. # Test this combination of libraries.
  145. set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_thread})
  146. # message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
  147. if (CMAKE_Fortran_COMPILER_LOADED)
  148. check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
  149. else()
  150. check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
  151. endif()
  152. set(CMAKE_REQUIRED_LIBRARIES)
  153. mark_as_advanced(${_prefix}${_combined_name}_WORKS)
  154. set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
  155. endif()
  156. if(_libraries_work)
  157. if("${_list}" STREQUAL "")
  158. set(${LIBRARIES} "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  159. endif()
  160. else()
  161. set(${LIBRARIES} FALSE)
  162. endif()
  163. #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
  164. endmacro()
  165. set(BLAS_LINKER_FLAGS)
  166. set(BLAS_LIBRARIES)
  167. set(BLAS95_LIBRARIES)
  168. if (NOT $ENV{BLA_VENDOR} STREQUAL "")
  169. set(BLA_VENDOR $ENV{BLA_VENDOR})
  170. else ()
  171. if(NOT BLA_VENDOR)
  172. set(BLA_VENDOR "All")
  173. endif()
  174. endif ()
  175. if (BLA_VENDOR STREQUAL "All")
  176. if(NOT BLAS_LIBRARIES)
  177. # Implicitly linked BLAS libraries
  178. check_fortran_libraries(
  179. BLAS_LIBRARIES
  180. BLAS
  181. sgemm
  182. ""
  183. ""
  184. ""
  185. )
  186. endif()
  187. endif ()
  188. if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
  189. if(NOT BLAS_LIBRARIES)
  190. # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
  191. check_fortran_libraries(
  192. BLAS_LIBRARIES
  193. BLAS
  194. sgemm
  195. ""
  196. "goto2"
  197. ""
  198. )
  199. endif()
  200. endif ()
  201. if (BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
  202. if(NOT BLAS_LIBRARIES)
  203. # OpenBLAS (http://www.openblas.net)
  204. check_fortran_libraries(
  205. BLAS_LIBRARIES
  206. BLAS
  207. sgemm
  208. ""
  209. "openblas"
  210. ""
  211. )
  212. endif()
  213. endif ()
  214. if (BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
  215. if(NOT BLAS_LIBRARIES)
  216. # FLAME's blis library (https://github.com/flame/blis)
  217. check_fortran_libraries(
  218. BLAS_LIBRARIES
  219. BLAS
  220. sgemm
  221. ""
  222. "blis"
  223. ""
  224. )
  225. endif()
  226. endif ()
  227. if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
  228. if(NOT BLAS_LIBRARIES)
  229. # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
  230. check_fortran_libraries(
  231. BLAS_LIBRARIES
  232. BLAS
  233. dgemm
  234. ""
  235. "f77blas;atlas"
  236. ""
  237. )
  238. endif()
  239. endif ()
  240. # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
  241. if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
  242. if(NOT BLAS_LIBRARIES)
  243. check_fortran_libraries(
  244. BLAS_LIBRARIES
  245. BLAS
  246. sgemm
  247. ""
  248. "sgemm;dgemm;blas"
  249. ""
  250. )
  251. endif()
  252. endif ()
  253. # BLAS in Alpha CXML library?
  254. if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
  255. if(NOT BLAS_LIBRARIES)
  256. check_fortran_libraries(
  257. BLAS_LIBRARIES
  258. BLAS
  259. sgemm
  260. ""
  261. "cxml"
  262. ""
  263. )
  264. endif()
  265. endif ()
  266. # BLAS in Alpha DXML library? (now called CXML, see above)
  267. if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
  268. if(NOT BLAS_LIBRARIES)
  269. check_fortran_libraries(
  270. BLAS_LIBRARIES
  271. BLAS
  272. sgemm
  273. ""
  274. "dxml"
  275. ""
  276. )
  277. endif()
  278. endif ()
  279. # BLAS in Sun Performance library?
  280. if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
  281. if(NOT BLAS_LIBRARIES)
  282. check_fortran_libraries(
  283. BLAS_LIBRARIES
  284. BLAS
  285. sgemm
  286. "-xlic_lib=sunperf"
  287. "sunperf;sunmath"
  288. ""
  289. )
  290. if(BLAS_LIBRARIES)
  291. set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
  292. endif()
  293. endif()
  294. endif ()
  295. # BLAS in SCSL library? (SGI/Cray Scientific Library)
  296. if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
  297. if(NOT BLAS_LIBRARIES)
  298. check_fortran_libraries(
  299. BLAS_LIBRARIES
  300. BLAS
  301. sgemm
  302. ""
  303. "scsl"
  304. ""
  305. )
  306. endif()
  307. endif ()
  308. # BLAS in SGIMATH library?
  309. if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
  310. if(NOT BLAS_LIBRARIES)
  311. check_fortran_libraries(
  312. BLAS_LIBRARIES
  313. BLAS
  314. sgemm
  315. ""
  316. "complib.sgimath"
  317. ""
  318. )
  319. endif()
  320. endif ()
  321. # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
  322. if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
  323. if(NOT BLAS_LIBRARIES)
  324. check_fortran_libraries(
  325. BLAS_LIBRARIES
  326. BLAS
  327. sgemm
  328. ""
  329. "essl;blas"
  330. ""
  331. )
  332. endif()
  333. endif ()
  334. #BLAS in acml library?
  335. if (BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
  336. if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
  337. ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
  338. ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))
  339. )
  340. # try to find acml in "standard" paths
  341. if( WIN32 )
  342. file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" )
  343. else()
  344. file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" )
  345. endif()
  346. if( WIN32 )
  347. file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" )
  348. else()
  349. file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" )
  350. endif()
  351. list(GET _ACML_ROOT 0 _ACML_ROOT)
  352. list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
  353. if( _ACML_ROOT )
  354. get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH )
  355. if( SIZEOF_INTEGER EQUAL 8 )
  356. set( _ACML_PATH_SUFFIX "_int64" )
  357. else()
  358. set( _ACML_PATH_SUFFIX "" )
  359. endif()
  360. if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" )
  361. set( _ACML_COMPILER32 "ifort32" )
  362. set( _ACML_COMPILER64 "ifort64" )
  363. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" )
  364. set( _ACML_COMPILER32 "sun32" )
  365. set( _ACML_COMPILER64 "sun64" )
  366. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" )
  367. set( _ACML_COMPILER32 "pgi32" )
  368. if( WIN32 )
  369. set( _ACML_COMPILER64 "win64" )
  370. else()
  371. set( _ACML_COMPILER64 "pgi64" )
  372. endif()
  373. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" )
  374. # 32 bit builds not supported on Open64 but for code simplicity
  375. # We'll just use the same directory twice
  376. set( _ACML_COMPILER32 "open64_64" )
  377. set( _ACML_COMPILER64 "open64_64" )
  378. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" )
  379. set( _ACML_COMPILER32 "nag32" )
  380. set( _ACML_COMPILER64 "nag64" )
  381. else()
  382. set( _ACML_COMPILER32 "gfortran32" )
  383. set( _ACML_COMPILER64 "gfortran64" )
  384. endif()
  385. if( BLA_VENDOR STREQUAL "ACML_MP" )
  386. set(_ACML_MP_LIB_DIRS
  387. "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
  388. "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" )
  389. else()
  390. set(_ACML_LIB_DIRS
  391. "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
  392. "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" )
  393. endif()
  394. endif()
  395. elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
  396. set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
  397. endif()
  398. if( BLA_VENDOR STREQUAL "ACML_MP" )
  399. foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
  400. check_fortran_libraries (
  401. BLAS_LIBRARIES
  402. BLAS
  403. sgemm
  404. "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS}
  405. )
  406. if( BLAS_LIBRARIES )
  407. break()
  408. endif()
  409. endforeach()
  410. elseif( BLA_VENDOR STREQUAL "ACML_GPU" )
  411. foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
  412. check_fortran_libraries (
  413. BLAS_LIBRARIES
  414. BLAS
  415. sgemm
  416. "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS}
  417. )
  418. if( BLAS_LIBRARIES )
  419. break()
  420. endif()
  421. endforeach()
  422. else()
  423. foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} )
  424. check_fortran_libraries (
  425. BLAS_LIBRARIES
  426. BLAS
  427. sgemm
  428. "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS}
  429. )
  430. if( BLAS_LIBRARIES )
  431. break()
  432. endif()
  433. endforeach()
  434. endif()
  435. # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
  436. if(NOT BLAS_LIBRARIES)
  437. check_fortran_libraries(
  438. BLAS_LIBRARIES
  439. BLAS
  440. sgemm
  441. ""
  442. "acml;acml_mv"
  443. ""
  444. )
  445. endif()
  446. if(NOT BLAS_LIBRARIES)
  447. check_fortran_libraries(
  448. BLAS_LIBRARIES
  449. BLAS
  450. sgemm
  451. ""
  452. "acml_mp;acml_mv"
  453. ""
  454. )
  455. endif()
  456. if(NOT BLAS_LIBRARIES)
  457. check_fortran_libraries(
  458. BLAS_LIBRARIES
  459. BLAS
  460. sgemm
  461. ""
  462. "acml;acml_mv;CALBLAS"
  463. ""
  464. )
  465. endif()
  466. endif () # ACML
  467. # Apple BLAS library?
  468. if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
  469. if(NOT BLAS_LIBRARIES)
  470. check_fortran_libraries(
  471. BLAS_LIBRARIES
  472. BLAS
  473. dgemm
  474. ""
  475. "Accelerate"
  476. ""
  477. )
  478. endif()
  479. endif ()
  480. if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  481. if ( NOT BLAS_LIBRARIES )
  482. check_fortran_libraries(
  483. BLAS_LIBRARIES
  484. BLAS
  485. dgemm
  486. ""
  487. "vecLib"
  488. ""
  489. )
  490. endif ()
  491. endif ()
  492. # Generic BLAS library?
  493. if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
  494. if(NOT BLAS_LIBRARIES)
  495. check_fortran_libraries(
  496. BLAS_LIBRARIES
  497. BLAS
  498. sgemm
  499. ""
  500. "blas"
  501. ""
  502. )
  503. endif()
  504. endif ()
  505. #BLAS in intel mkl 10 library? (em64t 64bit)
  506. if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  507. if (NOT WIN32)
  508. set(LM "-lm")
  509. endif ()
  510. if (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
  511. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  512. find_package(Threads)
  513. else()
  514. find_package(Threads REQUIRED)
  515. endif()
  516. set(BLAS_SEARCH_LIBS "")
  517. if(BLA_F95)
  518. set(BLAS_mkl_SEARCH_SYMBOL SGEMM)
  519. set(_LIBRARIES BLAS95_LIBRARIES)
  520. if (WIN32)
  521. if (BLA_STATIC)
  522. set(BLAS_mkl_DLL_SUFFIX "")
  523. else()
  524. set(BLAS_mkl_DLL_SUFFIX "_dll")
  525. endif()
  526. # Find the main file (32-bit or 64-bit)
  527. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  528. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  529. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  530. "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  531. endif()
  532. if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
  533. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  534. "mkl_blas95_lp64${BLAS_mkl_DLL_SUFFIX} mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
  535. endif ()
  536. # Add threading/sequential libs
  537. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  538. if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  539. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  540. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  541. endif()
  542. if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  543. # old version
  544. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  545. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  546. # mkl >= 10.3
  547. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  548. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  549. endif()
  550. # Cartesian product of the above
  551. foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  552. foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  553. list(APPEND BLAS_SEARCH_LIBS
  554. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  555. endforeach()
  556. endforeach()
  557. else ()
  558. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  559. list(APPEND BLAS_SEARCH_LIBS
  560. "mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide")
  561. endif ()
  562. if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
  563. # old version
  564. list(APPEND BLAS_SEARCH_LIBS
  565. "mkl_blas95 mkl_intel_lp64 mkl_intel_thread mkl_core guide")
  566. # mkl >= 10.3
  567. if (CMAKE_C_COMPILER MATCHES ".+gcc")
  568. list(APPEND BLAS_SEARCH_LIBS
  569. "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core gomp")
  570. else ()
  571. list(APPEND BLAS_SEARCH_LIBS
  572. "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core iomp5")
  573. endif ()
  574. endif ()
  575. if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
  576. list(APPEND BLAS_SEARCH_LIBS
  577. "mkl_intel_lp64 mkl_sequential mkl_core")
  578. endif ()
  579. endif ()
  580. else ()
  581. set(BLAS_mkl_SEARCH_SYMBOL sgemm)
  582. set(_LIBRARIES BLAS_LIBRARIES)
  583. if (WIN32)
  584. if (BLA_STATIC)
  585. set(BLAS_mkl_DLL_SUFFIX "")
  586. else()
  587. set(BLAS_mkl_DLL_SUFFIX "_dll")
  588. endif()
  589. # Find the main file (32-bit or 64-bit)
  590. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  591. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  592. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  593. "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  594. endif()
  595. if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
  596. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  597. "mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
  598. endif ()
  599. # Add threading/sequential libs
  600. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  601. if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  602. # old version
  603. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  604. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  605. # mkl >= 10.3
  606. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  607. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  608. endif()
  609. if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  610. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  611. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  612. endif()
  613. # Cartesian product of the above
  614. foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  615. foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  616. list(APPEND BLAS_SEARCH_LIBS
  617. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  618. endforeach()
  619. endforeach()
  620. else ()
  621. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  622. list(APPEND BLAS_SEARCH_LIBS
  623. "mkl_intel mkl_intel_thread mkl_core guide")
  624. endif ()
  625. if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
  626. # old version
  627. list(APPEND BLAS_SEARCH_LIBS
  628. "mkl_intel_lp64 mkl_intel_thread mkl_core guide")
  629. # mkl >= 10.3
  630. if (CMAKE_C_COMPILER MATCHES ".+gcc")
  631. list(APPEND BLAS_SEARCH_LIBS
  632. "mkl_intel_lp64 mkl_gnu_thread mkl_core gomp")
  633. else ()
  634. list(APPEND BLAS_SEARCH_LIBS
  635. "mkl_intel_lp64 mkl_intel_thread mkl_core iomp5")
  636. endif ()
  637. endif ()
  638. if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
  639. list(APPEND BLAS_SEARCH_LIBS
  640. "mkl_intel_lp64 mkl_sequential mkl_core")
  641. endif ()
  642. #older vesions of intel mkl libs
  643. if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
  644. list(APPEND BLAS_SEARCH_LIBS
  645. "mkl")
  646. list(APPEND BLAS_SEARCH_LIBS
  647. "mkl_ia32")
  648. list(APPEND BLAS_SEARCH_LIBS
  649. "mkl_em64t")
  650. endif ()
  651. endif ()
  652. endif ()
  653. foreach (IT ${BLAS_SEARCH_LIBS})
  654. string(REPLACE " " ";" SEARCH_LIBS ${IT})
  655. if (NOT ${_LIBRARIES})
  656. check_fortran_libraries(
  657. ${_LIBRARIES}
  658. BLAS
  659. ${BLAS_mkl_SEARCH_SYMBOL}
  660. ""
  661. "${SEARCH_LIBS}"
  662. "${CMAKE_THREAD_LIBS_INIT};${LM}"
  663. )
  664. endif ()
  665. endforeach ()
  666. endif ()
  667. endif ()
  668. if(BLA_F95)
  669. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS95_LIBRARIES)
  670. set(BLAS95_FOUND ${BLAS_FOUND})
  671. if(BLAS_FOUND)
  672. set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
  673. endif()
  674. else()
  675. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS_LIBRARIES)
  676. endif()
  677. # On compilers that implicitly link BLAS (such as ftn, cc, and CC on Cray HPC machines)
  678. # we used a placeholder for empty BLAS_LIBRARIES to get through our logic above.
  679. if (BLAS_LIBRARIES STREQUAL "BLAS_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  680. set(BLAS_LIBRARIES "")
  681. endif()
  682. cmake_pop_check_state()
  683. set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})