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,
|
const GeneratorExpressionContent *content,
|
||||||
cmGeneratorExpressionDAGChecker *dagChecker
|
cmGeneratorExpressionDAGChecker *dagChecker
|
||||||
) const = 0;
|
) 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
|
static const struct ZeroNode : public cmGeneratorExpressionNode
|
||||||
{
|
{
|
||||||
|
@ -825,22 +858,10 @@ getLinkedTargetsContent(
|
||||||
}
|
}
|
||||||
if(!depString.empty())
|
if(!depString.empty())
|
||||||
{
|
{
|
||||||
cmGeneratorExpression ge(&context->Backtrace);
|
linkedTargetsContent =
|
||||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
|
cmGeneratorExpressionNode::EvaluateDependentExpression(depString,
|
||||||
linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
|
target->GetMakefile(), context,
|
||||||
context->Config,
|
headTarget, target, dagChecker);
|
||||||
context->Quiet,
|
|
||||||
headTarget,
|
|
||||||
target,
|
|
||||||
dagChecker);
|
|
||||||
if (cge->GetHadContextSensitiveCondition())
|
|
||||||
{
|
|
||||||
context->HadContextSensitiveCondition = true;
|
|
||||||
}
|
|
||||||
if (cge->GetHadHeadSensitiveCondition())
|
|
||||||
{
|
|
||||||
context->HadHeadSensitiveCondition = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
linkedTargetsContent =
|
linkedTargetsContent =
|
||||||
cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);
|
cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);
|
||||||
|
@ -1181,24 +1202,9 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
||||||
}
|
}
|
||||||
if(!interfacePropertyName.empty())
|
if(!interfacePropertyName.empty())
|
||||||
{
|
{
|
||||||
cmGeneratorExpression ge(&context->Backtrace);
|
std::string result = this->EvaluateDependentExpression(prop,
|
||||||
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
|
context->Makefile, context,
|
||||||
cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
|
headTarget, target, &dagChecker);
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (!linkedTargetsContent.empty())
|
if (!linkedTargetsContent.empty())
|
||||||
{
|
{
|
||||||
result += (result.empty() ? "" : ";") + linkedTargetsContent;
|
result += (result.empty() ? "" : ";") + linkedTargetsContent;
|
||||||
|
|
|
@ -22,8 +22,11 @@ add_library(objlib OBJECT obj.cpp)
|
||||||
add_library(iface_objlib INTERFACE)
|
add_library(iface_objlib INTERFACE)
|
||||||
target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
|
target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
|
||||||
|
|
||||||
|
add_library(intermediate INTERFACE)
|
||||||
|
target_link_libraries(intermediate INTERFACE iface_objlib)
|
||||||
|
|
||||||
add_executable(InterfaceLibrary definetestexe.cpp)
|
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)
|
add_subdirectory(libsdir)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue