FindBLAS.cmake 19 KB

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