Browse Source

Genex: Fix evaluation context propagation for TARGET_OBJECTS.

Extract a new method to encapsulate the requirements of evaluating
dependent-expressions, namely, propagation of the
EvaluateForBuildsystem setting, which is missing from the
getLinkedTargetsContent implementation.

Commit v3.1.0-rc1~688^2 (Genex: Only evaluate TARGET_OBJECTS to determine
target sources., 2014-03-20) introduced an error case for use of
TARGET_OBJECTS outside of the context of generating the buildsystem,
as the path to object files may be dependent on buildsystem
variables (See bug #15226).

Commit v3.1.0-rc1~314^2 (Allow INTERFACE_SOURCES to specify
$<TARGET_OBJECTS> (#14970), 2014-07-09) made it possible to
propagate such content to dependent targets.

While that commit propagated the EvaluateForBuildsystem setting
for the case of a TARGET_PROPERTY expression, as generated for
direct dependencies of a target in
cmTargetInternals::AddInterfaceEntries, it did not add propagation
for content from further transitive target dependencies, as determined
by getLinkedTargetsContent.
Stephen Kelly 11 years ago
parent
commit
672f1001c0
2 changed files with 44 additions and 35 deletions
  1. 40 34
      Source/cmGeneratorExpressionEvaluator.cxx
  2. 4 1
      Tests/InterfaceLibrary/CMakeLists.txt

+ 40 - 34
Source/cmGeneratorExpressionEvaluator.cxx

@@ -69,8 +69,41 @@ struct cmGeneratorExpressionNode
                                const GeneratorExpressionContent *content,
                                cmGeneratorExpressionDAGChecker *dagChecker
                               ) const = 0;
+
+  static std::string EvaluateDependentExpression(
+    std::string const& prop, cmMakefile *makefile,
+    cmGeneratorExpressionContext *context,
+    cmTarget const* headTarget, cmTarget const* currentTarget,
+    cmGeneratorExpressionDAGChecker *dagChecker);
 };
 
+//----------------------------------------------------------------------------
+std::string cmGeneratorExpressionNode::EvaluateDependentExpression(
+    std::string const& prop, cmMakefile *makefile,
+    cmGeneratorExpressionContext *context,
+    cmTarget const* headTarget, cmTarget const* currentTarget,
+    cmGeneratorExpressionDAGChecker *dagChecker)
+{
+  cmGeneratorExpression ge(&context->Backtrace);
+  cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
+  cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
+  std::string result = cge->Evaluate(makefile,
+                        context->Config,
+                        context->Quiet,
+                        headTarget,
+                        currentTarget,
+                        dagChecker);
+  if (cge->GetHadContextSensitiveCondition())
+    {
+    context->HadContextSensitiveCondition = true;
+    }
+  if (cge->GetHadHeadSensitiveCondition())
+    {
+    context->HadHeadSensitiveCondition = true;
+    }
+  return result;
+}
+
 //----------------------------------------------------------------------------
 static const struct ZeroNode : public cmGeneratorExpressionNode
 {
@@ -825,22 +858,10 @@ getLinkedTargetsContent(
     }
   if(!depString.empty())
     {
-    cmGeneratorExpression ge(&context->Backtrace);
-    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString);
-    linkedTargetsContent = cge->Evaluate(target->GetMakefile(),
-                                         context->Config,
-                                         context->Quiet,
-                                         headTarget,
-                                         target,
-                                         dagChecker);
-    if (cge->GetHadContextSensitiveCondition())
-      {
-      context->HadContextSensitiveCondition = true;
-      }
-    if (cge->GetHadHeadSensitiveCondition())
-      {
-      context->HadHeadSensitiveCondition = true;
-      }
+    linkedTargetsContent =
+        cmGeneratorExpressionNode::EvaluateDependentExpression(depString,
+                                        target->GetMakefile(), context,
+                                        headTarget, target, dagChecker);
     }
   linkedTargetsContent =
     cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);
@@ -1181,24 +1202,9 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
       }
     if(!interfacePropertyName.empty())
       {
-      cmGeneratorExpression ge(&context->Backtrace);
-      cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop);
-      cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem);
-      std::string result = cge->Evaluate(context->Makefile,
-                            context->Config,
-                            context->Quiet,
-                            headTarget,
-                            target,
-                            &dagChecker);
-
-      if (cge->GetHadContextSensitiveCondition())
-        {
-        context->HadContextSensitiveCondition = true;
-        }
-      if (cge->GetHadHeadSensitiveCondition())
-        {
-        context->HadHeadSensitiveCondition = true;
-        }
+      std::string result = this->EvaluateDependentExpression(prop,
+                                        context->Makefile, context,
+                                        headTarget, target, &dagChecker);
       if (!linkedTargetsContent.empty())
         {
         result += (result.empty() ? "" : ";") + linkedTargetsContent;

+ 4 - 1
Tests/InterfaceLibrary/CMakeLists.txt

@@ -22,8 +22,11 @@ add_library(objlib OBJECT obj.cpp)
 add_library(iface_objlib INTERFACE)
 target_sources(iface_objlib INTERFACE $<TARGET_OBJECTS:objlib>)
 
+add_library(intermediate INTERFACE)
+target_link_libraries(intermediate INTERFACE iface_objlib)
+
 add_executable(InterfaceLibrary definetestexe.cpp)
-target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface iface_objlib)
+target_link_libraries(InterfaceLibrary iface_nodepends headeriface subiface intermediate)
 
 add_subdirectory(libsdir)