cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

FindLAPACK.cmake (9734B)


      1 # Find LAPACK library
      2 #
      3 # This module finds an installed library that implements the LAPACK
      4 # linear-algebra interface (see http://www.netlib.org/lapack/).
      5 # The approach follows mostly that taken for the autoconf macro file, acx_lapack.m4
      6 # (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).
      7 #
      8 # This module sets the following variables:
      9 #  LAPACK_FOUND - set to true if a library implementing the LAPACK interface
     10 #    is found
     11 #  LAPACK_INCLUDE_DIR - Directories containing the LAPACK header files
     12 #  LAPACK_DEFINITIONS - Compilation options to use LAPACK
     13 #  LAPACK_LINKER_FLAGS - Linker flags to use LAPACK (excluding -l
     14 #    and -L).
     15 #  LAPACK_LIBRARIES_DIR - Directories containing the LAPACK libraries.
     16 #     May be null if LAPACK_LIBRARIES contains libraries name using full path.
     17 #  LAPACK_LIBRARIES - List of libraries to link against LAPACK interface.
     18 #     May be null if the compiler supports auto-link (e.g. VC++).
     19 #  LAPACK_USE_FILE - The name of the cmake module to include to compile
     20 #     applications or libraries using LAPACK.
     21 #
     22 # This module was modified by CGAL team:
     23 # - find libraries for a C++ compiler, instead of Fortran
     24 # - added LAPACK_INCLUDE_DIR, LAPACK_DEFINITIONS and LAPACK_LIBRARIES_DIR
     25 # - removed LAPACK95_LIBRARIES
     26 
     27 
     28 include(CheckFunctionExists)
     29 include(CMakeFindDependencyMacro)
     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_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _blas _path)
     42   #message("DEBUG: check_lapack_libraries(${_list} in ${_path} with ${_blas})")
     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()
     80   endforeach()
     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_dependency( 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}} ${_blas})
     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()
    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}} ${_blas})
    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()
    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()
    131 
    132 
    133 #
    134 # main
    135 #
    136 
    137 # LAPACK requires BLAS
    138 if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
    139   find_dependency(BLAS)
    140 else()
    141   find_dependency(BLAS REQUIRED)
    142 endif()
    143 
    144 if (NOT BLAS_FOUND)
    145 
    146   message(STATUS "LAPACK requires BLAS.")
    147   set(LAPACK_FOUND FALSE)
    148 
    149 # Is it already configured?
    150 elseif (LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)
    151 
    152   set(LAPACK_FOUND TRUE)
    153 
    154 else()
    155 
    156   # reset variables
    157   set( LAPACK_INCLUDE_DIR "" )
    158   set( LAPACK_DEFINITIONS "" )
    159   set( LAPACK_LINKER_FLAGS "" ) # unused (yet)
    160   set( LAPACK_LIBRARIES "" )
    161   set( LAPACK_LIBRARIES_DIR "" )
    162 
    163     #
    164     # If Unix, search for LAPACK function in possible libraries
    165     #
    166 
    167     #intel mkl lapack?
    168     if(NOT LAPACK_LIBRARIES)
    169       check_lapack_libraries(
    170       LAPACK_DEFINITIONS
    171       LAPACK_LIBRARIES
    172       LAPACK
    173       cheev
    174       ""
    175       "mkl_lapack"
    176       "${BLAS_LIBRARIES}"
    177       "${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
    178       )
    179     endif()
    180 
    181     #acml lapack?
    182     if(NOT LAPACK_LIBRARIES)
    183       check_lapack_libraries(
    184       LAPACK_DEFINITIONS
    185       LAPACK_LIBRARIES
    186       LAPACK
    187       cheev
    188       ""
    189       "acml"
    190       "${BLAS_LIBRARIES}"
    191       "${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
    192       )
    193     endif()
    194 
    195     # Apple LAPACK library?
    196     if(NOT LAPACK_LIBRARIES)
    197       check_lapack_libraries(
    198       LAPACK_DEFINITIONS
    199       LAPACK_LIBRARIES
    200       LAPACK
    201       cheev
    202       ""
    203       "Accelerate"
    204       "${BLAS_LIBRARIES}"
    205       "${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
    206       )
    207     endif()
    208 
    209     if ( NOT LAPACK_LIBRARIES )
    210       check_lapack_libraries(
    211       LAPACK_DEFINITIONS
    212       LAPACK_LIBRARIES
    213       LAPACK
    214       cheev
    215       ""
    216       "vecLib"
    217       "${BLAS_LIBRARIES}"
    218       "${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
    219       )
    220     endif ()
    221 
    222     # Generic LAPACK library?
    223     # This configuration *must* be the last try as this library is notably slow.
    224     if ( NOT LAPACK_LIBRARIES )
    225       check_lapack_libraries(
    226       LAPACK_DEFINITIONS
    227       LAPACK_LIBRARIES
    228       LAPACK
    229       cheev
    230       ""
    231       "lapack"
    232       "${BLAS_LIBRARIES}"
    233       "${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR"
    234       )
    235     endif()
    236 
    237   if(LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)
    238     set(LAPACK_FOUND TRUE)
    239   else()
    240     set(LAPACK_FOUND FALSE)
    241   endif()
    242 
    243   if(NOT LAPACK_FIND_QUIETLY)
    244     if(LAPACK_FOUND)
    245       message(STATUS "A library with LAPACK API found.")
    246     else()
    247       if(LAPACK_FIND_REQUIRED)
    248         message(FATAL_ERROR "A required library with LAPACK API not found. Please specify library location.")
    249       else()
    250         message(STATUS "A library with LAPACK API not found. Please specify library location.")
    251       endif()
    252     endif()
    253   endif()
    254 
    255   # Add variables to cache
    256   set( LAPACK_INCLUDE_DIR   "${LAPACK_INCLUDE_DIR}"
    257                             CACHE PATH "Directories containing the LAPACK header files" FORCE )
    258   set( LAPACK_DEFINITIONS   "${LAPACK_DEFINITIONS}"
    259                             CACHE STRING "Compilation options to use LAPACK" FORCE )
    260   set( LAPACK_LINKER_FLAGS  "${LAPACK_LINKER_FLAGS}"
    261                             CACHE STRING "Linker flags to use LAPACK" FORCE )
    262   set( LAPACK_LIBRARIES     "${LAPACK_LIBRARIES}"
    263                             CACHE FILEPATH "LAPACK libraries name" FORCE )
    264   set( LAPACK_LIBRARIES_DIR "${LAPACK_LIBRARIES_DIR}"
    265                             CACHE PATH "Directories containing the LAPACK libraries" FORCE )
    266 
    267   #message("DEBUG: LAPACK_INCLUDE_DIR = ${LAPACK_INCLUDE_DIR}")
    268   #message("DEBUG: LAPACK_DEFINITIONS = ${LAPACK_DEFINITIONS}")
    269   #message("DEBUG: LAPACK_LINKER_FLAGS = ${LAPACK_LINKER_FLAGS}")
    270   #message("DEBUG: LAPACK_LIBRARIES = ${LAPACK_LIBRARIES}")
    271   #message("DEBUG: LAPACK_LIBRARIES_DIR = ${LAPACK_LIBRARIES_DIR}")
    272   #message("DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}")
    273 
    274 endif()