1# Simple file to refine MKL search.
2# It relies on FindLAPACK to locate MKL library files and set up linker options first.
3INCLUDE( CheckCXXSourceCompiles )
4
5SET(MKL_LIBRARIES ${LAPACK_LINKER_FLAGS} ${LAPACK_LIBRARIES})
6
7MESSAGE(STATUS "Looking for Intel MKL library header files")
8
9# Finding and setting the MKL_INCLUDE_DIRECTORIES based on MKL_ROOT, $ENV{MKLROOT}, $ENV{MKL_ROOT}, $ENV{MKL_HOME}
10# Extremely Basic Support of common mkl module environment variables
11FIND_PATH(MKL_INCLUDE_DIRECTORIES "mkl.h"
12  HINTS ${MKL_ROOT} $ENV{MKLROOT} $ENV{MKL_ROOT} $ENV{MKL_HOME}
13  PATH_SUFFIXES include)
14IF(NOT MKL_INCLUDE_DIRECTORIES)
15  # Finding MKL headers in the system
16  FIND_PATH(MKL_INCLUDE_DIRECTORIES "mkl.h" PATH_SUFFIXES mkl)
17ENDIF()
18
19IF(MKL_INCLUDE_DIRECTORIES)
20  MESSAGE(STATUS "MKL_INCLUDE_DIRECTORIES: ${MKL_INCLUDE_DIRECTORIES}")
21ELSE(MKL_INCLUDE_DIRECTORIES)
22  MESSAGE(STATUS "mkl.h cannot be found")
23  IF(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
24    MESSAGE(FATAL_ERROR "Intel's standard compilervar.sh sets the env variable MKLROOT.\n"
25            "If you are invoking icc without the customary environment\n"
26            "you must set the the environment variable or pass cmake MKL_ROOT.")
27  ELSE(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
28    MESSAGE(FATAL_ERROR "Pass mkl root directory to cmake via MKL_ROOT." )
29  ENDIF(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
30ENDIF(MKL_INCLUDE_DIRECTORIES)
31
32# Check for mkl.h
33FILE( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl.cxx"
34  "#include <iostream>\n #include <mkl.h>\n int main() { return 0; }\n" )
35TRY_COMPILE(HAVE_MKL ${CMAKE_BINARY_DIR}
36  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl.cxx
37  CMAKE_FLAGS
38  "-DINCLUDE_DIRECTORIES=${MKL_INCLUDE_DIRECTORIES} "
39  LINK_LIBRARIES "${MKL_LIBRARIES}"
40  OUTPUT_VARIABLE MKL_OUT)
41IF( NOT HAVE_MKL )
42  MESSAGE( "${MKL_OUT}" )
43ENDIF( NOT HAVE_MKL )
44
45# Check for mkl_vml_functions.h
46FILE( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl_vml.cxx"
47  "#include <iostream>\n #include <mkl_vml_functions.h>\n int main() { return 0; }\n" )
48TRY_COMPILE(HAVE_MKL_VML ${CMAKE_BINARY_DIR}
49  ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl_vml.cxx
50  CMAKE_FLAGS
51  "-DINCLUDE_DIRECTORIES=${MKL_INCLUDE_DIRECTORIES} "
52  OUTPUT_VARIABLE MKL_OUT)
53
54# Check for fftw3
55FIND_PATH(MKL_FFTW3 "fftw3.h"
56  HINTS ${MKL_INCLUDE_DIRECTORIES}
57  PATH_SUFFIXES fftw)
58IF(MKL_FFTW3)
59  FILE( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl_fftw3.cxx"
60    "#include <iostream>\n #include <fftw3.h>\n int main() { return 0; }\n" )
61  TRY_COMPILE(HAVE_MKL_FFTW3 ${CMAKE_BINARY_DIR}
62    ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src_mkl_fftw3.cxx
63    CMAKE_FLAGS
64    "-DINCLUDE_DIRECTORIES=${MKL_FFTW3} "
65    LINK_LIBRARIES "${MKL_LIBRARIES}"
66    OUTPUT_VARIABLE MKL_OUT)
67ELSE(MKL_FFTW3)
68  UNSET(HAVE_MKL_FFTW3)
69ENDIF(MKL_FFTW3)
70
71IF ( HAVE_MKL )
72  SET( MKL_FOUND TRUE )
73  MESSAGE(STATUS "MKL found: HAVE_MKL=${HAVE_MKL}, HAVE_MKL_VML=${HAVE_MKL_VML}, HAVE_MKL_FFTW3=${HAVE_MKL_FFTW3}")
74
75  #Add BLAS_LAPACK header
76  SET_TARGET_PROPERTIES(Math::BLAS_LAPACK PROPERTIES INTERFACE_COMPILE_DEFINITIONS "HAVE_MKL"
77                                                     INTERFACE_INCLUDE_DIRECTORIES "${MKL_INCLUDE_DIRECTORIES}")
78
79  IF( HAVE_MKL_VML )
80    #create scalar_vector_functions target
81    ADD_LIBRARY(Math::scalar_vector_functions INTERFACE IMPORTED)
82    SET_TARGET_PROPERTIES(Math::scalar_vector_functions PROPERTIES INTERFACE_COMPILE_DEFINITIONS "HAVE_MKL;HAVE_MKL_VML"
83                                                                   INTERFACE_INCLUDE_DIRECTORIES "${MKL_INCLUDE_DIRECTORIES}"
84                                                                   INTERFACE_LINK_LIBRARIES "${MKL_LIBRARIES}")
85  ENDIF( HAVE_MKL_VML )
86
87  IF( HAVE_MKL_FFTW3 )
88    #create FFTW3 target
89    ADD_LIBRARY(Math::FFTW3 INTERFACE IMPORTED)
90    SET_TARGET_PROPERTIES(Math::FFTW3 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MKL_FFTW3}"
91                                                 INTERFACE_COMPILE_DEFINITIONS "HAVE_MKL;HAVE_LIBFFTW"
92                                                 INTERFACE_LINK_LIBRARIES "${MKL_LIBRARIES}")
93  ENDIF( HAVE_MKL_FFTW3 )
94ELSE( HAVE_MKL )
95  SET( MKL_FOUND FALSE )
96  MESSAGE(STATUS "MKL header files not found")
97ENDIF( HAVE_MKL )
98