From 009fdbbea2c2a926f169c2be8a34de22bdae373c Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Sat, 8 Mar 2025 15:00:37 +0300 Subject: [PATCH] build: fix OpenBLAS detection on Linux --- cmake/OpenCVFindLAPACK.cmake | 88 +++++++++++---------- cmake/OpenCVFindOpenBLAS.cmake | 139 +++++++++------------------------ 2 files changed, 85 insertions(+), 142 deletions(-) diff --git a/cmake/OpenCVFindLAPACK.cmake b/cmake/OpenCVFindLAPACK.cmake index ba682c1c04..2ec188916c 100644 --- a/cmake/OpenCVFindLAPACK.cmake +++ b/cmake/OpenCVFindLAPACK.cmake @@ -44,6 +44,14 @@ macro(_find_header_file_in_dirs VAR NAME) endmacro() macro(ocv_lapack_check) + cmake_parse_arguments(LAPACK "" "IMPL;CBLAS_H;LAPACKE_H" "INCLUDE_DIR;LIBRARIES" ${ARGN}) + + ocv_debug_message("LAPACK_IMPL=${LAPACK_IMPL}") + ocv_debug_message("LAPACK_CBLAS_H=${LAPACK_CBLAS_H}") + ocv_debug_message("LAPACK_LAPACKE_H=${LAPACK_LAPACKE_H}") + ocv_debug_message("LAPACK_INCLUDE_DIR=${LAPACK_INCLUDE_DIR}") + ocv_debug_message("LAPACK_LIBRARIES=${LAPACK_LIBRARIES}") + 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}") @@ -169,34 +177,31 @@ if(WITH_LAPACK) if(NOT LAPACK_LIBRARIES AND NOT OPENCV_LAPACK_DISABLE_MKL) include(cmake/OpenCVFindMKL.cmake) if(HAVE_MKL) - set(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIRS}) - set(LAPACK_LIBRARIES ${MKL_LIBRARIES}) - set(LAPACK_CBLAS_H "mkl_cblas.h") - set(LAPACK_LAPACKE_H "mkl_lapack.h") - set(LAPACK_IMPL "MKL") - ocv_lapack_check() + ocv_lapack_check(IMPL "MKL" + CBLAS_H "mkl_cblas.h" + LAPACKE_H "mkl_lapack.h" + INCLUDE_DIR "${MKL_INCLUDE_DIRS}" + LIBRARIES "${MKL_LIBRARIES}") endif() endif() if(NOT LAPACK_LIBRARIES) include(cmake/OpenCVFindOpenBLAS.cmake) if(OpenBLAS_FOUND) - set(LAPACK_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIR}) - set(LAPACK_LIBRARIES ${OpenBLAS_LIB}) - set(LAPACK_CBLAS_H "cblas.h") - set(LAPACK_LAPACKE_H "lapacke.h") - set(LAPACK_IMPL "OpenBLAS") - ocv_lapack_check() + ocv_lapack_check(IMPL "OpenBLAS" + CBLAS_H "cblas.h" + LAPACKE_H "lapacke.h" + INCLUDE_DIR "${OpenBLAS_INCLUDE_DIRS}" + LIBRARIES "${OpenBLAS_LIBRARIES}") endif() endif() if(NOT LAPACK_LIBRARIES AND UNIX) include(cmake/OpenCVFindAtlas.cmake) if(ATLAS_FOUND) - set(LAPACK_INCLUDE_DIR ${Atlas_INCLUDE_DIR}) - set(LAPACK_LIBRARIES ${Atlas_LIBRARIES}) - set(LAPACK_CBLAS_H "cblas.h") - set(LAPACK_LAPACKE_H "lapacke.h") - set(LAPACK_IMPL "Atlas") - ocv_lapack_check() + ocv_lapack_check(IMPL "Atlas" + CBLAS_H "cblas.h" + LAPACKE_H "lapacke.h" + INCLUDE_DIR "${Atlas_INCLUDE_DIR}" + LIBRARIES "${Atlas_LIBRARIES}") endif() endif() endif() @@ -214,24 +219,26 @@ if(WITH_LAPACK) find_path(MKL_LAPACKE_INCLUDE_DIR "mkl_lapack.h") endif() if(MKL_LAPACKE_INCLUDE_DIR AND NOT OPENCV_LAPACK_DISABLE_MKL) - set(LAPACK_INCLUDE_DIR ${MKL_LAPACKE_INCLUDE_DIR}) - set(LAPACK_CBLAS_H "mkl_cblas.h") - set(LAPACK_LAPACKE_H "mkl_lapack.h") - set(LAPACK_IMPL "LAPACK/MKL") - ocv_lapack_check() + ocv_lapack_check(IMPL "LAPACK/MKL" + CBLAS_H "mkl_cblas.h" + LAPACKE_H "mkl_lapack.h" + INCLUDE_DIR "${MKL_LAPACKE_INCLUDE_DIR}" + LIBRARIES "${LAPACK_LIBRARIES}") endif() if(NOT HAVE_LAPACK) - if(LAPACKE_INCLUDE_DIR) - set(LAPACK_INCLUDE_DIR ${LAPACKE_INCLUDE_DIR}) - set(LAPACK_CBLAS_H "cblas.h") - set(LAPACK_LAPACKE_H "lapacke.h") - set(LAPACK_IMPL "LAPACK/Generic") - ocv_lapack_check() + if(NOT DEFINED CBLAS_INCLUDE_DIR) + find_path(CBLAS_INCLUDE_DIR "cblas.h") + endif() + if(CBLAS_INCLUDE_DIR AND LAPACKE_INCLUDE_DIR) + ocv_lapack_check(IMPL "LAPACK/Generic" + CBLAS_H "cblas.h" + LAPACKE_H "lapacke.h" + INCLUDE_DIR "${CBLAS_INCLUDE_DIR}" "${LAPACKE_INCLUDE_DIR}" + LIBRARIES "${LAPACK_LIBRARIES}") elseif(APPLE) - set(LAPACK_CBLAS_H "Accelerate/Accelerate.h") - set(LAPACK_LAPACKE_H "Accelerate/Accelerate.h") - set(LAPACK_IMPL "LAPACK/Apple") - ocv_lapack_check() + ocv_lapack_check(IMPL "LAPACK/Apple" + CBLAS_H "Accelerate/Accelerate.h" + LAPACKE_H "Accelerate/Accelerate.h") endif() endif() endif() @@ -242,16 +249,17 @@ if(WITH_LAPACK) 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() + ocv_lapack_check(IMPL "Apple" + CBLAS_H "Accelerate/Accelerate.h" + LAPACKE_H "Accelerate/Accelerate.h" + LIBRARIES "-framework Accelerate") endif() if(NOT HAVE_LAPACK AND LAPACK_LIBRARIES AND LAPACK_CBLAS_H AND LAPACK_LAPACKE_H) - ocv_lapack_check() + ocv_lapack_check(IMPL "Unknown" + CBLAS_H ${LAPACK_CBLAS_H} + LAPACKE_H ${LAPACK_LAPACKE_H} + LIBRARIES "${LAPACK_LIBRARIES}") endif() set(LAPACK_INCLUDE_DIR ${LAPACK_INCLUDE_DIR} CACHE PATH "Path to BLAS include dir" FORCE) diff --git a/cmake/OpenCVFindOpenBLAS.cmake b/cmake/OpenCVFindOpenBLAS.cmake index 4e3f0cc210..15771f7ebb 100644 --- a/cmake/OpenCVFindOpenBLAS.cmake +++ b/cmake/OpenCVFindOpenBLAS.cmake @@ -1,107 +1,42 @@ -#COPYRIGHT -# -#All contributions by the University of California: -#Copyright (c) 2014, 2015, The Regents of the University of California (Regents) -#All rights reserved. -# -#All other contributions: -#Copyright (c) 2014, 2015, the respective contributors -#All rights reserved. -# -#Caffe uses a shared copyright model: each contributor holds copyright over -#their contributions to Caffe. The project versioning records all such -#contribution and copyright details. If a contributor wants to further mark -#their specific copyright on a particular contribution, they should indicate -#their copyright solely in the commit message of the change when it is -#committed. -# -#LICENSE -# -#Redistribution and use in source and binary forms, with or without -#modification, are permitted provided that the following conditions are met: -# -#1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -#2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -#CONTRIBUTION AGREEMENT -# -#By contributing to the BVLC/caffe repository through pull-request, comment, -#or otherwise, the contributor releases their content to the -#license and copyright terms herein. +# Search for OpenBLAS library -SET(Open_BLAS_INCLUDE_SEARCH_PATHS - $ENV{OpenBLAS_HOME} - $ENV{OpenBLAS_HOME}/include - $ENV{OpenBLAS_HOME}/include/openblas - /opt/OpenBLAS/include - /usr/local/include/openblas - /usr/include/openblas - /usr/local/include/openblas-base - /usr/include/openblas-base - /usr/local/include - /usr/include -) +if(NOT OpenBLAS_FOUND AND NOT SKIP_OPENBLAS_PACKAGE) + find_package(OpenBLAS QUIET) + if(OpenBLAS_FOUND) + message(STATUS "Found OpenBLAS package") + endif() +endif() -SET(Open_BLAS_LIB_SEARCH_PATHS - $ENV{OpenBLAS} - $ENV{OpenBLAS}/lib - $ENV{OpenBLAS_HOME} - $ENV{OpenBLAS_HOME}/lib - /opt/OpenBLAS/lib - /usr/local/lib64 - /usr/local/lib - /lib/openblas-base - /lib64/ - /lib/ - /usr/lib/openblas-base - /usr/lib64 - /usr/lib - ) +if(NOT OpenBLAS_FOUND) + find_library(OpenBLAS_LIBRARIES NAMES openblas PATHS ENV "OpenBLAS" ENV "OpenBLAS_HOME" PATH_SUFFIXES "lib" NO_DEFAULT_PATH) + find_path(OpenBLAS_INCLUDE_DIRS NAMES cblas.h PATHS ENV "OpenBLAS" ENV "OpenBLAS_HOME" PATH_SUFFIXES "include" NO_DEFAULT_PATH) + find_path(OpenBLAS_LAPACKE_DIR NAMES lapacke.h PATHS "${OpenBLAS_INCLUDE_DIRS}" ENV "OpenBLAS" ENV "OpenBLAS_HOME" PATH_SUFFIXES "include" NO_DEFAULT_PATH) + if(OpenBLAS_LIBRARIES AND OpenBLAS_INCLUDE_DIRS) + message(STATUS "Found OpenBLAS using environment hint") + set(OpenBLAS_FOUND ON) + else() + ocv_clear_vars(OpenBLAS_LIBRARIES OpenBLAS_INCLUDE_DIRS) + endif() +endif() -FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS} NO_DEFAULT_PATH) -FIND_LIBRARY(OpenBLAS_LIB NAMES openblas libopenblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS} NO_DEFAULT_PATH) +if(NOT OpenBLAS_FOUND) + find_library(OpenBLAS_LIBRARIES NAMES openblas) + find_path(OpenBLAS_INCLUDE_DIRS NAMES cblas.h) + find_path(OpenBLAS_LAPACKE_DIR NAMES lapacke.h PATHS "${OpenBLAS_INCLUDE_DIRS}") + if(OpenBLAS_LIBRARIES AND OpenBLAS_INCLUDE_DIRS) + message(STATUS "Found OpenBLAS in the system") + set(OpenBLAS_FOUND ON) + else() + ocv_clear_vars(OpenBLAS_LIBRARIES OpenBLAS_INCLUDE_DIRS) + endif() +endif() -SET(OpenBLAS_FOUND ON) +if(OpenBLAS_FOUND) + if(OpenBLAS_LAPACKE_DIR) + set(OpenBLAS_INCLUDE_DIRS "${OpenBLAS_INCLUDE_DIRS};${OpenBLAS_LAPACKE_DIR}") + endif() + message(STATUS "OpenBLAS_LIBRARIES=${OpenBLAS_LIBRARIES}") + message(STATUS "OpenBLAS_INCLUDE_DIRS=${OpenBLAS_INCLUDE_DIRS}") +endif() -# Check include files -IF(NOT OpenBLAS_INCLUDE_DIR) - SET(OpenBLAS_FOUND OFF) - MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off") -ENDIF() - -# Check libraries -IF(NOT OpenBLAS_LIB) - SET(OpenBLAS_FOUND OFF) - MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off") -ENDIF() - -IF (OpenBLAS_FOUND) - IF (NOT OpenBLAS_FIND_QUIETLY) - MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}") - MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}") - ENDIF (NOT OpenBLAS_FIND_QUIETLY) -ELSE (OpenBLAS_FOUND) - IF (OpenBLAS_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find OpenBLAS") - ENDIF (OpenBLAS_FIND_REQUIRED) -ENDIF (OpenBLAS_FOUND) - -MARK_AS_ADVANCED( - OpenBLAS_INCLUDE_DIR - OpenBLAS_LIB - OpenBLAS -) +mark_as_advanced(OpenBLAS_LIBRARIES OpenBLAS_INCLUDE_DIRS OpenBLAS_LAPACKE_DIR)