FindBLAS.cmake 19 KB
Newer Older
1 2 3
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

4 5 6 7 8 9 10 11 12 13
#.rst:
# FindBLAS
# --------
#
# Find BLAS library
#
# This module finds an installed fortran library that implements the
# BLAS linear-algebra interface (see http://www.netlib.org/blas/).  The
# list of libraries searched for is taken from the autoconf macro file,
# acx_blas.m4 (distributed at
14 15 16
# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
#
# This module sets the following variables:
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#
# ::
#
#   BLAS_FOUND - set to true if a library implementing the BLAS interface
#     is found
#   BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l
#     and -L).
#   BLAS_LIBRARIES - uncached list of libraries (using full path name) to
#     link against to use BLAS
#   BLAS95_LIBRARIES - uncached list of libraries (using full path name)
#     to link against to use BLAS95 interface
#   BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface
#     is found
#   BLA_STATIC  if set on this determines what kind of linkage we do (static)
#   BLA_VENDOR  if set checks only the specified vendor, if not set checks
#      all the possibilities
#   BLA_F95     if set on tries to find the f95 interfaces for BLAS/LAPACK
#
# ######### ## List of vendors (BLA_VENDOR) valid in this module #
36 37 38
# Goto,OpenBLAS,ATLAS PhiPACK,CXML,DXML,SunPerf,SCSL,SGIMATH,IBMESSL,
# Intel10_32 (intel mkl v10 32 bit),Intel10_64lp (intel mkl v10 64 bit,
# lp thread model, lp64 model), # Intel10_64lp_seq (intel mkl v10 64
39 40 41
# bit,sequential code, lp64 model), # Intel( older versions of mkl 32
# and 64 bit), ACML,ACML_MP,ACML_GPU,Apple, NAS, Generic C/CXX should be
# enabled to use Intel mkl
42

43 44
include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
45 46 47
include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)
cmake_push_check_state()
set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY})
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
48

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
49 50
set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
51
# Check the language being used
52
if( NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED) )
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
53 54
  if(BLAS_FIND_REQUIRED)
    message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
55
  else()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
56 57
    message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
    return()
58 59
  endif()
endif()
60

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
61
macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
62 63 64 65 66 67 68 69 70 71 72
# This macro checks for the existence of the combination of fortran libraries
# given by _list.  If the combination is found, this macro checks (using the
# Check_Fortran_Function_Exists macro) whether can link against that library
# combination using the name of a routine given by _name using the linker
# flags given by _flags.  If the combination of libraries is found and passes
# the link test, LIBRARIES is set to the list of complete library paths that
# have been found.  Otherwise, LIBRARIES is set to FALSE.

# N.B. _prefix is the prefix applied to the names of all cached variables that
# are generated internally and marked advanced by this macro.

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
73
set(_libdir ${ARGN})
74

75 76 77
set(_libraries_work TRUE)
set(${LIBRARIES})
set(_combined_name)
78 79 80 81
if (NOT _libdir)
  if (WIN32)
    set(_libdir ENV LIB)
  elseif (APPLE)
82
    set(_libdir ENV DYLD_LIBRARY_PATH)
83
  else ()
84
    set(_libdir ENV LD_LIBRARY_PATH)
85 86
  endif ()
endif ()
87

88 89 90 91
foreach(_library ${_list})
  set(_combined_name ${_combined_name}_${_library})

  if(_libraries_work)
92 93
    if (BLA_STATIC)
      if (WIN32)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
94
        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
95
      endif ()
96
      if (APPLE)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
97
        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
98
      else ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
99
        set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
100 101
      endif ()
    else ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
102 103
      if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
        # for ubuntu's libblas3gf and liblapack3gf packages
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
104
        set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
105
      endif ()
106
    endif ()
107
    find_library(${_prefix}_${_library}_LIBRARY
108 109 110
      NAMES ${_library}
      PATHS ${_libdir}
      )
111 112 113
    mark_as_advanced(${_prefix}_${_library}_LIBRARY)
    set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
    set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
114 115
  endif()
endforeach()
116 117
if(_libraries_work)
  # Test this combination of libraries.
118
  set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_thread})
119
#  message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
120
  if (CMAKE_Fortran_COMPILER_LOADED)
121 122 123 124
    check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
  else()
    check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
  endif()
125 126 127
  set(CMAKE_REQUIRED_LIBRARIES)
  mark_as_advanced(${_prefix}${_combined_name}_WORKS)
  set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
