Merge pull request #11882 from alalek:videoio_vfw_lower_priority
[platform/upstream/opencv.git] / cmake / OpenCVFindLAPACK.cmake
1 macro(_find_header_file_in_dirs VAR NAME)
2   unset(${VAR})
3   unset(${VAR} CACHE)
4   if(" ${ARGN}" STREQUAL " ")
5     check_include_file("${NAME}" HAVE_${VAR})
6     if(HAVE_${VAR})
7       set(${VAR} "${NAME}") # fallback
8     else()
9       set(${VAR} "")
10     endif()
11   else()
12     find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
13     if(${VAR})
14       set(${VAR} "${${VAR}}/${NAME}")
15       unset(${VAR} CACHE)
16     else()
17       unset(${VAR} CACHE)
18       set(${VAR} "")
19     endif()
20   endif()
21 endmacro()
22
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)
31   else()
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 "")
37     else()
38         set(_lapack_include_str_extern_C "extern \"C\" {\n")
39         set(_lapack_include_str_extern_C_end "}\n")
40     endif()
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}}\"")
44     endif()
45     set(_lapack_include_str "${_lapack_include_str}\n${_lapack_include_str_extern_C_end}")
46     # update file contents (if required)
47     set(__content_str "")
48     if(EXISTS "${CBLAS_H_PROXY_PATH}")
49       file(READ "${CBLAS_H_PROXY_PATH}" __content_str)
50     endif()
51     if(NOT " ${__content_str}" STREQUAL " ${_lapack_include_str}")
52       file(WRITE "${CBLAS_H_PROXY_PATH}" "${_lapack_include_str}")
53     endif()
54
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
62     )
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)
67     else()
68       message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
69       ocv_include_directories(${LAPACK_INCLUDE_DIR})
70       set(HAVE_LAPACK 1)
71     endif()
72   endif()
73 endmacro()
74
75 if(WITH_LAPACK)
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)
80       if(HAVE_MKL)
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")
86         ocv_lapack_check()
87       endif()
88     endif()
89     if(NOT LAPACK_LIBRARIES)
90       include(cmake/OpenCVFindOpenBLAS.cmake)
91       if(OpenBLAS_FOUND)
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")
97         ocv_lapack_check()
98       endif()
99     endif()
100     if(NOT LAPACK_LIBRARIES AND UNIX)
101       include(cmake/OpenCVFindAtlas.cmake)
102       if(ATLAS_FOUND)
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")
108         ocv_lapack_check()
109       endif()
110     endif()
111   endif()
112
113   if(NOT LAPACK_LIBRARIES)
114     if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
115       set(BLA_STATIC 1)
116     endif()
117     find_package(LAPACK)
118     if(LAPACK_FOUND)
119       if(NOT DEFINED LAPACKE_INCLUDE_DIR)
120         find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
121       endif()
122       if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
123         find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
124       endif()
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")
130         ocv_lapack_check()
131       endif()
132       if(NOT HAVE_LAPACK)
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")
138           ocv_lapack_check()
139         elseif(APPLE)
140           set(LAPACK_CBLAS_H      "Accelerate/Accelerate.h")
141           set(LAPACK_LAPACKE_H    "Accelerate/Accelerate.h")
142           set(LAPACK_IMPL         "LAPACK/Apple")
143           ocv_lapack_check()
144         endif()
145       endif()
146     endif()
147     if(NOT HAVE_LAPACK)
148       unset(LAPACK_LIBRARIES)
149       unset(LAPACK_LIBRARIES CACHE)
150     endif()
151   endif()
152
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")
159     ocv_lapack_check()
160   endif()
161
162   if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H)
163     ocv_lapack_check()
164   endif()
165
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)
171 endif()