瀏覽代碼

Introduce the LINK_ONLY generator expression.

This is an internal expression for use by target_link_libraries
for static libraries.
Stephen Kelly 12 年之前
父節點
當前提交
ddde61c0b2

+ 15 - 1
Source/cmGeneratorExpressionDAGChecker.cxx

@@ -22,7 +22,7 @@ cmGeneratorExpressionDAGChecker::cmGeneratorExpressionDAGChecker(
                 const GeneratorExpressionContent *content,
                 cmGeneratorExpressionDAGChecker *parent)
   : Parent(parent), Target(target), Property(property),
-    Content(content), Backtrace(backtrace)
+    Content(content), Backtrace(backtrace), TransitivePropertiesOnly(false)
 {
   const cmGeneratorExpressionDAGChecker *top = this;
   const cmGeneratorExpressionDAGChecker *p = this->Parent;
@@ -138,6 +138,20 @@ cmGeneratorExpressionDAGChecker::checkGraph() const
   return DAG;
 }
 
+//----------------------------------------------------------------------------
+bool cmGeneratorExpressionDAGChecker::GetTransitivePropertiesOnly()
+{
+  const cmGeneratorExpressionDAGChecker *top = this;
+  const cmGeneratorExpressionDAGChecker *parent = this->Parent;
+  while (parent)
+    {
+    top = parent;
+    parent = parent->Parent;
+    }
+
+  return top->TransitivePropertiesOnly;
+}
+
 //----------------------------------------------------------------------------
 bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(const char *tgt)
 {

+ 5 - 0
Source/cmGeneratorExpressionDAGChecker.h

@@ -54,6 +54,10 @@ struct cmGeneratorExpressionDAGChecker
 
 CM_FOR_EACH_TRANSITIVE_PROPERTY_METHOD(DECLARE_TRANSITIVE_PROPERTY_METHOD)
 
+  bool GetTransitivePropertiesOnly();
+  void SetTransitivePropertiesOnly()
+    { this->TransitivePropertiesOnly = true; }
+
 private:
   Result checkGraph() const;
 
@@ -65,6 +69,7 @@ private:
   const GeneratorExpressionContent * const Content;
   const cmListFileBacktrace Backtrace;
   Result CheckResult;
+  bool TransitivePropertiesOnly;
 };
 
 #endif

+ 20 - 0
Source/cmGeneratorExpressionEvaluator.cxx

@@ -491,6 +491,24 @@ static const struct VersionEqualNode : public cmGeneratorExpressionNode
   }
 } versionEqualNode;
 
+//----------------------------------------------------------------------------
+static const struct LinkOnlyNode : public cmGeneratorExpressionNode
+{
+  LinkOnlyNode() {}
+
+  std::string Evaluate(const std::vector<std::string> &parameters,
+                       cmGeneratorExpressionContext *,
+                       const GeneratorExpressionContent *,
+                       cmGeneratorExpressionDAGChecker *dagChecker) const
+  {
+    if(!dagChecker->GetTransitivePropertiesOnly())
+      {
+      return parameters.front();
+      }
+    return "";
+  }
+} linkOnlyNode;
+
 //----------------------------------------------------------------------------
 static const struct ConfigurationNode : public cmGeneratorExpressionNode
 {
@@ -1396,6 +1414,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
     return &installPrefixNode;
   else if (identifier == "JOIN")
     return &joinNode;
+  else if (identifier == "LINK_ONLY")
+    return &linkOnlyNode;
   return 0;
 
 }