[cmake-developers] [PATCH] Add target property VS_CONFIGURATION_TYPE to Visual Studio 10 target generator

Fabian Otto fabian at fabianotto.de
Thu Feb 25 16:19:43 EST 2016


Hi Brad,

I'm sorry. I recreated a single patch that contains all changes. 
Hopefully it works this time. If not, please let me know.

Best regards,
Fabian
-------------- next part --------------
From 25c58561d2ddbf061705ef6a3a09e2c66436c3eb Mon Sep 17 00:00:00 2001
From: Fabian Otto <fabian.otto at rohde-schwarz.com>
Date: Thu, 25 Feb 2016 22:04:05 +0100
Subject: [PATCH] Add VS_CONFIGURATION_TYPE target property

---
 Help/manual/cmake-properties.7.rst                 |  1 +
 Help/prop_tgt/VS_CONFIGURATION_TYPE.rst            | 10 +++
 Source/cmVisualStudio10TargetGenerator.cxx         | 79 ++++++++++++----------
 Tests/RunCMake/CMakeLists.txt                      |  5 ++
 Tests/RunCMake/VS10Project/CMakeLists.txt          |  3 +
 Tests/RunCMake/VS10Project/RunCMakeTest.cmake      |  2 +
 .../VS10Project/VsConfigurationType-check.cmake    | 24 +++++++
 .../RunCMake/VS10Project/VsConfigurationType.cmake |  3 +
 Tests/RunCMake/VS10Project/foo.cpp                 |  1 +
 9 files changed, 93 insertions(+), 35 deletions(-)
 create mode 100644 Help/prop_tgt/VS_CONFIGURATION_TYPE.rst
 create mode 100644 Tests/RunCMake/VS10Project/CMakeLists.txt
 create mode 100644 Tests/RunCMake/VS10Project/RunCMakeTest.cmake
 create mode 100644 Tests/RunCMake/VS10Project/VsConfigurationType-check.cmake
 create mode 100644 Tests/RunCMake/VS10Project/VsConfigurationType.cmake
 create mode 100644 Tests/RunCMake/VS10Project/foo.cpp

diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index a41d484..d6618fe 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -255,6 +255,7 @@ Properties on Targets
    /prop_tgt/TYPE
    /prop_tgt/VERSION
    /prop_tgt/VISIBILITY_INLINES_HIDDEN
+   /prop_tgt/VS_CONFIGURATION_TYPE
    /prop_tgt/VS_DESKTOP_EXTENSIONS_VERSION
    /prop_tgt/VS_DOTNET_REFERENCES
    /prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION
diff --git a/Help/prop_tgt/VS_CONFIGURATION_TYPE.rst b/Help/prop_tgt/VS_CONFIGURATION_TYPE.rst
new file mode 100644
index 0000000..78feb20
--- /dev/null
+++ b/Help/prop_tgt/VS_CONFIGURATION_TYPE.rst
@@ -0,0 +1,10 @@
+VS_CONFIGURATION_TYPE
+---------------------
+
+Visual Studio project configuration type.
+
+Sets the "ConfigurationType" attribute for a generated Visual Studio project.
+If this property is set, it overrides the default setting that is based on
+the target type (e.g. "StaticLibrary", "Application", ...).
+
+Supported on Visual Studio 2010 and higher.
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index a664442..69b4029 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -696,43 +696,52 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
                                  i->c_str(),
                                  1, " Label=\"Configuration\"", "\n");
     std::string configType = "<ConfigurationType>";
