Don't keep track of content determined by target property values.
This tracking was added during the development of commit 042ecf04 (Add API to calculate link-interface-dependent bool properties or error., 2013-01-06), but was never used. It was not necessary to use the content because what is really useful in that logic is to determine if a property has been implied to be null by appearing in a LINK_LIBRARIES genex. I think the motivating usecase for developing the feature of keeping track of the targets relevant to a property was that I thought it would make it possible to allow requiring granular compatibility of interface properties only for targets which depended on the interface property. Eg: add_library(foo ...) add_library(bar ...) add_executable(user ...) # Read the INTERFACE_POSITION_INDEPENDENT_CODE from bar, but not # from foo: target_link_libraries(user foo $<$<TARGET_PROPERTY:POSTITION_INDEPENDENT_CODE>:bar>) This obviously doesn't make sense. We require that INTERFACE properties are consistent across all linked targets instead.
This commit is contained in:
parent
1fb545ad3a
commit
d4e5c6787c
@ -95,14 +95,13 @@ const char *cmCompiledGeneratorExpression::Evaluate(
|
|||||||
|
|
||||||
for ( ; it != end; ++it)
|
for ( ; it != end; ++it)
|
||||||
{
|
{
|
||||||
const std::string result = (*it)->Evaluate(&context, dagChecker);
|
this->Output += (*it)->Evaluate(&context, dagChecker);
|
||||||
this->Output += result;
|
|
||||||
|
|
||||||
for(std::set<cmStdString>::const_iterator
|
for(std::set<cmStdString>::const_iterator
|
||||||
p = context.SeenTargetProperties.begin();
|
p = context.SeenTargetProperties.begin();
|
||||||
p != context.SeenTargetProperties.end(); ++p)
|
p != context.SeenTargetProperties.end(); ++p)
|
||||||
{
|
{
|
||||||
this->SeenTargetProperties[*p] += result + ";";
|
this->SeenTargetProperties.insert(*p);
|
||||||
}
|
}
|
||||||
if (context.HadError)
|
if (context.HadError)
|
||||||
{
|
{
|
||||||
|
@ -90,7 +90,7 @@ public:
|
|||||||
std::set<cmTarget*> const& GetTargets() const
|
std::set<cmTarget*> const& GetTargets() const
|
||||||
{ return this->Targets; }
|
{ return this->Targets; }
|
||||||
|
|
||||||
std::map<cmStdString, cmStdString> const& GetSeenTargetProperties() const
|
std::set<cmStdString> const& GetSeenTargetProperties() const
|
||||||
{ return this->SeenTargetProperties; }
|
{ return this->SeenTargetProperties; }
|
||||||
|
|
||||||
~cmCompiledGeneratorExpression();
|
~cmCompiledGeneratorExpression();
|
||||||
@ -124,7 +124,7 @@ private:
|
|||||||
bool NeedsParsing;
|
bool NeedsParsing;
|
||||||
|
|
||||||
mutable std::set<cmTarget*> Targets;
|
mutable std::set<cmTarget*> Targets;
|
||||||
mutable std::map<cmStdString, cmStdString> SeenTargetProperties;
|
mutable std::set<cmStdString> SeenTargetProperties;
|
||||||
mutable std::string Output;
|
mutable std::string Output;
|
||||||
mutable bool HadContextSensitiveCondition;
|
mutable bool HadContextSensitiveCondition;
|
||||||
};
|
};
|
||||||
|
@ -398,7 +398,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
|
|||||||
{
|
{
|
||||||
// Keep track of the properties seen while processing.
|
// Keep track of the properties seen while processing.
|
||||||
// The evaluation of the LINK_LIBRARIES generator expressions
|
// The evaluation of the LINK_LIBRARIES generator expressions
|
||||||
// will check this to ensure that properties form a DAG.
|
// will check this to ensure that properties have one consistent
|
||||||
|
// value for all evaluations.
|
||||||
context->SeenTargetProperties.insert(propertyName);
|
context->SeenTargetProperties.insert(propertyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2233,7 +2233,15 @@ void cmTarget::GetDirectLinkLibraries(const char *config,
|
|||||||
&dagChecker),
|
&dagChecker),
|
||||||
libs);
|
libs);
|
||||||
|
|
||||||
this->AddLinkDependentTargetsForProperties(cge->GetSeenTargetProperties());
|
std::set<cmStdString> seenProps = cge->GetSeenTargetProperties();
|
||||||
|
for (std::set<cmStdString>::const_iterator it = seenProps.begin();
|
||||||
|
it != seenProps.end(); ++it)
|
||||||
|
{
|
||||||
|
if (!this->GetProperty(it->c_str()))
|
||||||
|
{
|
||||||
|
this->LinkImplicitNullProperties.insert(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4519,18 +4527,6 @@ const char* cmTarget::GetExportMacro()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
void cmTarget::GetLinkDependentTargetsForProperty(const std::string &p,
|
|
||||||
std::set<std::string> &targets)
|
|
||||||
{
|
|
||||||
const std::map<cmStdString, std::set<std::string> >::const_iterator findIt
|
|
||||||
= this->LinkDependentProperties.find(p);
|
|
||||||
if (findIt != this->LinkDependentProperties.end())
|
|
||||||
{
|
|
||||||
targets = findIt->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmTarget::IsNullImpliedByLinkLibraries(const std::string &p)
|
bool cmTarget::IsNullImpliedByLinkLibraries(const std::string &p)
|
||||||
{
|
{
|
||||||
@ -4538,24 +4534,6 @@ bool cmTarget::IsNullImpliedByLinkLibraries(const std::string &p)
|
|||||||
!= this->LinkImplicitNullProperties.end();
|
!= this->LinkImplicitNullProperties.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
void cmTarget::AddLinkDependentTargetsForProperties(
|
|
||||||
const std::map<cmStdString, cmStdString> &map)
|
|
||||||
{
|
|
||||||
for (std::map<cmStdString, cmStdString>::const_iterator it = map.begin();
|
|
||||||
it != map.end(); ++it)
|
|
||||||
{
|
|
||||||
std::vector<std::string> targets;
|
|
||||||
cmSystemTools::ExpandListArgument(it->second.c_str(), targets);
|
|
||||||
this->LinkDependentProperties[it->first].insert(targets.begin(),
|
|
||||||
targets.end());
|
|
||||||
if (!this->GetProperty(it->first.c_str()))
|
|
||||||
{
|
|
||||||
this->LinkImplicitNullProperties.insert(it->first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
template<typename PropertyType>
|
template<typename PropertyType>
|
||||||
PropertyType getTypedProperty(cmTarget *tgt, const char *prop,
|
PropertyType getTypedProperty(cmTarget *tgt, const char *prop,
|
||||||
@ -4611,9 +4589,6 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget *tgt,
|
|||||||
const bool explicitlySet = tgt->GetProperties()
|
const bool explicitlySet = tgt->GetProperties()
|
||||||
.find(p.c_str())
|
.find(p.c_str())
|
||||||
!= tgt->GetProperties().end();
|
!= tgt->GetProperties().end();
|
||||||
std::set<std::string> dependentTargets;
|
|
||||||
tgt->GetLinkDependentTargetsForProperty(p,
|
|
||||||
dependentTargets);
|
|
||||||
const bool impliedByUse =
|
const bool impliedByUse =
|
||||||
tgt->IsNullImpliedByLinkLibraries(p);
|
tgt->IsNullImpliedByLinkLibraries(p);
|
||||||
assert((impliedByUse ^ explicitlySet)
|
assert((impliedByUse ^ explicitlySet)
|
||||||
|
@ -498,17 +498,12 @@ public:
|
|||||||
|
|
||||||
void AppendBuildInterfaceIncludes();
|
void AppendBuildInterfaceIncludes();
|
||||||
|
|
||||||
void GetLinkDependentTargetsForProperty(const std::string &p,
|
|
||||||
std::set<std::string> &targets);
|
|
||||||
bool IsNullImpliedByLinkLibraries(const std::string &p);
|
bool IsNullImpliedByLinkLibraries(const std::string &p);
|
||||||
bool IsLinkInterfaceDependentBoolProperty(const std::string &p,
|
bool IsLinkInterfaceDependentBoolProperty(const std::string &p,
|
||||||
const char *config);
|
const char *config);
|
||||||
bool IsLinkInterfaceDependentStringProperty(const std::string &p,
|
bool IsLinkInterfaceDependentStringProperty(const std::string &p,
|
||||||
const char *config);
|
const char *config);
|
||||||
|
|
||||||
void AddLinkDependentTargetsForProperties(
|
|
||||||
const std::map<cmStdString, cmStdString> &map);
|
|
||||||
|
|
||||||
bool GetLinkInterfaceDependentBoolProperty(const std::string &p,
|
bool GetLinkInterfaceDependentBoolProperty(const std::string &p,
|
||||||
const char *config);
|
const char *config);
|
||||||
|
|
||||||
@ -627,8 +622,6 @@ private:
|
|||||||
bool IsApple;
|
bool IsApple;
|
||||||
bool IsImportedTarget;
|
bool IsImportedTarget;
|
||||||
bool DebugIncludesDone;
|
bool DebugIncludesDone;
|
||||||
mutable std::map<cmStdString, std::set<std::string> >
|
|
||||||
LinkDependentProperties;
|
|
||||||
mutable std::set<std::string> LinkImplicitNullProperties;
|
mutable std::set<std::string> LinkImplicitNullProperties;
|
||||||
bool BuildInterfaceIncludesAppended;
|
bool BuildInterfaceIncludesAppended;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user