Browse Source

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.
Jonas Andersen 12 years ago
parent
commit
6c9712c47b

+ 45 - 8
Source/cmVisualStudio10TargetGenerator.cxx

@@ -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();

+ 1 - 0
Source/cmVisualStudio10TargetGenerator.h

@@ -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();

+ 1 - 0
Tests/VSWindowsFormsResx/CMakeLists.txt

@@ -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