Home | History | Annotate | Download | only in cmake
      1 ###
      2 #
      3 # @copyright (c) 2009-2014 The University of Tennessee and The University
      4 #                          of Tennessee Research Foundation.
      5 #                          All rights reserved.
      6 # @copyright (c) 2012-2016 Inria. All rights reserved.
      7 # @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
      8 #
      9 ###
     10 #
     11 # - Find BLAS library
     12 # This module finds an installed fortran library that implements the BLAS
     13 # linear-algebra interface (see http://www.netlib.org/blas/).
     14 # The list of libraries searched for is taken
     15 # from the autoconf macro file, acx_blas.m4 (distributed at
     16 # http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
     17 #
     18 # This module sets the following variables:
     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_COMPILER_FLAGS - uncached list of required compiler flags (including -I for mkl headers).
     24 #  BLAS_LIBRARIES - uncached list of libraries (using full path name) to
     25 #    link against to use 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 #  BLA_STATIC  if set on this determines what kind of linkage we do (static)
     31 #  BLA_VENDOR  if set checks only the specified vendor, if not set checks
     32 #     all the possibilities
     33 #  BLAS_VENDOR_FOUND stores the BLAS vendor found 
     34 #  BLA_F95     if set on tries to find the f95 interfaces for BLAS/LAPACK
     35 # The user can give specific paths where to find the libraries adding cmake
     36 # options at configure (ex: cmake path/to/project -DBLAS_DIR=path/to/blas):
     37 #  BLAS_DIR            - Where to find the base directory of blas
     38 #  BLAS_INCDIR         - Where to find the header files
     39 #  BLAS_LIBDIR         - Where to find the library files
     40 # The module can also look for the following environment variables if paths
     41 # are not given as cmake variable: BLAS_DIR, BLAS_INCDIR, BLAS_LIBDIR
     42 # For MKL case and if no paths are given as hints, we will try to use the MKLROOT
     43 # environment variable
     44 #  BLAS_VERBOSE Print some additional information during BLAS libraries detection
     45 ##########
     46 ### List of vendors (BLA_VENDOR) valid in this module
     47 ########## List of vendors (BLA_VENDOR) valid in this module
     48 ##  Open (for OpenBlas), Eigen (for EigenBlas), Goto, ATLAS PhiPACK,
     49 ## CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, IBMESSLMT
     50 ##  Intel10_32 (intel mkl v10 32 bit), Intel10_64lp (intel mkl v10 64 bit,lp thread model, lp64 model),
     51 ##  Intel10_64lp_seq (intel mkl v10 64 bit,sequential code, lp64 model),
     52 ##  Intel( older versions of mkl 32 and 64 bit),
     53 ## ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic
     54 # C/CXX should be enabled to use Intel mkl
     55 ###
     56 # We handle different modes to find the dependency
     57 #
     58 # - Detection if already installed on the system
     59 #   - BLAS libraries can be detected from different ways
     60 #     Here is the order of precedence:
     61 #     1) we look in cmake variable BLAS_LIBDIR or BLAS_DIR (we guess the libdirs) if defined
     62 #     2) we look in environment variable BLAS_LIBDIR or BLAS_DIR (we guess the libdirs) if defined
     63 #     3) we look in common environnment variables depending on the system (INCLUDE, C_INCLUDE_PATH, CPATH - LIB, DYLD_LIBRARY_PATH, LD_LIBRARY_PATH)
     64 #     4) we look in common system paths depending on the system, see for example paths contained in the following cmake variables:
     65 #       - CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES, CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
     66 #       - CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES, CMAKE_C_IMPLICIT_LINK_DIRECTORIES
     67 #
     68 
     69 #=============================================================================
     70 # Copyright 2007-2009 Kitware, Inc.
     71 #
     72 # Distributed under the OSI-approved BSD License (the "License");
     73 # see accompanying file Copyright.txt for details.
     74 #
     75 # This software is distributed WITHOUT ANY WARRANTY; without even the
     76 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     77 # See the License for more information.
     78 #=============================================================================
     79 # (To distribute this file outside of CMake, substitute the full
     80 #  License text for the above reference.)
     81 
     82 ## Some macros to print status when search for headers and libs
     83 # This macro informs why the _lib_to_find file has not been found
     84 macro(Print_Find_Library_Blas_Status _libname _lib_to_find)
     85 
     86   # save _libname upper/lower case
     87   string(TOUPPER ${_libname} LIBNAME)
     88   string(TOLOWER ${_libname} libname)
     89 
     90   # print status
     91   #message(" ")
     92   if(${LIBNAME}_LIBDIR)
     93     message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}"
     94       "has not been found in ${ARGN}${ColourReset}")
     95   else()
     96     if(${LIBNAME}_DIR)
     97       message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}"
     98 	"has not been found in ${ARGN}${ColourReset}")
     99     else()
    100       message("${Yellow}${_lib_to_find} not found."
    101 	"Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR"
    102 	"are defined so that we look for ${_lib_to_find} in"
    103 	"system paths (Linux: LD_LIBRARY_PATH, Windows: LIB,"
    104 	"Mac: DYLD_LIBRARY_PATH,"
    105 	"CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES,"
    106 	"CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}")
    107       if(_lib_env)
    108 	message("${Yellow}${_lib_to_find} has not been found in"
    109 	  "${_lib_env}${ColourReset}")
    110       endif()
    111     endif()
    112   endif()
    113   message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n"
    114     "- Option 1: Provide the Installation directory of BLAS library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n"
    115     "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n"
    116     "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
    117     "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}")
    118 
    119 endmacro()
    120 
    121 # This macro informs why the _lib_to_find file has not been found
    122 macro(Print_Find_Library_Blas_CheckFunc_Status _name)
    123 
    124   # save _libname upper/lower case
    125   string(TOUPPER ${_name} FUNCNAME)
    126   string(TOLOWER ${_name} funcname)
    127 
    128   # print status
    129   #message(" ")
    130   message("${Red}Libs have been found but check of symbol ${_name} failed "
    131     "with following libraries ${ARGN}${ColourReset}")
    132   message("${BoldRed}Please open your error file CMakeFiles/CMakeError.log"
    133     "to figure out why it fails${ColourReset}")
    134   #message(" ")
    135 
    136 endmacro()
    137 
    138 if (NOT BLAS_FOUND)
    139   set(BLAS_DIR "" CACHE PATH "Installation directory of BLAS library")
    140   if (NOT BLAS_FIND_QUIETLY)
    141     message(STATUS "A cache variable, namely BLAS_DIR, has been set to specify the install directory of BLAS")
    142   endif()
    143 endif()
    144 
    145 option(BLAS_VERBOSE "Print some additional information during BLAS libraries detection" OFF)
    146 mark_as_advanced(BLAS_VERBOSE)
    147 
    148 include(CheckFunctionExists)
    149 include(CheckFortranFunctionExists)
    150 
    151 set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
    152 
    153 # Check the language being used
    154 get_property( _LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES )
    155 if( _LANGUAGES_ MATCHES Fortran )
    156   set( _CHECK_FORTRAN TRUE )
    157 elseif( (_LANGUAGES_ MATCHES C) OR (_LANGUAGES_ MATCHES CXX) )
    158   set( _CHECK_FORTRAN FALSE )
    159 else()
    160   if(BLAS_FIND_REQUIRED)
    161     message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
    162   else()
    163     message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
    164     return()
    165   endif()
    166 endif()
    167 
    168 macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
    169   # This macro checks for the existence of the combination of fortran libraries
    170   # given by _list.  If the combination is found, this macro checks (using the
    171   # Check_Fortran_Function_Exists macro) whether can link against that library
    172   # combination using the name of a routine given by _name using the linker
    173   # flags given by _flags.  If the combination of libraries is found and passes
    174   # the link test, LIBRARIES is set to the list of complete library paths that
    175   # have been found.  Otherwise, LIBRARIES is set to FALSE.
    176 
    177   # N.B. _prefix is the prefix applied to the names of all cached variables that
    178   # are generated internally and marked advanced by this macro.
    179 
    180   set(_libdir ${ARGN})
    181 
    182   set(_libraries_work TRUE)
    183   set(${LIBRARIES})
    184   set(_combined_name)
    185   set(ENV_MKLROOT "$ENV{MKLROOT}")
    186   set(ENV_BLAS_DIR "$ENV{BLAS_DIR}")
    187   set(ENV_BLAS_LIBDIR "$ENV{BLAS_LIBDIR}")
    188   if (NOT _libdir)
    189     if (BLAS_LIBDIR)
    190       list(APPEND _libdir "${BLAS_LIBDIR}")
    191     elseif (BLAS_DIR)
    192       list(APPEND _libdir "${BLAS_DIR}")
    193       list(APPEND _libdir "${BLAS_DIR}/lib")
    194       if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
    195 	list(APPEND _libdir "${BLAS_DIR}/lib64")
    196 	list(APPEND _libdir "${BLAS_DIR}/lib/intel64")
    197       else()
    198 	list(APPEND _libdir "${BLAS_DIR}/lib32")
    199 	list(APPEND _libdir "${BLAS_DIR}/lib/ia32")
    200       endif()
    201     elseif(ENV_BLAS_LIBDIR)
    202       list(APPEND _libdir "${ENV_BLAS_LIBDIR}")
    203     elseif(ENV_BLAS_DIR)
    204       list(APPEND _libdir "${ENV_BLAS_DIR}")
    205       list(APPEND _libdir "${ENV_BLAS_DIR}/lib")
    206       if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
    207 	list(APPEND _libdir "${ENV_BLAS_DIR}/lib64")
    208 	list(APPEND _libdir "${ENV_BLAS_DIR}/lib/intel64")
    209       else()
    210 	list(APPEND _libdir "${ENV_BLAS_DIR}/lib32")
    211 	list(APPEND _libdir "${ENV_BLAS_DIR}/lib/ia32")
    212       endif()
    213     else()
    214       if (ENV_MKLROOT)
    215 	list(APPEND _libdir "${ENV_MKLROOT}/lib")
    216 	if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
    217 	  list(APPEND _libdir "${ENV_MKLROOT}/lib64")
    218 	  list(APPEND _libdir "${ENV_MKLROOT}/lib/intel64")
    219 	else()
    220 	  list(APPEND _libdir "${ENV_MKLROOT}/lib32")
    221 	  list(APPEND _libdir "${ENV_MKLROOT}/lib/ia32")
    222 	endif()
    223       endif()
    224       if (WIN32)
    225 	string(REPLACE ":" ";" _libdir2 "$ENV{LIB}")
    226       elseif (APPLE)
    227 	string(REPLACE ":" ";" _libdir2 "$ENV{DYLD_LIBRARY_PATH}")
    228       else ()
    229 	string(REPLACE ":" ";" _libdir2 "$ENV{LD_LIBRARY_PATH}")
    230       endif ()
    231       list(APPEND _libdir "${_libdir2}")
    232       list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
    233       list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
    234     endif()
    235   endif ()
    236 
    237   if (BLAS_VERBOSE)
    238     message("${Cyan}Try to find BLAS libraries: ${_list}")
    239   endif ()
    240 
    241   foreach(_library ${_list})
    242     set(_combined_name ${_combined_name}_${_library})
    243 
    244     if(_libraries_work)
    245       if (BLA_STATIC)
    246 	if (WIN32)
    247 	  set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
    248 	endif ()
    249 	if (APPLE)
    250 	  set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
    251 	else ()
    252 	  set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
    253 	endif ()
    254       else ()
    255 	if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
    256 	  # for ubuntu's libblas3gf and liblapack3gf packages
    257 	  set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
    258 	endif ()
    259       endif ()
    260       find_library(${_prefix}_${_library}_LIBRARY
    261 	NAMES ${_library}
    262 	HINTS ${_libdir}
    263 	NO_DEFAULT_PATH
    264 	)
    265       mark_as_advanced(${_prefix}_${_library}_LIBRARY)
    266       # Print status if not found
    267       # -------------------------
    268       if (NOT ${_prefix}_${_library}_LIBRARY AND NOT BLAS_FIND_QUIETLY AND BLAS_VERBOSE)
    269 	Print_Find_Library_Blas_Status(blas ${_library} ${_libdir})
    270       endif ()
    271       set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
    272       set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
    273     endif(_libraries_work)
    274   endforeach(_library ${_list})
    275 
    276   if(_libraries_work)
    277     # Test this combination of libraries.
    278     if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND BLA_STATIC)
    279       list(INSERT ${LIBRARIES} 0 "-Wl,--start-group")
    280       list(APPEND ${LIBRARIES} "-Wl,--end-group")
    281     endif()
    282     set(CMAKE_REQUIRED_LIBRARIES "${_flags};${${LIBRARIES}};${_thread}")
    283     set(CMAKE_REQUIRED_FLAGS "${BLAS_COMPILER_FLAGS}")
    284     if (BLAS_VERBOSE)
    285       message("${Cyan}BLAS libs found for BLA_VENDOR ${BLA_VENDOR}."
    286 	"Try to compile symbol ${_name} with following libraries:"
    287 	"${CMAKE_REQUIRED_LIBRARIES}")
    288     endif ()
    289     if(NOT BLAS_FOUND)
    290       unset(${_prefix}${_combined_name}_WORKS CACHE)
    291     endif()
    292     if (_CHECK_FORTRAN)
    293       if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
    294 	string(REPLACE "mkl_intel_lp64" "mkl_gf_lp64" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
    295 	string(REPLACE "mkl_intel_ilp64" "mkl_gf_ilp64" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
    296       endif()
    297       check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
    298     else()
    299       check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
    300     endif()
    301     mark_as_advanced(${_prefix}${_combined_name}_WORKS)
    302     set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
    303     # Print status if not found
    304     # -------------------------
    305     if (NOT _libraries_work AND NOT BLAS_FIND_QUIETLY AND BLAS_VERBOSE)
    306       Print_Find_Library_Blas_CheckFunc_Status(${_name} ${CMAKE_REQUIRED_LIBRARIES})
    307     endif ()
    308     set(CMAKE_REQUIRED_LIBRARIES)
    309   endif()
    310 
    311   if(_libraries_work)
    312     set(${LIBRARIES} ${${LIBRARIES}} ${_thread})
    313   else(_libraries_work)
    314     set(${LIBRARIES} FALSE)
    315   endif(_libraries_work)
    316 
    317 endmacro(Check_Fortran_Libraries)
    318 
    319 
    320 set(BLAS_LINKER_FLAGS)
    321 set(BLAS_LIBRARIES)
    322 set(BLAS95_LIBRARIES)
    323 if ($ENV{BLA_VENDOR} MATCHES ".+")
    324   set(BLA_VENDOR $ENV{BLA_VENDOR})
    325 else ()
    326   if(NOT BLA_VENDOR)
    327     set(BLA_VENDOR "All")
    328   endif()
    329 endif ()
    330 
    331 #BLAS in intel mkl 10 library? (em64t 64bit)
    332 if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
    333 
    334   if(NOT BLAS_LIBRARIES OR BLA_VENDOR MATCHES "Intel*")
    335     # Looking for include
    336     # -------------------
    337 
    338     # Add system include paths to search include
    339     # ------------------------------------------
    340     unset(_inc_env)
    341     set(ENV_MKLROOT "$ENV{MKLROOT}")
    342     set(ENV_BLAS_DIR "$ENV{BLAS_DIR}")
    343     set(ENV_BLAS_INCDIR "$ENV{BLAS_INCDIR}")
    344     if(ENV_BLAS_INCDIR)
    345       list(APPEND _inc_env "${ENV_BLAS_INCDIR}")
    346     elseif(ENV_BLAS_DIR)
    347       list(APPEND _inc_env "${ENV_BLAS_DIR}")
    348       list(APPEND _inc_env "${ENV_BLAS_DIR}/include")
    349     else()
    350       if (ENV_MKLROOT)
    351 	list(APPEND _inc_env "${ENV_MKLROOT}/include")
    352       endif()
    353       # system variables
    354       if(WIN32)
    355 	string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}")
    356 	list(APPEND _inc_env "${_path_env}")
    357       else()
    358 	string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}")
    359 	list(APPEND _inc_env "${_path_env}")
    360 	string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}")
    361 	list(APPEND _inc_env "${_path_env}")
    362 	string(REPLACE ":" ";" _path_env "$ENV{CPATH}")
    363 	list(APPEND _inc_env "${_path_env}")
    364 	string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}")
    365 	list(APPEND _inc_env "${_path_env}")
    366       endif()
    367     endif()
    368     list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}")
    369     list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}")
    370     list(REMOVE_DUPLICATES _inc_env)
    371 
    372     # set paths where to look for
    373     set(PATH_TO_LOOK_FOR "${_inc_env}")
    374 
    375     # Try to find the fftw header in the given paths
    376     # -------------------------------------------------
    377     # call cmake macro to find the header path
    378     if(BLAS_INCDIR)
    379       set(BLAS_mkl.h_DIRS "BLAS_mkl.h_DIRS-NOTFOUND")
    380       find_path(BLAS_mkl.h_DIRS
    381 	NAMES mkl.h
    382 	HINTS ${BLAS_INCDIR})
    383     else()
    384       if(BLAS_DIR)
    385 	set(BLAS_mkl.h_DIRS "BLAS_mkl.h_DIRS-NOTFOUND")
    386 	find_path(BLAS_mkl.h_DIRS
    387 	  NAMES mkl.h
    388 	  HINTS ${BLAS_DIR}
    389 	  PATH_SUFFIXES "include")
    390       else()
    391 	set(BLAS_mkl.h_DIRS "BLAS_mkl.h_DIRS-NOTFOUND")
    392 	find_path(BLAS_mkl.h_DIRS
    393 	  NAMES mkl.h
    394 	  HINTS ${PATH_TO_LOOK_FOR})
    395       endif()
    396     endif()
    397     mark_as_advanced(BLAS_mkl.h_DIRS)
    398 
    399     # If found, add path to cmake variable
    400     # ------------------------------------
    401     if (BLAS_mkl.h_DIRS)
    402       set(BLAS_INCLUDE_DIRS "${BLAS_mkl.h_DIRS}")
    403     else ()
    404       set(BLAS_INCLUDE_DIRS "BLAS_INCLUDE_DIRS-NOTFOUND")
    405       if(NOT BLAS_FIND_QUIETLY)
    406 	message(STATUS "Looking for BLAS -- mkl.h not found")
    407       endif()
    408     endif()
    409 
    410     if (WIN32)
    411       string(REPLACE ":" ";" _libdir "$ENV{LIB}")
    412     elseif (APPLE)
    413       string(REPLACE ":" ";" _libdir "$ENV{DYLD_LIBRARY_PATH}")
    414     else ()
    415       string(REPLACE ":" ";" _libdir "$ENV{LD_LIBRARY_PATH}")
    416     endif ()
    417     list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")
    418     list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
    419     # libiomp5
    420     # --------
    421     set(OMP_iomp5_LIBRARY "OMP_iomp5_LIBRARY-NOTFOUND")
    422     find_library(OMP_iomp5_LIBRARY
    423       NAMES iomp5
    424       HINTS ${_libdir}
    425       )
    426     mark_as_advanced(OMP_iomp5_LIBRARY)
    427     set(OMP_LIB "")
    428     # libgomp
    429     # -------
    430     set(OMP_gomp_LIBRARY "OMP_gomp_LIBRARY-NOTFOUND")
    431     find_library(OMP_gomp_LIBRARY
    432       NAMES gomp
    433       HINTS ${_libdir}
    434       )
    435     mark_as_advanced(OMP_gomp_LIBRARY)
    436     # choose one or another depending on the compilo
    437     if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    438       if (OMP_gomp_LIBRARY)
    439 	set(OMP_LIB "${OMP_gomp_LIBRARY}")
    440       endif()
    441     else(CMAKE_C_COMPILER_ID STREQUAL "Intel")
    442       if (OMP_iomp5_LIBRARY)
    443 	set(OMP_LIB "${OMP_iomp5_LIBRARY}")
    444       endif()
    445     endif()
    446 
    447     if (UNIX AND NOT WIN32)
    448       # m
    449       find_library(M_LIBRARY
    450 	NAMES m
    451 	HINTS ${_libdir})
    452       mark_as_advanced(M_LIBRARY)
    453       if(M_LIBRARY)
    454 	set(LM "-lm")
    455       else()
    456 	set(LM "")
    457       endif()
    458       # Fortran
    459       set(LGFORTRAN "")
    460       if (CMAKE_C_COMPILER_ID MATCHES "GNU")
    461 	find_library(
    462 	  FORTRAN_gfortran_LIBRARY
    463 	  NAMES gfortran
    464 	  HINTS ${_libdir}
    465 	  )
    466 	mark_as_advanced(FORTRAN_gfortran_LIBRARY)
    467 	if (FORTRAN_gfortran_LIBRARY)
    468 	  set(LGFORTRAN "${FORTRAN_gfortran_LIBRARY}")
    469 	endif()
    470       elseif (CMAKE_C_COMPILER_ID MATCHES "Intel")
    471 	find_library(
    472 	  FORTRAN_ifcore_LIBRARY
    473 	  NAMES ifcore
    474 	  HINTS ${_libdir}
    475 	  )
    476 	mark_as_advanced(FORTRAN_ifcore_LIBRARY)
    477 	if (FORTRAN_ifcore_LIBRARY)
    478 	  set(LGFORTRAN "{FORTRAN_ifcore_LIBRARY}")
    479 	endif()
    480       endif()
    481       set(BLAS_COMPILER_FLAGS "")
    482       if (NOT BLA_VENDOR STREQUAL "Intel10_64lp_seq")
    483 	if (CMAKE_C_COMPILER_ID STREQUAL "Intel")
    484 	  list(APPEND BLAS_COMPILER_FLAGS "-openmp")
    485 	endif()
    486 	if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    487 	  list(APPEND BLAS_COMPILER_FLAGS "-fopenmp")
    488 	endif()
    489       endif()
    490       if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    491 	if (BLA_VENDOR STREQUAL "Intel10_32")
    492 	  list(APPEND BLAS_COMPILER_FLAGS "-m32")
    493 	else()
    494 	  list(APPEND BLAS_COMPILER_FLAGS "-m64")
    495 	endif()
    496 	if (NOT BLA_VENDOR STREQUAL "Intel10_64lp_seq")
    497 	  list(APPEND OMP_LIB "-ldl")
    498 	endif()
    499 	if (ENV_MKLROOT)
    500 	  list(APPEND BLAS_COMPILER_FLAGS "-I${ENV_MKLROOT}/include")
    501 	endif()
    502       endif()
    503 
    504       set(additional_flags "")
    505       if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
    506 	set(additional_flags "-Wl,--no-as-needed")
    507       endif()
    508     endif ()
    509 
    510     if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
    511       if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
    512 	find_package(Threads)
    513       else()
    514 	find_package(Threads REQUIRED)
    515       endif()
    516 
    517       set(BLAS_SEARCH_LIBS "")
    518 
    519       if(BLA_F95)
    520 
    521 	set(BLAS_mkl_SEARCH_SYMBOL SGEMM)
    522 	set(_LIBRARIES BLAS95_LIBRARIES)
    523 	if (WIN32)
    524 	  if (BLA_STATIC)
    525 	    set(BLAS_mkl_DLL_SUFFIX "")
    526 	  else()
    527 	    set(BLAS_mkl_DLL_SUFFIX "_dll")
    528 	  endif()
    529 
    530 	  # Find the main file (32-bit or 64-bit)
    531 	  set(BLAS_SEARCH_LIBS_WIN_MAIN "")
    532 	  if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
    533 	    list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
    534 	      "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
    535 	  endif()
    536 	  if (BLA_VENDOR STREQUAL "Intel10_64lp*" OR BLA_VENDOR STREQUAL "All")
    537 	    list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
    538 	      "mkl_blas95_lp64${BLAS_mkl_DLL_SUFFIX} mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
    539 	  endif ()
    540 
    541 	  # Add threading/sequential libs
    542 	  set(BLAS_SEARCH_LIBS_WIN_THREAD "")
    543 	  if (BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All")
    544 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    545 	      "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
    546 	  endif()
    547 	  if (NOT BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All")
    548 	    # old version
    549 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    550 	      "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
    551 	    # mkl >= 10.3
    552 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    553 	      "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
    554 	  endif()
    555 
    556 	  # Cartesian product of the above
    557 	  foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
    558 	    foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
    559 	      list(APPEND BLAS_SEARCH_LIBS
    560 		"${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
    561 	    endforeach()
    562 	  endforeach()
    563 	else (WIN32)
    564 	  if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
    565 	    list(APPEND BLAS_SEARCH_LIBS
    566 	      "mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide")
    567 	  endif ()
    568 	  if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
    569 	    # old version
    570 	    list(APPEND BLAS_SEARCH_LIBS
    571 	      "mkl_blas95 mkl_intel_lp64 mkl_intel_thread mkl_core guide")
    572 	    # mkl >= 10.3
    573 	    if (CMAKE_C_COMPILER_ID STREQUAL "Intel")
    574 	      list(APPEND BLAS_SEARCH_LIBS
    575 		"mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core")
    576 	    endif()
    577 	    if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    578 	      list(APPEND BLAS_SEARCH_LIBS
    579 		"mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core")
    580 	    endif()
    581 	  endif ()
    582 	  if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
    583 	    list(APPEND BLAS_SEARCH_LIBS
    584 	      "mkl_intel_lp64 mkl_sequential mkl_core")
    585 	    if (BLA_VENDOR STREQUAL "Intel10_64lp_seq")
    586 	      set(OMP_LIB "")
    587 	    endif()
    588 	  endif ()
    589 	endif (WIN32)
    590 
    591       else (BLA_F95)
    592 
    593 	set(BLAS_mkl_SEARCH_SYMBOL sgemm)
    594 	set(_LIBRARIES BLAS_LIBRARIES)
    595 	if (WIN32)
    596 	  if (BLA_STATIC)
    597 	    set(BLAS_mkl_DLL_SUFFIX "")
    598 	  else()
    599 	    set(BLAS_mkl_DLL_SUFFIX "_dll")
    600 	  endif()
    601 
    602 	  # Find the main file (32-bit or 64-bit)
    603 	  set(BLAS_SEARCH_LIBS_WIN_MAIN "")
    604 	  if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
    605 	    list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
    606 	      "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
    607 	  endif()
    608 	  if (BLA_VENDOR STREQUAL "Intel10_64lp*" OR BLA_VENDOR STREQUAL "All")
    609 	    list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
    610 	      "mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}")
    611 	  endif ()
    612 
    613 	  # Add threading/sequential libs
    614 	  set(BLAS_SEARCH_LIBS_WIN_THREAD "")
    615 	  if (NOT BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All")
    616 	    # old version
    617 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    618 	      "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
    619 	    # mkl >= 10.3
    620 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    621 	      "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
    622 	  endif()
    623 	  if (BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All")
    624 	    list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
    625 	      "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
    626 	  endif()
    627 
    628 	  # Cartesian product of the above
    629 	  foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
    630 	    foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
    631 	      list(APPEND BLAS_SEARCH_LIBS
    632 		"${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
    633 	    endforeach()
    634 	  endforeach()
    635 	else (WIN32)
    636 	  if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
    637 	    list(APPEND BLAS_SEARCH_LIBS
    638 	      "mkl_intel mkl_intel_thread mkl_core guide")
    639 	  endif ()
    640 	  if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
    641 	    # old version
    642 	    list(APPEND BLAS_SEARCH_LIBS
    643 	      "mkl_intel_lp64 mkl_intel_thread mkl_core guide")
    644 	    # mkl >= 10.3
    645 	    if (CMAKE_C_COMPILER_ID STREQUAL "Intel")
    646 	      list(APPEND BLAS_SEARCH_LIBS
    647 		"mkl_intel_lp64 mkl_intel_thread mkl_core")
    648 	    endif()
    649 	    if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
    650 	      list(APPEND BLAS_SEARCH_LIBS
    651 		"mkl_intel_lp64 mkl_gnu_thread mkl_core")
    652 	    endif()
    653 	  endif ()
    654 	  if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All")
    655 	    list(APPEND BLAS_SEARCH_LIBS
    656 	      "mkl_intel_lp64 mkl_sequential mkl_core")
    657 	    if (BLA_VENDOR STREQUAL "Intel10_64lp_seq")
    658 	      set(OMP_LIB "")
    659 	    endif()
    660 	  endif ()
    661 	  #older vesions of intel mkl libs
    662 	  if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
    663 	    list(APPEND BLAS_SEARCH_LIBS
    664 	      "mkl")
    665 	    list(APPEND BLAS_SEARCH_LIBS
    666 	      "mkl_ia32")
    667 	    list(APPEND BLAS_SEARCH_LIBS
    668 	      "mkl_em64t")
    669 	  endif ()
    670 	endif (WIN32)
    671 
    672       endif (BLA_F95)
    673 
    674       foreach (IT ${BLAS_SEARCH_LIBS})
    675 	string(REPLACE " " ";" SEARCH_LIBS ${IT})
    676 	if (${_LIBRARIES})
    677 	else ()
    678 	  check_fortran_libraries(
    679 	    ${_LIBRARIES}
    680 	    BLAS
    681 	    ${BLAS_mkl_SEARCH_SYMBOL}
    682 	    "${additional_flags}"
    683 	    "${SEARCH_LIBS}"
    684 	    "${OMP_LIB};${CMAKE_THREAD_LIBS_INIT};${LM}"
    685 	    )
    686 	  if(_LIBRARIES)
    687 	    set(BLAS_LINKER_FLAGS "${additional_flags}")
    688 	  endif()
    689 	endif()
    690       endforeach ()
    691       if(NOT BLAS_FIND_QUIETLY)
    692         if(${_LIBRARIES})
    693           message(STATUS "Looking for MKL BLAS: found")
    694         else()
    695           message(STATUS "Looking for MKL BLAS: not found")
    696         endif()
    697       endif()
    698       if (${_LIBRARIES} AND NOT BLAS_VENDOR_FOUND)
    699           set (BLAS_VENDOR_FOUND "Intel MKL")
    700       endif()
    701     endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
    702   endif(NOT BLAS_LIBRARIES OR BLA_VENDOR MATCHES "Intel*")
    703 endif (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
    704 
    705 
    706 if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
    707 
    708   if(NOT BLAS_LIBRARIES)
    709     # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
    710     check_fortran_libraries(
    711       BLAS_LIBRARIES
    712       BLAS
    713       sgemm
    714       ""
    715       "goto2"
    716       ""
    717       )
    718     if(NOT BLAS_FIND_QUIETLY)
    719       if(BLAS_LIBRARIES)
    720 	message(STATUS "Looking for Goto BLAS: found")
    721       else()
    722 	message(STATUS "Looking for Goto BLAS: not found")
    723       endif()
    724     endif()
    725   endif()
    726   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    727       set (BLAS_VENDOR_FOUND "Goto")
    728   endif()
    729 
    730 endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
    731 
    732 
    733 # OpenBlas
    734 if (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All")
    735 
    736   if(NOT BLAS_LIBRARIES)
    737     # openblas (http://www.openblas.net/)
    738     check_fortran_libraries(
    739       BLAS_LIBRARIES
    740       BLAS
    741       sgemm
    742       ""
    743       "openblas"
    744       ""
    745       )
    746     if(NOT BLAS_FIND_QUIETLY)
    747       if(BLAS_LIBRARIES)
    748 	message(STATUS "Looking for Open BLAS: found")
    749       else()
    750 	message(STATUS "Looking for Open BLAS: not found")
    751       endif()
    752     endif()
    753   endif()
    754   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    755       set (BLAS_VENDOR_FOUND "Openblas")
    756   endif()
    757 
    758 endif (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All")
    759 
    760 
    761 # EigenBlas
    762 if (BLA_VENDOR STREQUAL "Eigen" OR BLA_VENDOR STREQUAL "All")
    763 
    764   if(NOT BLAS_LIBRARIES)
    765     # eigenblas (http://eigen.tuxfamily.org/index.php?title=Main_Page)
    766     check_fortran_libraries(
    767       BLAS_LIBRARIES
    768       BLAS
    769       sgemm
    770       ""
    771       "eigen_blas"
    772       ""
    773       )
    774     if(NOT BLAS_FIND_QUIETLY)
    775       if(BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    776 	message(STATUS "Looking for Eigen BLAS: found")
    777       else()
    778 	message(STATUS "Looking for Eigen BLAS: not found")
    779       endif()
    780     endif()
    781   endif()
    782 
    783   if(NOT BLAS_LIBRARIES)
    784     # eigenblas (http://eigen.tuxfamily.org/index.php?title=Main_Page)
    785     check_fortran_libraries(
    786       BLAS_LIBRARIES
    787       BLAS
    788       sgemm
    789       ""
    790       "eigen_blas_static"
    791       ""
    792       )
    793     if(NOT BLAS_FIND_QUIETLY)
    794       if(BLAS_LIBRARIES)
    795 	message(STATUS "Looking for Eigen BLAS: found")
    796       else()
    797 	message(STATUS "Looking for Eigen BLAS: not found")
    798       endif()
    799     endif()
    800   endif()
    801   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    802       set (BLAS_VENDOR_FOUND "Eigen")
    803   endif()
    804 
    805 endif (BLA_VENDOR STREQUAL "Eigen" OR BLA_VENDOR STREQUAL "All")
    806 
    807 
    808 if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
    809 
    810   if(NOT BLAS_LIBRARIES)
    811     # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
    812     check_fortran_libraries(
    813       BLAS_LIBRARIES
    814       BLAS
    815       dgemm
    816       ""
    817       "f77blas;atlas"
    818       ""
    819       )
    820     if(NOT BLAS_FIND_QUIETLY)
    821       if(BLAS_LIBRARIES)
    822 	message(STATUS "Looking for Atlas BLAS: found")
    823       else()
    824 	message(STATUS "Looking for Atlas BLAS: not found")
    825       endif()
    826     endif()
    827   endif()
    828 
    829   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    830       set (BLAS_VENDOR_FOUND "Atlas")
    831   endif()
    832 
    833 endif (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
    834 
    835 
    836 # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
    837 if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
    838 
    839   if(NOT BLAS_LIBRARIES)
    840     check_fortran_libraries(
    841       BLAS_LIBRARIES
    842       BLAS
    843       sgemm
    844       ""
    845       "sgemm;dgemm;blas"
    846       ""
    847       )
    848     if(NOT BLAS_FIND_QUIETLY)
    849       if(BLAS_LIBRARIES)
    850 	message(STATUS "Looking for PhiPACK BLAS: found")
    851       else()
    852 	message(STATUS "Looking for PhiPACK BLAS: not found")
    853       endif()
    854     endif()
    855   endif()
    856 
    857   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    858       set (BLAS_VENDOR_FOUND "PhiPACK")
    859   endif()
    860 
    861 endif (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
    862 
    863 
    864 # BLAS in Alpha CXML library?
    865 if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
    866 
    867   if(NOT BLAS_LIBRARIES)
    868     check_fortran_libraries(
    869       BLAS_LIBRARIES
    870       BLAS
    871       sgemm
    872       ""
    873       "cxml"
    874       ""
    875       )
    876     if(NOT BLAS_FIND_QUIETLY)
    877       if(BLAS_LIBRARIES)
    878 	message(STATUS "Looking for CXML BLAS: found")
    879       else()
    880 	message(STATUS "Looking for CXML BLAS: not found")
    881       endif()
    882     endif()
    883   endif()
    884 
    885   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    886       set (BLAS_VENDOR_FOUND "CXML")
    887   endif()
    888 
    889 endif (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
    890 
    891 
    892 # BLAS in Alpha DXML library? (now called CXML, see above)
    893 if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
    894 
    895   if(NOT BLAS_LIBRARIES)
    896     check_fortran_libraries(
    897       BLAS_LIBRARIES
    898       BLAS
    899       sgemm
    900       ""
    901       "dxml"
    902       ""
    903       )
    904     if(NOT BLAS_FIND_QUIETLY)
    905       if(BLAS_LIBRARIES)
    906 	message(STATUS "Looking for DXML BLAS: found")
    907       else()
    908 	message(STATUS "Looking for DXML BLAS: not found")
    909       endif()
    910     endif()
    911   endif()
    912 
    913   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    914       set (BLAS_VENDOR_FOUND "DXML")
    915   endif()
    916   
    917 endif (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
    918 
    919 
    920 # BLAS in Sun Performance library?
    921 if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
    922 
    923   if(NOT BLAS_LIBRARIES)
    924     check_fortran_libraries(
    925       BLAS_LIBRARIES
    926       BLAS
    927       sgemm
    928       "-xlic_lib=sunperf"
    929       "sunperf;sunmath"
    930       ""
    931       )
    932     if(BLAS_LIBRARIES)
    933       set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
    934     endif()
    935     if(NOT BLAS_FIND_QUIETLY)
    936       if(BLAS_LIBRARIES)
    937 	message(STATUS "Looking for SunPerf BLAS: found")
    938       else()
    939 	message(STATUS "Looking for SunPerf BLAS: not found")
    940       endif()
    941     endif()
    942   endif()
    943 
    944   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    945       set (BLAS_VENDOR_FOUND "SunPerf")
    946   endif()
    947 
    948 endif ()
    949 
    950 
    951 # BLAS in SCSL library?  (SGI/Cray Scientific Library)
    952 if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
    953 
    954   if(NOT BLAS_LIBRARIES)
    955     check_fortran_libraries(
    956       BLAS_LIBRARIES
    957       BLAS
    958       sgemm
    959       ""
    960       "scsl"
    961       ""
    962       )
    963     if(NOT BLAS_FIND_QUIETLY)
    964       if(BLAS_LIBRARIES)
    965 	message(STATUS "Looking for SCSL BLAS: found")
    966       else()
    967 	message(STATUS "Looking for SCSL BLAS: not found")
    968       endif()
    969     endif()
    970   endif()
    971 
    972   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
    973       set (BLAS_VENDOR_FOUND "SunPerf")
    974   endif()
    975 
    976 endif ()
    977 
    978 
    979 # BLAS in SGIMATH library?
    980 if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
    981 
    982   if(NOT BLAS_LIBRARIES)
    983     check_fortran_libraries(
    984       BLAS_LIBRARIES
    985       BLAS
    986       sgemm
    987       ""
    988       "complib.sgimath"
    989       ""
    990       )
    991     if(NOT BLAS_FIND_QUIETLY)
    992       if(BLAS_LIBRARIES)
    993 	message(STATUS "Looking for SGIMATH BLAS: found")
    994       else()
    995 	message(STATUS "Looking for SGIMATH BLAS: not found")
    996       endif()
    997     endif()
    998   endif()
    999 
   1000   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1001       set (BLAS_VENDOR_FOUND "SGIMATH")
   1002   endif()
   1003 
   1004 endif ()
   1005 
   1006 
   1007 # BLAS in IBM ESSL library (requires generic BLAS lib, too)
   1008 if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
   1009 
   1010   if(NOT BLAS_LIBRARIES)
   1011     check_fortran_libraries(
   1012       BLAS_LIBRARIES
   1013       BLAS
   1014       sgemm
   1015       ""
   1016       "essl;xlfmath;xlf90_r;blas"
   1017       ""
   1018       )
   1019     if(NOT BLAS_FIND_QUIETLY)
   1020       if(BLAS_LIBRARIES)
   1021 	message(STATUS "Looking for IBM ESSL BLAS: found")
   1022       else()
   1023 	message(STATUS "Looking for IBM ESSL BLAS: not found")
   1024       endif()
   1025     endif()
   1026   endif()
   1027 
   1028   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1029       set (BLAS_VENDOR_FOUND "IBM ESSL")
   1030   endif()
   1031 
   1032 endif ()
   1033 
   1034 # BLAS in IBM ESSL_MT library (requires generic BLAS lib, too)
   1035 if (BLA_VENDOR STREQUAL "IBMESSLMT" OR BLA_VENDOR STREQUAL "All")
   1036 
   1037   if(NOT BLAS_LIBRARIES)
   1038     check_fortran_libraries(
   1039       BLAS_LIBRARIES
   1040       BLAS
   1041       sgemm
   1042       ""
   1043       "esslsmp;xlsmp;xlfmath;xlf90_r;blas"
   1044       ""
   1045       )
   1046     if(NOT BLAS_FIND_QUIETLY)
   1047       if(BLAS_LIBRARIES)
   1048 	message(STATUS "Looking for IBM ESSL MT BLAS: found")
   1049       else()
   1050 	message(STATUS "Looking for IBM ESSL MT BLAS: not found")
   1051       endif()
   1052     endif()
   1053   endif()
   1054 
   1055   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1056       set (BLAS_VENDOR_FOUND "IBM ESSL MT")
   1057   endif()
   1058 
   1059 endif ()
   1060 
   1061 
   1062 #BLAS in acml library?
   1063 if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All")
   1064 
   1065   if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
   1066       ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
   1067       ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS)))
   1068 
   1069     # try to find acml in "standard" paths
   1070     if( WIN32 )
   1071       file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" )
   1072     else()
   1073       file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" )
   1074     endif()
   1075     if( WIN32 )
   1076       file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" )
   1077     else()
   1078       file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" )
   1079     endif()
   1080     list(GET _ACML_ROOT 0 _ACML_ROOT)
   1081     list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
   1082 
   1083     if( _ACML_ROOT )
   1084 
   1085       get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH )
   1086       if( SIZEOF_INTEGER EQUAL 8 )
   1087 	set( _ACML_PATH_SUFFIX "_int64" )
   1088       else()
   1089 	set( _ACML_PATH_SUFFIX "" )
   1090       endif()
   1091       if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" )
   1092 	set( _ACML_COMPILER32 "ifort32" )
   1093 	set( _ACML_COMPILER64 "ifort64" )
   1094       elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" )
   1095 	set( _ACML_COMPILER32 "sun32" )
   1096 	set( _ACML_COMPILER64 "sun64" )
   1097       elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" )
   1098 	set( _ACML_COMPILER32 "pgi32" )
   1099 	if( WIN32 )
   1100 	  set( _ACML_COMPILER64 "win64" )
   1101 	else()
   1102 	  set( _ACML_COMPILER64 "pgi64" )
   1103 	endif()
   1104       elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" )
   1105 	# 32 bit builds not supported on Open64 but for code simplicity
   1106 	# We'll just use the same directory twice
   1107 	set( _ACML_COMPILER32 "open64_64" )
   1108 	set( _ACML_COMPILER64 "open64_64" )
   1109       elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" )
   1110 	set( _ACML_COMPILER32 "nag32" )
   1111 	set( _ACML_COMPILER64 "nag64" )
   1112       else()
   1113 	set( _ACML_COMPILER32 "gfortran32" )
   1114 	set( _ACML_COMPILER64 "gfortran64" )
   1115       endif()
   1116 
   1117       if( BLA_VENDOR STREQUAL "ACML_MP" )
   1118 	set(_ACML_MP_LIB_DIRS
   1119 	  "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
   1120 	  "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" )
   1121       else()
   1122 	set(_ACML_LIB_DIRS
   1123 	  "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
   1124 	  "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" )
   1125       endif()
   1126 
   1127     endif(_ACML_ROOT)
   1128 
   1129   elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
   1130 
   1131     set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
   1132 
   1133   endif()
   1134 
   1135   if( BLA_VENDOR STREQUAL "ACML_MP" )
   1136     foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
   1137       check_fortran_libraries (
   1138 	BLAS_LIBRARIES
   1139 	BLAS
   1140 	sgemm
   1141 	"" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS}
   1142 	)
   1143       if( BLAS_LIBRARIES )
   1144 	break()
   1145       endif()
   1146     endforeach()
   1147   elseif( BLA_VENDOR STREQUAL "ACML_GPU" )
   1148     foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
   1149       check_fortran_libraries (
   1150 	BLAS_LIBRARIES
   1151 	BLAS
   1152 	sgemm
   1153 	"" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS}
   1154 	)
   1155       if( BLAS_LIBRARIES )
   1156 	break()
   1157       endif()
   1158     endforeach()
   1159   else()
   1160     foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} )
   1161       check_fortran_libraries (
   1162 	BLAS_LIBRARIES
   1163 	BLAS
   1164 	sgemm
   1165 	"" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS}
   1166 	)
   1167       if( BLAS_LIBRARIES )
   1168 	break()
   1169       endif()
   1170     endforeach()
   1171   endif()
   1172 
   1173   # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
   1174   if(NOT BLAS_LIBRARIES)
   1175     check_fortran_libraries(
   1176       BLAS_LIBRARIES
   1177       BLAS
   1178       sgemm
   1179       ""
   1180       "acml;acml_mv"
   1181       ""
   1182       )
   1183     if(NOT BLAS_FIND_QUIETLY)
   1184       if(BLAS_LIBRARIES)
   1185 	message(STATUS "Looking for ACML BLAS: found")
   1186       else()
   1187 	message(STATUS "Looking for ACML BLAS: not found")
   1188       endif()
   1189     endif()
   1190   endif()
   1191 
   1192   if(NOT BLAS_LIBRARIES)
   1193     check_fortran_libraries(
   1194       BLAS_LIBRARIES
   1195       BLAS
   1196       sgemm
   1197       ""
   1198       "acml_mp;acml_mv"
   1199       ""
   1200       )
   1201     if(NOT BLAS_FIND_QUIETLY)
   1202       if(BLAS_LIBRARIES)
   1203 	message(STATUS "Looking for ACML BLAS: found")
   1204       else()
   1205 	message(STATUS "Looking for ACML BLAS: not found")
   1206       endif()
   1207     endif()
   1208   endif()
   1209 
   1210   if(NOT BLAS_LIBRARIES)
   1211     check_fortran_libraries(
   1212       BLAS_LIBRARIES
   1213       BLAS
   1214       sgemm
   1215       ""
   1216       "acml;acml_mv;CALBLAS"
   1217       ""
   1218       )
   1219     if(NOT BLAS_FIND_QUIETLY)
   1220       if(BLAS_LIBRARIES)
   1221 	message(STATUS "Looking for ACML BLAS: found")
   1222       else()
   1223 	message(STATUS "Looking for ACML BLAS: not found")
   1224       endif()
   1225     endif()
   1226   endif()
   1227 
   1228   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1229       set (BLAS_VENDOR_FOUND "ACML")
   1230   endif()
   1231 
   1232 endif (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") # ACML
   1233 
   1234 
   1235 # Apple BLAS library?
   1236 if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
   1237 
   1238   if(NOT BLAS_LIBRARIES)
   1239     check_fortran_libraries(
   1240       BLAS_LIBRARIES
   1241       BLAS
   1242       dgemm
   1243       ""
   1244       "Accelerate"
   1245       ""
   1246       )
   1247     if(NOT BLAS_FIND_QUIETLY)
   1248       if(BLAS_LIBRARIES)
   1249 	message(STATUS "Looking for Apple BLAS: found")
   1250       else()
   1251 	message(STATUS "Looking for Apple BLAS: not found")
   1252       endif()
   1253     endif()
   1254   endif()
   1255 
   1256   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1257       set (BLAS_VENDOR_FOUND "Apple Accelerate")
   1258   endif()
   1259 
   1260 endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
   1261 
   1262 
   1263 if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
   1264 
   1265   if ( NOT BLAS_LIBRARIES )
   1266     check_fortran_libraries(
   1267       BLAS_LIBRARIES
   1268       BLAS
   1269       dgemm
   1270       ""
   1271       "vecLib"
   1272       ""
   1273       )
   1274     if(NOT BLAS_FIND_QUIETLY)
   1275       if(BLAS_LIBRARIES)
   1276 	message(STATUS "Looking for NAS BLAS: found")
   1277       else()
   1278 	message(STATUS "Looking for NAS BLAS: not found")
   1279       endif()
   1280     endif()
   1281   endif ()
   1282 
   1283   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1284       set (BLAS_VENDOR_FOUND "NAS")
   1285   endif()
   1286 
   1287 endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
   1288 
   1289 
   1290 # Generic BLAS library?
   1291 if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
   1292 
   1293   set(BLAS_SEARCH_LIBS "blas;blas_LINUX;blas_MAC;blas_WINDOWS;refblas")
   1294   foreach (SEARCH_LIB ${BLAS_SEARCH_LIBS})
   1295     if (BLAS_LIBRARIES)
   1296     else ()
   1297       check_fortran_libraries(
   1298 	BLAS_LIBRARIES
   1299 	BLAS
   1300 	sgemm
   1301 	""
   1302 	"${SEARCH_LIB}"
   1303 	"${LGFORTRAN}"
   1304 	)
   1305       if(NOT BLAS_FIND_QUIETLY)
   1306 	if(BLAS_LIBRARIES)
   1307 	  message(STATUS "Looking for Generic BLAS: found")
   1308 	else()
   1309 	  message(STATUS "Looking for Generic BLAS: not found")
   1310 	endif()
   1311       endif()
   1312     endif()
   1313   endforeach ()
   1314 
   1315   if (BLAS_LIBRARIES AND NOT BLAS_VENDOR_FOUND)
   1316       set (BLAS_VENDOR_FOUND "Netlib or other Generic libblas")
   1317   endif()
   1318 
   1319 endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
   1320 
   1321 
   1322 if(BLA_F95)
   1323 
   1324   if(BLAS95_LIBRARIES)
   1325     set(BLAS95_FOUND TRUE)
   1326   else()
   1327     set(BLAS95_FOUND FALSE)
   1328   endif()
   1329 
   1330   if(NOT BLAS_FIND_QUIETLY)
   1331     if(BLAS95_FOUND)
   1332       message(STATUS "A library with BLAS95 API found.")
   1333       message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}")
   1334     else(BLAS95_FOUND)
   1335       message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas 95 libraries could not be found or check of symbols failed."
   1336 	"\nPlease indicate where to find blas libraries. You have three options:\n"
   1337 	"- Option 1: Provide the installation directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n"
   1338 	"- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n"
   1339 	"- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
   1340 	"\nTo follow libraries detection more precisely you can activate a verbose mode with -DBLAS_VERBOSE=ON at cmake configure."
   1341 	"\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name."
   1342 	"\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit),"
   1343 	"Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
   1344 	"Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
   1345       if(BLAS_FIND_REQUIRED)
   1346 	message(FATAL_ERROR
   1347 	  "A required library with BLAS95 API not found. Please specify library location.")
   1348       else()
   1349 	message(STATUS
   1350 	  "A library with BLAS95 API not found. Please specify library location.")
   1351       endif()
   1352     endif(BLAS95_FOUND)
   1353   endif(NOT BLAS_FIND_QUIETLY)
   1354 
   1355   set(BLAS_FOUND TRUE)
   1356   set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
   1357 
   1358 else(BLA_F95)
   1359 
   1360   if(BLAS_LIBRARIES)
   1361     set(BLAS_FOUND TRUE)
   1362   else()
   1363     set(BLAS_FOUND FALSE)
   1364   endif()
   1365 
   1366   if(NOT BLAS_FIND_QUIETLY)
   1367     if(BLAS_FOUND)
   1368       message(STATUS "A library with BLAS API found.")
   1369       message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}")
   1370     else(BLAS_FOUND)
   1371       message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas libraries could not be found or check of symbols failed."
   1372 	"\nPlease indicate where to find blas libraries. You have three options:\n"
   1373 	"- Option 1: Provide the installation directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n"
   1374 	"- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n"
   1375 	"- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n"
   1376 	"\nTo follow libraries detection more precisely you can activate a verbose mode with -DBLAS_VERBOSE=ON at cmake configure."
   1377 	"\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name."
   1378 	"\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit),"
   1379 	"Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
   1380 	"Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
   1381       if(BLAS_FIND_REQUIRED)
   1382 	message(FATAL_ERROR
   1383 	  "A required library with BLAS API not found. Please specify library location.")
   1384       else()
   1385 	message(STATUS
   1386 	  "A library with BLAS API not found. Please specify library location.")
   1387       endif()
   1388     endif(BLAS_FOUND)
   1389   endif(NOT BLAS_FIND_QUIETLY)
   1390 
   1391 endif(BLA_F95)
   1392 
   1393 set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
   1394 
   1395 if (BLAS_FOUND)
   1396   list(GET BLAS_LIBRARIES 0 first_lib)
   1397   get_filename_component(first_lib_path "${first_lib}" PATH)
   1398   if (${first_lib_path} MATCHES "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)")
   1399     string(REGEX REPLACE "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)" "" not_cached_dir "${first_lib_path}")
   1400     set(BLAS_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of BLAS library" FORCE)
   1401   else()
   1402     set(BLAS_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of BLAS library" FORCE)
   1403   endif()
   1404 endif()
   1405 mark_as_advanced(BLAS_DIR)
   1406 mark_as_advanced(BLAS_DIR_FOUND)
   1407