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")
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)
18
set(_apple_device_has_required_min_os_version OFF)
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
24
macro(_find_header_file_in_dirs VAR NAME)
27
if(" ${ARGN}" STREQUAL " ")
28
check_include_file("${NAME}" HAVE_${VAR})
30
set(${VAR} "${NAME}") # fallback
35
find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
37
set(${VAR} "${${VAR}}/${NAME}")
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)
55
# adding proxy opencv_lapack.h header
56
set(CBLAS_H_PROXY_PATH ${CMAKE_BINARY_DIR}/opencv_lapack.h)
58
set(_lapack_add_extern_c NOT (APPLE OR OPENCV_SKIP_LAPACK_EXTERN_C) OR OPENCV_FORCE_LAPACK_EXTERN_C)
60
set(_lapack_content "// This file is auto-generated\n")
61
if(${_lapack_add_extern_c})
62
list(APPEND _lapack_content "extern \"C\" {")
64
if(NOT OPENCV_SKIP_LAPACK_MSVC_FIX)
65
list(APPEND _lapack_content "
68
#define lapack_complex_float _Fcomplex
69
#define lapack_complex_double _Dcomplex
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}}\"")
77
list(APPEND _lapack_content "
78
#if defined(LAPACK_GLOBAL) || defined(LAPACK_NAME)
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.
88
#define OCV_LAPACK_FUNC(f) LAPACK_##f
90
/* Using other LAPACK implementations so fall back to opencv's assumption until now */
91
#define OCV_LAPACK_FUNC(f) f##_
94
if(${_lapack_add_extern_c})
95
list(APPEND _lapack_content "}")
98
string(REPLACE ";" "\n" _lapack_content "${_lapack_content}")
99
ocv_update_file("${CBLAS_H_PROXY_PATH}" "${_lapack_content}")
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
106
# workaround DEFAULTLIB:tbb12.lib issue
107
get_target_property(_tbb_lib tbb IMPORTED_LOCATION)
109
get_target_property(_tbb_lib tbb IMPORTED_LOCATION_RELEASE)
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}")
125
# TODO add cache for try_compile() inputs/results
127
get_property(__link_directories DIRECTORY PROPERTY LINK_DIRECTORIES)
128
if(LAPACK_LINK_LIBRARIES)
129
list(APPEND __link_directories ${LAPACK_LINK_LIBRARIES})
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)
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
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)
159
message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
160
ocv_include_directories(${LAPACK_INCLUDE_DIR})
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)
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")
180
if(NOT LAPACK_LIBRARIES)
181
include(cmake/OpenCVFindOpenBLAS.cmake)
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")
191
if(NOT LAPACK_LIBRARIES AND UNIX)
192
include(cmake/OpenCVFindAtlas.cmake)
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")
204
if(NOT LAPACK_LIBRARIES)
205
if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
210
if(NOT DEFINED LAPACKE_INCLUDE_DIR)
211
find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
213
if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
214
find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
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")
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")
231
set(LAPACK_CBLAS_H "Accelerate/Accelerate.h")
232
set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h")
233
set(LAPACK_IMPL "LAPACK/Apple")
239
unset(LAPACK_LIBRARIES)
240
unset(LAPACK_LIBRARIES CACHE)
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")
253
if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H)
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)