Xcode: Factor out XCODE_ATTRIBUTE_ variant filter (#14947)

Move the variant=<config> filter out to a helper function
so that it can be re-used later for CMAKE_XCODE_ATTRIBUTE_*.
This commit is contained in:
Gregor Jasny 2016-01-02 17:57:06 +01:00
parent 506504d440
commit 28db2268e8
2 changed files with 43 additions and 27 deletions

View File

@ -1656,6 +1656,46 @@ std::string cmGlobalXCodeGenerator::ExtractFlagRegex(const char* exp,
return retFlag; 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 void
cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase, cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase,
@ -2498,33 +2538,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
if(i->find("XCODE_ATTRIBUTE_") == 0) if(i->find("XCODE_ATTRIBUTE_") == 0)
{ {
std::string attribute = i->substr(16); std::string attribute = i->substr(16);
// Handle [variant=<config>] condition explicitly here. this->FilterConfigurationAttribute(configName, attribute);
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();
}
}
}
if (!attribute.empty()) if (!attribute.empty())
{ {
cmGeneratorExpression ge; cmGeneratorExpression ge;

View File

@ -153,6 +153,8 @@ private:
std::string ExtractFlag(const char* flag, std::string& flags); std::string ExtractFlag(const char* flag, std::string& flags);
std::string ExtractFlagRegex(const char* exp, int matchIndex, std::string ExtractFlagRegex(const char* exp, int matchIndex,
std::string& flags); std::string& flags);
void FilterConfigurationAttribute(std::string const& configName,
std::string& attribute);
void SortXCodeObjects(); void SortXCodeObjects();
// delete all objects in the this->XCodeObjects vector. // delete all objects in the this->XCodeObjects vector.
void ClearXCodeObjects(); void ClearXCodeObjects();