Extract the AddTargetNamespace method.

This commit is contained in:
Stephen Kelly 2013-01-08 20:58:33 +01:00
parent cb1afbf466
commit b6036d104a
2 changed files with 52 additions and 95 deletions

View File

@ -183,6 +183,41 @@ void cmExportFileGenerator::GenerateInterfaceProperties(cmTarget *target,
} }
} }
//----------------------------------------------------------------------------
bool
cmExportFileGenerator::AddTargetNamespace(std::string &input,
cmTarget* target,
std::vector<std::string> &missingTargets)
{
cmMakefile *mf = target->GetMakefile();
cmTarget *tgt = mf->FindTargetToUse(input.c_str());
if (!tgt)
{
return false;
}
if(tgt->IsImported())
{
return true;
}
if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end())
{
input = this->Namespace + input;
}
else
{
std::string namespacedTarget;
this->HandleMissingTarget(namespacedTarget, missingTargets,
mf, target, tgt);
if (!namespacedTarget.empty())
{
input = namespacedTarget;
}
}
return true;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void void
cmExportFileGenerator::ResolveTargetsInGeneratorExpressions( cmExportFileGenerator::ResolveTargetsInGeneratorExpressions(
@ -212,45 +247,17 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpressions(
continue; continue;
} }
const std::string targetName = input.substr(nameStartPos, std::string targetName = input.substr(nameStartPos,
commaPos - nameStartPos); commaPos - nameStartPos);
pos = nameStartPos; // We're not going to replace the entire expression, if (!this->AddTargetNamespace(targetName, target, missingTargets))
// but only the target parameter.
if (cmTarget *tgt = mf->FindTargetToUse(targetName.c_str()))
{
if(tgt->IsImported())
{
pos += targetName.size();
}
else if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end())
{
input.replace(pos, targetName.size(),
this->Namespace + targetName);
pos += this->Namespace.size() + targetName.size();
}
else
{
std::string namespacedTarget;
this->HandleMissingTarget(namespacedTarget, missingTargets,
mf, target, tgt);
if (!namespacedTarget.empty())
{
input.replace(pos, targetName.size(), namespacedTarget);
pos += namespacedTarget.size();
}
}
}
else
{ {
errorString = "$<TARGET_PROPERTY:" + targetName + ",prop> requires " errorString = "$<TARGET_PROPERTY:" + targetName + ",prop> requires "
"its first parameter to be a reachable target."; "its first parameter to be a reachable target.";
}
lastPos = pos;
if (!errorString.empty())
{
break; break;
} }
input.replace(nameStartPos, commaPos - nameStartPos, targetName);
lastPos = pos + targetName.size();
} }
if (!errorString.empty()) if (!errorString.empty())
{ {
@ -267,51 +274,24 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpressions(
if (endPos == input.npos) if (endPos == input.npos)
{ {
errorString = "$<TARGET_NAME:...> expression incomplete"; errorString = "$<TARGET_NAME:...> expression incomplete";
break;
} }
const std::string targetName = input.substr(nameStartPos, std::string targetName = input.substr(nameStartPos,
endPos - nameStartPos); endPos - nameStartPos);
if(targetName.find("$<") != input.npos) if(targetName.find("$<") != input.npos)
{ {
errorString = "$<TARGET_NAME:...> requires its parameter to be a " errorString = "$<TARGET_NAME:...> requires its parameter to be a "
"literal."; "literal.";
break;
} }
if (cmTarget *tgt = mf->FindTargetToUse(targetName.c_str())) if (!this->AddTargetNamespace(targetName, target, missingTargets))
{
if(tgt->IsImported())
{
input.replace(pos, sizeof("$<TARGET_NAME:") + targetName.size(),
targetName);
pos += sizeof("$<TARGET_NAME:") + targetName.size();
}
else if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end())
{
input.replace(pos, sizeof("$<TARGET_NAME:") + targetName.size(),
this->Namespace + targetName);
pos += sizeof("$<TARGET_NAME:") + targetName.size();
}
else
{
std::string namespacedTarget;
this->HandleMissingTarget(namespacedTarget, missingTargets,
mf, target, tgt);
if (!namespacedTarget.empty())
{
input.replace(pos, sizeof("$<TARGET_NAME:") + targetName.size(),
namespacedTarget);
pos += sizeof("$<TARGET_NAME:") + targetName.size();
}
}
}
else
{ {
errorString = "$<TARGET_NAME:...> requires its parameter to be a " errorString = "$<TARGET_NAME:...> requires its parameter to be a "
"reachable target."; "reachable target.";
}
lastPos = pos;
if (!errorString.empty())
{
break; break;
} }
input.replace(pos, endPos - pos + 1, targetName);
lastPos = endPos;
} }
if (!errorString.empty()) if (!errorString.empty())
{ {
@ -397,9 +377,6 @@ cmExportFileGenerator
return; return;
} }
// Get the makefile in which to lookup target information.
cmMakefile* mf = target->GetMakefile();
// Construct the property value. // Construct the property value.
std::string link_libs; std::string link_libs;
const char* sep = ""; const char* sep = "";
@ -410,33 +387,9 @@ cmExportFileGenerator
link_libs += sep; link_libs += sep;
sep = ";"; sep = ";";
// Append this entry. std::string temp = *li;
if(cmTarget* tgt = mf->FindTargetToUse(li->c_str())) this->AddTargetNamespace(temp, target, missingTargets);
{ link_libs += temp;
// This is a target.
if(tgt->IsImported())
{
// The target is imported (and therefore is not in the
// export). Append the raw name.
link_libs += *li;
}
else if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end())
{
// The target is in the export. Append it with the export
// namespace.
link_libs += this->Namespace;
link_libs += *li;
}
else
{
this->HandleMissingTarget(link_libs, missingTargets, mf, target, tgt);
}
}
else
{
// Append the raw name.
link_libs += *li;
}
} }
// Store the property. // Store the property.

View File

@ -128,6 +128,10 @@ private:
cmGeneratorExpression::PreprocessContext, cmGeneratorExpression::PreprocessContext,
ImportPropertyMap &properties, ImportPropertyMap &properties,
std::vector<std::string> &missingTargets); std::vector<std::string> &missingTargets);
bool AddTargetNamespace(std::string &input, cmTarget* target,
std::vector<std::string> &missingTargets);
}; };
#endif #endif