opencv

Форк
0
/
OpenCVFindLAPACK.cmake 
262 строки · 10.7 Кб
1
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
2
  set(_apple_device_min_target_os_version "13.3")
3
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
4
  set(_apple_device_min_target_os_version "16.4")
5
elseif(CMAKE_SYSTEM_NAME STREQUAL "watchOS")
6
  set(_apple_device_min_target_os_version "9.4")
7
elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS")
8
  set(_apple_device_min_target_os_version "16.4")
9
elseif(CMAKE_SYSTEM_NAME STREQUAL "visionOS")
10
  set(_apple_device_min_target_os_version "1.0")
11
endif()
12

13
if(DEFINED _apple_device_min_target_os_version AND
14
   ("${CMAKE_OSX_DEPLOYMENT_TARGET}" VERSION_GREATER "${_apple_device_min_target_os_version}" OR
15
    "${CMAKE_OSX_DEPLOYMENT_TARGET}" VERSION_EQUAL "${_apple_device_min_target_os_version}"))
16
  set(_apple_device_has_required_min_os_version ON)
17
else()
18
  set(_apple_device_has_required_min_os_version OFF)
19
endif()
20

21
OCV_OPTION(OPENCV_OSX_USE_ACCELERATE_NEW_LAPACK "Use new BLAS/LAPACK interfaces from Accelerate framework on Apple platform" _apple_device_has_required_min_os_version
22
  VISIBLE_IF APPLE)
23

24
macro(_find_header_file_in_dirs VAR NAME)
25
  unset(${VAR})
26
  unset(${VAR} CACHE)
27
  if(" ${ARGN}" STREQUAL " ")
28
    check_include_file("${NAME}" HAVE_${VAR})
29
    if(HAVE_${VAR})
30
      set(${VAR} "${NAME}") # fallback
31
    else()
32
      set(${VAR} "")
33
    endif()
34
  else()
35
    find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
36
    if(${VAR})
37
      set(${VAR} "${${VAR}}/${NAME}")
38
      unset(${VAR} CACHE)
39
    else()
40
      unset(${VAR} CACHE)
41
      set(${VAR} "")
42
    endif()
43
  endif()
44
endmacro()
45

46
macro(ocv_lapack_check)
47
  string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" _lapack_impl "${LAPACK_IMPL}")
48
  message(STATUS "LAPACK(${LAPACK_IMPL}): LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}")
49
  _find_header_file_in_dirs(OPENCV_CBLAS_H_PATH_${_lapack_impl} "${LAPACK_CBLAS_H}" "${LAPACK_INCLUDE_DIR}")
50
  _find_header_file_in_dirs(OPENCV_LAPACKE_H_PATH_${_lapack_impl} "${LAPACK_LAPACKE_H}" "${LAPACK_INCLUDE_DIR}")
51
  if(NOT OPENCV_CBLAS_H_PATH_${_lapack_impl} OR NOT OPENCV_LAPACKE_H_PATH_${_lapack_impl})
52
    message(WARNING "LAPACK(${LAPACK_IMPL}): CBLAS/LAPACK headers are not found in '${LAPACK_INCLUDE_DIR}'")
53
    unset(LAPACK_LIBRARIES)
54
  else()
55
    # adding proxy opencv_lapack.h header
56
    set(CBLAS_H_PROXY_PATH ${CMAKE_BINARY_DIR}/opencv_lapack.h)
57

58
    set(_lapack_add_extern_c NOT (APPLE OR OPENCV_SKIP_LAPACK_EXTERN_C) OR OPENCV_FORCE_LAPACK_EXTERN_C)
59

60
    set(_lapack_content "// This file is auto-generated\n")
61
    if(${_lapack_add_extern_c})
62
      list(APPEND _lapack_content "extern \"C\" {")
63
    endif()
64
    if(NOT OPENCV_SKIP_LAPACK_MSVC_FIX)
