summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx68
-rw-r--r--Source/cmGlobalXCodeGenerator.h2
2 files changed, 43 insertions, 27 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index 475efa8b6b..c9d2742cc1 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -1656,6 +1656,46 @@ std::string cmGlobalXCodeGenerator::ExtractFlagRegex(const char* exp,
return retFlag;
}
+ //----------------------------------------------------------------------------
+// This function strips off Xcode attributes that do not target the current
+// configuration
+void
+cmGlobalXCodeGenerator
+::FilterConfigurationAttribute(std::string const& configName,
+ std::string& attribute)
+{
+ // Handle [variant=<config>] condition explicitly here.
+ std::string::size_type beginVariant = attribute.find("[variant=");
+ if (beginVariant == std::string::npos)
+ {
+ // There is no variant in this attribute.
+ return;
+ }
+
+ std::string::size_type endVariant = attribute.find("]", beginVariant+9);
+ if (endVariant == std::string::npos)
+ {
+ // There is no terminating bracket.
+ return;
+ }
+
+ // Compare the variant to the configuration.
+ std::string variant =
+ attribute.substr(beginVariant+9, endVariant-beginVariant-9);
+ if (variant == configName)
+ {
+ // The variant matches the configuration so use this
+ // attribute but drop the [variant=<config>] condition.
+ attribute.erase(beginVariant, endVariant-beginVariant+1);
+ }
+ else
+ {
+ // The variant does not match the configuration so
+ // do not use this attribute.
+ attribute.clear();
+ }
+}
+
//----------------------------------------------------------------------------
void
cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase,
@@ -2498,33 +2538,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
if(i->find("XCODE_ATTRIBUTE_") == 0)
{
std::string attribute = i->substr(16);
- // Handle [variant=<config>] condition explicitly here.
- std::string::size_type beginVariant =
- attribute.find("[variant=");
- if (beginVariant != std::string::npos)
- {
- std::string::size_type endVariant =
- attribute.find("]", beginVariant+9);
- if (endVariant != std::string::npos)
- {
- // Compare the variant to the configuration.
- std::string variant =
- attribute.substr(beginVariant+9, endVariant-beginVariant-9);
- if (variant == configName)
- {
- // The variant matches the configuration so use this
- // attribute but drop the [variant=<config>] condition.
- attribute.erase(beginVariant, endVariant-beginVariant+1);
- }
- else
- {
- // The variant does not match the configuration so
- // do not use this attribute.
- attribute.clear();
- }
- }
- }
-
+ this->FilterConfigurationAttribute(configName, attribute);
if (!attribute.empty())
{
cmGeneratorExpression ge;
diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h
index c8a39dfa2a..4801064c2c 100644
--- a/Source/cmGlobalXCodeGenerator.h
+++ b/Source/cmGlobalXCodeGenerator.h
@@ -153,6 +153,8 @@ private:
std::string ExtractFlag(const char* flag, std::string& flags);
std::string ExtractFlagRegex(const char* exp, int matchIndex,
std::string& flags);
+ void FilterConfigurationAttribute(std::string const& configName,
+ std::string& attribute);
void SortXCodeObjects();
// delete all objects in the this->XCodeObjects vector.
void ClearXCodeObjects();