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

    unset(BLAS_mkl_ILP_MODE)
  endif ()
endif()

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

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

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

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

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

345
else()
346
  message(STATUS "LAPACK requires BLAS")
347
endif()
348
349
350
351

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

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

396
cmake_pop_check_state()
Alexey Ozeritsky's avatar
Alexey Ozeritsky committed
397
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})