FindLAPACK.cmake 10.3 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
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#[=======================================================================[.rst:
FindLAPACK
----------

Find LAPACK library

This module finds an installed fortran library that implements the
LAPACK linear-algebra interface (see http://www.netlib.org/lapack/).

The approach follows that taken for the autoconf macro file,
acx_lapack.m4 (distributed at
http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).

This module sets the following variables:

::

  LAPACK_FOUND - set to true if a library implementing the LAPACK interface
    is found
  LAPACK_LINKER_FLAGS - uncached list of required linker flags (excluding -l
    and -L).
  LAPACK_LIBRARIES - uncached list of libraries (using full path name) to
    link against to use LAPACK
  LAPACK95_LIBRARIES - uncached list of libraries (using full path name) to
    link against to use LAPACK95
  LAPACK95_FOUND - set to true if a library implementing the LAPACK 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:

* Intel(mkl)
* OpenBLAS
* FLAME
* ACML
* Apple
* NAS
* Generic

#]=======================================================================]
47

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
48
49
set(_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})

50
51
52
53
54
55
56
57
58
59
60
# Check the language being used
if( NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED) )
  if(LAPACK_FIND_REQUIRED)
    message(FATAL_ERROR "FindLAPACK requires Fortran, C, or C++ to be enabled.")
  else()
    message(STATUS "Looking for LAPACK... - NOT found (Unsupported languages)")
    return()
  endif()
endif()

if (CMAKE_Fortran_COMPILER_LOADED)
61
include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
62
63
else ()
include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
64
endif ()
65
66
67
68
include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)

cmake_push_check_state()
set(CMAKE_REQUIRED_QUIET ${LAPACK_FIND_QUIETLY})
69

70
71
72
set(LAPACK_FOUND FALSE)
set(LAPACK95_FOUND FALSE)

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
73
74
# TODO: move this stuff to separate module

75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas _threads)
# 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.

set(_libraries_work TRUE)
set(${LIBRARIES})
set(_combined_name)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
90
91
92
93
if (NOT _libdir)
  if (WIN32)
    set(_libdir ENV LIB)
  elseif (APPLE)
94
    set(_libdir ENV DYLD_LIBRARY_PATH)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
95
  else ()
96
    set(_libdir ENV LD_LIBRARY_PATH)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
97
98
  endif ()
endif ()
99
100
101

list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")

102
103
104
105
foreach(_library ${_list})
  set(_combined_name ${_combined_name}_${_library})

  if(_libraries_work)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
106
107
    if (BLA_STATIC)
      if (WIN32)
108
        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
109
      endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
110
      if (APPLE)
111
        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
112
      else ()
113
        set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
114
115
      endif ()
    else ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
116
117
			if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
        # for ubuntu's libblas3gf and liblapack3gf packages
118
        set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
119
      endif ()
120
    endif ()
121
    find_library(${_prefix}_${_library}_LIBRARY
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
122
123
124
      NAMES ${_library}
      PATHS ${_libdir}
      )
125
126
127
    mark_as_advanced(${_prefix}_${_library}_LIBRARY)
    set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
    set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
128
129
  endif()
endforeach()
130
131
132
133

if(_libraries_work)
  # Test this combination of libraries.
  if(UNIX AND BLA_STATIC)
134
    set(CMAKE_REQUIRED_LIBRARIES ${_flags} "-Wl,--start-group" ${${LIBRARIES}} ${_blas} "-Wl,--end-group" ${_threads})
135
  else()
136
    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas} ${_threads})
137
  endif()
138
#  message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
139
  if (NOT CMAKE_Fortran_COMPILER_LOADED)
140
    check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
141
  else ()
142
    check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
143
  endif ()
144
145
146
  set(CMAKE_REQUIRED_LIBRARIES)
  set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
  #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
147
endif()
148
149

 if(_libraries_work)
150
   set(${LIBRARIES} ${${LIBRARIES}} ${_blas} ${_threads})
151
 else()
152
    set(${LIBRARIES} FALSE)
153
 endif()
154

155
endmacro()
156
157
158
159
160
161
162
163
164


set(LAPACK_LINKER_FLAGS)
set(LAPACK_LIBRARIES)
set(LAPACK95_LIBRARIES)


