From 5ef548a985fc64dc89e8a6fdfa4e3889b1519780 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 18 Jul 2019 13:22:02 +0300 Subject: [PATCH] cmake: update initialization --- 3rdparty/libjpeg/CMakeLists.txt | 7 -- CMakeLists.txt | 105 +++++++++------------- cmake/OpenCVCRTLinkage.cmake | 10 --- cmake/OpenCVCompilerOptions.cmake | 5 -- cmake/OpenCVMinDepVersions.cmake | 4 +- cmake/OpenCVModule.cmake | 4 - cmake/OpenCVUtils.cmake | 3 +- cmake/platforms/OpenCV-Android.cmake | 1 + cmake/platforms/OpenCV-Darwin.cmake | 1 + cmake/platforms/OpenCV-Linux.cmake | 1 + cmake/platforms/OpenCV-WinRT.cmake | 31 +++++++ cmake/platforms/OpenCV-Windows.cmake | 1 + cmake/platforms/OpenCV-WindowsCE.cmake | 1 + cmake/platforms/OpenCV-WindowsPhone.cmake | 6 ++ cmake/platforms/OpenCV-WindowsStore.cmake | 1 + cmake/platforms/OpenCV-iOS.cmake | 1 + modules/core/CMakeLists.txt | 2 +- platforms/android/android.toolchain.cmake | 3 + 18 files changed, 96 insertions(+), 91 deletions(-) create mode 100644 cmake/platforms/OpenCV-Android.cmake create mode 100644 cmake/platforms/OpenCV-Darwin.cmake create mode 100644 cmake/platforms/OpenCV-Linux.cmake create mode 100644 cmake/platforms/OpenCV-WinRT.cmake create mode 100644 cmake/platforms/OpenCV-Windows.cmake create mode 100644 cmake/platforms/OpenCV-WindowsCE.cmake create mode 100644 cmake/platforms/OpenCV-WindowsPhone.cmake create mode 100644 cmake/platforms/OpenCV-WindowsStore.cmake create mode 100644 cmake/platforms/OpenCV-iOS.cmake diff --git a/3rdparty/libjpeg/CMakeLists.txt b/3rdparty/libjpeg/CMakeLists.txt index 4d06bbffd6..b50fc09840 100644 --- a/3rdparty/libjpeg/CMakeLists.txt +++ b/3rdparty/libjpeg/CMakeLists.txt @@ -15,13 +15,6 @@ else() ocv_list_filterout(lib_srcs jmemnobs.c) endif() -if(WINRT) - add_definitions(-DNO_GETENV) - get_directory_property( DirDefs COMPILE_DEFINITIONS ) - message(STATUS "Adding NO_GETENV to compiler definitions for WINRT:") - message(STATUS " COMPILE_DEFINITIONS = ${DirDefs}") -endif() - # ---------------------------------------------------------------------------------- # Define the library target: # ---------------------------------------------------------------------------------- diff --git a/CMakeLists.txt b/CMakeLists.txt index bc90983453..4ac553bbde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,40 +29,19 @@ else() cmake_minimum_required(VERSION "${MIN_VER_CMAKE}" FATAL_ERROR) endif() -option(ENABLE_PIC "Generate position independent code (necessary for shared libraries)" TRUE) -set(CMAKE_POSITION_INDEPENDENT_CODE ${ENABLE_PIC}) - -set(OPENCV_MATHJAX_RELPATH "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0" CACHE STRING "URI to a MathJax installation") - -# Following block can break build in case of cross-compiling -# but CMAKE_CROSSCOMPILING variable will be set only on project(OpenCV) command -# so we will try to detect cross-compiling by the presence of CMAKE_TOOLCHAIN_FILE -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - if(NOT CMAKE_TOOLCHAIN_FILE) - # it _must_ go before project(OpenCV) in order to work - if(WIN32) - set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory") - else() - set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory") - endif() - else() - #Android: set output folder to ${CMAKE_BINARY_DIR} - set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_BINARY_DIR} CACHE PATH "root for library output, set this to change where android libs are compiled to" ) - # any cross-compiling - set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory") - endif() -endif() - +# +# Configure CMake policies +# if(POLICY CMP0026) cmake_policy(SET CMP0026 NEW) endif() if(POLICY CMP0042) - cmake_policy(SET CMP0042 NEW) + cmake_policy(SET CMP0042 NEW) # CMake 3.0+ (2.8.12): MacOS "@rpath" in target's install name endif() if(POLICY CMP0046) - cmake_policy(SET CMP0046 NEW) + cmake_policy(SET CMP0046 NEW) # warn about non-existed dependencies endif() if(POLICY CMP0051) @@ -74,17 +53,21 @@ if(POLICY CMP0054) # CMake 3.1: Only interpret if() arguments as variables or k endif() if(POLICY CMP0056) - cmake_policy(SET CMP0056 NEW) + cmake_policy(SET CMP0056 NEW) # try_compile(): link flags endif() if(POLICY CMP0067) - cmake_policy(SET CMP0067 NEW) + cmake_policy(SET CMP0067 NEW) # CMake 3.8: try_compile(): honor language standard variables (like C++11) endif() if(POLICY CMP0068) cmake_policy(SET CMP0068 NEW) # CMake 3.9+: `RPATH` settings on macOS do not affect `install_name`. endif() + +# +# Configure OpenCV CMake hooks +# include(cmake/OpenCVUtils.cmake) ocv_cmake_reset_hooks() ocv_check_environment_variables(OPENCV_CMAKE_HOOKS_DIR) @@ -97,49 +80,46 @@ endif() ocv_cmake_hook(CMAKE_INIT) -# must go before the project command +# must go before the project()/enable_language() commands ocv_update(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE) if(DEFINED CMAKE_BUILD_TYPE) - set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} ) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${CMAKE_CONFIGURATION_TYPES}") endif() -enable_testing() - -project(OpenCV CXX C) +option(ENABLE_PIC "Generate position independent code (necessary for shared libraries)" TRUE) +set(CMAKE_POSITION_INDEPENDENT_CODE ${ENABLE_PIC}) -if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) - set(WINRT TRUE) -endif() +ocv_cmake_hook(PRE_CMAKE_BOOTSTRAP) -if(WINRT OR WINCE) - add_definitions(-DNO_GETENV) -endif() +# Bootstap CMake system: setup CMAKE_SYSTEM_NAME and other vars +enable_language(CXX C) -if(WINRT) - add_definitions(-DWINRT) +ocv_cmake_hook(POST_CMAKE_BOOTSTRAP) - # Making definitions available to other configurations and - # to filter dependency restrictions at compile time. - if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone) - set(WINRT_PHONE TRUE) - add_definitions(-DWINRT_PHONE) - elseif(CMAKE_SYSTEM_NAME MATCHES WindowsStore) - set(WINRT_STORE TRUE) - add_definitions(-DWINRT_STORE) +if(NOT OPENCV_SKIP_CMAKE_SYSTEM_FILE) + include("cmake/platforms/OpenCV-${CMAKE_SYSTEM_NAME}.cmake" OPTIONAL RESULT_VARIABLE "OPENCV_CMAKE_SYSTEM_FILE") + if(NOT OPENCV_CMAKE_SYSTEM_FILE) + message(STATUS "OpenCV: system-specific configuration file is not found: '${CMAKE_SYSTEM_NAME}'") endif() +endif() - if(CMAKE_SYSTEM_VERSION MATCHES 10) - set(WINRT_10 TRUE) - add_definitions(-DWINRT_10) - elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) - set(WINRT_8_1 TRUE) - add_definitions(-DWINRT_8_1) - elseif(CMAKE_SYSTEM_VERSION MATCHES 8.0) - set(WINRT_8_0 TRUE) - add_definitions(-DWINRT_8_0) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT.html + if(NOT CMAKE_TOOLCHAIN_FILE) + if(WIN32) + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE) + else() + set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation Directory" FORCE) + endif() + else() + # any cross-compiling + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Installation Directory" FORCE) endif() endif() +enable_testing() + +project(OpenCV CXX C) + if(MSVC) set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE) endif() @@ -511,6 +491,7 @@ if(ENABLE_IMPL_COLLECTION) add_definitions(-DCV_COLLECT_IMPL_DATA) endif() +set(OPENCV_MATHJAX_RELPATH "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0" CACHE STRING "URI to a MathJax installation") # ---------------------------------------------------------------------------- # Get actual OpenCV version number from sources @@ -665,12 +646,12 @@ endif() if(WIN32) # Postfix of DLLs: - set(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}") - set(OPENCV_DEBUG_POSTFIX d) + ocv_update(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}") + ocv_update(OPENCV_DEBUG_POSTFIX d) else() # Postfix of so's: - set(OPENCV_DLLVERSION "") - set(OPENCV_DEBUG_POSTFIX "") + ocv_update(OPENCV_DLLVERSION "") + ocv_update(OPENCV_DEBUG_POSTFIX "") endif() if(DEFINED CMAKE_DEBUG_POSTFIX) diff --git a/cmake/OpenCVCRTLinkage.cmake b/cmake/OpenCVCRTLinkage.cmake index 4916800211..b87dfd3a7c 100644 --- a/cmake/OpenCVCRTLinkage.cmake +++ b/cmake/OpenCVCRTLinkage.cmake @@ -4,16 +4,6 @@ if(NOT MSVC) message(FATAL_ERROR "CRT options are available only for MSVC") endif() -if (WINRT) - if (CMAKE_SYSTEM_VERSION MATCHES 10) - add_definitions(/DWINVER=_WIN32_WINNT_WIN10 /DNTDDI_VERSION=NTDDI_WIN10 /D_WIN32_WINNT=_WIN32_WINNT_WIN10) - elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) - add_definitions(/DWINVER=_WIN32_WINNT_WINBLUE /DNTDDI_VERSION=NTDDI_WINBLUE /D_WIN32_WINNT=_WIN32_WINNT_WINBLUE) - else() - add_definitions(/DWINVER=_WIN32_WINNT_WIN8 /DNTDDI_VERSION=NTDDI_WIN8 /D_WIN32_WINNT=_WIN32_WINNT_WIN8) - endif() -endif() - # Removing LNK4075 warnings for debug WinRT builds # "LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification" # "LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification" diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 0b9d6692a4..b166f4c7de 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -280,11 +280,6 @@ if(MSVC) endif() endif() -# Adding additional using directory for WindowsPhone 8.0 to get Windows.winmd properly -if(WINRT_PHONE AND WINRT_8_0) - set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /AI\$(WindowsSDK_MetadataPath)") -endif() - include(cmake/OpenCVCompilerOptimizations.cmake) if(COMMAND ocv_compiler_optimization_options) ocv_compiler_optimization_options() diff --git a/cmake/OpenCVMinDepVersions.cmake b/cmake/OpenCVMinDepVersions.cmake index a7e2477956..e67856bb97 100644 --- a/cmake/OpenCVMinDepVersions.cmake +++ b/cmake/OpenCVMinDepVersions.cmake @@ -1,4 +1,6 @@ -set(MIN_VER_CMAKE 2.8.12.2) +if(NOT DEFINED MIN_VER_CMAKE) + set(MIN_VER_CMAKE 2.8.12.2) +endif() set(MIN_VER_CUDA 6.5) set(MIN_VER_PYTHON2 2.7) set(MIN_VER_PYTHON3 3.2) diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index 3f7dfdc6d6..8b1267d951 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -1193,10 +1193,6 @@ endfunction() function(ocv_add_accuracy_tests) ocv_debug_message("ocv_add_accuracy_tests(" ${ARGN} ")") - if(WINRT) - set(OPENCV_DEBUG_POSTFIX "") - endif() - set(test_path "${CMAKE_CURRENT_LIST_DIR}/test") if(BUILD_TESTS AND EXISTS "${test_path}") __ocv_parse_test_sources(TEST ${ARGN}) diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index f8ff242948..541771411d 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -16,7 +16,8 @@ function(ocv_cmake_dump_vars) string(TOLOWER "${__variableName}" __variableName_lower) if((__variableName MATCHES "${regex}" OR __variableName_lower MATCHES "${regex_lower}") AND NOT __variableName_lower MATCHES "^__") - set(__VARS "${__VARS}${__variableName}=${${__variableName}}\n") + get_property(__value VARIABLE PROPERTY "${__variableName}") + set(__VARS "${__VARS}${__variableName}=${__value}\n") endif() endforeach() if(DUMP_TOFILE) diff --git a/cmake/platforms/OpenCV-Android.cmake b/cmake/platforms/OpenCV-Android.cmake new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/cmake/platforms/OpenCV-Android.cmake @@ -0,0 +1 @@ +# empty diff --git a/cmake/platforms/OpenCV-Darwin.cmake b/cmake/platforms/OpenCV-Darwin.cmake new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/cmake/platforms/OpenCV-Darwin.cmake @@ -0,0 +1 @@ +# empty diff --git a/cmake/platforms/OpenCV-Linux.cmake b/cmake/platforms/OpenCV-Linux.cmake new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/cmake/platforms/OpenCV-Linux.cmake @@ -0,0 +1 @@ +# empty diff --git a/cmake/platforms/OpenCV-WinRT.cmake b/cmake/platforms/OpenCV-WinRT.cmake new file mode 100644 index 0000000000..0a5e9f3c7d --- /dev/null +++ b/cmake/platforms/OpenCV-WinRT.cmake @@ -0,0 +1,31 @@ +set(WINRT TRUE) + +add_definitions(-DWINRT -DNO_GETENV) + +# Making definitions available to other configurations and +# to filter dependency restrictions at compile time. +if(WINDOWS_PHONE) + set(WINRT_PHONE TRUE) + add_definitions(-DWINRT_PHONE) +elseif(WINDOWS_STORE) + set(WINRT_STORE TRUE) + add_definitions(-DWINRT_STORE) +endif() + +if(CMAKE_SYSTEM_VERSION MATCHES 10) + set(WINRT_10 TRUE) + add_definitions(-DWINRT_10) + add_definitions(/DWINVER=_WIN32_WINNT_WIN10 /DNTDDI_VERSION=NTDDI_WIN10 /D_WIN32_WINNT=_WIN32_WINNT_WIN10) +elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) + set(WINRT_8_1 TRUE) + add_definitions(-DWINRT_8_1) + add_definitions(/DWINVER=_WIN32_WINNT_WINBLUE /DNTDDI_VERSION=NTDDI_WINBLUE /D_WIN32_WINNT=_WIN32_WINNT_WINBLUE) +elseif(CMAKE_SYSTEM_VERSION MATCHES 8.0) + set(WINRT_8_0 TRUE) + add_definitions(-DWINRT_8_0) + add_definitions(/DWINVER=_WIN32_WINNT_WIN8 /DNTDDI_VERSION=NTDDI_WIN8 /D_WIN32_WINNT=_WIN32_WINNT_WIN8) +else() + message(STATUS "Unsupported WINRT version (consider upgrading OpenCV): ${CMAKE_SYSTEM_VERSION}") +endif() + +set(OPENCV_DEBUG_POSTFIX "") diff --git a/cmake/platforms/OpenCV-Windows.cmake b/cmake/platforms/OpenCV-Windows.cmake new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/cmake/platforms/OpenCV-Windows.cmake @@ -0,0 +1 @@ +# empty diff --git a/cmake/platforms/OpenCV-WindowsCE.cmake b/cmake/platforms/OpenCV-WindowsCE.cmake new file mode 100644 index 0000000000..f5ac590754 --- /dev/null +++ b/cmake/platforms/OpenCV-WindowsCE.cmake @@ -0,0 +1 @@ +add_definitions(-DNO_GETENV) diff --git a/cmake/platforms/OpenCV-WindowsPhone.cmake b/cmake/platforms/OpenCV-WindowsPhone.cmake new file mode 100644 index 0000000000..8a496d3a7b --- /dev/null +++ b/cmake/platforms/OpenCV-WindowsPhone.cmake @@ -0,0 +1,6 @@ +include("${CMAKE_CURRENT_LIST_DIR}/OpenCV_WinRT.cmake") + +# Adding additional using directory for WindowsPhone 8.0 to get Windows.winmd properly +if(WINRT_8_0) + set(OPENCV_EXTRA_CXX_FLAGS "${OPENCV_EXTRA_CXX_FLAGS} /AI\$(WindowsSDK_MetadataPath)") +endif() diff --git a/cmake/platforms/OpenCV-WindowsStore.cmake b/cmake/platforms/OpenCV-WindowsStore.cmake new file mode 100644 index 0000000000..8b5dfa5556 --- /dev/null +++ b/cmake/platforms/OpenCV-WindowsStore.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/OpenCV_WinRT.cmake") diff --git a/cmake/platforms/OpenCV-iOS.cmake b/cmake/platforms/OpenCV-iOS.cmake new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/cmake/platforms/OpenCV-iOS.cmake @@ -0,0 +1 @@ +# empty diff --git a/modules/core/CMakeLists.txt b/modules/core/CMakeLists.txt index 96c190f5b8..25cd0d2f68 100644 --- a/modules/core/CMakeLists.txt +++ b/modules/core/CMakeLists.txt @@ -23,7 +23,7 @@ ocv_add_module(core set(extra_libs "") -if(WINRT AND CMAKE_SYSTEM_NAME MATCHES WindowsStore AND CMAKE_SYSTEM_VERSION MATCHES "8.0") +if(WINRT AND WINDOWS_STORE AND CMAKE_SYSTEM_VERSION MATCHES "8.0") list(APPEND extra_libs ole32.lib) endif() diff --git a/platforms/android/android.toolchain.cmake b/platforms/android/android.toolchain.cmake index b37dea01ae..50b342c7a6 100644 --- a/platforms/android/android.toolchain.cmake +++ b/platforms/android/android.toolchain.cmake @@ -1554,6 +1554,9 @@ if( ANDROID_EXPLICIT_CRT_LINK ) endif() # setup output directories +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT 1) +endif() set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) if( DEFINED LIBRARY_OUTPUT_PATH_ROOT -- GitLab