128
endif()
129 130
if(NOT _libraries_work)
  set(${LIBRARIES} FALSE)
131
endif()
132
#message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
133
endmacro()
134 135 136 137

set(BLAS_LINKER_FLAGS)
set(BLAS_LIBRARIES)
set(BLAS95_LIBRARIES)
138
if (NOT $ENV{BLA_VENDOR} STREQUAL "")
139
  set(BLA_VENDOR $ENV{BLA_VENDOR})
140
else ()
141 142
  if(NOT BLA_VENDOR)
    set(BLA_VENDOR "All")
143 144
  endif()
endif ()
145

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
146 147
if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
148
  # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
149 150 151 152 153 154 155 156
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "goto2"
  ""
  )
157 158
 endif()
endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
159

160 161 162 163 164 165 166 167 168 169 170 171 172 173
if (BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  # OpenBLAS (http://www.openblas.net)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "openblas"
  ""
  )
 endif()
endif ()

174 175 176 177 178 179
if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
180
  dgemm
181
  ""
182
  "f77blas;atlas"
183 184
  ""
  )
185 186
 endif()
endif ()
187 188 189 190 191 192 193 194 195 196 197 198

# BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "sgemm;dgemm;blas"
  ""
  )
199 200
 endif()
endif ()
201 202 203 204 205 206 207 208 209 210 211 212

# BLAS in Alpha CXML library?
if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "cxml"
  ""
  )
213 214
 endif()
endif ()
215 216 217 218 219 220 221 222 223 224 225 226

# BLAS in Alpha DXML library? (now called CXML, see above)
if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "dxml"
  ""
  )
227 228
 endif()
endif ()
229 230 231 232 233 234 235 236 237 238 239 240 241 242

# BLAS in Sun Performance library?
if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  "-xlic_lib=sunperf"
  "sunperf;sunmath"
  ""
  )
  if(BLAS_LIBRARIES)
    set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
243 244 245
  endif()
 endif()
endif ()
246 247 248 249 250 251 252 253 254 255 256 257

# BLAS in SCSL library?  (SGI/Cray Scientific Library)
if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "scsl"
  ""
  )
258 259
 endif()
endif ()
260 261 262 263 264 265 266 267 268 269 270 271

# BLAS in SGIMATH library?
if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "complib.sgimath"
  ""
  )
272 273
 endif()
endif ()
274 275 276 277 278 279 280 281 282 283 284 285

# BLAS in IBM ESSL library? (requires generic BLAS lib, too)
if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "essl;blas"
  ""
  )
286 287
 endif()
endif ()
288 289

#BLAS in acml library?
290
if (BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
291 292 293 294 295
 if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
     ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
     ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))
   )
   # try to find acml in "standard" paths
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
296 297 298 299 300
   if( WIN32 )
    file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" )
   else()
    file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" )
   endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
301 302 303 304 305 306 307
   if( WIN32 )
    file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" )
   else()
    file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" )
   endif()
   list(GET _ACML_ROOT 0 _ACML_ROOT)
   list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
   if( _ACML_ROOT )
    get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH )
    if( SIZEOF_INTEGER EQUAL 8 )
     set( _ACML_PATH_SUFFIX "_int64" )
    else()
    set( _ACML_PATH_SUFFIX "" )
   endif()
   if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" )
    set( _ACML_COMPILER32 "ifort32" )
    set( _ACML_COMPILER64 "ifort64" )
   elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" )
    set( _ACML_COMPILER32 "sun32" )
    set( _ACML_COMPILER64 "sun64" )
   elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" )
    set( _ACML_COMPILER32 "pgi32" )
    if( WIN32 )
     set( _ACML_COMPILER64 "win64" )
    else()
     set( _ACML_COMPILER64 "pgi64" )
    endif()
   elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" )
    # 32 bit builds not supported on Open64 but for code simplicity
    # We'll just use the same directory twice
    set( _ACML_COMPILER32 "open64_64" )
    set( _ACML_COMPILER64 "open64_64" )
   elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" )
    set( _ACML_COMPILER32 "nag32" )
    set( _ACML_COMPILER64 "nag64" )
336
   else()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
337 338 339 340
    set( _ACML_COMPILER32 "gfortran32" )
    set( _ACML_COMPILER64 "gfortran64" )
   endif()

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
341
   if( BLA_VENDOR STREQUAL "ACML_MP" )
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
342 343 344
    set(_ACML_MP_LIB_DIRS
     "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
     "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" )
345
   else()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
346 347 348 349 350
    set(_ACML_LIB_DIRS
     "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
     "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" )
   endif()
  endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
