[Cmake-commits] CMake branch, next, updated. v2.8.11-1955-g4527d76

Brad King brad.king at kitware.com
Wed May 15 17:12:29 EDT 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  4527d76a7f0ab32810e6cf0ff0143d37a8044804 (commit)
       via  7189e82f0036b74ae58e7bc56667316d210e323a (commit)
      from  06f8701788cffce1d8abc5013a8b7483e2c2367f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4527d76a7f0ab32810e6cf0ff0143d37a8044804
commit 4527d76a7f0ab32810e6cf0ff0143d37a8044804
Merge: 06f8701 7189e82
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Wed May 15 17:12:26 2013 -0400
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Wed May 15 17:12:26 2013 -0400

    Merge topic 'vs-windows-forms' into next
    
    7189e82 VS: Add Windows Forms Support


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7189e82f0036b74ae58e7bc56667316d210e323a
commit 7189e82f0036b74ae58e7bc56667316d210e323a
Author:     John Farrier <john.farrier at digitalinblue.com>
AuthorDate: Mon Apr 29 10:48:22 2013 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed May 15 17:10:38 2013 -0400

    VS: Add Windows Forms Support
    
    Add support to maintain designer functionality for Visual Studio C++
    Windows Forms projects.  Also add a test project showing how to use
    the CMakeLists.txt file and, when successfully configured, will allow
    use of the designer for the included form.

diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 335ba0f..f5d1560 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -98,6 +98,18 @@ void cmGeneratorTarget::ClassifySources()
       this->IDLSources.push_back(sf);
       if(isObjLib) { badObjLib.push_back(sf); }
       }
+    else if(ext == "resx")
+      {
+      // Build and save the name of the corresponding .h file
+      // This relationship will be used later when building the project files.
+      // Both names would have been auto generated from Visual Studio
+      // where the user supplied the file name and Visual Studio
+      // appended the suffix.
+      std::string resx = sf->GetFullPath();
+      std::string hFileName = resx.substr(0, resx.find_last_of(".")) + ".h";
+      this->ExpectedResxHeaders.insert(hFileName);
+      this->ResxSources.push_back(sf);
+      }
     else if(header.find(sf->GetFullPath().c_str()))
       {
       this->HeaderSources.push_back(sf);
diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h
index cbcd8a5..5f7019d 100644
--- a/Source/cmGeneratorTarget.h
+++ b/Source/cmGeneratorTarget.h
@@ -44,11 +44,15 @@ public:
   std::vector<cmSourceFile*> ObjectSources;
   std::vector<cmSourceFile*> ExternalObjects;
   std::vector<cmSourceFile*> IDLSources;
+  std::vector<cmSourceFile*> ResxSources;
+
   std::string ModuleDefinitionFile;
 
   std::map<cmSourceFile const*, std::string> Objects;
   std::set<cmSourceFile const*> ExplicitObjectName;
 
+  std::set<std::string> ExpectedResxHeaders;
+
   /** Full path with trailing slash to the top-level directory
       holding object files for this target.  Includes the build
       time config name placeholder if needed for the generator.  */
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 1cb9f23..933bf95 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -291,6 +291,7 @@ void cmVisualStudio10TargetGenerator::Generate()
   this->WriteCustomCommands();
   this->WriteAllSources();
   this->WriteDotNetReferences();
+
   this->WriteWinRTReferences();
   this->WriteProjectReferences();
   this->WriteString(
@@ -455,6 +456,12 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
       this->WriteString("<WindowsAppContainer>true"
                         "</WindowsAppContainer>\n", 2);
       }
+
+    if(!this->GeneratorTarget->ResxSources.empty())
+      {
+      this->WriteString("<CLRSupport>true</CLRSupport>\n", 2);
+      }
+
     this->WriteString("</PropertyGroup>\n", 1);
     }
 }
@@ -647,6 +654,23 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
     this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups);
     }
 
+  std::vector<cmSourceFile*> resxObjs = this->GeneratorTarget->ResxSources;
+  if(!resxObjs.empty())
+    {
+    this->WriteString("<ItemGroup>\n", 1);
+    for(std::vector<cmSourceFile*>::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("<Filter>Resource Files</Filter>\n", 3);
+      this->WriteString("</EmbeddedResource>\n", 2);
+      }
+    this->WriteString("</ItemGroup>\n", 1);
+    }
+
   // Add object library contents as external objects.
   std::vector<std::string> objs;
   this->GeneratorTarget->UseObjectLibraries(objs);
@@ -701,6 +725,23 @@ void cmVisualStudio10TargetGenerator::WriteGroups()
                              << "</UniqueIdentifier>\n";
     this->WriteString("</Filter>\n", 2);
     }
