From ef93aea0da04a4151af23a396814cec0203d4d8b Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 11 Feb 2020 17:24:52 +0300 Subject: [PATCH] cmake: update handling of MSVC /MP flag --- cmake/OpenCVCRTLinkage.cmake | 9 -------- cmake/OpenCVCompilerOptions.cmake | 35 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/cmake/OpenCVCRTLinkage.cmake b/cmake/OpenCVCRTLinkage.cmake index b87dfd3a7cce..0e0a54ecf911 100644 --- a/cmake/OpenCVCRTLinkage.cmake +++ b/cmake/OpenCVCRTLinkage.cmake @@ -64,12 +64,3 @@ else() endif() endforeach(flag_var) endif() - -if(CMAKE_VERSION VERSION_GREATER "2.8.6") - include(ProcessorCount) - ProcessorCount(N) - if(NOT N EQUAL 0) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP${N} ") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${N} ") - endif() -endif() diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index dd4dcc2296ea..eafca6406842 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -442,3 +442,38 @@ if(OPENCV_EXTRA_RPATH_LINK_PATH) message(WARNING "OPENCV_EXTRA_RPATH_LINK_PATH may not work properly because CMAKE_EXECUTABLE_RPATH_LINK_CXX_FLAG is not defined (not supported)") endif() endif() + +# Control MSVC /MP flag +# Input variables: OPENCV_MSVC_PARALLEL (ON,1,2,3,...) + OPENCV_SKIP_MSVC_PARALLEL +# Details: +# - https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes +# - https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables +# - https://gitlab.kitware.com/cmake/cmake/merge_requests/1718/diffs +if(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_CXX_COMPILER_ID MATCHES "MSVC|Intel") + ocv_check_environment_variables(OPENCV_SKIP_MSVC_PARALLEL) + if(OPENCV_SKIP_MSVC_PARALLEL) + # nothing + elseif(" ${CMAKE_CXX_FLAGS}" MATCHES "/MP") + # nothing, already defined in compiler flags + elseif(DEFINED ENV{CL} AND " $ENV{CL}" MATCHES "/MP") + # nothing, compiler will use CL environment variable + elseif(DEFINED ENV{_CL_} AND " $ENV{_CL_}" MATCHES "/MP") + # nothing, compiler will use _CL_ environment variable + else() + ocv_check_environment_variables(OPENCV_MSVC_PARALLEL) + set(_mp_value "ON") + if(DEFINED OPENCV_MSVC_PARALLEL) + set(_mp_value "${OPENCV_MSVC_PARALLEL}") + endif() + set(OPENCV_MSVC_PARALLEL "${_mp_value}" CACHE STRING "Control MSVC /MP flag") + if(_mp_value) + if(_mp_value GREATER 0) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP${_mp_value}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${_mp_value}") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + endif() + endif() + endif() +endif()