VS: Do not compile C sources as WinRT (#15100)

The MSVC /ZW flag is valid only for C++ sources.  Whenever we enable
CompileAsWinRT for the whole target, disable it for all C sources.
Update the documentation of VS_WINRT_COMPONENT to drop the statement
about undefined behavior for non-C++ sources, because it is now
defined as expected.
This commit is contained in:
Brad King 2014-08-22 09:27:00 -04:00
parent b8e405387e
commit dd11ae8f0f
3 changed files with 15 additions and 4 deletions

View File

@ -7,8 +7,5 @@ For ``SHARED`` and ``MODULE`` libraries, this also defines the
``_WINRT_DLL`` preprocessor macro. ``_WINRT_DLL`` preprocessor macro.
.. note:: .. note::
Behavior is not defined for targets with source files that compile as
any language other than ``CXX``.
Currently this is implemented only by Visual Studio generators. Currently this is implemented only by Visual Studio generators.
Support may be added to other generators in the future. Support may be added to other generators in the future.

View File

@ -159,6 +159,7 @@ cmVisualStudio10TargetGenerator(cmTarget* target,
this->GUID = this->GlobalGenerator->GetGUID(this->Name.c_str()); this->GUID = this->GlobalGenerator->GetGUID(this->Name.c_str());
this->Platform = gg->GetPlatformName(); this->Platform = gg->GetPlatformName();
this->MSTools = true; this->MSTools = true;
this->TargetCompileAsWinRT = false;
this->BuildFileStream = 0; this->BuildFileStream = 0;
this->IsMissingFiles = false; this->IsMissingFiles = false;
this->DefaultArtifactDir = this->DefaultArtifactDir =
@ -1414,6 +1415,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
compileAs = "CompileAsC"; compileAs = "CompileAsC";
} }
} }
bool noWinRT = this->TargetCompileAsWinRT && lang == "C";
bool hasFlags = false; bool hasFlags = false;
// for the first time we need a new line if there is something // for the first time we need a new line if there is something
// produced here. // produced here.
@ -1447,7 +1449,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
} }
// if we have flags or defines for this config then // if we have flags or defines for this config then
// use them // use them
if(!flags.empty() || !configDefines.empty() || compileAs) if(!flags.empty() || !configDefines.empty() || compileAs || noWinRT)
{ {
(*this->BuildFileStream ) << firstString; (*this->BuildFileStream ) << firstString;
firstString = ""; // only do firstString once firstString = ""; // only do firstString once
@ -1460,6 +1462,10 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
{ {
clOptions.AddFlag("CompileAs", compileAs); clOptions.AddFlag("CompileAs", compileAs);
} }
if(noWinRT)
{
clOptions.AddFlag("CompileAsWinRT", "false");
}
clOptions.Parse(flags.c_str()); clOptions.Parse(flags.c_str());
clOptions.AddDefines(configDefines.c_str()); clOptions.AddDefines(configDefines.c_str());
clOptions.SetConfiguration((*config).c_str()); clOptions.SetConfiguration((*config).c_str());
@ -1711,6 +1717,13 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
clOptions.AddFlag("CompileAsWinRT", "false"); clOptions.AddFlag("CompileAsWinRT", "false");
} }
} }
if(const char* winRT = clOptions.GetFlag("CompileAsWinRT"))
{
if(cmSystemTools::IsOn(winRT))
{
this->TargetCompileAsWinRT = true;
}
}
} }
this->ClOptions[configName] = pOptions.release(); this->ClOptions[configName] = pOptions.release();

View File

@ -134,6 +134,7 @@ private:
std::string GUID; std::string GUID;
std::string Name; std::string Name;
bool MSTools; bool MSTools;
bool TargetCompileAsWinRT;
cmGlobalVisualStudio10Generator* GlobalGenerator; cmGlobalVisualStudio10Generator* GlobalGenerator;
cmGeneratedFileStream* BuildFileStream; cmGeneratedFileStream* BuildFileStream;
cmLocalVisualStudio7Generator* LocalGenerator; cmLocalVisualStudio7Generator* LocalGenerator;