+
+  if(!this->GeneratorTarget->ResxSources.empty())
+    {
+    this->WriteString("<Filter Include=\"Resource Files\">\n", 2);
+    std::string guidName = "SG_Filter_Resource Files";
+    this->GlobalGenerator->CreateGUID(guidName.c_str());
+    this->WriteString("<UniqueIdentifier>", 3);
+    std::string guid =
+      this->GlobalGenerator->GetGUID(guidName.c_str());
+    (*this->BuildFileStream) << "{" << guid << "}"
+                             << "</UniqueIdentifier>\n";
+    this->WriteString("<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;", 3);
+    (*this->BuildFileStream) << "gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;";
+    (*this->BuildFileStream) << "mfcribbon-ms</Extensions>\n";
+    this->WriteString("</Filter>\n", 2);
+  }
+
   this->WriteString("</ItemGroup>\n", 1);
   this->WriteString("</Project>\n", 0);
   // restore stream pointer
@@ -832,8 +873,20 @@ void cmVisualStudio10TargetGenerator::WriteSource(
     }
   this->ConvertToWindowsSlash(sourceFile);
   this->WriteString("<", 2);
-  (*this->BuildFileStream ) << tool <<
-    " Include=\"" << sourceFile << "\"" << (end? end : " />\n");
+  (*this->BuildFileStream ) << tool << " Include=\"" << sourceFile << "\"";
+
+  if(sf->GetExtension() == "h" &&
+    this->IsResxHeader(sf->GetFullPath()))
+    {
+      (*this->BuildFileStream ) << ">\n";
+      this->WriteString("<FileType>CppForm</FileType>\n", 3);
+      this->WriteString("</ClInclude>\n", 2);
+    }
+  else
+    {
+      (*this->BuildFileStream ) << (end? end : " />\n");
+    }
+
   ToolSource toolSource = {sf, forceRelative};
   this->Tools[tool].push_back(toolSource);
 }
@@ -1718,3 +1771,12 @@ void cmVisualStudio10TargetGenerator::WriteProjectReferences()
     }
   this->WriteString("</ItemGroup>\n", 1);
 }
+
+bool cmVisualStudio10TargetGenerator::
+  IsResxHeader(const std::string& headerFile)
+{
+  std::set<std::string>::iterator it =
+      this->GeneratorTarget->ExpectedResxHeaders.find(headerFile);
+
+  return it != this->GeneratorTarget->ExpectedResxHeaders.end();
+}
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index 55a850a..73d5961 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -62,6 +62,7 @@ private:
   void WriteWinRTReferences();
   void WritePathAndIncrementalLinkOptions();
   void WriteItemDefinitionGroups();
+
   bool ComputeClOptions();
   bool ComputeClOptions(std::string const& configName);
   void WriteClOptions(std::string const& config,
@@ -91,7 +92,7 @@ private:
                          std::vector<cmSourceGroup>& );
   void AddMissingSourceGroups(std::set<cmSourceGroup*>& groupsUsed,
                               const std::vector<cmSourceGroup>& allGroups);
-
+  bool IsResxHeader(const std::string& headerFile);
 
 private:
   typedef cmVisualStudioGeneratorOptions Options;
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index e07bb69..434daf1 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -1448,6 +1448,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
       ADD_TEST_MACRO(SBCS SBCS)
     endif()
 
