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) 420