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:
Stephen Kelly 2013-02-07 13:04:46 +01:00
parent 1fb545ad3a
commit d4e5c6787c
5 changed files with 15 additions and 47 deletions

View File

@ -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)
{ {

View File

@ -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;
}; };

View File

@ -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);
} }

View File

@ -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)

View File

@ -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;