1 macro(_find_header_file_in_dirs VAR NAME)
4 if(" ${ARGN}" STREQUAL " ")
5 check_include_file("${NAME}" HAVE_${VAR})
7 set(${VAR} "${NAME}") # fallback
12 find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
14 set(${VAR} "${${VAR}}/${NAME}")
23 macro(ocv_lapack_check)
24 string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" _lapack_impl "${LAPACK_IMPL}")
25 message(STATUS "LAPACK(${LAPACK_IMPL}): LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}")
26 _find_header_file_in_dirs(OPENCV_CBLAS_H_PATH_${_lapack_impl} "${LAPACK_CBLAS_H}" "${LAPACK_INCLUDE_DIR}")
27 _find_header_file_in_dirs(OPENCV_LAPACKE_H_PATH_${_lapack_impl} "${LAPACK_LAPACKE_H}" "${LAPACK_INCLUDE_DIR}")
28 if(NOT OPENCV_CBLAS_H_PATH_${_lapack_impl} OR NOT OPENCV_LAPACKE_H_PATH_${_lapack_impl})
29 message(WARNING "LAPACK(${LAPACK_IMPL}): CBLAS/LAPACK headers are not found in '${LAPACK_INCLUDE_DIR}'")
30 unset(LAPACK_LIBRARIES)
32 # adding proxy opencv_lapack.h header
33 set(CBLAS_H_PROXY_PATH ${CMAKE_BINARY_DIR}/opencv_lapack.h)
34 if((APPLE OR OPENCV_SKIP_LAPACK_EXTERN_C) AND NOT OPENCV_FORCE_LAPACK_EXTERN_C)
35 set(_lapack_include_str_extern_C "")
36 set(_lapack_include_str_extern_C_end "")
38 set(_lapack_include_str_extern_C "extern \"C\" {\n")
39 set(_lapack_include_str_extern_C_end "}\n")
41 set(_lapack_include_str "${_lapack_include_str_extern_C}\#include \"${OPENCV_CBLAS_H_PATH_${_lapack_impl}}\"")
42 if(NOT "${OPENCV_CBLAS_H_PATH_${_lapack_impl}}" STREQUAL "${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}")
43 set(_lapack_include_str "${_lapack_include_str}\n#include \"${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}\"")
45 set(_lapack_include_str "${_lapack_include_str}\n${_lapack_include_str_extern_C_end}")
46 # update file contents (if required)
48 if(EXISTS "${CBLAS_H_PROXY_PATH}")
49 file(READ "${CBLAS_H_PROXY_PATH}" __content_str)
51 if(NOT " ${__content_str}" STREQUAL " ${_lapack_include_str}")
52 file(WRITE "${CBLAS_H_PROXY_PATH}" "${_lapack_include_str}")
55 try_compile(__VALID_LAPACK
56 "${OpenCV_BINARY_DIR}"
57 "${OpenCV_SOURCE_DIR}/cmake/checks/lapack_check.cpp"
58 CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${LAPACK_INCLUDE_DIR}\;${CMAKE_BINARY_DIR}"
59 "-DLINK_DIRECTORIES:STRING=${LAPACK_LINK_LIBRARIES}"
60 "-DLINK_LIBRARIES:STRING=${LAPACK_LIBRARIES}"
61 OUTPUT_VARIABLE TRY_OUT
63 if(NOT __VALID_LAPACK)
64 #message(FATAL_ERROR "LAPACK: check build log:\n${TRY_OUT}")
65 message(STATUS "LAPACK(${LAPACK_IMPL}): Can't build LAPACK check code. This LAPACK version is not supported.")
66 unset(LAPACK_LIBRARIES)
68 message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
69 ocv_include_directories(${LAPACK_INCLUDE_DIR})
76 ocv_update(LAPACK_IMPL "Unknown")
77 if(NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
78 if(NOT LAPACK_LIBRARIES AND NOT OPENCV_LAPACK_DISABLE_MKL)
79 include(cmake/OpenCVFindMKL.cmake)
81 set(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIRS})
82 set(LAPACK_LIBRARIES ${MKL_LIBRARIES})
83 set(LAPACK_CBLAS_H "mkl_cblas.h")
84 set(LAPACK_LAPACKE_H "mkl_lapack.h")
85 set(LAPACK_IMPL "MKL")
89 if(NOT LAPACK_LIBRARIES)
90 include(cmake/OpenCVFindOpenBLAS.cmake)
92 set(LAPACK_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIR})
93 set(LAPACK_LIBRARIES ${OpenBLAS_LIB})
94 set(LAPACK_CBLAS_H "cblas.h")
95 set(LAPACK_LAPACKE_H "lapacke.h")
96 set(LAPACK_IMPL "OpenBLAS")
100 if(NOT LAPACK_LIBRARIES AND UNIX)
101 include(cmake/OpenCVFindAtlas.cmake)
103 set(LAPACK_INCLUDE_DIR ${Atlas_INCLUDE_DIR})
104 set(LAPACK_LIBRARIES ${Atlas_LIBRARIES})
105 set(LAPACK_CBLAS_H "cblas.h")
106 set(LAPACK_LAPACKE_H "lapacke.h")
107 set(LAPACK_IMPL "Atlas")
113 if(NOT LAPACK_LIBRARIES)
114 if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
119 if(NOT DEFINED LAPACKE_INCLUDE_DIR)
120 find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
122 if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
123 find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
125 if(MKL_LAPACKE_INCLUDE_DIR AND NOT OPENCV_LAPACK_DISABLE_MKL)
126 set(LAPACK_INCLUDE_DIR ${MKL_LAPACKE_INCLUDE_DIR})
127 set(LAPACK_CBLAS_H "mkl_cblas.h")
128 set(LAPACK_LAPACKE_H "mkl_lapack.h")
129 set(LAPACK_IMPL "LAPACK/MKL")
133 if(LAPACKE_INCLUDE_DIR)
134 set(LAPACK_INCLUDE_DIR ${LAPACKE_INCLUDE_DIR})
135 set(LAPACK_CBLAS_H "cblas.h")
136 set(LAPACK_LAPACKE_H "lapacke.h")
137 set(LAPACK_IMPL "LAPACK/Generic")
140 set(LAPACK_CBLAS_H "Accelerate/Accelerate.h")
141 set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h")
142 set(LAPACK_IMPL "LAPACK/Apple")
148 unset(LAPACK_LIBRARIES)
149 unset(LAPACK_LIBRARIES CACHE)
153 if(NOT LAPACK_LIBRARIES AND APPLE AND NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
154 set(LAPACK_INCLUDE_DIR "")
155 set(LAPACK_LIBRARIES "-framework Accelerate")
156 set(LAPACK_CBLAS_H "Accelerate/Accelerate.h")
157 set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h")
158 set(LAPACK_IMPL "Apple")
162 if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H)
166 set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH "Path to BLAS include dir" FORCE)
167 set(LAPACK_CBLAS_H ${LAPACK_CBLAS_H} CACHE STRING "Alternative name of cblas.h" FORCE)
168 set(LAPACK_LAPACKE_H ${LAPACK_LAPACKE_H} CACHE STRING "Alternative name of lapacke.h" FORCE)
169 set(LAPACK_LIBRARIES ${LAPACK_LIBRARIES} CACHE STRING "Names of BLAS & LAPACK binaries (.so, .dll, .a, .lib)" FORCE)
170 set(LAPACK_IMPL ${LAPACK_IMPL} CACHE STRING "Lapack implementation id" FORCE)