浏览代码

Use a preprocessor loop to manage the valid transitive properties.

Hopefully this will prevent regressions when adding further transitive
properties in the future.
Stephen Kelly 12 年之前
父节点
当前提交
0d8db250ce

+ 4 - 3
Source/cmExportTryCompileFileGenerator.cxx

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

+ 7 - 3
Source/cmGeneratorExpressionDAGChecker.cxx

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

+ 15 - 3
Source/cmGeneratorExpressionDAGChecker.h

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

+ 15 - 9
Source/cmGeneratorExpressionEvaluator.cxx

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