Genex: Fix evaluation context propagation for TARGET_OBJECTS.
Extract a new method to encapsulate the requirements of evaluating dependent-expressions, namely, propagation of the EvaluateForBuildsystem setting, which is missing from the getLinkedTargetsContent implementation. Commit v3.1.0-rc1~688^2 (Genex: Only evaluate TARGET_OBJECTS to determine target sources., 2014-03-20) introduced an error case for use of TARGET_OBJECTS outside of the context of generating the buildsystem, as the path to object files may be dependent on buildsystem variables (See bug #15226). Commit v3.1.0-rc1~314^2 (Allow INTERFACE_SOURCES to specify $<TARGET_OBJECTS> (#14970), 2014-07-09) made it possible to propagate such content to dependent targets. While that commit propagated the EvaluateForBuildsystem setting for the case of a TARGET_PROPERTY expression, as generated for direct dependencies of a target in cmTargetInternals::AddInterfaceEntries, it did not add propagation for content from further transitive target dependencies, as determined by getLinkedTargetsContent.
This commit is contained in:
parent
d2f2a2e226
commit
672f1001c0
|
@ -69,8 +69,41 @@ struct cmGeneratorExpressionNode
|
|||
const GeneratorExpressionContent *content,
|
||||
cmGeneratorExpressionDAGChecker *dagChecker
|
||||
) const = 0;
|
||||
|
||||
static std::string EvaluateDependentExpression(
|
||||
std::string const& prop, cmMakefile *makefile,
|
||||
cmGeneratorExpressionContext *context,
|
||||
cmTarget const* headTarget, cmTarget const* currentTarget,
|
||||
cmGeneratorExpressionDAGChecker *dagChecker);
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::string cmGeneratorExpressionNode::EvaluateDependentExpression(
|
||||
std::string const& prop, cmMakefile *makefile,
|
||||
cmGeneratorExpressionContext *context,
|
||||
cmTarget const* headTarget, cmTarget const* currentTarget,
|
||||
cmGeneratorExpressionDAGChecker *dagChecker)
|
||||
{
|
||||
cmGeneratorExpression ge(&context->Backtrace);
|
||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
|
||||
cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
|
||||
std::string result = cge->Evaluate(makefile,
|
||||
context->Config,
|
||||
context->Quiet,
|
||||
headTarget,
|
||||
currentTarget,
|
||||
dagChecker);
|
||||
if (cge->GetHadContextSensitiveCondition())
|
||||
{
|
||||
context->HadContextSensitiveCondition = true;
|
||||
}
|
||||
if (cge->GetHadHeadSensitiveCondition())
|
||||
{
|
||||
context->HadHeadSensitiveCondition = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static const struct ZeroNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
|
@ -825,22 +858,10 @@ getLinkedTargetsContent(
|
|||
}
|
||||
if(!depString.empty())
|
||||
{
|
||||
cmGeneratorExpression ge(&context->Backtrace);
|
||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
|
||||
linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
|
||||
context->Config,
|
||||
context->Quiet,
|
||||
headTarget,
|
||||
target,
|
||||
dagChecker);
|
||||
if (cge->GetHadContextSensitiveCondition())
|
||||
{
|
||||
context->HadContextSensitiveCondition = true;
|
||||
}
|
||||
if (cge->GetHadHeadSensitiveCondition())
|
||||
{
|
||||
context->HadHeadSensitiveCondition = true;
|
||||
}
|
||||
linkedTargetsContent =
|
||||
cmGeneratorExpressionNode::EvaluateDependentExpression(depString,
|
||||
target->GetMakefile(), context,
|
||||
headTarget, target, dagChecker);
|
||||
}
|
||||
linkedTargetsContent =
|
||||
cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);
|
||||
|
@ -1181,24 +1202,9 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
|||
}
|
||||
if(!interfacePropertyName.empty())
|
||||
{
|
||||
cmGeneratorExpression ge(&context->Backtrace);
|
||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
|
||||
cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
|
||||
std::string result = cge->Evaluate(context->Makefile,
|
||||
context->Config,
|
||||
context->Quiet,
|
||||
headTarget,
|
||||
target,
|
||||
&dagChecker);
|
||||
|
||||
if (cge->GetHadContextSensitiveCondition())
|
||||
{
|
||||
context->HadContextSensitiveCondition = true;
|
||||
}
|
||||
if (cge->GetHadHeadSensitiveCondition())
|
||||
{
|
||||
context->HadHeadSensitiveCondition = true;
|
||||
}
|
||||
std::string result = this->EvaluateDependentExpression(prop,
|
||||
context->Makefile, context,
|
||||
headTarget, target, &dagChecker);
|
||||
if (!linkedTargetsContent.empty())
|
||||
{
|
||||
result += (result.empty() ? "" : ";") + linkedTargetsContent;
|
||||
|
|
|
@ -22,8 +22,11 @@ add_library(objlib OBJECT obj.cpp)
|
|||
add_library(iface_objlib INTERFACE)
|
||||
target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
|
||||
|
||||
add_library(intermediate INTERFACE)
|
||||
target_link_libraries(intermediate INTERFACE iface_objlib)
|
||||
|
||||
add_executable(InterfaceLibrary definetestexe.cpp)
|
||||
target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface iface_objlib)
|
||||
target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface intermediate)
|
||||
|
||||
add_subdirectory(libsdir)
|
||||
|
||||
|
|
Loading…
Reference in New Issue