if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
  find_package(BLAS)
165
else()
166
  find_package(BLAS REQUIRED)
167
endif()
168
169
170
171


if(BLAS_FOUND)
  set(LAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS})
172
  if (NOT $ENV{BLA_VENDOR} STREQUAL "")
173
    set(BLA_VENDOR $ENV{BLA_VENDOR})
174
  else ()
175
176
    if(NOT BLA_VENDOR)
      set(BLA_VENDOR "All")
177
178
    endif()
  endif ()
179

Jakub Benda's avatar
Jakub Benda committed
180
181
182
#intel lapack
if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  if (NOT WIN32)
183
    set(LAPACK_mkl_LM "-lm")
184
    set(LAPACK_mkl_LDL "-ldl")
Jakub Benda's avatar
Jakub Benda committed
185
186
187
188
189
190
191
192
193
  endif ()
  if (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
    if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
      find_PACKAGE(Threads)
    else()
      find_package(Threads REQUIRED)
    endif()

    if (BLA_VENDOR MATCHES "_64ilp")
194
      set(LAPACK_mkl_ILP_MODE "ilp64")
Jakub Benda's avatar
Jakub Benda committed
195
    else ()
196
      set(LAPACK_mkl_ILP_MODE "lp64")
Jakub Benda's avatar
Jakub Benda committed
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
    endif ()

    set(LAPACK_SEARCH_LIBS "")

    if (BLA_F95)
      set(LAPACK_mkl_SEARCH_SYMBOL "cheev_f95")
      set(_LIBRARIES LAPACK95_LIBRARIES)
      set(_BLAS_LIBRARIES ${BLAS95_LIBRARIES})

      # old
      list(APPEND LAPACK_SEARCH_LIBS
        "mkl_lapack95")
      # new >= 10.3
      list(APPEND LAPACK_SEARCH_LIBS
        "mkl_intel_c")
      list(APPEND LAPACK_SEARCH_LIBS
213
        "mkl_lapack95_${LAPACK_mkl_ILP_MODE}")
Jakub Benda's avatar
Jakub Benda committed
214
215
216
217
218
219
220
221
222
223
224
225
226
227
    else()
      set(LAPACK_mkl_SEARCH_SYMBOL "cheev")
      set(_LIBRARIES LAPACK_LIBRARIES)
      set(_BLAS_LIBRARIES ${BLAS_LIBRARIES})

      # old
      list(APPEND LAPACK_SEARCH_LIBS
        "mkl_lapack")
    endif()

    # First try empty lapack libs
    if (NOT ${_LIBRARIES})
      check_lapack_libraries(
        ${_LIBRARIES}
228
        LAPACK
Jakub Benda's avatar
Jakub Benda committed
229
230
231
232
        ${LAPACK_mkl_SEARCH_SYMBOL}
        ""
        ""
        "${_BLAS_LIBRARIES}"
233
        ""
Jakub Benda's avatar
Jakub Benda committed
234
235
236
237
238
239
240
        )
    endif ()
    # Then try the search libs
    foreach (IT ${LAPACK_SEARCH_LIBS})
      if (NOT ${_LIBRARIES})
        check_lapack_libraries(
          ${_LIBRARIES}
241
          LAPACK
Jakub Benda's avatar
Jakub Benda committed
242
243
244
245
          ${LAPACK_mkl_SEARCH_SYMBOL}
          ""
          "${IT}"
          "${_BLAS_LIBRARIES}"
246
          "${CMAKE_THREAD_LIBS_INIT};${LAPACK_mkl_LM};${LAPACK_mkl_LDL}"
Jakub Benda's avatar
Jakub Benda committed
247
248
249
250
          )
      endif ()
    endforeach ()

251
252
253
    unset(LAPACK_mkl_ILP_MODE)
    unset(LAPACK_mkl_SEARCH_SYMBOL)
    unset(LAPACK_mkl_LM)
254
    unset(LAPACK_mkl_LDL)
Jakub Benda's avatar
Jakub Benda committed
255
256
257
  endif ()
endif()

Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
258
259
260
261
262
263
264
265
266
267
268
if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
 if(NOT LAPACK_LIBRARIES)
  check_lapack_libraries(
  LAPACK_LIBRARIES
  LAPACK
  cheev
  ""
  "goto2"
  "${BLAS_LIBRARIES}"
  ""
  )
269
270
 endif()
endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
271

272
273
274
275
276
277
278
279
280
281
282
283
284
if (BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
 if(NOT LAPACK_LIBRARIES)
  check_lapack_libraries(
  LAPACK_LIBRARIES
  LAPACK
  cheev
  ""
  "openblas"
  "${BLAS_LIBRARIES}"
  ""
  )
 endif()
endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
285

286
287
288
289
290
291
292
293
294
295
296
297
298
299
if (BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
 if(NOT LAPACK_LIBRARIES)
  check_lapack_libraries(
  LAPACK_LIBRARIES
  LAPACK
  cheev
  ""
  "flame"
  "${BLAS_LIBRARIES}"
  ""
  )
 endif()
endif ()

300
#acml lapack
301
 if (BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
302
303
304
   if (BLAS_LIBRARIES MATCHES ".+acml.+")
     set (LAPACK_LIBRARIES ${BLAS_LIBRARIES})
   endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
305
 endif ()
306
307
308
309
310
311
312
313
314
315
316
317
318

# Apple LAPACK library?
if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
 if(NOT LAPACK_LIBRARIES)
  check_lapack_libraries(
  LAPACK_LIBRARIES
  LAPACK
  cheev
  ""
  "Accelerate"
  "${BLAS_LIBRARIES}"
  ""
  )
319
320
 endif()
endif ()
321
322
323
324
325
326
327
328
329
330
331
if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  if ( NOT LAPACK_LIBRARIES )
    check_lapack_libraries(
    LAPACK_LIBRARIES
    LAPACK
    cheev
    ""
    "vecLib"
    "${BLAS_LIBRARIES}"
    ""
    )
332
333
  endif ()
endif ()
334
# Generic LAPACK library?
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
335
336
337
if (BLA_VENDOR STREQUAL "Generic" OR
    BLA_VENDOR STREQUAL "ATLAS" OR
    BLA_VENDOR STREQUAL "All")
338
339
340
341
342
343
344
345
346
347
  if ( NOT LAPACK_LIBRARIES )
    check_lapack_libraries(
    LAPACK_LIBRARIES
    LAPACK
    cheev
    ""
    "lapack"
    "${BLAS_LIBRARIES}"
    ""
    )
348
  endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
349
endif ()
350

351
else()
352
  message(STATUS "LAPACK requires BLAS")
353
endif()
354
355
356
357

if(BLA_F95)
 if(LAPACK95_LIBRARIES)
  set(LAPACK95_FOUND TRUE)
358
 else()
359
  set(LAPACK95_FOUND FALSE)
360
 endif()
361
362
363
 if(NOT LAPACK_FIND_QUIETLY)
  if(LAPACK95_FOUND)
    message(STATUS "A library with LAPACK95 API found.")
364
  else()
365
366
367
368
    if(LAPACK_FIND_REQUIRED)
      message(FATAL_ERROR
      "A required library with LAPACK95 API not found. Please specify library location."
      )
369
    else()
370
371
372
      message(STATUS
      "A library with LAPACK95 API not found. Please specify library location."
      )
373
374
375
    endif()
  endif()
 endif()
376
377
 set(LAPACK_FOUND "${LAPACK95_FOUND}")
 set(LAPACK_LIBRARIES "${LAPACK95_LIBRARIES}")
378
else()
379
380
 if(LAPACK_LIBRARIES)
  set(LAPACK_FOUND TRUE)
381
 else()
382
  set(LAPACK_FOUND FALSE)
383
 endif()
384
385
386
387

 if(NOT LAPACK_FIND_QUIETLY)
  if(LAPACK_FOUND)
    message(STATUS "A library with LAPACK API found.")
388
  else()
389
390
391
392
    if(LAPACK_FIND_REQUIRED)
      message(FATAL_ERROR
      "A required library with LAPACK API not found. Please specify library location."
      )
393
    else()
394
395
396
      message(STATUS
      "A library with LAPACK API not found. Please specify library location."
      )
397
398
399
400
    endif()
  endif()
 endif()
endif()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
401

402
cmake_pop_check_state()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
403
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})