cmake: fix lapack

- added compile check with multiple tries for different configurations
- restored find_package(LAPACK)
- avoided modification of OPENCV_LINKER_LIBS
This commit is contained in:
Alexander Alekhin 2016-12-23 14:50:33 +03:00
parent 89a740a62f
commit 2b44c0b649
3 changed files with 162 additions and 67 deletions

View File

@ -1,78 +1,159 @@
macro(_find_file_in_dirs VAR NAME DIRS) macro(_find_header_file_in_dirs VAR NAME)
find_path(${VAR} ${NAME} ${DIRS} NO_DEFAULT_PATH) unset(${VAR})
set(${VAR} ${${VAR}}/${NAME}) unset(${VAR} CACHE)
unset(${VAR} CACHE) if(" ${ARGN}" STREQUAL " ")
check_include_file("${NAME}" HAVE_${VAR})
if(HAVE_${VAR})
set(${VAR} "${NAME}") # fallback
else()
set(${VAR} "")
endif()
else()
find_path(${VAR} "${NAME}" ${ARGN} NO_DEFAULT_PATH)
if(${VAR})
set(${VAR} "${${VAR}}/${NAME}")
unset(${VAR} CACHE)
else()
unset(${VAR} CACHE)
set(${VAR} "")
endif()
endif()
endmacro()
macro(ocv_lapack_check)
string(REGEX REPLACE "[^a-zA-Z0-9_]" "_" _lapack_impl "${LAPACK_IMPL}")
message(STATUS "LAPACK(${LAPACK_IMPL}): LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}")
_find_header_file_in_dirs(OPENCV_CBLAS_H_PATH_${_lapack_impl} "${LAPACK_CBLAS_H}" "${LAPACK_INCLUDE_DIR}")
_find_header_file_in_dirs(OPENCV_LAPACKE_H_PATH_${_lapack_impl} "${LAPACK_LAPACKE_H}" "${LAPACK_INCLUDE_DIR}")
if(NOT OPENCV_CBLAS_H_PATH_${_lapack_impl} OR NOT OPENCV_LAPACKE_H_PATH_${_lapack_impl})
message(WARNING "LAPACK(${LAPACK_IMPL}): CBLAS/LAPACK headers are not found in '${LAPACK_INCLUDE_DIR}'")
unset(LAPACK_LIBRARIES)
else()
# adding proxy opencv_lapack.h header
set(CBLAS_H_PROXY_PATH ${CMAKE_BINARY_DIR}/opencv_lapack.h)
set(_lapack_include_str "\#include \"${OPENCV_CBLAS_H_PATH_${_lapack_impl}}\"")
if(NOT "${OPENCV_CBLAS_H_PATH_${_lapack_impl}}" STREQUAL "${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}")
set(_lapack_include_str "${_lapack_include_str}\n#include \"${OPENCV_LAPACKE_H_PATH_${_lapack_impl}}\"")
endif()
# update file contents (if required)
set(__content_str "")
if(EXISTS "${CBLAS_H_PROXY_PATH}")
file(READ "${CBLAS_H_PROXY_PATH}" __content_str)
endif()
if(NOT " ${__content_str}" STREQUAL " ${_lapack_include_str}")
file(WRITE "${CBLAS_H_PROXY_PATH}" "${_lapack_include_str}")
endif()
try_compile(__VALID_LAPACK
"${OpenCV_BINARY_DIR}"
"${OpenCV_SOURCE_DIR}/cmake/checks/lapack_check.cpp"
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${LAPACK_INCLUDE_DIR}\;${CMAKE_BINARY_DIR}"
"-DLINK_DIRECTORIES:STRING=${LAPACK_LINK_LIBRARIES}"
"-DLINK_LIBRARIES:STRING=${LAPACK_LIBRARIES}"
OUTPUT_VARIABLE TRY_OUT
)
if(NOT __VALID_LAPACK)
#message(FATAL_ERROR "LAPACK: check build log:\n${TRY_OUT}")
message(STATUS "LAPACK(${LAPACK_IMPL}): Can't build LAPACK check code. This LAPACK version is not supported.")
unset(LAPACK_LIBRARIES)
else()
message(STATUS "LAPACK(${LAPACK_IMPL}): Support is enabled.")
ocv_include_directories(${LAPACK_INCLUDE_DIR})
set(HAVE_LAPACK 1)
endif()
endif()
endmacro() endmacro()
if(WITH_LAPACK) if(WITH_LAPACK)
ocv_update(LAPACK_IMPL "Unknown") ocv_update(LAPACK_IMPL "Unknown")
if(NOT LAPACK_LIBRARIES) if(NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
include(cmake/OpenCVFindMKL.cmake) if(NOT LAPACK_LIBRARIES AND NOT OPENCV_LAPACK_DISABLE_MKL)
if(HAVE_MKL) include(cmake/OpenCVFindMKL.cmake)
set(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIRS}) if(HAVE_MKL)
set(LAPACK_LIBRARIES ${MKL_LIBRARIES} ) set(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIRS})
set(LAPACK_CBLAS_H "mkl_cblas.h" ) set(LAPACK_LIBRARIES ${MKL_LIBRARIES})
set(LAPACK_LAPACKE_H "mkl_lapack.h" ) set(LAPACK_CBLAS_H "mkl_cblas.h")
set(LAPACK_IMPL "MKL") set(LAPACK_LAPACKE_H "mkl_lapack.h")
endif() set(LAPACK_IMPL "MKL")
ocv_lapack_check()
endif()
endif() endif()
if(NOT LAPACK_LIBRARIES) if(NOT LAPACK_LIBRARIES)
include(cmake/OpenCVFindOpenBLAS.cmake) include(cmake/OpenCVFindOpenBLAS.cmake)
if(OpenBLAS_FOUND) if(OpenBLAS_FOUND)
set(LAPACK_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIR} ) set(LAPACK_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIR})
set(LAPACK_LIBRARIES ${OpenBLAS_LIB} ) set(LAPACK_LIBRARIES ${OpenBLAS_LIB})
set(LAPACK_CBLAS_H "cblas.h" ) set(LAPACK_CBLAS_H "cblas.h")
set(LAPACK_LAPACKE_H "lapacke.h" ) set(LAPACK_LAPACKE_H "lapacke.h")
set(LAPACK_IMPL "OpenBLAS") set(LAPACK_IMPL "OpenBLAS")
endif() ocv_lapack_check()
endif()
endif() endif()
if(NOT LAPACK_LIBRARIES AND UNIX) if(NOT LAPACK_LIBRARIES AND UNIX)
include(cmake/OpenCVFindAtlas.cmake) include(cmake/OpenCVFindAtlas.cmake)
if(ATLAS_FOUND) if(ATLAS_FOUND)
set(LAPACK_INCLUDE_DIR ${Atlas_INCLUDE_DIR}) set(LAPACK_INCLUDE_DIR ${Atlas_INCLUDE_DIR})
set(LAPACK_LIBRARIES ${Atlas_LIBRARIES} ) set(LAPACK_LIBRARIES ${Atlas_LIBRARIES})
set(LAPACK_CBLAS_H "cblas.h" ) set(LAPACK_CBLAS_H "cblas.h")
set(LAPACK_LAPACKE_H "lapacke.h" ) set(LAPACK_LAPACKE_H "lapacke.h")
set(LAPACK_IMPL "Atlas") set(LAPACK_IMPL "Atlas")
endif() ocv_lapack_check()
endif()
endif() endif()
endif()
if(NOT LAPACK_LIBRARIES AND APPLE) if(NOT LAPACK_LIBRARIES)
set(LAPACK_INCLUDE_DIR "Accelerate") if(WIN32 AND NOT OPENCV_LAPACK_SHARED_LIBS)
set(LAPACK_LIBRARIES "-framework Accelerate") set(BLA_STATIC 1)
set(LAPACK_CBLAS_H "cblas.h" )
set(LAPACK_LAPACKE_H "lapacke.h" )
set(LAPACK_IMPL "Apple")
endif() endif()
find_package(LAPACK)
set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH "Path to BLAS include dir" FORCE) if(LAPACK_FOUND)
set(LAPACK_CBLAS_H ${LAPACK_CBLAS_H} CACHE STRING "Alternative name of cblas.h" FORCE) if(NOT DEFINED LAPACKE_INCLUDE_DIR)
set(LAPACK_LAPACKE_H ${LAPACK_LAPACKE_H} CACHE STRING "Alternative name of lapacke.h" FORCE) find_path(LAPACKE_INCLUDE_DIR "lapacke.h")
set(LAPACK_LIBRARIES ${LAPACK_LIBRARIES} CACHE STRING "Names of BLAS & LAPACK binaries (.so, .dll, .a, .lib)" FORCE) endif()
set(LAPACK_IMPL ${LAPACK_IMPL} CACHE STRING "Lapack implementation id" FORCE) if(NOT DEFINED MKL_LAPACKE_INCLUDE_DIR)
find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h")
if(LAPACK_LIBRARIES) #adding proxy cblas.h header endif()
message(STATUS "LAPACK_IMPL: ${LAPACK_IMPL}, LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}") if(MKL_LAPACKE_INCLUDE_DIR AND NOT OPENCV_LAPACK_DISABLE_MKL)
if("${LAPACK_IMPL}" STREQUAL "Apple") set(LAPACK_INCLUDE_DIR ${MKL_LAPACKE_INCLUDE_DIR})
set(CBLAS_H_PATH "Accelerate/Accelerate.h") set(LAPACK_CBLAS_H "mkl_cblas.h")
set(LAPACKE_H_PATH "Accelerate/Accelerate.h") set(LAPACK_LAPACKE_H "mkl_lapack.h")
else() set(LAPACK_IMPL "LAPACK/MKL")
_find_file_in_dirs(CBLAS_H_PATH "${LAPACK_CBLAS_H}" "${LAPACK_INCLUDE_DIR}") ocv_lapack_check()
_find_file_in_dirs(LAPACKE_H_PATH "${LAPACK_LAPACKE_H}" "${LAPACK_INCLUDE_DIR}") endif()
endif() if(LAPACKE_INCLUDE_DIR AND NOT HAVE_LAPACK)
if(NOT CBLAS_H_PATH OR NOT LAPACKE_H_PATH) set(LAPACK_INCLUDE_DIR ${LAPACKE_INCLUDE_DIR})
message(WARNING "CBLAS/LAPACK headers are not found in '${LAPACK_INCLUDE_DIR}'") set(LAPACK_CBLAS_H "cblas.h")
endif() set(LAPACK_LAPACKE_H "lapacke.h")
ocv_include_directories(${LAPACK_INCLUDE_DIR}) set(LAPACK_IMPL "LAPACK/Generic")
list(APPEND OPENCV_LINKER_LIBS ${LAPACK_LIBRARIES}) ocv_lapack_check()
set(HAVE_LAPACK 1) elseif(APPLE)
set(LAPACK_CBLAS_H "Accelerate/Accelerate.h")
set(CBLAS_H_PROXY_PATH ${CMAKE_BINARY_DIR}/opencv_lapack.h) set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h")
set(_include_str "\#include \"${CBLAS_H_PATH}\"") set(LAPACK_IMPL "LAPACK/Apple")
if("${CBLAS_H_PATH}" STREQUAL "${LAPACKE_H_PATH}") ocv_lapack_check()
else() else()
set(_include_str "${_include_str}\n\#include \"${LAPACKE_H_PATH}\"") unset(LAPACK_LIBRARIES CACHE)
endif() endif()
file(WRITE ${CBLAS_H_PROXY_PATH} ${_include_str})
endif() endif()
endif()
if(NOT LAPACK_LIBRARIES AND APPLE AND NOT OPENCV_LAPACK_FIND_PACKAGE_ONLY)
set(LAPACK_INCLUDE_DIR "")
set(LAPACK_LIBRARIES "-framework Accelerate")
set(LAPACK_CBLAS_H "Accelerate/Accelerate.h")
set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h")
set(LAPACK_IMPL "Apple")
ocv_lapack_check()
endif()
if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES)
ocv_lapack_check()
endif()
set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH "Path to BLAS include dir" FORCE)
set(LAPACK_CBLAS_H ${LAPACK_CBLAS_H} CACHE STRING "Alternative name of cblas.h" FORCE)
set(LAPACK_LAPACKE_H ${LAPACK_LAPACKE_H} CACHE STRING "Alternative name of lapacke.h" FORCE)
set(LAPACK_LIBRARIES ${LAPACK_LIBRARIES} CACHE STRING "Names of BLAS & LAPACK binaries (.so, .dll, .a, .lib)" FORCE)
set(LAPACK_IMPL ${LAPACK_IMPL} CACHE STRING "Lapack implementation id" FORCE)
endif() endif()

View File

@ -0,0 +1,14 @@
#include "opencv_lapack.h"
static char* check_fn1 = (char*)sgesv_;
static char* check_fn2 = (char*)sposv_;
static char* check_fn3 = (char*)spotrf_;
static char* check_fn4 = (char*)sgesdd_;
int main(int argc, char* argv[])
{
(void)argv;
if(argc > 1000)
return check_fn1[0] + check_fn2[0] + check_fn3[0] + check_fn4[0];
return 0;
}

View File

@ -1,7 +1,7 @@
set(the_description "The Core Functionality") set(the_description "The Core Functionality")
ocv_add_module(core ocv_add_module(core
"${OPENCV_HAL_LINKER_LIBS}" "${OPENCV_HAL_LINKER_LIBS}"
PRIVATE_REQUIRED ${ZLIB_LIBRARIES} "${OPENCL_LIBRARIES}" "${VA_LIBRARIES}" PRIVATE_REQUIRED ${ZLIB_LIBRARIES} "${OPENCL_LIBRARIES}" "${VA_LIBRARIES}" "${LAPACK_LIBRARIES}"
OPTIONAL opencv_cudev OPTIONAL opencv_cudev
WRAP java python) WRAP java python)