Răsfoiți Sursa

Merge topic 'fix-transitive-OBJECT_SOURCES-context'

672f1001 Genex: Fix evaluation context propagation for TARGET_OBJECTS.
Brad King 11 ani în urmă
părinte
comite
22b72b1894

+ 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);
@@ -1185,24 +1206,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)