Merge pull request #16122 from alalek:cmake_update_cpu_compiler_detection
[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
35     set(_lapack_add_extern_c NOT (APPLE OR OPENCV_SKIP_LAPACK_EXTERN_C) OR OPENCV_FORCE_LAPACK_EXTERN_C)
36
37     set(_lapack_content "// This file is auto-generated\n")
38     if(${_lapack_add_extern_c})
39       list(APPEND _lapack_content "extern \"C\" {")
40     endif()
41     if(NOT OPENCV_SKIP_LAPACK_MSVC_FIX)
42       list(APPEND _lapack_content "
43 #ifdef _MSC_VER
44 #include <complex.h>
45 #define lapack_complex_float _Fcomplex
46 #define lapack_complex_double _Dcomplex
47 #endif
48 ")
49     endif()
50     list(APPEND _lapack_content "#include \"${OPENCV_CBLAS_H_PATH_${_lapack_impl}}\"")
51     if(NOT "${OPENCV_CBLAS_H_PATH_${_lapack_impl}}" STREQUAL "${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}")
52       list(APPEND _lapack_content "#include \"${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}\"")
53     endif()
54     if(${_lapack_add_extern_c})
55       list(APPEND _lapack_content "}")
56     endif()
57
58     string(REPLACE ";" "\n" _lapack_content "${_lapack_content}")
59     ocv_update_file("${CBLAS_H_PROXY_PATH}" "${_lapack_content}")
60
61     try_compile(__VALID_LAPACK
62         "${OpenCV_BINARY_DIR}"
63         "${OpenCV_SOURCE_DIR}/cmake/checks/lapack_check.cpp"
64         CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${LAPACK_INCLUDE_DIR}\;${CMAKE_BINARY_DIR}"
65                     "-DLINK_DIRECTORIES:STRING=${LAPACK_LINK_LIBRARIES}"
66                     "-DLINK_LIBRARIES:STRING=${LAPACK_LIBRARIES}"
67         OUTPUT_VARIABLE TRY_OUT
68     )
69     if(NOT __VALID_LAPACK)
70       #message(FATAL_ERROR "LAPACK: check build log:\n${TRY_OUT}")
71       message(STATUS "LAPACK(${LAPACK_IMPL}): Can't build LAPACK check code. This LAPACK version is not supported.")
72       unset(LAPACK_LIBRARIES)
73     else()
74       message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
75       ocv_include_directories(${LAPACK_INCLUDE_DIR})
76       set(HAVE_LAPACK 1)
77     endif()
78   endif()
79 endmacro()
80
81 if(WITH_LAPACK)
82   ocv_update(LAPACK_IMPL "Unknown")
83   if(NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
84     if(NOT LAPACK_LIBRARIES AND NOT OPENCV_LAPACK_DISABLE_MKL)
85       include(cmake/OpenCVFindMKL.cmake)
86       if(HAVE_MKL)
87         set(LAPACK_INCLUDE_DIR  ${MKL_INCLUDE_DIRS})
88         set(LAPACK_LIBRARIES    ${MKL_LIBRARIES})
89         set(LAPACK_CBLAS_H      "mkl_cblas.h")
90         set(LAPACK_LAPACKE_H    "mkl_lapack.h")
91         set(LAPACK_IMPL         "MKL")
92         ocv_lapack_check()
93       endif()
94     endif()
95     if(NOT LAPACK_LIBRARIES)
96       include(cmake/OpenCVFindOpenBLAS.cmake)
97       if(OpenBLAS_FOUND)
98         set(LAPACK_INCLUDE_DIR  ${OpenBLAS_INCLUDE_DIR})
99         set(LAPACK_LIBRARIES    ${OpenBLAS_LIB})
100         set(LAPACK_CBLAS_H      "cblas.h")
101         set(LAPACK_LAPACKE_H    "lapacke.h")
102         set(LAPACK_IMPL         "OpenBLAS")
103         ocv_lapack_check()
104       endif()
105     endif()
106     if(NOT LAPACK_LIBRARIES AND UNIX)
107       include(cmake/OpenCVFindAtlas.cmake)
108       if(ATLAS_FOUND)
109         set(LAPACK_INCLUDE_DIR  ${Atlas_INCLUDE_DIR})
110         set(LAPACK_LIBRARIES    ${Atlas_LIBRARIES})
111         set(LAPACK_CBLAS_H      "cblas.h")
112         set(LAPACK_LAPACKE_H    "lapacke.h")
113         set(LAPACK_IMPL         "Atlas")
114         ocv_lapack_check()
115       endif()
116     endif()
117   endif()
118
119   if(NOT LAPACK_LIBRARIES)
120     if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
121       set(BLA_STATIC 1)
122     endif()
123     find_package(LAPACK)
124     if(LAPACK_FOUND)
125       if(NOT DEFINED LAPACKE_INCLUDE_DIR)
126         find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
127       endif()
128       if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
129         find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
130       endif()
131       if(MKL_LAPACKE_INCLUDE_DIR AND NOT OPENCV_LAPACK_DISABLE_MKL)
132         set(LAPACK_INCLUDE_DIR  ${MKL_LAPACKE_INCLUDE_DIR})
133         set(LAPACK_CBLAS_H      "mkl_cblas.h")
134         set(LAPACK_LAPACKE_H    "mkl_lapack.h")
135         set(LAPACK_IMPL         "LAPACK/MKL")
136         ocv_lapack_check()
137       endif()
138       if(NOT HAVE_LAPACK)
139         if(LAPACKE_INCLUDE_DIR)
140           set(LAPACK_INCLUDE_DIR  ${LAPACKE_INCLUDE_DIR})
141           set(LAPACK_CBLAS_H      "cblas.h")
142           set(LAPACK_LAPACKE_H    "lapacke.h")
143           set(LAPACK_IMPL         "LAPACK/Generic")
144           ocv_lapack_check()
145         elseif(APPLE)
146           set(LAPACK_CBLAS_H      "Accelerate/Accelerate.h")
147           set(LAPACK_LAPACKE_H    "Accelerate/Accelerate.h")
148           set(LAPACK_IMPL         "LAPACK/Apple")
149           ocv_lapack_check()
150         endif()
151       endif()
152     endif()
153     if(NOT HAVE_LAPACK)
154       unset(LAPACK_LIBRARIES)
155       unset(LAPACK_LIBRARIES CACHE)
156     endif()
157   endif()
158
159   if(NOT LAPACK_LIBRARIES AND APPLE AND NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
160     set(LAPACK_INCLUDE_DIR  "")
161     set(LAPACK_LIBRARIES    "-framework Accelerate")
162     set(LAPACK_CBLAS_H      "Accelerate/Accelerate.h")
163     set(LAPACK_LAPACKE_H    "Accelerate/Accelerate.h")
164     set(LAPACK_IMPL         "Apple")
165     ocv_lapack_check()
166   endif()
167
168   if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H)
169     ocv_lapack_check()
170   endif()
171
172   set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH   "Path to BLAS include dir" FORCE)
173   set(LAPACK_CBLAS_H     ${LAPACK_CBLAS_H}     CACHE STRING "Alternative name of cblas.h" FORCE)
174   set(LAPACK_LAPACKE_H   ${LAPACK_LAPACKE_H}   CACHE STRING "Alternative name of lapacke.h" FORCE)
175   set(LAPACK_LIBRARIES   ${LAPACK_LIBRARIES}   CACHE STRING "Names of BLAS & LAPACK binaries (.so, .dll, .a, .lib)" FORCE)
176   set(LAPACK_IMPL        ${LAPACK_IMPL}        CACHE STRING "Lapack implementation id" FORCE)
177 endif()