ENH: add support for g77 extra _ at the end of functions that have an _ in the name...
[cmake.git] / Modules / FindBLAS.cmake
blobb821a23253cf6e4e138e4882ee47b1b8726e89d6
1 # - Find BLAS library
2 # This module finds an installed fortran library that implements the BLAS
3 # linear-algebra interface (see http://www.netlib.org/blas/).
4 # The list of libraries searched for is taken
5 # from the autoconf macro file, acx_blas.m4 (distributed at
6 # http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
8 # This module sets the following variables:
9 #  BLAS_FOUND - set to true if a library implementing the BLAS interface
10 #    is found
11 #  BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l
12 #    and -L).
13 #  BLAS_LIBRARIES - uncached list of libraries (using full path name) to
14 #    link against to use BLAS
15 #  BLAS95_LIBRARIES - uncached list of libraries (using full path name)
16 #    to link against to use BLAS95 interface
17 #  BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface
18 #    is found
19 #  BLA_STATIC  if set on this determines what kind of linkage we do (static)
20 #  BLA_VENDOR  if set checks only the specified vendor, if not set checks
21 #     all the posibilities
22 #  BLA_F95     if set on tries to find the f95 interfaces for BLAS/LAPACK
23 ##########
24 ### List of vendors (BLA_VENDOR) valid in this module
25 ##  ATLAS, PhiPACK,CXML,DXML,SunPerf,SCSL,SGIMATH,IBMESSL,Intel10_32 (intel mkl v10 32 bit),Intel10_64lp (intel mkl v10 64 bit,lp thread model, lp64 model),
26 ##  Intel( older versions of mkl 32 and 64 bit), ACML,Apple, NAS, Generic
27 # C/CXX should be enabled to use Intel mkl
28 get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES)
29 if(NOT _LANGUAGES_ MATCHES Fortran)
30   if(BLAS_FIND_REQUIRED)
31     message(FATAL_ERROR "FindBLAS is Fortran-only so Fortran must be enabled.")
32   else(BLAS_FIND_REQUIRED)
33     message(STATUS "Looking for BLAS... - NOT found (Fortran not enabled)") #
34     return()
35   endif(BLAS_FIND_REQUIRED)
36 endif(NOT _LANGUAGES_ MATCHES Fortran)
38 include(CheckFortranFunctionExists)
40 macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _threads)
41 # This macro checks for the existence of the combination of fortran libraries
42 # given by _list.  If the combination is found, this macro checks (using the
43 # Check_Fortran_Function_Exists macro) whether can link against that library
44 # combination using the name of a routine given by _name using the linker
45 # flags given by _flags.  If the combination of libraries is found and passes
46 # the link test, LIBRARIES is set to the list of complete library paths that
47 # have been found.  Otherwise, LIBRARIES is set to FALSE.
49 # N.B. _prefix is the prefix applied to the names of all cached variables that
50 # are generated internally and marked advanced by this macro.
52 set(_libraries_work TRUE)
53 set(${LIBRARIES})
54 set(_combined_name)
55 foreach(_library ${_list})
56   set(_combined_name ${_combined_name}_${_library})
58   if(_libraries_work)
59    if ( WIN32 )
60     if(BLA_STATIC)
61       set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll")
62     endif(BLA_STATIC)
63     find_library(${_prefix}_${_library}_LIBRARY
64     NAMES ${_library}
65     PATHS ENV LIB
66     )
67    endif ( WIN32 )
69    if ( APPLE )
70     if(BLA_STATIC)
71      set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll")
72     endif(BLA_STATIC)
73     find_library(${_prefix}_${_library}_LIBRARY
74     NAMES ${_library}
75     PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH
76     )
78    else ( APPLE )
79     if(BLA_STATIC)
80       set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
81     endif(BLA_STATIC)
82     find_library(${_prefix}_${_library}_LIBRARY
83     NAMES ${_library}
84     PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH
85     )
86    endif( APPLE )
87     mark_as_advanced(${_prefix}_${_library}_LIBRARY)
88     set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
89     set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
90   endif(_libraries_work)
91 endforeach(_library ${_list})
92 if(_libraries_work)
93   # Test this combination of libraries.
94   set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_threads})
95 #  message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
96   check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
97   set(CMAKE_REQUIRED_LIBRARIES)
98   mark_as_advanced(${_prefix}${_combined_name}_WORKS)
99   set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
100 endif(_libraries_work)
101 if(NOT _libraries_work)
102   set(${LIBRARIES} FALSE)
103 endif(NOT _libraries_work)
104 #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
105 endmacro(Check_Fortran_Libraries)
107 set(BLAS_LINKER_FLAGS)
108 set(BLAS_LIBRARIES)
109 set(BLAS95_LIBRARIES)
110 if ($ENV{BLA_VENDOR} MATCHES ".+")
111   set(BLA_VENDOR $ENV{BLA_VENDOR})
112 else ($ENV{BLA_VENDOR} MATCHES ".+")
113   if(NOT BLA_VENDOR)
114     set(BLA_VENDOR "All")
115   endif(NOT BLA_VENDOR)
116 endif ($ENV{BLA_VENDOR} MATCHES ".+")
118 if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
119  if(NOT BLAS_LIBRARIES)
120   # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
121   check_fortran_libraries(
122   BLAS_LIBRARIES
123   BLAS
124   cblas_dgemm
125   ""
126   "cblas;f77blas;atlas"
127   ""
128   )
129  endif(NOT BLAS_LIBRARIES)
130 endif (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
132 # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
133 if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
134  if(NOT BLAS_LIBRARIES)
135   check_fortran_libraries(
136   BLAS_LIBRARIES
137   BLAS
138   sgemm
139   ""
140   "sgemm;dgemm;blas"
141   ""
142   )
143  endif(NOT BLAS_LIBRARIES)
144 endif (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
146 # BLAS in Alpha CXML library?
147 if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
148  if(NOT BLAS_LIBRARIES)
149   check_fortran_libraries(
150   BLAS_LIBRARIES
151   BLAS
152   sgemm
153   ""
154   "cxml"
155   ""
156   )
157  endif(NOT BLAS_LIBRARIES)
158 endif (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
160 # BLAS in Alpha DXML library? (now called CXML, see above)
161 if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
162  if(NOT BLAS_LIBRARIES)
163   check_fortran_libraries(
164   BLAS_LIBRARIES
165   BLAS
166   sgemm
167   ""
168   "dxml"
169   ""
170   )
171  endif(NOT BLAS_LIBRARIES)
172 endif (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
174 # BLAS in Sun Performance library?
175 if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
176  if(NOT BLAS_LIBRARIES)
177   check_fortran_libraries(
178   BLAS_LIBRARIES
179   BLAS
180   sgemm
181   "-xlic_lib=sunperf"
182   "sunperf;sunmath"
183   ""
184   )
185   if(BLAS_LIBRARIES)
186     set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
187   endif(BLAS_LIBRARIES)
188  endif(NOT BLAS_LIBRARIES)
189 endif (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
191 # BLAS in SCSL library?  (SGI/Cray Scientific Library)
192 if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
193  if(NOT BLAS_LIBRARIES)
194   check_fortran_libraries(
195   BLAS_LIBRARIES
196   BLAS
197   sgemm
198   ""
199   "scsl"
200   ""
201   )
202  endif(NOT BLAS_LIBRARIES)
203 endif (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
205 # BLAS in SGIMATH library?
206 if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
207  if(NOT BLAS_LIBRARIES)
208   check_fortran_libraries(
209   BLAS_LIBRARIES
210   BLAS
211   sgemm
212   ""
213   "complib.sgimath"
214   ""
215   )
216  endif(NOT BLAS_LIBRARIES)
217 endif (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
219 # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
220 if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
221  if(NOT BLAS_LIBRARIES)
222   check_fortran_libraries(
223   BLAS_LIBRARIES
224   BLAS
225   sgemm
226   ""
227   "essl;blas"
228   ""
229   )
230  endif(NOT BLAS_LIBRARIES)
231 endif (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
233 #BLAS in acml library?
234 if (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
235  if(NOT BLAS_LIBRARIES)
236   check_fortran_libraries(
237   BLAS_LIBRARIES
238   BLAS
239   sgemm
240   ""
241   "acml"
242   ""
243   )
244  endif(NOT BLAS_LIBRARIES)
245 endif (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
247 # Apple BLAS library?
248 if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
249 if(NOT BLAS_LIBRARIES)
250   check_fortran_libraries(
251   BLAS_LIBRARIES
252   BLAS
253   cblas_dgemm
254   ""
255   "Accelerate"
256   ""
257   )
258  endif(NOT BLAS_LIBRARIES)
259 endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
261 if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
262  if ( NOT BLAS_LIBRARIES )
263     check_fortran_libraries(
264     BLAS_LIBRARIES
265     BLAS
266     cblas_dgemm
267     ""
268     "vecLib"
269     ""
270     )
271  endif ( NOT BLAS_LIBRARIES )
272 endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
273 # Generic BLAS library?
274 if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
275  if(NOT BLAS_LIBRARIES)
276   check_fortran_libraries(
277   BLAS_LIBRARIES
278   BLAS
279   sgemm
280   ""
281   "blas"
282   ""
283   )
284  endif(NOT BLAS_LIBRARIES)
285 endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
287 #BLAS in intel mkl 10 library? (em64t 64bit)
288 if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
289  if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
290   if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
291     find_package(Threads)
292   else(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
293     find_package(Threads REQUIRED)
294   endif(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
295   if (WIN32)
296   if(BLA_F95)
297     if(NOT BLAS95_LIBRARIES)
298     check_fortran_libraries(
299     BLAS95_LIBRARIES
300     BLAS
301     sgemm
302     ""
303     "mkl_blas95;mkl_intel_c;mkl_intel_thread;mkl_core;libguide40"
304     ""
305     )
306     endif(NOT BLAS95_LIBRARIES)
307   else(BLA_F95)
308     if(NOT BLAS_LIBRARIES)
309     check_fortran_libraries(
310     BLAS_LIBRARIES
311     BLAS
312     SGEMM
313     ""
314     "mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40"
315     ""
316     )
317     endif(NOT BLAS_LIBRARIES)
318   endif(BLA_F95)
319   else(WIN32)
320   if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
321     if(BLA_F95)
322       if(NOT BLAS95_LIBRARIES)
323       check_fortran_libraries(
324       BLAS95_LIBRARIES
325       BLAS
326       sgemm
327       ""
328       "mkl_blas95;mkl_intel;mkl_intel_thread;mkl_core;guide"
329       "${CMAKE_THREAD_LIBS_INIT}"
330       )
331       endif(NOT BLAS95_LIBRARIES)
332     else(BLA_F95)
333     if(NOT BLAS_LIBRARIES)
334       check_fortran_libraries(
335       BLAS_LIBRARIES
336       BLAS
337       sgemm
338       ""
339       "mkl_intel;mkl_intel_thread;mkl_core;guide"
340       "${CMAKE_THREAD_LIBS_INIT}"
341       )
342       endif(NOT BLAS_LIBRARIES)
343     endif(BLA_F95)
344   endif (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
345   if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
346    if(BLA_F95)
347     if(NOT BLAS95_LIBRARIES)
348       check_fortran_libraries(
349       BLAS95_LIBRARIES
350       BLAS
351       sgemm
352       ""
353       "mkl_blas95;mkl_intel_lp64;mkl_intel_thread;mkl_core;guide"
354       "${CMAKE_THREAD_LIBS_INIT}"
355       )
356     endif(NOT BLAS95_LIBRARIES)
357    else(BLA_F95)
358      if(NOT BLAS_LIBRARIES)
359       check_fortran_libraries(
360       BLAS_LIBRARIES
361       BLAS
362       sgemm
363       ""
364       "mkl_intel_lp64;mkl_intel_thread;mkl_core;guide"
365       "${CMAKE_THREAD_LIBS_INIT}"
366       )
367      endif(NOT BLAS_LIBRARIES)
368    endif(BLA_F95)
369   endif (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
370   endif (WIN32)
371   #older vesions of intel mkl libs
372   # BLAS in intel mkl library? (shared)
373   if(NOT BLAS_LIBRARIES)
374     check_fortran_libraries(
375     BLAS_LIBRARIES
376     BLAS
377     sgemm
378     ""
379     "mkl;guide"
380     "${CMAKE_THREAD_LIBS_INIT}"
381     )
382   endif(NOT BLAS_LIBRARIES)
383   #BLAS in intel mkl library? (static, 32bit)
384   if(NOT BLAS_LIBRARIES)
385     check_fortran_libraries(
386     BLAS_LIBRARIES
387     BLAS
388     sgemm
389     ""
390     "mkl_ia32;guide"
391     "${CMAKE_THREAD_LIBS_INIT}"
392     )
393   endif(NOT BLAS_LIBRARIES)
394   #BLAS in intel mkl library? (static, em64t 64bit)
395   if(NOT BLAS_LIBRARIES)
396     check_fortran_libraries(
397     BLAS_LIBRARIES
398     BLAS
399     sgemm
400     ""
401     "mkl_em64t;guide"
402     "${CMAKE_THREAD_LIBS_INIT}"
403     )
404   endif(NOT BLAS_LIBRARIES)
405  endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
406 endif (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
409 if(BLA_F95)
410  if(BLAS95_LIBRARIES)
411     set(BLAS95_FOUND TRUE)
412   else(BLAS95_LIBRARIES)
413     set(BLAS95_FOUND FALSE)
414   endif(BLAS95_LIBRARIES)
416   if(NOT BLAS_FIND_QUIETLY)
417     if(BLAS95_FOUND)
418       message(STATUS "A library with BLAS95 API found.")
419     else(BLAS95_FOUND)
420       if(BLAS_FIND_REQUIRED)
421         message(FATAL_ERROR
422         "A required library with BLAS95 API not found. Please specify library location.")
423       else(BLAS_FIND_REQUIRED)
424         message(STATUS
425         "A library with BLAS95 API not found. Please specify library location.")
426       endif(BLAS_FIND_REQUIRED)
427     endif(BLAS95_FOUND)
428   endif(NOT BLAS_FIND_QUIETLY)
429   set(BLAS_FOUND TRUE)
430   set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
431 else(BLA_F95)
432   if(BLAS_LIBRARIES)
433     set(BLAS_FOUND TRUE)
434   else(BLAS_LIBRARIES)
435     set(BLAS_FOUND FALSE)
436   endif(BLAS_LIBRARIES)
438   if(NOT BLAS_FIND_QUIETLY)
439     if(BLAS_FOUND)
440       message(STATUS "A library with BLAS API found.")
441     else(BLAS_FOUND)
442       if(BLAS_FIND_REQUIRED)
443         message(FATAL_ERROR
444         "A required library with BLAS API not found. Please specify library location."
445         )
446       else(BLAS_FIND_REQUIRED)
447         message(STATUS
448         "A library with BLAS API not found. Please specify library location."
449         )
450       endif(BLAS_FIND_REQUIRED)
451     endif(BLAS_FOUND)
452   endif(NOT BLAS_FIND_QUIETLY)
453 endif(BLA_F95)