Split the generator expression before extracting targets.
Now that we're processing a LINK_INTERFACE_LIBRARIES string, it can contain targets. Make sure they are extracted for namespacing purposes. This needs to be restricted to strings which can actually have targets named in them. For example, this is not done for INTERFACE_COMPILE_DEFINITIONS, because even if there is a target named 'foo', the string 'foo' in that property means that '-Dfoo' will be set when compiling.
This commit is contained in:
parent
b6036d104a
commit
a3aedb8152
|
@ -218,9 +218,54 @@ cmExportFileGenerator::AddTargetNamespace(std::string &input,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
static bool isGeneratorExpression(const std::string &lib)
|
||||||
|
{
|
||||||
|
const std::string::size_type openpos = lib.find("$<");
|
||||||
|
return (openpos != std::string::npos)
|
||||||
|
&& (lib.find(">", openpos) != std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmExportFileGenerator::ResolveTargetsInGeneratorExpressions(
|
cmExportFileGenerator::ResolveTargetsInGeneratorExpressions(
|
||||||
|
std::string &input,
|
||||||
|
cmTarget* target,
|
||||||
|
std::vector<std::string> &missingTargets,
|
||||||
|
FreeTargetsReplace replace)
|
||||||
|
{
|
||||||
|
if (replace == NoReplaceFreeTargets)
|
||||||
|
{
|
||||||
|
this->ResolveTargetsInGeneratorExpression(input, target, missingTargets);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
cmGeneratorExpression::Split(input, parts);
|
||||||
|
|
||||||
|
std::string sep;
|
||||||
|
input = "";
|
||||||
|
for(std::vector<std::string>::iterator li = parts.begin();
|
||||||
|
li != parts.end(); ++li)
|
||||||
|
{
|
||||||
|
if (!isGeneratorExpression(*li))
|
||||||
|
{
|
||||||
|
this->AddTargetNamespace(*li, target, missingTargets);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ResolveTargetsInGeneratorExpression(
|
||||||
|
*li,
|
||||||
|
target,
|
||||||
|
missingTargets);
|
||||||
|
}
|
||||||
|
input += sep + *li;
|
||||||
|
sep = ";";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmExportFileGenerator::ResolveTargetsInGeneratorExpression(
|
||||||
std::string &input,
|
std::string &input,
|
||||||
cmTarget* target,
|
cmTarget* target,
|
||||||
std::vector<std::string> &missingTargets)
|
std::vector<std::string> &missingTargets)
|
||||||
|
|
|
@ -102,9 +102,16 @@ protected:
|
||||||
void GenerateInterfaceProperties(cmTarget *target, std::ostream& os,
|
void GenerateInterfaceProperties(cmTarget *target, std::ostream& os,
|
||||||
const ImportPropertyMap &properties);
|
const ImportPropertyMap &properties);
|
||||||
|
|
||||||
|
|
||||||
|
enum FreeTargetsReplace {
|
||||||
|
ReplaceFreeTargets,
|
||||||
|
NoReplaceFreeTargets
|
||||||
|
};
|
||||||
|
|
||||||
void ResolveTargetsInGeneratorExpressions(std::string &input,
|
void ResolveTargetsInGeneratorExpressions(std::string &input,
|
||||||
cmTarget* target,
|
cmTarget* target,
|
||||||
std::vector<std::string> &missingTargets);
|
std::vector<std::string> &missingTargets,
|
||||||
|
FreeTargetsReplace replace = NoReplaceFreeTargets);
|
||||||
|
|
||||||
// The namespace in which the exports are placed in the generated file.
|
// The namespace in which the exports are placed in the generated file.
|
||||||
std::string Namespace;
|
std::string Namespace;
|
||||||
|
@ -132,6 +139,9 @@ private:
|
||||||
bool AddTargetNamespace(std::string &input, cmTarget* target,
|
bool AddTargetNamespace(std::string &input, cmTarget* target,
|
||||||
std::vector<std::string> &missingTargets);
|
std::vector<std::string> &missingTargets);
|
||||||
|
|
||||||
|
void ResolveTargetsInGeneratorExpression(std::string &input,
|
||||||
|
cmTarget* target,
|
||||||
|
std::vector<std::string> &missingTargets);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue