diff --git a/CMakeLists.txt b/CMakeLists.txt index 0262cd3a97..77378a1b29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -552,8 +552,22 @@ endif(WIN32 AND NOT MINGW) # CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC.. # ---------------------------------------------------------------------------- if(UNIX) - if(NOT APPLE_FRAMEWORK) - find_package(PkgConfig QUIET) + if(NOT APPLE_FRAMEWORK OR OPENCV_ENABLE_PKG_CONFIG) + if(CMAKE_CROSSCOMPILING AND NOT DEFINED ENV{PKG_CONFIG_LIBDIR} + AND NOT OPENCV_ENABLE_PKG_CONFIG + ) + if(NOT PkgConfig_FOUND) + message(STATUS "OpenCV disables pkg-config to avoid using of host libraries. Consider using PKG_CONFIG_LIBDIR to specify target SYSROOT") + elseif(OPENCV_SKIP_PKG_CONFIG_WARNING) + message(WARNING "pkg-config is enabled in cross-compilation mode without defining of PKG_CONFIG_LIBDIR environment variable. This may lead to misconfigured host-based dependencies.") + endif() + elseif(OPENCV_DISABLE_PKG_CONFIG) + if(PkgConfig_FOUND) + message(WARNING "OPENCV_DISABLE_PKG_CONFIG flag has no effect") + endif() + else() + find_package(PkgConfig QUIET) + endif() endif() include(CheckFunctionExists) include(CheckIncludeFile) diff --git a/platforms/linux/gnu.toolchain.cmake b/platforms/linux/gnu.toolchain.cmake index 4050d83f61..fc53dbf9f1 100644 --- a/platforms/linux/gnu.toolchain.cmake +++ b/platforms/linux/gnu.toolchain.cmake @@ -57,15 +57,51 @@ else() endif() # IN_TRY_COMPILE set(CMAKE_SKIP_RPATH TRUE) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +endif() + +macro(__cmake_find_root_save_and_reset) + foreach(v + CMAKE_FIND_ROOT_PATH_MODE_LIBRARY + CMAKE_FIND_ROOT_PATH_MODE_INCLUDE + CMAKE_FIND_ROOT_PATH_MODE_PACKAGE + CMAKE_FIND_ROOT_PATH_MODE_PROGRAM + ) + set(__save_${v} ${${v}}) + set(${v} NEVER) + endforeach() +endmacro() + +macro(__cmake_find_root_restore) + foreach(v + CMAKE_FIND_ROOT_PATH_MODE_LIBRARY + CMAKE_FIND_ROOT_PATH_MODE_INCLUDE + CMAKE_FIND_ROOT_PATH_MODE_PACKAGE + CMAKE_FIND_ROOT_PATH_MODE_PROGRAM + ) + set(${v} ${__save_${v}}) + unset(__save_${v}) + endforeach() +endmacro() + # macro to find programs on the host OS macro(find_host_program) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + __cmake_find_root_save_and_reset() if(CMAKE_HOST_WIN32) SET(WIN32 1) SET(UNIX) @@ -77,16 +113,12 @@ macro(find_host_program) SET(WIN32) SET(APPLE) SET(UNIX 1) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + __cmake_find_root_restore() endmacro() # macro to find packages on the host OS macro(find_host_package) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + __cmake_find_root_save_and_reset() if(CMAKE_HOST_WIN32) SET(WIN32 1) SET(UNIX) @@ -98,9 +130,7 @@ macro(find_host_package) SET(WIN32) SET(APPLE) SET(UNIX 1) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + __cmake_find_root_restore() endmacro() set(CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries.")