351 352
 elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
   set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
353 354
 endif()

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
355 356
 if( BLA_VENDOR STREQUAL "ACML_MP" )
  foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
357 358 359 360 361 362 363
   check_fortran_libraries (
     BLAS_LIBRARIES
     BLAS
     sgemm
     "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS}
   )
   if( BLAS_LIBRARIES )
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
364 365 366
    break()
   endif()
  endforeach()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
367 368 369 370 371 372
 elseif( BLA_VENDOR STREQUAL "ACML_GPU" )
  foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
   check_fortran_libraries (
     BLAS_LIBRARIES
     BLAS
     sgemm
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
373
     "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS}
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
374 375 376 377 378
   )
   if( BLAS_LIBRARIES )
    break()
   endif()
  endforeach()
379
 else()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
380
  foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} )
381 382 383 384
   check_fortran_libraries (
     BLAS_LIBRARIES
     BLAS
     sgemm
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
385
     "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS}
386 387
   )
   if( BLAS_LIBRARIES )
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
388 389 390 391 392
    break()
   endif()
  endforeach()
 endif()

393
 # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
394 395 396 397 398 399
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
400 401 402
  "acml;acml_mv"
  ""
  )
403
 endif()
404 405 406 407 408 409 410
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "acml_mp;acml_mv"
411 412
  ""
  )
413
 endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
414 415 416 417 418 419 420 421 422
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "acml;acml_mv;CALBLAS"
  ""
  )
423
 endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
424
endif () # ACML
425 426 427 428 429 430 431

# Apple BLAS library?
if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
432
  dgemm
433 434 435 436
  ""
  "Accelerate"
  ""
  )
437 438
 endif()
endif ()
439 440 441 442 443 444

if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
 if ( NOT BLAS_LIBRARIES )
    check_fortran_libraries(
    BLAS_LIBRARIES
    BLAS
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
445
    dgemm
446 447 448 449
    ""
    "vecLib"
    ""
    )
450 451
 endif ()
endif ()
452 453 454 455 456 457 458 459 460 461 462
# Generic BLAS library?
if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
 if(NOT BLAS_LIBRARIES)
  check_fortran_libraries(
  BLAS_LIBRARIES
  BLAS
  sgemm
  ""
  "blas"
  ""
  )
463 464
 endif()
endif ()
465 466

#BLAS in intel mkl 10 library? (em64t 64bit)
467
if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
468 469 470
 if (NOT WIN32)
  set(LM "-lm")
 endif ()
