Merge topic 'vs-non-built-file-item-metadata'

0723e04f7a VS: Add documentation for VS_SETTINGS and VS_SOURCE_SETTINGS_<tool>.
2ca1102f83 VS: Test VS_SETTINGS and VS_SOURCE_SETTINGS_<tool> properties.
f00e1b816d VS: Add VS_SOURCE_SETTINGS_<tool> target property
2ce42f281f VS: Add VS_SETTINGS source file property
53116d3942 VS: Use unordered_map to write HLSL settings.

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4498
This commit is contained in:
Brad King
2020-03-30 17:27:23 +00:00
committed by Kitware Robot
15 changed files with 327 additions and 94 deletions
+146 -93
View File
@@ -1745,20 +1745,65 @@ void cmVisualStudio10TargetGenerator::WriteHeaderSource(Elem& e1,
}
}
void cmVisualStudio10TargetGenerator::ParseSettingsProperty(
const char* settingsPropertyValue, ConfigToSettings& toolSettings)
{
if (settingsPropertyValue) {
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge =
ge.Parse(settingsPropertyValue);
for (const std::string& config : this->Configurations) {
std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
std::vector<std::string> settings = cmExpandedList(evaluated);
for (const std::string& setting : settings) {
const std::string::size_type assignment = setting.find('=');
if (assignment != std::string::npos) {
const std::string propName = setting.substr(0, assignment);
const std::string propValue = setting.substr(assignment + 1);
if (!propValue.empty()) {
toolSettings[config][propName] = propValue;
}
}
}
}
}
}
bool cmVisualStudio10TargetGenerator::PropertyIsSameInAllConfigs(
const ConfigToSettings& toolSettings, const std::string& propName)
{
std::string firstPropValue = "";
for (const auto& configToSettings : toolSettings) {
const std::unordered_map<std::string, std::string>& settings =
configToSettings.second;
if (firstPropValue.empty()) {
if (settings.find(propName) != settings.end()) {
firstPropValue = settings.find(propName)->second;
}
}
if (settings.find(propName) == settings.end()) {
return false;
}
if (settings.find(propName)->second != firstPropValue) {
return false;
}
}
return true;
}
void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
cmSourceFile const* sf)
{
bool toolHasSettings = false;
const char* tool = "None";
std::string shaderType;
std::string shaderEntryPoint;
std::string shaderModel;
std::string shaderAdditionalFlags;
std::string shaderDisableOptimizations;
std::string shaderEnableDebug;
std::string shaderObjectFileName;
std::string outputHeaderFile;
std::string variableName;
std::string settingsGenerator;
std::string settingsLastGenOutput;
std::string sourceLink;
@@ -1766,6 +1811,11 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
std::string copyToOutDir;
std::string includeInVsix;
std::string ext = cmSystemTools::LowerCase(sf->GetExtension());
ConfigToSettings toolSettings;
for (const auto& config : this->Configurations) {
toolSettings[config];
}
if (this->ProjectType == csproj && !this->InSourceBuild) {
toolHasSettings = true;
}
@@ -1773,47 +1823,72 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
tool = "FXCompile";
// Figure out the type of shader compiler to use.
if (const char* st = sf->GetProperty("VS_SHADER_TYPE")) {
shaderType = st;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["ShaderType"] = st;
}
}
// Figure out which entry point to use if any
if (const char* se = sf->GetProperty("VS_SHADER_ENTRYPOINT")) {
shaderEntryPoint = se;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["EntryPointName"] = se;
}
}
// Figure out which shader model to use if any
if (const char* sm = sf->GetProperty("VS_SHADER_MODEL")) {
shaderModel = sm;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["ShaderModel"] = sm;
}
}
// Figure out which output header file to use if any
if (const char* ohf = sf->GetProperty("VS_SHADER_OUTPUT_HEADER_FILE")) {
outputHeaderFile = ohf;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["HeaderFileOutput"] = ohf;
}
}
// Figure out which variable name to use if any
if (const char* vn = sf->GetProperty("VS_SHADER_VARIABLE_NAME")) {
variableName = vn;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["VariableName"] = vn;
}
}
// Figure out if there's any additional flags to use
if (const char* saf = sf->GetProperty("VS_SHADER_FLAGS")) {
shaderAdditionalFlags = saf;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["AdditionalOptions"] = saf;
}
}
// Figure out if debug information should be generated
if (const char* sed = sf->GetProperty("VS_SHADER_ENABLE_DEBUG")) {
shaderEnableDebug = sed;
toolHasSettings = true;
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(sed);
for (const std::string& config : this->Configurations) {
std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
if (!evaluated.empty()) {
toolSettings[config]["EnableDebuggingInformation"] =
cmIsOn(evaluated) ? "true" : "false";
}
}
}
// Figure out if optimizations should be disabled
if (const char* sdo = sf->GetProperty("VS_SHADER_DISABLE_OPTIMIZATIONS")) {
shaderDisableOptimizations = sdo;
toolHasSettings = true;
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(sdo);
for (const std::string& config : this->Configurations) {
std::string evaluated = cge->Evaluate(this->LocalGenerator, config);
if (!evaluated.empty()) {
toolSettings[config]["DisableOptimizations"] =
cmIsOn(evaluated) ? "true" : "false";
}
}
}
if (const char* sofn = sf->GetProperty("VS_SHADER_OBJECT_FILE_NAME")) {
shaderObjectFileName = sofn;
toolHasSettings = true;
for (const std::string& config : this->Configurations) {
toolSettings[config]["ObjectFileOutput"] = sofn;
}
}
} else if (ext == "jpg" || ext == "png") {
tool = "Image";
@@ -1883,11 +1958,55 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
}
}
if (ParsedToolTargetSettings.find(tool) == ParsedToolTargetSettings.end()) {
const char* toolTargetProperty =
this->GeneratorTarget->Target->GetProperty("VS_SOURCE_SETTINGS_" +
std::string(tool));
ConfigToSettings toolTargetSettings;
ParseSettingsProperty(toolTargetProperty, toolTargetSettings);
ParsedToolTargetSettings[tool] = toolTargetSettings;
}
for (const auto& configToSetting : ParsedToolTargetSettings[tool]) {
for (const auto& setting : configToSetting.second) {
toolSettings[configToSetting.first][setting.first] = setting.second;
}
}
ParseSettingsProperty(sf->GetProperty("VS_SETTINGS"), toolSettings);
if (!toolSettings.empty()) {
toolHasSettings = true;
}
Elem e2(e1, tool);
this->WriteSource(e2, sf);
if (toolHasSettings) {
e2.SetHasElements();
std::vector<std::string> writtenSettings;
for (const auto& configSettings : toolSettings) {
for (const auto& setting : configSettings.second) {
if (std::find(writtenSettings.begin(), writtenSettings.end(),
setting.first) != writtenSettings.end()) {
continue;
}
if (PropertyIsSameInAllConfigs(toolSettings, setting.first)) {
e2.Element(setting.first, setting.second);
writtenSettings.push_back(setting.first);
} else {
e2.WritePlatformConfigTag(setting.first,
"'$(Configuration)|$(Platform)'=='" +
configSettings.first + "|" +
this->Platform + "'",
setting.second);
}
}
}
if (!deployContent.empty()) {
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge =
@@ -1913,73 +2032,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1,
}
}
}
if (!shaderType.empty()) {
e2.Element("ShaderType", shaderType);
}
if (!shaderEntryPoint.empty()) {
e2.Element("EntryPointName", shaderEntryPoint);
}
if (!shaderModel.empty()) {
e2.Element("ShaderModel", shaderModel);
}
if (!outputHeaderFile.empty()) {
for (size_t i = 0; i != this->Configurations.size(); ++i) {
e2.WritePlatformConfigTag("HeaderFileOutput",
"'$(Configuration)|$(Platform)'=='" +
this->Configurations[i] + "|" +
this->Platform + "'",
outputHeaderFile);
}
}
if (!variableName.empty()) {
for (size_t i = 0; i != this->Configurations.size(); ++i) {
e2.WritePlatformConfigTag("VariableName",
"'$(Configuration)|$(Platform)'=='" +
this->Configurations[i] + "|" +
this->Platform + "'",
variableName);
}
}
if (!shaderEnableDebug.empty()) {
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge =
ge.Parse(shaderEnableDebug);
for (size_t i = 0; i != this->Configurations.size(); ++i) {
const std::string& enableDebug =
cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
if (!enableDebug.empty()) {
e2.WritePlatformConfigTag("EnableDebuggingInformation",
"'$(Configuration)|$(Platform)'=='" +
this->Configurations[i] + "|" +
this->Platform + "'",
cmIsOn(enableDebug) ? "true" : "false");
}
}
}
if (!shaderDisableOptimizations.empty()) {
cmGeneratorExpression ge;
std::unique_ptr<cmCompiledGeneratorExpression> cge =
ge.Parse(shaderDisableOptimizations);
for (size_t i = 0; i != this->Configurations.size(); ++i) {
const std::string& disableOptimizations =
cge->Evaluate(this->LocalGenerator, this->Configurations[i]);
if (!disableOptimizations.empty()) {
e2.WritePlatformConfigTag(
"DisableOptimizations",
"'$(Configuration)|$(Platform)'=='" + this->Configurations[i] +
"|" + this->Platform + "'",
(cmIsOn(disableOptimizations) ? "true" : "false"));
}
}
}
if (!shaderObjectFileName.empty()) {
e2.Element("ObjectFileOutput", shaderObjectFileName);
}
if (!shaderAdditionalFlags.empty()) {
e2.Element("AdditionalOptions", shaderAdditionalFlags);
}
if (!settingsGenerator.empty()) {
e2.Element("Generator", settingsGenerator);
}
+10
View File
@@ -10,6 +10,7 @@
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#include <vector>
class cmComputeLinkInformation;
@@ -234,6 +235,15 @@ private:
using ToolSourceMap = std::map<std::string, ToolSources>;
ToolSourceMap Tools;
using ConfigToSettings =
std::unordered_map<std::string,
std::unordered_map<std::string, std::string>>;
std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
const std::string& propName);
void ParseSettingsProperty(const char* settingsPropertyValue,
ConfigToSettings& toolSettings);
std::string GetCMakeFilePath(const char* name) const;
};