-    switch(this->GeneratorTarget->GetType())
-      {
-      case cmState::SHARED_LIBRARY:
-      case cmState::MODULE_LIBRARY:
-        configType += "DynamicLibrary";
-        break;
-      case cmState::OBJECT_LIBRARY:
-      case cmState::STATIC_LIBRARY:
-        configType += "StaticLibrary";
-        break;
-      case cmState::EXECUTABLE:
-        if(this->NsightTegra &&
-           !this->GeneratorTarget->GetPropertyAsBool("ANDROID_GUI"))
-          {
-          // Android executables are .so too.
+    const char* vsConfigurationType =
+      this->GeneratorTarget->GetProperty("VS_CONFIGURATION_TYPE");
+    if(vsConfigurationType)
+      {
+      configType += cmVS10EscapeXML(vsConfigurationType);
+      }
+    else
+      {
+      switch(this->GeneratorTarget->GetType())
+        {
+        case cmState::SHARED_LIBRARY:
+        case cmState::MODULE_LIBRARY:
           configType += "DynamicLibrary";
-          }
-        else
-          {
-          configType += "Application";
-          }
-        break;
-      case cmState::UTILITY:
-      case cmState::GLOBAL_TARGET:
-        if(this->NsightTegra)
-          {
-          // Tegra-Android platform does not understand "Utility".
+          break;
+        case cmState::OBJECT_LIBRARY:
+        case cmState::STATIC_LIBRARY:
           configType += "StaticLibrary";
-          }
-        else
-          {
-          configType += "Utility";
-          }
-        break;
-      case cmState::UNKNOWN_LIBRARY:
-      case cmState::INTERFACE_LIBRARY:
-        break;
+          break;
+        case cmState::EXECUTABLE:
+          if(this->NsightTegra &&
+             !this->GeneratorTarget->GetPropertyAsBool("ANDROID_GUI"))
+            {
+            // Android executables are .so too.
+            configType += "DynamicLibrary";
+            }
+          else
+            {
+            configType += "Application";
+            }
+          break;
+        case cmState::UTILITY:
+        case cmState::GLOBAL_TARGET:
+          if(this->NsightTegra)
+            {
+            // Tegra-Android platform does not understand "Utility".
+            configType += "StaticLibrary";
+            }
+          else
+            {
+            configType += "Utility";
+            }
+          break;
+        case cmState::UNKNOWN_LIBRARY:
+        case cmState::INTERFACE_LIBRARY:
+          break;
+        }
       }
     configType += "</ConfigurationType>\n";
     this->WriteString(configType.c_str(), 2);
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 0a388c5..81df69f 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -236,6 +236,11 @@ if("${CMAKE_GENERATOR}" MATCHES "Visual Studio [^6]")
   add_RunCMake_test(SolutionGlobalSections)
 endif()
 
+if(MSVC AND MSVC_VERSION GREATER 1500)
+  # Visual Studio 2010 or newer
+  add_RunCMake_test(VS10Project)
+endif()
+
 if(XCODE_VERSION AND NOT "${XCODE_VERSION}" VERSION_LESS 3)
   add_RunCMake_test(XcodeProject -DXCODE_VERSION=${XCODE_VERSION})
 endif()
diff --git a/Tests/RunCMake/VS10Project/CMakeLists.txt b/Tests/RunCMake/VS10Project/CMakeLists.txt
new file mode 100644
index 0000000..91baae7
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.5.0)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
new file mode 100644
index 0000000..cc2cc2e
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
@@ -0,0 +1,2 @@
+include(RunCMake)
+run_cmake(VsConfigurationType)
diff --git a/Tests/RunCMake/VS10Project/VsConfigurationType-check.cmake b/Tests/RunCMake/VS10Project/VsConfigurationType-check.cmake
new file mode 100644
index 0000000..4690970
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsConfigurationType-check.cmake
@@ -0,0 +1,24 @@
+set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
+if(NOT EXISTS "${vcProjectFile}")
+  set(RunCMake_TEST_FAILED "Project file ${vcProjectFile} does not exist.")
+  return()
+endif()
+
+set(propertyFound FALSE)
+file(STRINGS "${vcProjectFile}" lines)
+foreach(line IN LISTS lines)
+  if(line MATCHES "^ *<ConfigurationType>(.*)</ConfigurationType>$")
+    set(propertyFound TRUE)
+    set(expectedValue "MyValue")
+    set(actualValue ${CMAKE_MATCH_1})
+    if(NOT (${actualValue} STREQUAL ${expectedValue}))
+      set(RunCMake_TEST_FAILED "ConfigurationType \"${actualValue}\" differs from expected value \"${expectedValue}\".")
+      return()
+    endif()
+  endif()
+endforeach()
+
+if(NOT propertyFound)
+  set(RunCMake_TEST_FAILED "Property ConfigurationType not found in project file.")
+  return()
+endif()
diff --git a/Tests/RunCMake/VS10Project/VsConfigurationType.cmake b/Tests/RunCMake/VS10Project/VsConfigurationType.cmake
new file mode 100644
index 0000000..a73dfe8
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/VsConfigurationType.cmake
@@ -0,0 +1,3 @@
+enable_language(CXX)
+add_library(foo foo.cpp)
+set_target_properties(foo PROPERTIES VS_CONFIGURATION_TYPE "MyValue")
diff --git a/Tests/RunCMake/VS10Project/foo.cpp b/Tests/RunCMake/VS10Project/foo.cpp
new file mode 100644
index 0000000..2fb55ee
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/foo.cpp
@@ -0,0 +1 @@
+void foo() { }
-- 
2.7.2.windows.1



More information about the cmake-developers mailing list