471
 if (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
472 473
  if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
    find_package(Threads)
474
  else()
475
    find_package(Threads REQUIRED)
476
  endif()
477 478 479

  set(BLAS_SEARCH_LIBS "")

480
  if(BLA_F95)
481 482 483
    set(BLAS_mkl_SEARCH_SYMBOL SGEMM)
    set(_LIBRARIES BLAS95_LIBRARIES)
    if (WIN32)
484 485 486 487 488 489 490 491 492 493 494 495
      if (BLA_STATIC)
        set(BLAS_mkl_DLL_SUFFIX "")
      else()
        set(BLAS_mkl_DLL_SUFFIX "_dll")
      endif()

      # Find the main file (32-bit or 64-bit)
      set(BLAS_SEARCH_LIBS_WIN_MAIN "")
      if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
          "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
      endif()
496
      if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
497 498 499 500 501 502
        list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
          "mkl_blas95_lp64${BLAS_mkl_DLL_SUFFIX} mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
      endif ()

      # Add threading/sequential libs
      set(BLAS_SEARCH_LIBS_WIN_THREAD "")
503
      if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
504 505 506
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
      endif()
507
      if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
        # old version
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
        # mkl >= 10.3
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
      endif()

      # Cartesian product of the above
      foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
        foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
          list(APPEND BLAS_SEARCH_LIBS
            "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
        endforeach()
      endforeach()
523
    else ()
524 525 526 527 528 529 530 531 532 533
      if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide")
      endif ()
      if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
        # old version
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_blas95 mkl_intel_lp64 mkl_intel_thread mkl_core guide")

        # mkl >= 10.3
534
        if (CMAKE_C_COMPILER MATCHES ".+gcc")
535
          list(APPEND BLAS_SEARCH_LIBS
536
            "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core gomp")
537 538 539 540 541
        else ()
          list(APPEND BLAS_SEARCH_LIBS
            "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core iomp5")
        endif ()
      endif ()
542 543 544 545
      if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_intel_lp64 mkl_sequential mkl_core")
      endif ()
546
    endif ()
547
  else ()
548 549 550
    set(BLAS_mkl_SEARCH_SYMBOL sgemm)
    set(_LIBRARIES BLAS_LIBRARIES)
    if (WIN32)
551 552 553 554 555 556 557 558 559 560 561 562
      if (BLA_STATIC)
        set(BLAS_mkl_DLL_SUFFIX "")
      else()
        set(BLAS_mkl_DLL_SUFFIX "_dll")
      endif()

      # Find the main file (32-bit or 64-bit)
      set(BLAS_SEARCH_LIBS_WIN_MAIN "")
      if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
          "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
      endif()
563
      if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
564 565 566 567 568 569
        list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
          "mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
      endif ()

      # Add threading/sequential libs
      set(BLAS_SEARCH_LIBS_WIN_THREAD "")
570
      if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
571 572 573 574 575 576 577
        # old version
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
        # mkl >= 10.3
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
      endif()
578
      if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
579 580 581 582 583 584 585 586 587 588 589
        list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
          "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
      endif()

      # Cartesian product of the above
      foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
        foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
          list(APPEND BLAS_SEARCH_LIBS
            "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
        endforeach()
      endforeach()
590
    else ()
591 592 593 594 595 596 597 598 599 600 601
      if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_intel mkl_intel_thread mkl_core guide")
      endif ()
      if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")

        # old version
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_intel_lp64 mkl_intel_thread mkl_core guide")

        # mkl >= 10.3
602
        if (CMAKE_C_COMPILER MATCHES ".+gcc")
603
          list(APPEND BLAS_SEARCH_LIBS
604
            "mkl_intel_lp64 mkl_gnu_thread mkl_core gomp")
605 606 607 608 609
        else ()
          list(APPEND BLAS_SEARCH_LIBS
            "mkl_intel_lp64 mkl_intel_thread mkl_core iomp5")
        endif ()
      endif ()
610 611 612 613
      if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_intel_lp64 mkl_sequential mkl_core")
      endif ()
614 615 616 617 618 619 620 621 622 623

      #older vesions of intel mkl libs
      if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_ia32")
        list(APPEND BLAS_SEARCH_LIBS
          "mkl_em64t")
      endif ()
624 625
    endif ()
  endif ()
626 627 628 629 630

  foreach (IT ${BLAS_SEARCH_LIBS})
    string(REPLACE " " ";" SEARCH_LIBS ${IT})
    if (${_LIBRARIES})
    else ()
631
      check_fortran_libraries(
632 633 634 635 636 637 638 639 640 641
        ${_LIBRARIES}
        BLAS
        ${BLAS_mkl_SEARCH_SYMBOL}
        ""
        "${SEARCH_LIBS}"
        "${CMAKE_THREAD_LIBS_INIT};${LM}"
        )
    endif ()
  endforeach ()

642 643
 endif ()
endif ()
644 645 646 647 648


if(BLA_F95)
 if(BLAS95_LIBRARIES)
    set(BLAS95_FOUND TRUE)
649
  else()
650
    set(BLAS95_FOUND FALSE)
651
  endif()
652 653 654 655

  if(NOT BLAS_FIND_QUIETLY)
    if(BLAS95_FOUND)
      message(STATUS "A library with BLAS95 API found.")
656
    else()
657 658 659
      if(BLAS_FIND_REQUIRED)
        message(FATAL_ERROR
        "A required library with BLAS95 API not found. Please specify library location.")
660
      else()
661 662
        message(STATUS
        "A library with BLAS95 API not found. Please specify library location.")
663 664 665
      endif()
    endif()
  endif()
666 667
  set(BLAS_FOUND TRUE)
  set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
668
else()
669 670
  if(BLAS_LIBRARIES)
    set(BLAS_FOUND TRUE)
671
  else()
672
    set(BLAS_FOUND FALSE)
673
  endif()
674 675 676 677

  if(NOT BLAS_FIND_QUIETLY)
    if(BLAS_FOUND)
      message(STATUS "A library with BLAS API found.")
678
    else()
679 680 681 682
      if(BLAS_FIND_REQUIRED)
        message(FATAL_ERROR
        "A required library with BLAS API not found. Please specify library location."
        )
683
      else()
684 685 686
        message(STATUS
        "A library with BLAS API not found. Please specify library location."
        )
687 688 689 690
      endif()
    endif()
  endif()
endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
691

692
cmake_pop_check_state()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
693
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})