1#==================================================================
2#   Copyright (c) 2018 The Regents of the University of California,
3#   through Lawrence Berkeley National Laboratory.
4#
5#   Author: David Williams-Young
6#
7#   This file is part of cmake-modules. All rights reserved.
8#
9#   Redistribution and use in source and binary forms, with or without
10#   modification, are permitted provided that the following conditions are met:
11#
12#   (1) Redistributions of source code must retain the above copyright notice, this
13#   list of conditions and the following disclaimer.
14#   (2) Redistributions in binary form must reproduce the above copyright notice,
15#   this list of conditions and the following disclaimer in the documentation
16#   and/or other materials provided with the distribution.
17#   (3) Neither the name of the University of California, Lawrence Berkeley
18#   National Laboratory, U.S. Dept. of Energy nor the names of its contributors may
19#   be used to endorse or promote products derived from this software without
20#   specific prior written permission.
21#
22#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23#   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24#   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25#   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
26#   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27#   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28#   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29#   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31#   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32#
33#   You are under no obligation whatsoever to provide any bug fixes, patches, or
34#   upgrades to the features, functionality or performance of the source code
35#   ("Enhancements") to anyone; however, if you choose to make your Enhancements
36#   available either publicly, or directly to Lawrence Berkeley National
37#   Laboratory, without imposing a separate written license agreement for such
38#   Enhancements, then you hereby grant the following license: a non-exclusive,
39#   royalty-free perpetual license to install, use, modify, prepare derivative
40#   works, incorporate into other computer software, distribute, and sublicense
41#   such enhancements or derivative works thereof, in binary and source code form.
42#
43#==================================================================
44
45#    FindIntelMKL.cmake
46#
47#    Finds Intel(R) MKL and exports its linkange as
48#    CMake TARGETS
49#
50#    This module is meant to serve as part of FindLinAlg.
51#    It can also be used by itself.
52#
53#    The module will define the following variables:
54#
55#      IntelMKL_FOUND       - Found MKL installation
56#      IntelMKL_INCLUDE_DIR - Location of MKL headers (mkl.h)
57#      IntelMKL_LIBRARIES   - MKL libraries
58#
59#    This module will export the following CMake TARGETS if possible
60#
61#      IntelMKL::mkl
62#
63#      intelmkl_PREFERS_STATIC          - default ON
64#      intelmkl_PREFERED_THREAD_LEVEL   - ( sequential, openmp, tbb ) default: openmp
65#      intelmkl_PREFERED_THREAD_LIBRARY - ( intel, gnu, pgi )         default: depends on compiler
66
67include(CommonFunctions)
68
69# SANITY CHECK
70if( "ilp64" IN_LIST IntelMKL_FIND_COMPONENTS AND "lp64" IN_LIST IntelMKL_FIND_COMPONENTS )
71  message( FATAL_ERROR "IntelMKL cannot link to both ILP64 and LP64 iterfaces" )
72endif()
73
74if( "scalapack" IN_LIST IntelMKL_FIND_COMPONENTS AND NOT ("blacs" IN_LIST IntelMKL_FIND_COMPONENTS) )
75  list(APPEND IntelMKL_FIND_COMPONENTS "blacs" )
76endif()
77
78set(intelmkl_PREFERS_STATIC ON)
79if(BUILD_SHARED_LIBS)
80  set(intelmkl_PREFERS_STATIC OFF)
81endif()
82
83# MKL lib names
84if( intelmkl_PREFERS_STATIC )
85  set( intelmkl_LP64_LIBRARY_NAME       "libmkl_intel_lp64.a"   )
86  set( intelmkl_ILP64_LIBRARY_NAME      "libmkl_intel_ilp64.a"  )
87  set( intelmkl_SEQUENTIAL_LIBRARY_NAME "libmkl_sequential.a"   )
88  set( intelmkl_OMP_INTEL_LIBRARY_NAME  "libmkl_intel_thread.a" )
89  set( intelmkl_OMP_GNU_LIBRARY_NAME    "libmkl_gnu_thread.a"   )
90  set( intelmkl_OMP_PGI_LIBRARY_NAME    "libmkl_pgi_thread.a"   )
91  set( intelmkl_TBB_LIBRARY_NAME        "libmkl_tbb_thread.a"   )
92  set( intelmkl_CORE_LIBRARY_NAME       "libmkl_core.a"         )
93
94  set( intelmkl_LP64_SCALAPACK_LIBRARY_NAME  "libmkl_scalapack_lp64.a"  )
95  set( intelmkl_ILP64_SCALAPACK_LIBRARY_NAME "libmkl_scalapack_ilp64.a" )
96
97  set( intelmkl_LP64_INTELMPI_BLACS_LIBRARY_NAME  "libmkl_blacs_intelmpi_lp64.a"  )
98  set( intelmkl_LP64_OPENMPI_BLACS_LIBRARY_NAME   "libmkl_blacs_openmpi_lp64.a"   )
99  set( intelmkl_LP64_SGIMPT_BLACS_LIBRARY_NAME    "libmkl_blacs_sgimpt_lp64.a"    )
100  set( intelmkl_ILP64_INTELMPI_BLACS_LIBRARY_NAME "libmkl_blacs_intelmpi_ilp64.a" )
101  set( intelmkl_ILP64_OPENMPI_BLACS_LIBRARY_NAME  "libmkl_blacs_openmpi_ilp64.a"  )
102  set( intelmkl_ILP64_SGIMPT_BLACS_LIBRARY_NAME   "libmkl_blacs_sgimpt_ilp64.a"   )
103else()
104  set( intelmkl_LP64_LIBRARY_NAME       "mkl_intel_lp64"   )
105  set( intelmkl_ILP64_LIBRARY_NAME      "mkl_intel_ilp64"  )
106  set( intelmkl_SEQUENTIAL_LIBRARY_NAME "mkl_sequential"   )
107  set( intelmkl_OMP_INTEL_LIBRARY_NAME  "mkl_intel_thread" )
108  set( intelmkl_OMP_GNU_LIBRARY_NAME    "mkl_gnu_thread"   )
109  set( intelmkl_OMP_PGI_LIBRARY_NAME    "mkl_pgi_thread"   )
110  set( intelmkl_TBB_LIBRARY_NAME        "mkl_tbb_thread"   )
111  set( intelmkl_CORE_LIBRARY_NAME       "mkl_core"         )
112
113  set( intelmkl_LP64_SCALAPACK_LIBRARY_NAME  "mkl_scalapack_lp64"  )
114  set( intelmkl_ILP64_SCALAPACK_LIBRARY_NAME "mkl_scalapack_ilp64" )
115
116  set( intelmkl_LP64_INTELMPI_BLACS_LIBRARY_NAME  "mkl_blacs_intelmpi_lp64"  )
117  set( intelmkl_LP64_OPENMPI_BLACS_LIBRARY_NAME   "mkl_blacs_openmpi_lp64"   )
118  set( intelmkl_LP64_SGIMPT_BLACS_LIBRARY_NAME    "mkl_blacs_sgimpt_lp64"    )
119  set( intelmkl_ILP64_INTELMPI_BLACS_LIBRARY_NAME "mkl_blacs_intelmpi_ilp64" )
120  set( intelmkl_ILP64_OPENMPI_BLACS_LIBRARY_NAME  "mkl_blacs_openmpi_ilp64"  )
121  set( intelmkl_ILP64_SGIMPT_BLACS_LIBRARY_NAME   "mkl_blacs_sgimpt_ilp64"   )
122endif()
123
124if( intelmkl_PREFERS_STATIC AND ENABLE_DPCPP)
125  set( intelmkl_SYCL_LIBRARY_NAME       "libmkl_sycl.a"         )
126elseif(ENABLE_DPCPP)
127  set( intelmkl_SYCL_LIBRARY_NAME       "mkl_sycl"              )
128endif()
129
130# Defaults
131if( NOT intelmkl_PREFERED_THREAD_LEVEL )
132  if(USE_OPENMP)
133    set( intelmkl_PREFERED_THREAD_LEVEL "openmp" )
134  else()
135    set( intelmkl_PREFERED_THREAD_LEVEL "sequential" )
136  endif()
137endif()
138
139if( NOT intelmkl_PREFERED_MPI_LIBRARY )
140  set( intelmkl_PREFERED_MPI_LIBRARY "intelmpi" )
141endif()
142
143if( NOT intelmkl_PREFIX )
144  set( intelmkl_PREFIX ${MKLROOT} $ENV{MKLROOT} )
145endif()
146
147
148
149# MKL Threads
150if( intelmkl_PREFERED_THREAD_LEVEL MATCHES "sequential" )
151  set( intelmkl_THREAD_LIBRARY_NAME ${intelmkl_SEQUENTIAL_LIBRARY_NAME} )
152elseif( intelmkl_PREFERED_THREAD_LEVEL MATCHES "tbb" )
153  set( intelmkl_THREAD_LIBRARY_NAME ${intelmkl_TBB_LIBRARY_NAME} )
154else() # OpenMP
155  if( CMAKE_C_COMPILER_ID MATCHES "Intel" )
156    set( intelmkl_THREAD_LIBRARY_NAME ${intelmkl_OMP_INTEL_LIBRARY_NAME} )
157  elseif( CMAKE_C_COMPILER_ID MATCHES "PGI" )
158    set( intelmkl_THREAD_LIBRARY_NAME ${intelmkl_OMP_PGI_LIBRARY_NAME} )
159  else()
160    set( intelmkl_THREAD_LIBRARY_NAME ${intelmkl_OMP_GNU_LIBRARY_NAME} )
161  endif()
162endif()
163
164
165# MKL MPI for BLACS
166if( intelmkl_PREFERED_MPI_LIBRARY MATCHES "openmpi" )
167  set( intelmkl_LP64_BLACS_LIBRARY_NAME  ${intelmkl_LP64_OPENMPI_BLACS_LIBRARY_NAME}  )
168  set( intelmkl_ILP64_BLACS_LIBRARY_NAME ${intelmkl_ILP64_OPENMPI_BLACS_LIBRARY_NAME} )
169elseif( intelmkl_PREFERED_MPI_LIBRARY MATCHES "sgimpt" )
170  set( intelmkl_LP64_BLACS_LIBRARY_NAME  ${intelmkl_LP64_SGIMPT_BLACS_LIBRARY_NAME}  )
171  set( intelmkl_ILP64_BLACS_LIBRARY_NAME ${intelmkl_ILP64_SGIMPT_BLACS_LIBRARY_NAME} )
172else() # Intel MPI
173  set( intelmkl_LP64_BLACS_LIBRARY_NAME  ${intelmkl_LP64_INTELMPI_BLACS_LIBRARY_NAME}  )
174  set( intelmkl_ILP64_BLACS_LIBRARY_NAME ${intelmkl_ILP64_INTELMPI_BLACS_LIBRARY_NAME} )
175endif()
176
177
178# Header
179find_path( intelmkl_INCLUDE_DIR
180  NAMES mkl.h
181  HINTS ${intelmkl_PREFIX}
182  PATHS ${intelmkl_INCLUDE_DIR}
183  PATH_SUFFIXES include
184  DOC "Intel(R) MKL header"
185)
186
187find_library( intelmkl_THREAD_LIBRARY
188  NAMES ${intelmkl_THREAD_LIBRARY_NAME}
189  HINTS ${intelmkl_PREFIX}
190  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
191  PATH_SUFFIXES lib/intel64 lib/ia32
192  DOC "Intel(R) MKL THREAD Library"
193)
194
195find_library( intelmkl_CORE_LIBRARY
196  NAMES ${intelmkl_CORE_LIBRARY_NAME}
197  HINTS ${intelmkl_PREFIX}
198  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
199  PATH_SUFFIXES lib/intel64 lib/ia32
200  DOC "Intel(R) MKL CORE Library"
201)
202
203# Check version
204if( EXISTS ${intelmkl_INCLUDE_DIR}/mkl_version.h )
205  set( version_pattern
206  "^#define[\t ]+__INTEL_MKL(|_MINOR|_UPDATE)__[\t ]+([0-9\\.]+)$"
207  )
208  file( STRINGS ${intelmkl_INCLUDE_DIR}/mkl_version.h mkl_version
209        REGEX ${version_pattern} )
210
211  foreach( match ${mkl_version} )
212
213    if(IntelMKL_VERSION_STRING)
214      set(IntelMKL_VERSION_STRING "${IntelMKL_VERSION_STRING}.")
215    endif()
216
217    string(REGEX REPLACE ${version_pattern}
218      "${IntelMKL_VERSION_STRING}\\2"
219      IntelMKL_VERSION_STRING ${match}
220    )
221
222    set(IntelMKL_VERSION_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
223
224  endforeach()
225
226  unset( mkl_version )
227  unset( version_pattern )
228endif()
229
230if( intelmkl_INCLUDE_DIR )
231  set( IntelMKL_INCLUDE_DIR ${intelmkl_INCLUDE_DIR} )
232endif()
233
234
235# Handle LP64 / ILP64
236find_library( intelmkl_ILP64_LIBRARY
237  NAMES ${intelmkl_ILP64_LIBRARY_NAME}
238  HINTS ${intelmkl_PREFIX}
239  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
240  PATH_SUFFIXES lib/intel64 lib/ia32
241  DOC "Intel(R) ILP64 MKL Library"
242)
243
244find_library( intelmkl_LP64_LIBRARY
245  NAMES ${intelmkl_LP64_LIBRARY_NAME}
246  HINTS ${intelmkl_PREFIX}
247  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
248  PATH_SUFFIXES lib/intel64 lib/ia32
249  DOC "Intel(R) LP64 MKL Library"
250)
251
252if( intelmkl_ILP64_LIBRARY )
253  set( IntelMKL_ilp64_FOUND TRUE )
254endif()
255
256if( intelmkl_LP64_LIBRARY )
257  set( IntelMKL_lp64_FOUND TRUE )
258endif()
259
260# SYCL
261if(ENABLE_DPCPP)
262  set(USE_DPCPP ON)
263  find_library( intelmkl_SYCL_LIBRARY
264    NAMES ${intelmkl_SYCL_LIBRARY_NAME}
265    HINTS ${intelmkl_PREFIX}
266    PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
267    PATH_SUFFIXES lib/intel64 lib/ia32
268    DOC "Intel(R) MKL SYCL Library"
269  )
270endif()
271
272
273# BLACS / ScaLAPACK
274
275find_library( intelmkl_ILP64_BLACS_LIBRARY
276  NAMES ${intelmkl_ILP64_BLACS_LIBRARY_NAME}
277  HINTS ${intelmkl_PREFIX}
278  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
279  PATH_SUFFIXES lib/intel64 lib/ia32
280  DOC "Intel(R) ILP64 MKL BLACS Library"
281)
282
283find_library( intelmkl_LP64_BLACS_LIBRARY
284  NAMES ${intelmkl_LP64_BLACS_LIBRARY_NAME}
285  HINTS ${intelmkl_PREFIX}
286  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
287  PATH_SUFFIXES lib/intel64 lib/ia32
288  DOC "Intel(R) LP64 MKL BLACS Library"
289)
290
291find_library( intelmkl_ILP64_SCALAPACK_LIBRARY
292  NAMES ${intelmkl_ILP64_SCALAPACK_LIBRARY_NAME}
293  HINTS ${intelmkl_PREFIX}
294  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
295  PATH_SUFFIXES lib/intel64 lib/ia32
296  DOC "Intel(R) ILP64 MKL SCALAPACK Library"
297)
298
299find_library( intelmkl_LP64_SCALAPACK_LIBRARY
300  NAMES ${intelmkl_LP64_SCALAPACK_LIBRARY_NAME}
301  HINTS ${intelmkl_PREFIX}
302  PATHS ${intelmkl_LIBRARY_DIR} ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}
303  PATH_SUFFIXES lib/intel64 lib/ia32
304  DOC "Intel(R) LP64 MKL SCALAPACK Library"
305)
306
307
308
309# Default to LP64
310if( "ilp64" IN_LIST IntelMKL_FIND_COMPONENTS )
311  set(MKL_ILP64 ON)
312  #set( IntelMKL_COMPILE_DEFINITIONS "MKL_ILP64" )
313  if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
314    set( IntelMKL_C_COMPILE_FLAGS        "-m64" )
315    set( IntelMKL_Fortran_COMPILE_FLAGS  "-m64" "-fdefault-integer-8" )
316  elseif( CMAKE_C_COMPILER_ID MATCHES "PGI" )
317    set( IntelMKL_Fortran_COMPILE_FLAGS "-i8" )
318  endif()
319  set( intelmkl_LIBRARY ${intelmkl_ILP64_LIBRARY} )
320
321  if( intelmkl_ILP64_BLACS_LIBRARY )
322    set( intelmkl_BLACS_LIBRARY ${intelmkl_ILP64_BLACS_LIBRARY} )
323    set( IntelMKL_blacs_FOUND TRUE )
324  endif()
325
326  if( intelmkl_ILP64_SCALAPACK_LIBRARY )
327    set( intelmkl_SCALAPACK_LIBRARY ${intelmkl_ILP64_SCALAPACK_LIBRARY} )
328    set( IntelMKL_scalapack_FOUND TRUE )
329  endif()
330
331else()
332  set( intelmkl_LIBRARY ${intelmkl_LP64_LIBRARY} )
333
334  if( intelmkl_LP64_BLACS_LIBRARY )
335    set( intelmkl_BLACS_LIBRARY ${intelmkl_LP64_BLACS_LIBRARY} )
336    set( IntelMKL_blacs_FOUND TRUE )
337  endif()
338
339  if( intelmkl_LP64_SCALAPACK_LIBRARY )
340    set( intelmkl_SCALAPACK_LIBRARY ${intelmkl_LP64_SCALAPACK_LIBRARY} )
341    set( IntelMKL_scalapack_FOUND TRUE )
342  endif()
343endif()
344
345
346
347
348
349# Check if found library is actually static
350if( intelmkl_CORE_LIBRARY MATCHES ".+libmkl_core.a" )
351  set( intelmkl_PREFERS_STATIC TRUE )
352endif()
353
354
355
356
357if( intelmkl_LIBRARY AND intelmkl_THREAD_LIBRARY AND intelmkl_CORE_LIBRARY )
358  #if( intelmkl_PREFERS_STATIC )
359  #  set( IntelMKL_LIBRARIES "-Wl,--start-group" ${intelmkl_LIBRARY} ${intelmkl_THREAD_LIBRARY} ${intelmkl_CORE_LIBRARY} "-Wl,--end-group" )
360  #else()
361  #  set( IntelMKL_LIBRARIES "-Wl,--no-as-needed" ${intelmkl_LIBRARY} ${intelmkl_THREAD_LIBRARY} ${intelmkl_CORE_LIBRARY} )
362  #endif()
363
364
365  if( intelmkl_PREFERS_STATIC )
366
367    if( "scalapack" IN_LIST IntelMKL_FIND_COMPONENTS )
368      set( IntelMKL_LIBRARIES ${intelmkl_SCALAPACK_LIBRARY} )
369    endif()
370
371    list( APPEND IntelMKL_LIBRARIES  "-Wl,--start-group" ${intelmkl_LIBRARY} ${intelmkl_THREAD_LIBRARY} ${intelmkl_CORE_LIBRARY} ${intelmkl_SYCL_LIBRARY})
372
373    if( "blacs" IN_LIST IntelMKL_FIND_COMPONENTS )
374      list( APPEND IntelMKL_LIBRARIES ${intelmkl_BLACS_LIBRARY} )
375    endif()
376
377    list( APPEND IntelMKL_LIBRARIES "-Wl,--end-group" )
378
379  else()
380
381    set( IntelMKL_LIBRARIES "-Wl,--no-as-needed" )
382    if( "scalapack" IN_LIST IntelMKL_FIND_COMPONENTS )
383      list( APPEND IntelMKL_LIBRARIES ${intelmkl_SCALAPACK_LIBRARY} )
384    endif()
385
386    list( APPEND IntelMKL_LIBRARIES  ${intelmkl_LIBRARY} ${intelmkl_THREAD_LIBRARY} ${intelmkl_CORE_LIBRARY} ${intelmkl_SYCL_LIBRARY})
387
388    if( "blacs" IN_LIST IntelMKL_FIND_COMPONENTS )
389      list( APPEND IntelMKL_LIBRARIES ${intelmkl_BLACS_LIBRARY} )
390    endif()
391
392  endif()
393
394
395  if( intelmkl_PREFERED_THREAD_LEVEL MATCHES "openmp" )
396    find_package( OpenMP QUIET )
397    set( IntelMKL_LIBRARIES ${IntelMKL_LIBRARIES} OpenMP::OpenMP_C )
398  elseif( intelmkl_PREFERED_THREAD_LEVEL MATCHES "sequential" )
399    find_package( Threads )
400    set( IntelMKL_LIBRARIES ${IntelMKL_LIBRARIES} Threads::Threads )
401  elseif( intelmkl_PREFERED_THREAD_LEVEL MATCHES "tbb" )
402    find_package( TBB QUIET )
403    set( IntelMKL_LIBRARIES ${IntelMKL_LIBRARIES} tbb )
404  endif()
405  set( IntelMKL_LIBRARIES ${IntelMKL_LIBRARIES} "m" "dl" )
406endif()
407
408# list(APPEND IntelMKL_COMPILE_DEFINITIONS "BLA_LAPACK_INT=MKL_INT")
409# list(APPEND IntelMKL_COMPILE_DEFINITIONS "BLA_LAPACK_COMPLEX8=MKL_Complex8")
410# list(APPEND IntelMKL_COMPILE_DEFINITIONS "BLA_LAPACK_COMPLEX16=MKL_Complex16")
411# list(APPEND IntelMKL_COMPILE_DEFINITIONS "BLA_VENDOR_MKL")
412
413set(BLA_VENDOR_MKL ON)
414set(BLA_LAPACK_INT       "MKL_INT")
415set(BLA_LAPACK_COMPLEX8  "MKL_Complex8")
416set(BLA_LAPACK_COMPLEX16 "MKL_Complex16")
417
418include(FindPackageHandleStandardArgs)
419is_valid(IntelMKL_C_COMPILE_FLAGS __has_cflags)
420if(__has_cflags)
421  find_package_handle_standard_args( IntelMKL
422    REQUIRED_VARS IntelMKL_LIBRARIES IntelMKL_INCLUDE_DIR
423      IntelMKL_C_COMPILE_FLAGS
424    VERSION_VAR IntelMKL_VERSION_STRING
425    HANDLE_COMPONENTS
426  )
427else()
428  find_package_handle_standard_args( IntelMKL
429    REQUIRED_VARS IntelMKL_LIBRARIES IntelMKL_INCLUDE_DIR
430    VERSION_VAR IntelMKL_VERSION_STRING
431    HANDLE_COMPONENTS
432  )
433endif()
434
435if( IntelMKL_FOUND AND NOT TARGET IntelMKL::mkl )
436
437  add_library( IntelMKL::mkl INTERFACE IMPORTED )
438
439  set_target_properties( IntelMKL::mkl PROPERTIES
440    INTERFACE_INCLUDE_DIRECTORIES "${IntelMKL_INCLUDE_DIR}"
441    INTERFACE_LINK_LIBRARIES      "${IntelMKL_LIBRARIES}"
442    INTERFACE_COMPILE_OPTIONS     "${IntelMKL_C_COMPILE_FLAGS}"
443    # INTERFACE_COMPILE_DEFINITIONS "${IntelMKL_COMPILE_DEFINITIONS}"
444  )
445
446  if( "scalapack" IN_LIST IntelMKL_FIND_COMPONENTS AND NOT scalapack_LIBRARIES )
447    set( scalapack_LIBRARIES IntelMKL::mkl )
448  endif()
449
450  if( "blacs" IN_LIST IntelMKL_FIND_COMPONENTS AND NOT blacs_LIBRARIES )
451    set( blacs_LIBRARIES IntelMKL::mkl )
452  endif()
453
454endif()
455