65
      list(APPEND _lapack_content "
66
#ifdef _MSC_VER
67
#include <complex.h>
68
#define lapack_complex_float _Fcomplex
69
#define lapack_complex_double _Dcomplex
70
#endif
71
")
72
    endif()
73
    list(APPEND _lapack_content "#include \"${OPENCV_CBLAS_H_PATH_${_lapack_impl}}\"")
74
    if(NOT "${OPENCV_CBLAS_H_PATH_${_lapack_impl}}" STREQUAL "${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}")
75
      list(APPEND _lapack_content "#include \"${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}\"")
76
    endif()
77
    list(APPEND _lapack_content "
78
#if defined(LAPACK_GLOBAL) || defined(LAPACK_NAME)
79
/*
80
 * Using netlib's reference LAPACK implementation version >= 3.4.0 (first with C interface).
81
 * Use LAPACK_xxxx to transparently (via predefined lapack macros) deal with pre and post 3.9.1 versions.
82
 * LAPACK 3.9.1 introduces LAPACK_FORTRAN_STRLEN_END and modifies (through preprocessing) the declarations of the following functions used in opencv
83
 *        sposv_, dposv_, spotrf_, dpotrf_, sgesdd_, dgesdd_, sgels_, dgels_
84
 * which end up with an extra parameter.
85
 * So we also need to preprocess the function calls in opencv coding by prefixing them with LAPACK_.
86
 * The good news is the preprocessing works fine whatever netlib's LAPACK version.
87
 */
88
#define OCV_LAPACK_FUNC(f) LAPACK_##f
89
#else
90
/* Using other LAPACK implementations so fall back to opencv's assumption until now */
91
#define OCV_LAPACK_FUNC(f) f##_
92
#endif
93
")
94
    if(${_lapack_add_extern_c})
95
      list(APPEND _lapack_content "}")
96
    endif()
97

98
    string(REPLACE ";" "\n" _lapack_content "${_lapack_content}")
99
    ocv_update_file("${CBLAS_H_PROXY_PATH}" "${_lapack_content}")
100

101
    if(CMAKE_GENERATOR MATCHES "Visual Studio"  # MSBuild
102
        AND LAPACK_IMPL STREQUAL "MKL"
103
        AND ";${LAPACK_LIBRARIES};" MATCHES ";tbb;" AND TARGET tbb
104
        AND DEFINED TBB_INTERFACE_VERSION AND NOT (TBB_INTERFACE_VERSION LESS 12000)  # oneTBB/oneAPI workaround
105
    )
106
      # workaround DEFAULTLIB:tbb12.lib issue
107
      get_target_property(_tbb_lib tbb IMPORTED_LOCATION)
108
      if(NOT _tbb_lib)
109
        get_target_property(_tbb_lib tbb IMPORTED_LOCATION_RELEASE)
110
      endif()
111
      if(_tbb_lib AND NOT OPENCV_SKIP_WORKAROUND_MKL_LINK_DIRECTORIES_TBB)
112
        # MSBuild drops content of 'LIB' environment variable,
113
        # so pass TBB library directory through `link_directories()`
114
        get_filename_component(_tbb_lib_dir "${_tbb_lib}" DIRECTORY)
115
        message(STATUS "MKL: adding '${_tbb_lib_dir}' to link directories (workaround DEFAULTLIB issue)")
116
        link_directories("${_tbb_lib_dir}")
117
      elseif(NOT OPENCV_SKIP_WORKAROUND_MKL_DEFAULTLIB)
118
        # We may have tbb.lib for 'tbb' target, but not 'tbb12.lib'
119
        ocv_update(OPENCV_MKL_IGNORE_DEFAULTLIB_TBB "tbb12.lib")
120
        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:${OPENCV_MKL_IGNORE_DEFAULTLIB_TBB}")
121
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:${OPENCV_MKL_IGNORE_DEFAULTLIB_TBB}")
122
      endif()
123
    endif()
124

125
    # TODO add cache for try_compile() inputs/results
126

127
    get_property(__link_directories DIRECTORY PROPERTY LINK_DIRECTORIES)
128
    if(LAPACK_LINK_LIBRARIES)
129
      list(APPEND __link_directories ${LAPACK_LINK_LIBRARIES})
130
    endif()
131

132
    set(LAPACK_TRY_COMPILE_DEF "")
133
    if(LAPACK_IMPL STREQUAL "LAPACK/Apple" AND OPENCV_OSX_USE_ACCELERATE_NEW_LAPACK)
134
      message(STATUS "LAPACK(${LAPACK_IMPL}): Accelerate New LAPACK is enabled.")
135
      set(LAPACK_TRY_COMPILE_DEF "-DACCELERATE_NEW_LAPACK")
136
      add_compile_definitions(ACCELERATE_NEW_LAPACK)
137
      add_compile_definitions(ACCELERATE_LAPACK_ILP64)
138
    endif()
139

140
    try_compile(__VALID_LAPACK
141
        "${OpenCV_BINARY_DIR}"
142
        "${OpenCV_SOURCE_DIR}/cmake/checks/lapack_check.cpp"
143
        CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${LAPACK_INCLUDE_DIR}\;${CMAKE_BINARY_DIR}"
144
                    "-DLINK_DIRECTORIES:STRING=${__link_directories}"
145
        COMPILE_DEFINITIONS ${LAPACK_TRY_COMPILE_DEF}
146
        LINK_LIBRARIES ${LAPACK_LIBRARIES}
147
        OUTPUT_VARIABLE TRY_OUT
148
    )
149
    if(NOT __VALID_LAPACK)
150
      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
151
          "\nLAPACK(${LAPACK_IMPL}) check FAILED:\n"
152
          "    LAPACK_INCLUDE_DIR: '${LAPACK_INCLUDE_DIR}'\n"
153
          "    LAPACK_LIBRARIES: '${LAPACK_LIBRARIES}'\n"
154
          "    LAPACK_LINK_LIBRARIES: '${__link_directories}'\n"
155
          "    Output:\n${TRY_OUT}\n\n")
156
      message(STATUS "LAPACK(${LAPACK_IMPL}): Can't build LAPACK check code. This LAPACK version is not supported.")
157
      unset(LAPACK_LIBRARIES)
158
    else()
159
      message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
160
      ocv_include_directories(${LAPACK_INCLUDE_DIR})
161
      set(HAVE_LAPACK 1)
162
    endif()
163
  endif()
164
endmacro()
165

166
if(WITH_LAPACK)
167
  ocv_update(LAPACK_IMPL "Unknown")
168
  if(NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
169
    if(NOT LAPACK_LIBRARIES AND NOT OPENCV_LAPACK_DISABLE_MKL)
170
      include(cmake/OpenCVFindMKL.cmake)
171
      if(HAVE_MKL)
172
        set(LAPACK_INCLUDE_DIR  ${MKL_INCLUDE_DIRS})
173
        set(LAPACK_LIBRARIES    ${MKL_LIBRARIES})
174
        set(LAPACK_CBLAS_H      "mkl_cblas.h")
175
        set(LAPACK_LAPACKE_H    "mkl_lapack.h")
176
        set(LAPACK_IMPL         "MKL")
177
        ocv_lapack_check()
178
      endif()
179
    endif()
180
    if(NOT LAPACK_LIBRARIES)
181
      include(cmake/OpenCVFindOpenBLAS.cmake)
182
      if(OpenBLAS_FOUND)
183
        set(LAPACK_INCLUDE_DIR  ${OpenBLAS_INCLUDE_DIR})
184
        set(LAPACK_LIBRARIES    ${OpenBLAS_LIB})
185
        set(LAPACK_CBLAS_H      "cblas.h")
186
        set(LAPACK_LAPACKE_H    "lapacke.h")
187
        set(LAPACK_IMPL         "OpenBLAS")
188
        ocv_lapack_check()
189
      endif()
190
    endif()
191
    if(NOT LAPACK_LIBRARIES AND UNIX)
192
      include(cmake/OpenCVFindAtlas.cmake)
193
      if(ATLAS_FOUND)
194
        set(LAPACK_INCLUDE_DIR  ${Atlas_INCLUDE_DIR})
195
        set(LAPACK_LIBRARIES    ${Atlas_LIBRARIES})
196
        set(LAPACK_CBLAS_H      "cblas.h")
197
        set(LAPACK_LAPACKE_H    "lapacke.h")
198
        set(LAPACK_IMPL         "Atlas")
199
        ocv_lapack_check()
200
      endif()
201
    endif()
202
  endif()
203

204
  if(NOT LAPACK_LIBRARIES)
205
    if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
206
      set(BLA_STATIC 1)
207
    endif()
208
    find_package(LAPACK)
209
    if(LAPACK_FOUND)
210
      if(NOT DEFINED LAPACKE_INCLUDE_DIR)
211
        find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
212
      endif()
213
      if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
214
        find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
215
      endif()
216
      if(MKL_LAPACKE_INCLUDE_DIR AND NOT OPENCV_LAPACK_DISABLE_MKL)
217
        set(LAPACK_INCLUDE_DIR  ${MKL_LAPACKE_INCLUDE_DIR})
218
        set(LAPACK_CBLAS_H      "mkl_cblas.h")
219
        set(LAPACK_LAPACKE_H    "mkl_lapack.h")
220
        set(LAPACK_IMPL         "LAPACK/MKL")
221
        ocv_lapack_check()
222
      endif()
223
      if(NOT HAVE_LAPACK)
224
        if(LAPACKE_INCLUDE_DIR)
225
          set(LAPACK_INCLUDE_DIR  ${LAPACKE_INCLUDE_DIR})
226
          set(LAPACK_CBLAS_H      "cblas.h")
227
          set(LAPACK_LAPACKE_H    "lapacke.h")
228
          set(LAPACK_IMPL         "LAPACK/Generic")
229
          ocv_lapack_check()
230
        elseif(APPLE)
231
          set(LAPACK_CBLAS_H      "Accelerate/Accelerate.h")
232
          set(LAPACK_LAPACKE_H    "Accelerate/Accelerate.h")
233
          set(LAPACK_IMPL         "LAPACK/Apple")
234
          ocv_lapack_check()
235
        endif()
236
      endif()
237
    endif()
238
    if(NOT HAVE_LAPACK)
239
      unset(LAPACK_LIBRARIES)
240
      unset(LAPACK_LIBRARIES CACHE)
241
    endif()
242
  endif()
243

244
  if(NOT LAPACK_LIBRARIES AND APPLE AND NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
245
    set(LAPACK_INCLUDE_DIR  "")
246
    set(LAPACK_LIBRARIES    "-framework Accelerate")
247
    set(LAPACK_CBLAS_H      "Accelerate/Accelerate.h")
248
    set(LAPACK_LAPACKE_H    "Accelerate/Accelerate.h")
249
    set(LAPACK_IMPL         "Apple")
250
    ocv_lapack_check()
251
  endif()
252

253
  if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H)
254
    ocv_lapack_check()
255
  endif()
256

257
  set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH   "Path to BLAS include dir" FORCE)
258
  set(LAPACK_CBLAS_H     ${LAPACK_CBLAS_H}     CACHE STRING "Alternative name of cblas.h" FORCE)
259
  set(LAPACK_LAPACKE_H   ${LAPACK_LAPACKE_H}   CACHE STRING "Alternative name of lapacke.h" FORCE)
260
  set(LAPACK_LIBRARIES   ${LAPACK_LIBRARIES}   CACHE STRING "Names of BLAS & LAPACK binaries (.so, .dll, .a, .lib)" FORCE)
261
  set(LAPACK_IMPL        ${LAPACK_IMPL}        CACHE STRING "Lapack implementation id" FORCE)
262
endif()
263

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.