Ver Fonte

VS: Add support for generator expressions to VS_CONFIGURATION_TYPE

Generator expressions in target property VS_CONFIGURATION_TYPE might be used to
set the ConfigurationType to Utility for certain configurations to not build
the target while still linking to the target in other configurations.

Fixes: #19613
Daniel Eiband há 6 anos atrás
pai
commit
8909a450a6

+ 2 - 0
Help/prop_tgt/VS_CONFIGURATION_TYPE.rst

@@ -4,6 +4,8 @@ VS_CONFIGURATION_TYPE
 Visual Studio project configuration type.
 
 Sets the ``ConfigurationType`` attribute for a generated Visual Studio project.
+The property value may use
+:manual:`generator expressions <cmake-generator-expressions(7)>`.
 If this property is set, it overrides the default setting that is based on the
 target type (e.g. ``StaticLibrary``, ``Application``, ...).
 

+ 5 - 0
Help/release/dev/vs-configuration-type-genex.rst

@@ -0,0 +1,5 @@
+vs-configuration-type-genex
+---------------------------
+
+* :prop_tgt:`VS_CONFIGURATION_TYPE` now supports
+  :manual:`generator expressions <cmake-generator-expressions(7)>`.

+ 4 - 1
Source/cmVisualStudio10TargetGenerator.cxx

@@ -1115,7 +1115,10 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues(Elem& e0)
       std::string configType;
       if (const char* vsConfigurationType =
             this->GeneratorTarget->GetProperty("VS_CONFIGURATION_TYPE")) {
-        configType = vsConfigurationType;
+        cmGeneratorExpression ge;
+        std::unique_ptr<cmCompiledGeneratorExpression> cge =
+          ge.Parse(vsConfigurationType);
+        configType = cge->Evaluate(this->LocalGenerator, c);
       } else {
         switch (this->GeneratorTarget->GetType()) {
           case cmStateEnums::SHARED_LIBRARY:

+ 1 - 1
Tests/RunCMake/VS10Project/VsConfigurationType-check.cmake

@@ -9,7 +9,7 @@ file(STRINGS "${vcProjectFile}" lines)
 foreach(line IN LISTS lines)
   if(line MATCHES "^ *<ConfigurationType>(.*)</ConfigurationType>$")
     set(propertyFound TRUE)
-    set(expectedValue "MyValue")
+    set(expectedValue "MyValue foo")
     set(actualValue ${CMAKE_MATCH_1})
     if(NOT (${actualValue} STREQUAL ${expectedValue}))
       set(RunCMake_TEST_FAILED "ConfigurationType \"${actualValue}\" differs from expected value \"${expectedValue}\".")

+ 1 - 1
Tests/RunCMake/VS10Project/VsConfigurationType.cmake

@@ -1,3 +1,3 @@
 enable_language(CXX)
 add_library(foo foo.cpp)
-set_target_properties(foo PROPERTIES VS_CONFIGURATION_TYPE "MyValue")
+set_target_properties(foo PROPERTIES VS_CONFIGURATION_TYPE "MyValue $<TARGET_PROPERTY:foo,NAME>")