+    if(NOT "${CMAKE_TEST_GENERATOR}" MATCHES "Visual Studio [6789]( |$)")
+      ADD_TEST_MACRO(VSWindowsFormsResx VSWindowsFormsResx)
+    endif()
+
     add_test(VSExternalInclude ${CMAKE_CTEST_COMMAND}
       --build-and-test
       "${CMake_SOURCE_DIR}/Tests/VSExternalInclude"
diff --git a/Tests/VSWindowsFormsResx/CMakeLists.txt b/Tests/VSWindowsFormsResx/CMakeLists.txt
new file mode 100644
index 0000000..a313ac2
--- /dev/null
+++ b/Tests/VSWindowsFormsResx/CMakeLists.txt
@@ -0,0 +1,44 @@
+#
+# Example CMakeLists.txt file to demonstrate how to make a designable Windows Forms project with CMake.
+#
+# Code modifications and example by John Farrier, john.farrier at helleboreconsulting.com
+#
+
+cmake_minimum_required(VERSION 2.8.10)
+
+# Project Name
+project(VSWindowsFormsResx CXX)
+
+include(CheckFunctionExists)
+include(CheckCXXSourceCompiles)
+include(CheckIncludeFile)
+
+# Note: The designable form is assumed to have a .h extension as is default in Visual Studio.
+# Node: The designable form is assumed to have a .resx file with the same name and path (save extension) as is default in Visual Studio
+
+set(TARGET_H
+  WindowsFormsResx/MyForm.h
+  WindowsFormsResx/Header.h
+  )
+
+set(TARGET_SRC
+  WindowsFormsResx/MyForm.cpp
+  WindowsFormsResx/Source.cpp
+  )
+
+set(TARGET_RESX
+  WindowsFormsResx/MyForm.resx
+  )
+
+set(TARGET_LIBRARIES ${SYSLIBS})
+add_executable(${PROJECT_NAME} ${TARGET_SRC} ${TARGET_H} ${TARGET_RESX})
+
+# Note: The property VS_GLOBAL_KEYWORD must be set.
+set_property(TARGET ${PROJECT_NAME} PROPERTY VS_GLOBAL_KEYWORD "ManagedCProj")
+
+# Note: The property VS_DOTNET_REFERENCES must be set.
+set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCES "System" "System.Data" "System.Drawing" "System.Windows.Forms" "System.Xml")
+
+# Note: Modification of compiler flags is required for CLR compatibility now that we are using .resx files.
+string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/Header.h b/Tests/VSWindowsFormsResx/WindowsFormsResx/Header.h
new file mode 100644
index 0000000..e69de29
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
new file mode 100644
index 0000000..154e268
--- /dev/null
+++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
@@ -0,0 +1 @@
+#include "MyForm.h"
\ No newline at end of file
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h
new file mode 100644
index 0000000..16222c5
--- /dev/null
+++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h
@@ -0,0 +1,78 @@
+#pragma once
+
+namespace Farrier {
+
+  using namespace System;
+  using namespace System::ComponentModel;
+  using namespace System::Collections;
+  using namespace System::Windows::Forms;
+  using namespace System::Data;
+  using namespace System::Drawing;
+
+  /// <summary>
+  /// Summary for MyForm
+  /// </summary>
+  public ref class MyForm : public System::Windows::Forms::Form
+  {
+  public:
+    MyForm(void)
+    {
+      InitializeComponent();
+      //
+      //TODO: Add the constructor code here
+      //
+    }
+
+  protected:
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    ~MyForm()
+    {
+      if (components)
+      {
+        delete components;
+      }
+    }
+  private: System::Windows::Forms::Button^  button1;
+  protected:
+
+  private:
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    System::ComponentModel::Container ^components;
+
+#pragma region Windows Form Designer generated code
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    void InitializeComponent(void)
+    {
+      this->button1 = (gcnew System::Windows::Forms::Button());
+      this->SuspendLayout();
+      //
+      // button1
+      //
+      this->button1->Location = System::Drawing::Point(13, 13);
+      this->button1->Name = L"button1";
+      this->button1->Size = System::Drawing::Size(75, 23);
+      this->button1->TabIndex = 0;
+      this->button1->Text = L"button1";
+      this->button1->UseVisualStyleBackColor = true;
+      //
+      // MyForm
+      //
+      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
+      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
+      this->ClientSize = System::Drawing::Size(284, 261);
+      this->Controls->Add(this->button1);
+      this->Name = L"MyForm";
+      this->Text = L"MyForm";
+      this->ResumeLayout(false);
+
+    }
+#pragma endregion
+  };
+}
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.resx b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.resx
new file mode 100644
index 0000000..e8ae276
--- /dev/null
+++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.resx
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Tests/VSWindowsFormsResx/WindowsFormsResx/Source.cpp b/Tests/VSWindowsFormsResx/WindowsFormsResx/Source.cpp
new file mode 100644
index 0000000..aee9e2e
--- /dev/null
+++ b/Tests/VSWindowsFormsResx/WindowsFormsResx/Source.cpp
@@ -0,0 +1,4 @@
+int main(int argc, char **argv)
+{
+  return 0;
+}

-----------------------------------------------------------------------

Summary of changes:
 Source/cmGeneratorTarget.cxx                       |   12 +++
 Source/cmGeneratorTarget.h                         |    4 +
 Source/cmVisualStudio10TargetGenerator.cxx         |   66 ++++++++++++++++-
 Source/cmVisualStudio10TargetGenerator.h           |    3 +-
 Tests/CMakeLists.txt                               |    4 +
 Tests/VSWindowsFormsResx/CMakeLists.txt            |   44 +++++++++++
 .../VSWindowsFormsResx/WindowsFormsResx/Header.h   |    0
 .../VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp |    1 +
 Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h |   78 ++++++++++++++++++++
 .../WindowsFormsResx/MyForm.resx                   |   61 +++++++++++++++
 .../WindowsFormsResx/Source.cpp}                   |    1 -
 11 files changed, 270 insertions(+), 4 deletions(-)
 create mode 100644 Tests/VSWindowsFormsResx/CMakeLists.txt
 copy Modules/IntelVSImplicitPath/hello.f => Tests/VSWindowsFormsResx/WindowsFormsResx/Header.h (100%)
 create mode 100644 Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.cpp
 create mode 100644 Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.h
 create mode 100644 Tests/VSWindowsFormsResx/WindowsFormsResx/MyForm.resx
 copy Tests/{RunCMake/CompatibleInterface/main.cpp => VSWindowsFormsResx/WindowsFormsResx/Source.cpp} (97%)


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list