1 | # Find BLAS library
|
---|
2 | #
|
---|
3 | # This module finds an installed library that implements the BLAS
|
---|
4 | # linear-algebra interface (see http://www.netlib.org/blas/).
|
---|
5 | # The list of libraries searched for is mainly taken
|
---|
6 | # from the autoconf macro file, acx_blas.m4 (distributed at
|
---|
7 | # http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
|
---|
8 | #
|
---|
9 | # This module sets the following variables:
|
---|
10 | # BLAS_FOUND - set to true if a library implementing the BLAS interface
|
---|
11 | # is found
|
---|
12 | # BLAS_INCLUDE_DIR - Directories containing the BLAS header files
|
---|
13 | # BLAS_DEFINITIONS - Compilation options to use BLAS
|
---|
14 | # BLAS_LINKER_FLAGS - Linker flags to use BLAS (excluding -l
|
---|
15 | # and -L).
|
---|
16 | # BLAS_LIBRARIES_DIR - Directories containing the BLAS libraries.
|
---|
17 | # May be null if BLAS_LIBRARIES contains libraries name using full path.
|
---|
18 | # BLAS_LIBRARIES - List of libraries to link against BLAS interface.
|
---|
19 | # May be null if the compiler supports auto-link (e.g. VC++).
|
---|
20 | # BLAS_USE_FILE - The name of the cmake module to include to compile
|
---|
21 | # applications or libraries using BLAS.
|
---|
22 | #
|
---|
23 | # This module was modified by CGAL team:
|
---|
24 | # - find libraries for a C++ compiler, instead of Fortran
|
---|
25 | # - added BLAS_INCLUDE_DIR, BLAS_DEFINITIONS and BLAS_LIBRARIES_DIR
|
---|
26 | # - removed BLAS95_LIBRARIES
|
---|
27 |
|
---|
28 | include(CheckFunctionExists)
|
---|
29 |
|
---|
30 |
|
---|
31 | # This macro checks for the existence of the combination of fortran libraries
|
---|
32 | # given by _list. If the combination is found, this macro checks (using the
|
---|
33 | # check_function_exists macro) whether can link against that library
|
---|
34 | # combination using the name of a routine given by _name using the linker
|
---|
35 | # flags given by _flags. If the combination of libraries is found and passes
|
---|
36 | # the link test, LIBRARIES is set to the list of complete library paths that
|
---|
37 | # have been found and DEFINITIONS to the required definitions.
|
---|
38 | # Otherwise, LIBRARIES is set to FALSE.
|
---|
39 | # N.B. _prefix is the prefix applied to the names of all cached variables that
|
---|
40 | # are generated internally and marked advanced by this macro.
|
---|
41 | macro(check_fortran_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _path)
|
---|
42 | #message("DEBUG: check_fortran_libraries(${_list} in ${_path})")
|
---|
43 |
|
---|
44 | # Check for the existence of the libraries given by _list
|
---|
45 | set(_libraries_found TRUE)
|
---|
46 | set(_libraries_work FALSE)
|
---|
47 | set(${DEFINITIONS} "")
|
---|
48 | set(${LIBRARIES} "")
|
---|
49 | set(_combined_name)
|
---|
50 | foreach(_library ${_list})
|
---|
51 | set(_combined_name ${_combined_name}_${_library})
|
---|
52 |
|
---|
53 | if(_libraries_found)
|
---|
54 | # search first in ${_path}
|
---|
55 | find_library(${_prefix}_${_library}_LIBRARY
|
---|
56 | NAMES ${_library}
|
---|
57 | PATHS ${_path} NO_DEFAULT_PATH
|
---|
58 | )
|
---|
59 | # if not found, search in environment variables and system
|
---|
60 | if ( WIN32 )
|
---|
61 | find_library(${_prefix}_${_library}_LIBRARY
|
---|
62 | NAMES ${_library}
|
---|
63 | PATHS ENV LIB
|
---|
64 | )
|
---|
65 | elseif ( APPLE )
|
---|
66 | find_library(${_prefix}_${_library}_LIBRARY
|
---|
67 | NAMES ${_library}
|
---|
68 | PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH
|
---|
69 | )
|
---|
70 | else ()
|
---|
71 | find_library(${_prefix}_${_library}_LIBRARY
|
---|
72 | NAMES ${_library}
|
---|
73 | PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH
|
---|
74 | )
|
---|
75 | endif()
|
---|
76 | mark_as_advanced(${_prefix}_${_library}_LIBRARY)
|
---|
77 | set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
|
---|
78 | set(_libraries_found ${${_prefix}_${_library}_LIBRARY})
|
---|
79 | endif(_libraries_found)
|
---|
80 | endforeach(_library ${_list})
|
---|
81 | if(_libraries_found)
|
---|
82 | set(_libraries_found ${${LIBRARIES}})
|
---|
83 | endif()
|
---|
84 |
|
---|
85 | # Test this combination of libraries with the Fortran/f2c interface.
|
---|
86 | # We test the Fortran interface first as it is well standardized.
|
---|
87 | if(_libraries_found AND NOT _libraries_work)
|
---|
88 | set(${DEFINITIONS} "-D${_prefix}_USE_F2C")
|
---|
89 | set(${LIBRARIES} ${_libraries_found})
|
---|
90 | # Some C++ linkers require the f2c library to link with Fortran libraries.
|
---|
91 | # I do not know which ones, thus I just add the f2c library if it is available.
|
---|
92 | find_package( F2C QUIET )
|
---|
93 | if ( F2C_FOUND )
|
---|
94 | set(${DEFINITIONS} ${${DEFINITIONS}} ${F2C_DEFINITIONS})
|
---|
95 | set(${LIBRARIES} ${${LIBRARIES}} ${F2C_LIBRARIES})
|
---|
96 | endif()
|
---|
97 | set(CMAKE_REQUIRED_DEFINITIONS ${${DEFINITIONS}})
|
---|
98 | set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}})
|
---|
99 | #message("DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}")
|
---|
100 | #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
|
---|
101 | # Check if function exists with f2c calling convention (ie a trailing underscore)
|
---|
102 | check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)
|
---|
103 | set(CMAKE_REQUIRED_DEFINITIONS} "")
|
---|
104 | set(CMAKE_REQUIRED_LIBRARIES "")
|
---|
105 | mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)
|
---|
106 | set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})
|
---|
107 | endif(_libraries_found AND NOT _libraries_work)
|
---|
108 |
|
---|
109 | # If not found, test this combination of libraries with a C interface.
|
---|
110 | # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.
|
---|
111 | if(_libraries_found AND NOT _libraries_work)
|
---|
112 | set(${DEFINITIONS} "")
|
---|
113 | set(${LIBRARIES} ${_libraries_found})
|
---|
114 | set(CMAKE_REQUIRED_DEFINITIONS "")
|
---|
115 | set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}})
|
---|
116 | #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
|
---|
117 | check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)
|
---|
118 | set(CMAKE_REQUIRED_LIBRARIES "")
|
---|
119 | mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)
|
---|
120 | set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})
|
---|
121 | endif(_libraries_found AND NOT _libraries_work)
|
---|
122 |
|
---|
123 | # on failure
|
---|
124 | if(NOT _libraries_work)
|
---|
125 | set(${DEFINITIONS} "")
|
---|
126 | set(${LIBRARIES} FALSE)
|
---|
127 | endif()
|
---|
128 | #message("DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}")
|
---|
129 | #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
|
---|
130 | endmacro(check_fortran_libraries)
|
---|
131 |
|
---|
132 |
|
---|
133 | #
|
---|
134 | # main
|
---|
135 | #
|
---|
136 |
|
---|
137 | # Is it already configured?
|
---|
138 | if (BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)
|
---|
139 |
|
---|
140 | set(BLAS_FOUND TRUE)
|
---|
141 |
|
---|
142 | else()
|
---|
143 |
|
---|
144 | # reset variables
|
---|
145 | set( BLAS_INCLUDE_DIR "" )
|
---|
146 | set( BLAS_DEFINITIONS "" )
|
---|
147 | set( BLAS_LINKER_FLAGS "" )
|
---|
148 | set( BLAS_LIBRARIES "" )
|
---|
149 | set( BLAS_LIBRARIES_DIR "" )
|
---|
150 |
|
---|
151 | #
|
---|
152 | # If Unix, search for BLAS function in possible libraries
|
---|
153 | #
|
---|
154 |
|
---|
155 | # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
|
---|
156 | if(NOT BLAS_LIBRARIES)
|
---|
157 | check_fortran_libraries(
|
---|
158 | BLAS_DEFINITIONS
|
---|
159 | BLAS_LIBRARIES
|
---|
160 | BLAS
|
---|
161 | sgemm
|
---|
162 | ""
|
---|
163 | "cblas;f77blas;atlas"
|
---|
164 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
165 | )
|
---|
166 | endif()
|
---|
167 |
|
---|
168 | # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
|
---|
169 | if(NOT BLAS_LIBRARIES)
|
---|
170 | check_fortran_libraries(
|
---|
171 | BLAS_DEFINITIONS
|
---|
172 | BLAS_LIBRARIES
|
---|
173 | BLAS
|
---|
174 | sgemm
|
---|
175 | ""
|
---|
176 | "sgemm;dgemm;blas"
|
---|
177 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
178 | )
|
---|
179 | endif()
|
---|
180 |
|
---|
181 | # BLAS in Alpha CXML library?
|
---|
182 | if(NOT BLAS_LIBRARIES)
|
---|
183 | check_fortran_libraries(
|
---|
184 | BLAS_DEFINITIONS
|
---|
185 | BLAS_LIBRARIES
|
---|
186 | BLAS
|
---|
187 | sgemm
|
---|
188 | ""
|
---|
189 | "cxml"
|
---|
190 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
191 | )
|
---|
192 | endif()
|
---|
193 |
|
---|
194 | # BLAS in Alpha DXML library? (now called CXML, see above)
|
---|
195 | if(NOT BLAS_LIBRARIES)
|
---|
196 | check_fortran_libraries(
|
---|
197 | BLAS_DEFINITIONS
|
---|
198 | BLAS_LIBRARIES
|
---|
199 | BLAS
|
---|
200 | sgemm
|
---|
201 | ""
|
---|
202 | "dxml"
|
---|
203 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
204 | )
|
---|
205 | endif()
|
---|
206 |
|
---|
207 | # BLAS in Sun Performance library?
|
---|
208 | if(NOT BLAS_LIBRARIES)
|
---|
209 | check_fortran_libraries(
|
---|
210 | BLAS_DEFINITIONS
|
---|
211 | BLAS_LIBRARIES
|
---|
212 | BLAS
|
---|
213 | sgemm
|
---|
214 | "-xlic_lib=sunperf"
|
---|
215 | "sunperf;sunmath"
|
---|
216 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
217 | )
|
---|
218 | if(BLAS_LIBRARIES)
|
---|
219 | # Extra linker flag
|
---|
220 | set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
|
---|
221 | endif()
|
---|
222 | endif()
|
---|
223 |
|
---|
224 | # BLAS in SCSL library? (SGI/Cray Scientific Library)
|
---|
225 | if(NOT BLAS_LIBRARIES)
|
---|
226 | check_fortran_libraries(
|
---|
227 | BLAS_DEFINITIONS
|
---|
228 | BLAS_LIBRARIES
|
---|
229 | BLAS
|
---|
230 | sgemm
|
---|
231 | ""
|
---|
232 | "scsl"
|
---|
233 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
234 | )
|
---|
235 | endif()
|
---|
236 |
|
---|
237 | # BLAS in SGIMATH library?
|
---|
238 | if(NOT BLAS_LIBRARIES)
|
---|
239 | check_fortran_libraries(
|
---|
240 | BLAS_DEFINITIONS
|
---|
241 | BLAS_LIBRARIES
|
---|
242 | BLAS
|
---|
243 | sgemm
|
---|
244 | ""
|
---|
245 | "complib.sgimath"
|
---|
246 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
247 | )
|
---|
248 | endif()
|
---|
249 |
|
---|
250 | # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
|
---|
251 | if(NOT BLAS_LIBRARIES)
|
---|
252 | check_fortran_libraries(
|
---|
253 | BLAS_DEFINITIONS
|
---|
254 | BLAS_LIBRARIES
|
---|
255 | BLAS
|
---|
256 | sgemm
|
---|
257 | ""
|
---|
258 | "essl;blas"
|
---|
259 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
260 | )
|
---|
261 | endif()
|
---|
262 |
|
---|
263 | #BLAS in intel mkl 10 library? (em64t 64bit)
|
---|
264 | if(NOT BLAS_LIBRARIES)
|
---|
265 | check_fortran_libraries(
|
---|
266 | BLAS_DEFINITIONS
|
---|
267 | BLAS_LIBRARIES
|
---|
268 | BLAS
|
---|
269 | sgemm
|
---|
270 | ""
|
---|
271 | "mkl_intel_lp64;mkl_intel_thread;mkl_core;guide;pthread"
|
---|
272 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
273 | )
|
---|
274 | endif()
|
---|
275 |
|
---|
276 | ### windows version of intel mkl 10?
|
---|
277 | if(NOT BLAS_LIBRARIES)
|
---|
278 | check_fortran_libraries(
|
---|
279 | BLAS_DEFINITIONS
|
---|
280 | BLAS_LIBRARIES
|
---|
281 | BLAS
|
---|
282 | SGEMM
|
---|
283 | ""
|
---|
284 | "mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40"
|
---|
285 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
286 | )
|
---|
287 | endif()
|
---|
288 |
|
---|
289 | #older versions of intel mkl libs
|
---|
290 |
|
---|
291 | # BLAS in intel mkl library? (shared)
|
---|
292 | if(NOT BLAS_LIBRARIES)
|
---|
293 | check_fortran_libraries(
|
---|
294 | BLAS_DEFINITIONS
|
---|
295 | BLAS_LIBRARIES
|
---|
296 | BLAS
|
---|
297 | sgemm
|
---|
298 | ""
|
---|
299 | "mkl;guide;pthread"
|
---|
300 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
301 | )
|
---|
302 | endif()
|
---|
303 |
|
---|
304 | #BLAS in intel mkl library? (static, 32bit)
|
---|
305 | if(NOT BLAS_LIBRARIES)
|
---|
306 | check_fortran_libraries(
|
---|
307 | BLAS_DEFINITIONS
|
---|
308 | BLAS_LIBRARIES
|
---|
309 | BLAS
|
---|
310 | sgemm
|
---|
311 | ""
|
---|
312 | "mkl_ia32;guide;pthread"
|
---|
313 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
314 | )
|
---|
315 | endif()
|
---|
316 |
|
---|
317 | #BLAS in intel mkl library? (static, em64t 64bit)
|
---|
318 | if(NOT BLAS_LIBRARIES)
|
---|
319 | check_fortran_libraries(
|
---|
320 | BLAS_DEFINITIONS
|
---|
321 | BLAS_LIBRARIES
|
---|
322 | BLAS
|
---|
323 | sgemm
|
---|
324 | ""
|
---|
325 | "mkl_em64t;guide;pthread"
|
---|
326 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
327 | )
|
---|
328 | endif()
|
---|
329 |
|
---|
330 | #BLAS in acml library?
|
---|
331 | if(NOT BLAS_LIBRARIES)
|
---|
332 | check_fortran_libraries(
|
---|
333 | BLAS_DEFINITIONS
|
---|
334 | BLAS_LIBRARIES
|
---|
335 | BLAS
|
---|
336 | sgemm
|
---|
337 | ""
|
---|
338 | "acml"
|
---|
339 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
340 | )
|
---|
341 | endif()
|
---|
342 |
|
---|
343 | # Apple BLAS library?
|
---|
344 | if(NOT BLAS_LIBRARIES)
|
---|
345 | check_fortran_libraries(
|
---|
346 | BLAS_DEFINITIONS
|
---|
347 | BLAS_LIBRARIES
|
---|
348 | BLAS
|
---|
349 | sgemm
|
---|
350 | ""
|
---|
351 | "Accelerate"
|
---|
352 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
353 | )
|
---|
354 | endif()
|
---|
355 |
|
---|
356 | if ( NOT BLAS_LIBRARIES )
|
---|
357 | check_fortran_libraries(
|
---|
358 | BLAS_DEFINITIONS
|
---|
359 | BLAS_LIBRARIES
|
---|
360 | BLAS
|
---|
361 | sgemm
|
---|
362 | ""
|
---|
363 | "vecLib"
|
---|
364 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
365 | )
|
---|
366 | endif ( NOT BLAS_LIBRARIES )
|
---|
367 |
|
---|
368 | # Generic BLAS library?
|
---|
369 | # This configuration *must* be the last try as this library is notably slow.
|
---|
370 | if ( NOT BLAS_LIBRARIES )
|
---|
371 | check_fortran_libraries(
|
---|
372 | BLAS_DEFINITIONS
|
---|
373 | BLAS_LIBRARIES
|
---|
374 | BLAS
|
---|
375 | sgemm
|
---|
376 | ""
|
---|
377 | "blas"
|
---|
378 | "${CGAL_TAUCS_LIBRARIES_DIR} ENV BLAS_LIB_DIR"
|
---|
379 | )
|
---|
380 | endif()
|
---|
381 |
|
---|
382 | if(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)
|
---|
383 | set(BLAS_FOUND TRUE)
|
---|
384 | else()
|
---|
385 | set(BLAS_FOUND FALSE)
|
---|
386 | endif()
|
---|
387 |
|
---|
388 | if(NOT BLAS_FIND_QUIETLY)
|
---|
389 | if(BLAS_FOUND)
|
---|
390 | message(STATUS "A library with BLAS API found.")
|
---|
391 | else(BLAS_FOUND)
|
---|
392 | if(BLAS_FIND_REQUIRED)
|
---|
393 | message(FATAL_ERROR "A required library with BLAS API not found. Please specify library location.")
|
---|
394 | else()
|
---|
395 | message(STATUS "A library with BLAS API not found. Please specify library location.")
|
---|
396 | endif()
|
---|
397 | endif(BLAS_FOUND)
|
---|
398 | endif(NOT BLAS_FIND_QUIETLY)
|
---|
399 |
|
---|
400 | # Add variables to cache
|
---|
401 | set( BLAS_INCLUDE_DIR "${BLAS_INCLUDE_DIR}"
|
---|
402 | CACHE PATH "Directories containing the BLAS header files" FORCE )
|
---|
403 | set( BLAS_DEFINITIONS "${BLAS_DEFINITIONS}"
|
---|
404 | CACHE STRING "Compilation options to use BLAS" FORCE )
|
---|
405 | set( BLAS_LINKER_FLAGS "${BLAS_LINKER_FLAGS}"
|
---|
406 | CACHE STRING "Linker flags to use BLAS" FORCE )
|
---|
407 | set( BLAS_LIBRARIES "${BLAS_LIBRARIES}"
|
---|
408 | CACHE FILEPATH "BLAS libraries name" FORCE )
|
---|
409 | set( BLAS_LIBRARIES_DIR "${BLAS_LIBRARIES_DIR}"
|
---|
410 | CACHE PATH "Directories containing the BLAS libraries" FORCE )
|
---|
411 |
|
---|
412 | #message("DEBUG: BLAS_INCLUDE_DIR = ${BLAS_INCLUDE_DIR}")
|
---|
413 | #message("DEBUG: BLAS_DEFINITIONS = ${BLAS_DEFINITIONS}")
|
---|
414 | #message("DEBUG: BLAS_LINKER_FLAGS = ${BLAS_LINKER_FLAGS}")
|
---|
415 | #message("DEBUG: BLAS_LIBRARIES = ${BLAS_LIBRARIES}")
|
---|
416 | #message("DEBUG: BLAS_LIBRARIES_DIR = ${BLAS_LIBRARIES_DIR}")
|
---|
417 | #message("DEBUG: BLAS_FOUND = ${BLAS_FOUND}")
|
---|
418 |
|
---|
419 | endif(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)
|
---|