FindLAPACK.cmake 10.2 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
102
foreach(_library ${_list})
  set(_combined_name ${_combined_name}_${_library})

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

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

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

153
endmacro()
154
155
156
157
158
159
160
161
162


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


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


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

Jakub Benda's avatar
Jakub Benda committed
178
179
180
#intel lapack
if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  if (NOT WIN32)
181
    set(LAPACK_mkl_LM "-lm")
Jakub Benda's avatar
Jakub Benda committed
182
183
184
185
186
187
188
189
190
  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")
191
      set(LAPACK_mkl_ILP_MODE "ilp64")
Jakub Benda's avatar
Jakub Benda committed
192
    else ()
193
      set(LAPACK_mkl_ILP_MODE "lp64")
Jakub Benda's avatar
Jakub Benda committed
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
    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
210
        "mkl_lapack95_${LAPACK_mkl_ILP_MODE}")
Jakub Benda's avatar
Jakub Benda committed
211
212
213
214
215
216
217
218
219
220
221
222
223
224
    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}
225
        LAPACK
Jakub Benda's avatar
Jakub Benda committed
226
227
228
229
        ${LAPACK_mkl_SEARCH_SYMBOL}
        ""
        ""
        "${_BLAS_LIBRARIES}"
230
        ""
Jakub Benda's avatar
Jakub Benda committed
231
232
233
234
235
236
237
        )
    endif ()
    # Then try the search libs
    foreach (IT ${LAPACK_SEARCH_LIBS})
      if (NOT ${_LIBRARIES})
        check_lapack_libraries(
          ${_LIBRARIES}
238
          LAPACK
Jakub Benda's avatar
Jakub Benda committed
239
240
241
242
          ${LAPACK_mkl_SEARCH_SYMBOL}
          ""
          "${IT}"
          "${_BLAS_LIBRARIES}"
243
          "${CMAKE_THREAD_LIBS_INIT};${LAPACK_mkl_LM}"
Jakub Benda's avatar
Jakub Benda committed
244
245
246
247
          )
      endif ()
    endforeach ()

248
249
250
    unset(LAPACK_mkl_ILP_MODE)
    unset(LAPACK_mkl_SEARCH_SYMBOL)
    unset(LAPACK_mkl_LM)
Jakub Benda's avatar
Jakub Benda committed
251
252
253
  endif ()
endif()

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

268
269
270
271
272
273
274
275
276
277
278
279
280
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
281

282
283
284
285
286
287
288
289
290
291
292
293
294
295
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 ()

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

# 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}"
  ""
  )
315
316
 endif()
endif ()
317
318
319
320
321
322
323
324
325
326
327
if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  if ( NOT LAPACK_LIBRARIES )
    check_lapack_libraries(
    LAPACK_LIBRARIES
    LAPACK
    cheev
    ""
    "vecLib"
    "${BLAS_LIBRARIES}"
    ""
    )
328
329
  endif ()
endif ()
330
# Generic LAPACK library?
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
331
332
333
if (BLA_VENDOR STREQUAL "Generic" OR
    BLA_VENDOR STREQUAL "ATLAS" OR
    BLA_VENDOR STREQUAL "All")
334
335
336
337
338
339
340
341
342
343
  if ( NOT LAPACK_LIBRARIES )
    check_lapack_libraries(
    LAPACK_LIBRARIES
    LAPACK
    cheev
    ""
    "lapack"
    "${BLAS_LIBRARIES}"
    ""
    )
344
  endif ()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
345
endif ()
346

347
else()
348
  message(STATUS "LAPACK requires BLAS")
349
endif()
350
351
352
353

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

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

398
cmake_pop_check_state()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
399
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})