Browse Source

Add generator expressions for VS_SHADER_ source file properties.

Jeremiah van Oosten 7 years ago
parent
commit
83ed65cdde

+ 8 - 0
Help/release/dev/vs-shader-generator-expressions.rst

@@ -0,0 +1,8 @@
+vs-shader-generator-expressions
+-------------------------------
+
+* Added support for generator expressions for the following source file
+  properties:
+
+  - :prop_sf:`VS_SHADER_DISABLE_OPTIMIZATIONS`
+  - :prop_sf:`VS_SHADER_ENABLE_DEBUG`

+ 33 - 6
Source/cmVisualStudio10TargetGenerator.cxx

@@ -1696,12 +1696,12 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(cmSourceFile const* sf)
     }
     // Figure out if debug information should be generated
     if (const char* sed = sf->GetProperty("VS_SHADER_ENABLE_DEBUG")) {
-      shaderEnableDebug = cmSystemTools::IsOn(sed) ? "true" : "false";
+      shaderEnableDebug = sed;
       toolHasSettings = true;
     }
     // Figure out if optimizations should be disabled
     if (const char* sdo = sf->GetProperty("VS_SHADER_DISABLE_OPTIMIZATIONS")) {
-      shaderDisableOptimizations = cmSystemTools::IsOn(sdo) ? "true" : "false";
+      shaderDisableOptimizations = sdo;
       toolHasSettings = true;
     }
     if (const char* sofn = sf->GetProperty("VS_SHADER_OBJECT_FILE_NAME")) {
@@ -1843,12 +1843,39 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(cmSourceFile const* sf)
       }
     }
     if (!shaderEnableDebug.empty()) {
-      this->WriteElemEscapeXML("EnableDebuggingInformation", shaderEnableDebug,
-                               3);
+      cmGeneratorExpression ge;
+      std::unique_ptr<cmCompiledGeneratorExpression> cge =
+        ge.Parse(shaderEnableDebug);
+
+      for (size_t i = 0; i != this->Configurations.size(); ++i) {
+        const char* enableDebug =
+          cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
+        if (strlen(enableDebug) > 0) {
+          Elem el(*this->BuildFileStream, 3);
+          el.StartElement("EnableDebuggingInformation");
+          el.Attribute("Condition", "'$(Configuration)|$(Platform)'=='" +
+                         this->Configurations[i] + "|" + this->Platform + "'");
+          el.Content(cmSystemTools::IsOn(enableDebug) ? "true" : "false");
+        }
+      }
     }
     if (!shaderDisableOptimizations.empty()) {
-      this->WriteElemEscapeXML("DisableOptimizations",
-                               shaderDisableOptimizations, 3);
+      cmGeneratorExpression ge;
+      std::unique_ptr<cmCompiledGeneratorExpression> cge =
+        ge.Parse(shaderDisableOptimizations);
+
+      for (size_t i = 0; i != this->Configurations.size(); ++i) {
+        const char* disableOptimizations =
+          cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
+        if (strlen(disableOptimizations) > 0) {
+          Elem el(*this->BuildFileStream, 3);
+          el.StartElement("DisableOptimizations");
+          el.Attribute("Condition", "'$(Configuration)|$(Platform)'=='" +
+                         this->Configurations[i] + "|" + this->Platform + "'");
+          el.Content(cmSystemTools::IsOn(disableOptimizations) ? "true"
+                                                               : "false");
+        }
+      }
     }
     if (!shaderObjectFileName.empty()) {
       this->WriteElemEscapeXML("ObjectFileOutput", shaderObjectFileName, 3);