diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 475efa8b6..c9d2742cc 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=] 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=] 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=] 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=] 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 c8a39dfa2..4801064c2 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();