diff options
author | Brad King <brad.king@kitware.com> | 2020-11-13 16:15:57 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2020-11-13 16:46:23 (GMT) |
commit | c00a6d3967be94a1cd8dfa369d834feea3e91725 (patch) | |
tree | 00c24f1df5da1a20f8abe03bb387609a24507304 | |
parent | 6114c8e994761ae4873218499a951136a4cdd855 (diff) | |
download | CMake-c00a6d3967be94a1cd8dfa369d834feea3e91725.zip CMake-c00a6d3967be94a1cd8dfa369d834feea3e91725.tar.gz CMake-c00a6d3967be94a1cd8dfa369d834feea3e91725.tar.bz2 |
MSVC: Do not add /GR to CMAKE_CXX_FLAGS by default
The `/GR` flag has been on by default since MSVC cl 14.0 from VS 2005.
Remove it from the default flags to make it easier for projects to pass
`/GR-` themselves to turn it off.
Projects may be using string processing to replace `/GR` with another
flag, so we cannot simply drop it. Add a policy to drop it in a
compatible way.
Fixes: #21428
-rw-r--r-- | Help/manual/cmake-policies.7.rst | 1 | ||||
-rw-r--r-- | Help/policy/CMP0117.rst | 43 | ||||
-rw-r--r-- | Help/release/dev/msvc-no-GR.rst | 7 | ||||
-rw-r--r-- | Modules/Platform/Windows-MSVC.cmake | 8 | ||||
-rw-r--r-- | Source/cmPolicies.h | 3 | ||||
-rw-r--r-- | Tests/RunCMake/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-NEW.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-OLD.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-WARN.cmake | 2 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-common.cmake | 12 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Tests/RunCMake/MSVCRuntimeTypeInfo/RunCMakeTest.cmake | 5 |
12 files changed, 88 insertions, 1 deletions
diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst index 0116674..03eb93e 100644 --- a/Help/manual/cmake-policies.7.rst +++ b/Help/manual/cmake-policies.7.rst @@ -57,6 +57,7 @@ Policies Introduced by CMake 3.20 .. toctree:: :maxdepth: 1 + CMP0117: MSVC RTTI flag /GR is not added to CMAKE_CXX_FLAGS by default. </policy/CMP0117> CMP0116: Ninja generators transform DEPFILEs from add_custom_command(). </policy/CMP0116> CMP0115: Source file extensions must be explicit. </policy/CMP0115> diff --git a/Help/policy/CMP0117.rst b/Help/policy/CMP0117.rst new file mode 100644 index 0000000..0c4dd30 --- /dev/null +++ b/Help/policy/CMP0117.rst @@ -0,0 +1,43 @@ +CMP0117 +------- + +.. versionadded:: 3.20 + +MSVC RTTI flag ``/GR`` is not added to +:variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` by default. + +When using MSVC-like compilers in CMake 3.19 and below, the RTTI flag +``/GR`` is added to :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` by +default. This behavior is left from support for MSVC versions from Visual +Studio 2003 and below that did not enable RTTI by default. It is no longer +necessary. Furthermore, it is problematic for projects that want to change +to ``/GR-`` programmatically. In particular, it requires string editing of +the :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` variable with knowledge +of the CMake builtin default so it can be replaced. + +CMake 3.20 and above prefer to leave out ``/GR`` from the value of +:variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` by default. + +This policy provides compatibility with projects that have not been updated +to expect the lack of the ``/GR`` flag. The policy setting takes effect as +of the first :command:`project` or :command:`enable_language` command that +initializes :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>`. + +.. note:: + + Once the policy has taken effect at the top of a project for a given + language, that choice must be used throughout the tree for that language. + In projects that have nested projects in subdirectories, be sure to + convert everything together. + +The ``OLD`` behavior for this policy is to place the MSVC ``/GR`` flag in the +default :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` cache entry. The +``NEW`` behavior for this policy is to *not* place the MSVC ``/GR`` flag in +the default cache entry. + +This policy was introduced in CMake version 3.20. Use the +:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly. +Unlike many policies, CMake version |release| does *not* warn +when this policy is not set and simply uses ``OLD`` behavior. + +.. include:: DEPRECATED.txt diff --git a/Help/release/dev/msvc-no-GR.rst b/Help/release/dev/msvc-no-GR.rst new file mode 100644 index 0000000..e5ca850 --- /dev/null +++ b/Help/release/dev/msvc-no-GR.rst @@ -0,0 +1,7 @@ +msvc-no-GR +---------- + +* With MSVC-like compilers the value of + :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` no longer contains + the ``/GR`` flag for runtime type information by default. + See policy :policy:`CMP0117`. diff --git a/Modules/Platform/Windows-MSVC.cmake b/Modules/Platform/Windows-MSVC.cmake index cf3e3eb..3f65475 100644 --- a/Modules/Platform/Windows-MSVC.cmake +++ b/Modules/Platform/Windows-MSVC.cmake @@ -163,7 +163,13 @@ foreach(lang C CXX) endif() endforeach() -set(_GR " /GR") +cmake_policy(GET CMP0117 __WINDOWS_MSVC_CMP0117) +if(__WINDOWS_MSVC_CMP0117 STREQUAL "NEW") + set(_GR "") +else() + set(_GR " /GR") +endif() +unset(__WINDOWS_MSVC_CMP0117) if(WINCE) foreach(lang C CXX) diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 5ef0ff7..30cd4b7 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -345,6 +345,9 @@ class cmMakefile; 0, cmPolicies::WARN) \ SELECT(POLICY, CMP0116, \ "Ninja generators transform DEPFILEs from add_custom_command().", 3, \ + 20, 0, cmPolicies::WARN) \ + SELECT(POLICY, CMP0117, \ + "MSVC RTTI flag /GR is not added to CMAKE_CXX_FLAGS by default.", 3, \ 20, 0, cmPolicies::WARN) #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1) diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 740815b..79f0d77 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -262,6 +262,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "^(Cray|PGI|XL|XLClang)$") endif() if(MSVC) add_RunCMake_test(MSVCRuntimeLibrary) + add_RunCMake_test(MSVCRuntimeTypeInfo) add_RunCMake_test(MSVCWarningFlags) endif() add_RunCMake_test(ObjectLibrary) diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-NEW.cmake b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-NEW.cmake new file mode 100644 index 0000000..c8b0a91 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-NEW.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0117 NEW) +include(CMP0117-common.cmake) diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-OLD.cmake b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-OLD.cmake new file mode 100644 index 0000000..c0a61d0 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-OLD.cmake @@ -0,0 +1,2 @@ +cmake_policy(SET CMP0117 OLD) +include(CMP0117-common.cmake) diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-WARN.cmake b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-WARN.cmake new file mode 100644 index 0000000..37d1b64 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-WARN.cmake @@ -0,0 +1,2 @@ + +include(CMP0117-common.cmake) diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-common.cmake b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-common.cmake new file mode 100644 index 0000000..5dda623 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMP0117-common.cmake @@ -0,0 +1,12 @@ +enable_language(CXX) + +cmake_policy(GET CMP0117 cmp0117) +if(cmp0117 STREQUAL "NEW") + if(" ${CMAKE_CXX_FLAGS} " MATCHES " ([/-]GR) ") + message(SEND_ERROR "CMAKE_CXX_FLAGS has '${CMAKE_MATCH_1}' under NEW behavior") + endif() +else() + if(NOT " ${CMAKE_CXX_FLAGS} " MATCHES " /GR ") + message(SEND_ERROR "CMAKE_CXX_FLAGS does not have '/GR' under OLD behavior") + endif() +endif() diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/CMakeLists.txt b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMakeLists.txt new file mode 100644 index 0000000..3e470a2 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.14) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/MSVCRuntimeTypeInfo/RunCMakeTest.cmake b/Tests/RunCMake/MSVCRuntimeTypeInfo/RunCMakeTest.cmake new file mode 100644 index 0000000..c870f59 --- /dev/null +++ b/Tests/RunCMake/MSVCRuntimeTypeInfo/RunCMakeTest.cmake @@ -0,0 +1,5 @@ +include(RunCMake) + +run_cmake(CMP0117-WARN) +run_cmake(CMP0117-OLD) +run_cmake(CMP0117-NEW) |