From 2ce42f281fb5403cad398e886f0138d60f6a1dae Mon Sep 17 00:00:00 2001 From: Matt Davies Date: Wed, 18 Mar 2020 12:25:02 +0000 Subject: VS: Add VS_SETTINGS source file property VS_SETTINGS is a list of key value pairs that get written as item metadata for the associated non-built file. The entire value of VS_SETTINGS is evaluated as a generator expression. --- Source/cmVisualStudio10TargetGenerator.cxx | 34 ++++++++++++++++++++++++++++-- Source/cmVisualStudio10TargetGenerator.h | 6 ++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index d55d30d..d67fe72 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -1754,7 +1754,35 @@ void cmVisualStudio10TargetGenerator::WriteHeaderSource(Elem& e1, } } -bool cmVisualStudio10TargetGenerator::cmPropertyIsSameInAllConfigs( +void cmVisualStudio10TargetGenerator::ParseSettingsProperty( + const char* settingsPropertyValue, ConfigToSettings& toolSettings) +{ + if (settingsPropertyValue) { + cmGeneratorExpression ge; + + std::unique_ptr cge = + ge.Parse(settingsPropertyValue); + + for (const std::string& config : this->Configurations) { + std::string evaluated = cge->Evaluate(this->LocalGenerator, config); + + std::vector 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 = ""; @@ -1939,6 +1967,8 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, } } + ParseSettingsProperty(sf->GetProperty("VS_SETTINGS"), toolSettings); + if (!toolSettings.empty()) { toolHasSettings = true; } @@ -1957,7 +1987,7 @@ void cmVisualStudio10TargetGenerator::WriteExtraSource(Elem& e1, continue; } - if (cmPropertyIsSameInAllConfigs(toolSettings, setting.first)) { + if (PropertyIsSameInAllConfigs(toolSettings, setting.first)) { e2.Element(setting.first, setting.second); writtenSettings.push_back(setting.first); } else { diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 8e5f29b..790811b 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -241,8 +241,10 @@ private: using ConfigToSettings = std::unordered_map>; - bool cmPropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings, - const std::string& propName); + bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings, + const std::string& propName); + void ParseSettingsProperty(const char* settingsPropertyValue, + ConfigToSettings& toolSettings); std::string GetCMakeFilePath(const char* name) const; }; -- cgit v0.12