From 6c9712c47b99cb5e955f2a72b4093558768a7cc1 Mon Sep 17 00:00:00 2001 From: Jonas Andersen Date: Fri, 28 Jun 2013 09:04:01 +0200 Subject: 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 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. --- Source/cmVisualStudio10TargetGenerator.cxx | 53 +++++++++++++++++++++++++----- Source/cmVisualStudio10TargetGenerator.h | 1 + Tests/VSWindowsFormsResx/CMakeLists.txt | 1 + 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index d0ab976..ae92f88 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -300,7 +300,7 @@ void cmVisualStudio10TargetGenerator::Generate() this->WriteCustomCommands(); this->WriteAllSources(); this->WriteDotNetReferences(); - + this->WriteEmbeddedResourceGroup(); this->WriteWinRTReferences(); this->WriteProjectReferences(); this->WriteString( @@ -339,6 +339,47 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferences() } } +void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup() +{ + std::vector const& resxObjs = + this->GeneratorTarget->ResxSources; + if(!resxObjs.empty()) + { + this->WriteString("\n", 1); + for(std::vector::const_iterator oi = resxObjs.begin(); + oi != resxObjs.end(); ++oi) + { + std::string obj = (*oi)->GetFullPath(); + this->WriteString("ConvertToWindowsSlash(obj); + (*this->BuildFileStream ) << obj << "\">\n"; + + this->WriteString("", 3); + std::string hFileName = obj.substr(0, obj.find_last_of(".")) + ".h"; + (*this->BuildFileStream ) << hFileName; + this->WriteString("\n", 3); + + std::vector const * configs = + this->GlobalGenerator->GetConfigurations(); + for(std::vector::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 ) << "\n"; + } + + this->WriteString("\n", 2); + } + this->WriteString("\n", 1); + } +} + void cmVisualStudio10TargetGenerator::WriteWinRTReferences() { std::vector references; @@ -466,11 +507,6 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues() "\n", 2); } - if(!this->GeneratorTarget->ResxSources.empty()) - { - this->WriteString("true\n", 2); - } - this->WriteString("\n", 1); } } @@ -663,11 +699,12 @@ void cmVisualStudio10TargetGenerator::WriteGroups() this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups); } - std::vector resxObjs = this->GeneratorTarget->ResxSources; + std::vector const& resxObjs = + this->GeneratorTarget->ResxSources; if(!resxObjs.empty()) { this->WriteString("\n", 1); - for(std::vector::iterator oi = resxObjs.begin(); + for(std::vector::const_iterator oi = resxObjs.begin(); oi != resxObjs.end(); ++oi) { std::string obj = (*oi)->GetFullPath(); diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 73d5961..9a480a8 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -59,6 +59,7 @@ private: void WriteSources(const char* tool, std::vector const&); void WriteAllSources(); void WriteDotNetReferences(); + void WriteEmbeddedResourceGroup(); void WriteWinRTReferences(); void WritePathAndIncrementalLinkOptions(); void WriteItemDefinitionGroups(); diff --git a/Tests/VSWindowsFormsResx/CMakeLists.txt b/Tests/VSWindowsFormsResx/CMakeLists.txt index a313ac2..4373810 100644 --- a/Tests/VSWindowsFormsResx/CMakeLists.txt +++ b/Tests/VSWindowsFormsResx/CMakeLists.txt @@ -25,6 +25,7 @@ set(TARGET_SRC WindowsFormsResx/MyForm.cpp WindowsFormsResx/Source.cpp ) +set_source_files_properties(${TARGET_SRC} PROPERTIES COMPILE_FLAGS "/clr") set(TARGET_RESX WindowsFormsResx/MyForm.resx -- cgit v0.12