From 7007756923d9c59dd6f19a367420513c3ab23fd7 Mon Sep 17 00:00:00 2001 From: DRC Date: Fri, 26 Jan 2024 18:15:48 -0500 Subject: [PATCH] Build/Win: Eliminate MSVC run-time DLL dependency (regression introduced by e402185fdef0e0a91fc762e9467c60b2409b1794) Setting a maximum version in cmake_minimum_required() effectively sets the behavior to NEW for all policies introduced in all CMake versions up to and including that maximum version. The NEW behavior for CMP0091, introduced in CMake 3.15, uses CMake variables to specify the MSVC runtime library against which to link, rather than placing the relevant flags in CMAKE_C_FLAGS*. Thus, replacing /MD with /MT in CMAKE_C_FLAGS* no longer has any effect when using CMake 3.15+. --- win/CMakeLists.txt | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/win/CMakeLists.txt b/win/CMakeLists.txt index d609bd3da..ce88a29b0 100644 --- a/win/CMakeLists.txt +++ b/win/CMakeLists.txt @@ -1,15 +1,26 @@ enable_language(CXX) +string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC) + if(MSVC) # Use the static C library for all build types - foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - if(${var} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") + if(CMAKE_VERSION VERSION_EQUAL "3.15" OR + CMAKE_VERSION VERSION_GREATER "3.15") + if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug) + else() + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded) endif() - endforeach() + else() + foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}") + endif() + endforeach() + endif() foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) @@ -28,8 +39,6 @@ if(MSVC) add_definitions(-D__WIN32__ -U_MBCS -D_WINSOCK_DEPRECATED_NO_WARNINGS) endif() -string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC) - set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}") message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")