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