VS: Change CMAKE_VS_WINRT_BY_DEFAULT to not implicitly enable WinRT

Original behaviour would unconditionally enable WinRT for all projects
so source file flag generation code can acknowledge WinRT being present
and disable it for C language source files.  An unintentional result of
that approach is that WinRT is enabled for ALL projects, including C++
projects/source files with no way to disable it

Instead use `CMAKE_VS_WINRT_BY_DEFAULT` as a hint that the platform is
WinRT-by-default and set global `CompileAsWinRT` flag to `false` unless
it was explicitly requested by either `WINRT_COMPONENT` option or `/ZW`
compilation option - similar to what Windows Phone/Windows Store
platform logic does

In case WinRT compilation is enabled for a project by either of
aforementioned methods, C language source file override logic will still
kick in and disable CompileAsWinRT for C source files

Fixes: #20063
This commit is contained in:
Petr Polezhaev
2019-12-03 16:00:41 +03:00
committed by Brad King
parent 7bcef355bf
commit 557ea4614e
3 changed files with 19 additions and 10 deletions

View File

@@ -1,8 +1,18 @@
CMAKE_VS_WINRT_BY_DEFAULT CMAKE_VS_WINRT_BY_DEFAULT
------------------------- -------------------------
Tell :ref:`Visual Studio Generators` for VS 2010 and above that the Inform :ref:`Visual Studio Generators` for VS 2010 and above that the
target platform compiles as WinRT by default (compiles with ``/ZW``). target platform enables WinRT compilation by default and it needs to
be explicitly disabled if ``/ZW`` or :prop_tgt:`VS_WINRT_COMPONENT` is
omitted (as opposed to enabling it when either of those options is
present)
This makes cmake configuration consistent in terms of WinRT among
platforms - if you did not enable the WinRT compilation explicitly, it
will be disabled (by either not enabling it or explicitly disabling it)
Note: WinRT compilation is always explicitly disabled for C language
source files, even if it is expliclty enabled for a project
This variable is meant to be set by a This variable is meant to be set by a
:variable:`toolchain file <CMAKE_TOOLCHAIN_FILE>` for such platforms. :variable:`toolchain file <CMAKE_TOOLCHAIN_FILE>` for such platforms.

View File

@@ -2832,10 +2832,8 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
} }
if (this->MSTools) { if (this->MSTools) {
// If we have the VS_WINRT_COMPONENT or CMAKE_VS_WINRT_BY_DEFAULT // If we have the VS_WINRT_COMPONENT set then force Compile as WinRT
// set then force Compile as WinRT. if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT")) {
if (this->GeneratorTarget->GetPropertyAsBool("VS_WINRT_COMPONENT") ||
this->Makefile->IsOn("CMAKE_VS_WINRT_BY_DEFAULT")) {
clOptions.AddFlag("CompileAsWinRT", "true"); clOptions.AddFlag("CompileAsWinRT", "true");
// For WinRT components, add the _WINRT_DLL define to produce a lib // For WinRT components, add the _WINRT_DLL define to produce a lib
if (this->GeneratorTarget->GetType() == cmStateEnums::SHARED_LIBRARY || if (this->GeneratorTarget->GetType() == cmStateEnums::SHARED_LIBRARY ||
@@ -2843,7 +2841,8 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
clOptions.AddDefine("_WINRT_DLL"); clOptions.AddDefine("_WINRT_DLL");
} }
} else if (this->GlobalGenerator->TargetsWindowsStore() || } else if (this->GlobalGenerator->TargetsWindowsStore() ||
this->GlobalGenerator->TargetsWindowsPhone()) { this->GlobalGenerator->TargetsWindowsPhone() ||
this->Makefile->IsOn("CMAKE_VS_WINRT_BY_DEFAULT")) {
if (!clOptions.IsWinRt()) { if (!clOptions.IsWinRt()) {
clOptions.AddFlag("CompileAsWinRT", "false"); clOptions.AddFlag("CompileAsWinRT", "false");
} }

View File

@@ -57,9 +57,9 @@ macro(checkCompileAsWinRT projectPath)
endif() endif()
endmacro() endmacro()
checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagOnlyC.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c) checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagOnlyC.vcxproj" GLOBAL false)
checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagMixedCAndCxx.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c) checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagMixedCAndCxx.vcxproj" GLOBAL false)
checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagOnlyCxx.vcxproj" GLOBAL true) checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/noFlagOnlyCxx.vcxproj" GLOBAL false)
checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/flagOnlyC.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c) checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/flagOnlyC.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c)
checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/flagMixedCAndCxx.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c) checkCompileAsWinRT("${RunCMake_TEST_BINARY_DIR}/flagMixedCAndCxx.vcxproj" GLOBAL true OVERRIDES_DISABLE empty.c)