Commit 0d8db250 authored by Stephen Kelly's avatar Stephen Kelly
Browse files

Use a preprocessor loop to manage the valid transitive properties.

Hopefully this will prevent regressions when adding further transitive
properties in the future.
parent 8a3b5bed
......@@ -31,9 +31,10 @@ bool cmExportTryCompileFileGenerator::GenerateMainFile(std::ostream& os)
ImportPropertyMap properties;
this->FindTargets("INTERFACE_INCLUDE_DIRECTORIES", te, emittedDeps);
this->FindTargets("INTERFACE_COMPILE_DEFINITIONS", te, emittedDeps);
this->FindTargets("INTERFACE_COMPILE_OPTIONS", te, emittedDeps);
#define FIND_TARGETS(PROPERTY) \
this->FindTargets(#PROPERTY, te, emittedDeps);
CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(FIND_TARGETS)
this->PopulateProperties(te, properties, emittedDeps);
......
......@@ -33,9 +33,13 @@ cmGeneratorExpressionDAGChecker::cmGeneratorExpressionDAGChecker(
}
this->CheckResult = this->checkGraph();
if (CheckResult == DAG && (top->EvaluatingIncludeDirectories()
|| top->EvaluatingCompileDefinitions()
|| top->EvaluatingCompileOptions()))
#define TEST_TRANSITIVE_PROPERTY_METHOD(METHOD) \
top->METHOD () ||
if (CheckResult == DAG && (
CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(TEST_TRANSITIVE_PROPERTY_METHOD)
false)
)
{
std::map<cmStdString, std::set<cmStdString> >::const_iterator it
= top->Seen.find(target);
......
......@@ -16,6 +16,16 @@
#include "cmGeneratorExpressionEvaluator.h"
#define CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(F) \
F(EvaluatingIncludeDirectories) \
F(EvaluatingCompileDefinitions) \
F(EvaluatingCompileOptions)
#define CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(F) \
F(INTERFACE_INCLUDE_DIRECTORIES) \
F(INTERFACE_COMPILE_DEFINITIONS) \
F(INTERFACE_COMPILE_OPTIONS)
//----------------------------------------------------------------------------
struct cmGeneratorExpressionDAGChecker
{
......@@ -38,9 +48,11 @@ struct cmGeneratorExpressionDAGChecker
const std::string &expr);
bool EvaluatingLinkLibraries();
bool EvaluatingIncludeDirectories() const;
bool EvaluatingCompileDefinitions() const;
bool EvaluatingCompileOptions() const;
#define DECLARE_TRANSITIVE_PROPERTY_METHOD(METHOD) \
bool METHOD () const;
CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
private:
Result checkGraph() const;
......
......@@ -491,11 +491,13 @@ static const struct JoinNode : public cmGeneratorExpressionNode
}
} joinNode;
#define TRANSITIVE_PROPERTY_NAME(PROPERTY) \
, #PROPERTY
//----------------------------------------------------------------------------
static const char* targetPropertyTransitiveWhitelist[] = {
"INTERFACE_INCLUDE_DIRECTORIES"
, "INTERFACE_COMPILE_DEFINITIONS"
, "INTERFACE_COMPILE_OPTIONS"
0
CM_FOR_EACH_TRANSITIVE_PROPERTY_NAME(TRANSITIVE_PROPERTY_NAME)
};
std::string getLinkedTargetsContent(const std::vector<std::string> &libraries,
......@@ -675,7 +677,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
// No error. We just skip cyclic references.
return std::string();
case cmGeneratorExpressionDAGChecker::ALREADY_SEEN:
for (size_t i = 0;
for (size_t i = 1;
i < (sizeof(targetPropertyTransitiveWhitelist) /
sizeof(*targetPropertyTransitiveWhitelist));
++i)
......@@ -703,9 +705,13 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
}
else
{
assert(dagCheckerParent->EvaluatingIncludeDirectories()
|| dagCheckerParent->EvaluatingCompileDefinitions()
|| dagCheckerParent->EvaluatingCompileOptions());
#define ASSERT_TRANSITIVE_PROPERTY_METHOD(METHOD) \
dagCheckerParent->METHOD () ||
assert(
CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(
ASSERT_TRANSITIVE_PROPERTY_METHOD)
false);
}
}
......@@ -732,7 +738,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
cmTarget *headTarget = context->HeadTarget ? context->HeadTarget : target;
const char **transBegin = targetPropertyTransitiveWhitelist;
const char **transBegin = targetPropertyTransitiveWhitelist + 1;
const char **transEnd = targetPropertyTransitiveWhitelist
+ (sizeof(targetPropertyTransitiveWhitelist) /
sizeof(*targetPropertyTransitiveWhitelist));
......@@ -798,7 +804,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
return linkedTargetsContent;
}
for (size_t i = 0;
for (size_t i = 1;
i < (sizeof(targetPropertyTransitiveWhitelist) /
sizeof(*targetPropertyTransitiveWhitelist));
++i)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment