VS: Add Resx configuration to the vcxproj file

In my project group we are using CMake to generate c++/cli winform
projects and I noticed the work done in commit 79ec7868 (VS: Add Windows
Forms Support, 2013-04-29) was in the right direction for solving some
of the problems we were facing.

The changes as submitted was breaking some functionality in our
projects, so I made some changes that fixes our problems and I believe
that it will also work for others.

* Resx files did not link correctly with the winform h-file so I added
  the Resx configuration to the vcxproj file.

* I removed the functionality for setting <CLRSupport> true for the
  project based on if an resx-file is pressent.  This is preventing
  us from using native cpp code.  Also this do not address that some
  projects will need to set other options like clr:pure, clr:safe.
  This could be implemented as a cmake option, so it is possible to
  specify exactly what is needed.  Existing VSWindowsFormsResx Test
  project is updated so it will be working with my changes.
This commit is contained in:
Jonas Andersen 2013-06-28 09:04:01 +02:00 committed by Brad King
parent 90441b289d
commit 6c9712c47b
3 changed files with 47 additions and 8 deletions

View File

@ -300,7 +300,7 @@ void cmVisualStudio10TargetGenerator::Generate()
this->WriteCustomCommands(); this->WriteCustomCommands();
this->WriteAllSources(); this->WriteAllSources();
this->WriteDotNetReferences(); this->WriteDotNetReferences();
this->WriteEmbeddedResourceGroup();
this->WriteWinRTReferences(); this->WriteWinRTReferences();
this->WriteProjectReferences(); this->WriteProjectReferences();
this->WriteString( this->WriteString(
@ -339,6 +339,47 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferences()
} }
} }
void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup()
{
std::vector<cmSourceFile*> const& resxObjs =
this->GeneratorTarget->ResxSources;
if(!resxObjs.empty())
{
this->WriteString("<ItemGroup>\n", 1);
for(std::vector<cmSourceFile*>::const_iterator oi = resxObjs.begin();
oi != resxObjs.end(); ++oi)
{
std::string obj = (*oi)->GetFullPath();
this->WriteString("<EmbeddedResource Include=\"", 2);
this->ConvertToWindowsSlash(obj);
(*this->BuildFileStream ) << obj << "\">\n";
this->WriteString("<DependentUpon>", 3);
std::string hFileName = obj.substr(0, obj.find_last_of(".")) + ".h";
(*this->BuildFileStream ) << hFileName;
this->WriteString("</DependentUpon>\n", 3);
std::vector<std::string> const * configs =
this->GlobalGenerator->GetConfigurations();
for(std::vector<std::string>::const_iterator i = configs->begin();
i != configs->end(); ++i)
{
this->WritePlatformConfigTag("LogicalName", i->c_str(), 3);
if(this->Target->GetProperty("VS_GLOBAL_ROOTNAMESPACE"))
{
(*this->BuildFileStream ) << "$(RootNamespace).";
}
(*this->BuildFileStream ) << "%(Filename)";
(*this->BuildFileStream ) << ".resources";
(*this->BuildFileStream ) << "</LogicalName>\n";
}
this->WriteString("</EmbeddedResource>\n", 2);
}
this->WriteString("</ItemGroup>\n", 1);
}
}
void cmVisualStudio10TargetGenerator::WriteWinRTReferences() void cmVisualStudio10TargetGenerator::WriteWinRTReferences()
{ {
std::vector<std::string> references; std::vector<std::string> references;
@ -466,11 +507,6 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
"</WindowsAppContainer>\n", 2); "</WindowsAppContainer>\n", 2);
} }
if(!this->GeneratorTarget->ResxSources.empty())
{
this->WriteString("<CLRSupport>true</CLRSupport>\n", 2);
}
this->WriteString("</PropertyGroup>\n", 1); this->WriteString("</PropertyGroup>\n", 1);
} }
} }
@ -663,11 +699,12 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups); this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups);
} }
std::vector<cmSourceFile*> resxObjs = this->GeneratorTarget->ResxSources; std::vector<cmSourceFile*> const& resxObjs =
this->GeneratorTarget->ResxSources;
if(!resxObjs.empty()) if(!resxObjs.empty())
{ {
this->WriteString("<ItemGroup>\n", 1); this->WriteString("<ItemGroup>\n", 1);
for(std::vector<cmSourceFile*>::iterator oi = resxObjs.begin(); for(std::vector<cmSourceFile*>::const_iterator oi = resxObjs.begin();
oi != resxObjs.end(); ++oi) oi != resxObjs.end(); ++oi)
{ {
std::string obj = (*oi)->GetFullPath(); std::string obj = (*oi)->GetFullPath();

View File

@ -59,6 +59,7 @@ private:
void WriteSources(const char* tool, std::vector<cmSourceFile*> const&); void WriteSources(const char* tool, std::vector<cmSourceFile*> const&);
void WriteAllSources(); void WriteAllSources();
void WriteDotNetReferences(); void WriteDotNetReferences();
void WriteEmbeddedResourceGroup();
void WriteWinRTReferences(); void WriteWinRTReferences();
void WritePathAndIncrementalLinkOptions(); void WritePathAndIncrementalLinkOptions();
void WriteItemDefinitionGroups(); void WriteItemDefinitionGroups();

View File

@ -25,6 +25,7 @@ set(TARGET_SRC
WindowsFormsResx/MyForm.cpp WindowsFormsResx/MyForm.cpp
WindowsFormsResx/Source.cpp WindowsFormsResx/Source.cpp
) )
set_source_files_properties(${TARGET_SRC} PROPERTIES COMPILE_FLAGS "/clr")
set(TARGET_RESX set(TARGET_RESX
WindowsFormsResx/MyForm.resx WindowsFormsResx/MyForm.resx