Pārlūkot izejas kodu

GenexEval: Fix evaluation of INCLUDE_DIRECTORIES target property.

This property should come from the content of the property itself,
plus the INTERFACE_INCLUDE_DIRECTORIES of the link *implementation*.

In contrast, when the INTERFACE_INCLUDE_DIRECTORIES is evaluated for
a target, the INTERFACE_INCLUDE_DIRECTORIES of the link *interface*
is used.

Similar logic applies for the COMPILE_DEFINITIONS target properties.

If the propertyName is already an INTERFACE_ variant of the property,
ie, the expression is similar to

 $<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES>

then the INTERFACE_INCLUDE_DIRECTORIES of the link *interface* of foo
is used.

However, if the propertyName is not an INTERFACE_ variant, and the
interfacePropertyName is, ie, the expression is similar to:

 $<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>

then the INTERFACE_INCLUDE_DIRECTORIES of the link *implementation*
of foo is used.
Stephen Kelly 12 gadi atpakaļ
vecāks
revīzija
3aa9ce441f
1 mainītis faili ar 15 papildinājumiem un 1 dzēšanām
  1. 15 1
      Source/cmGeneratorExpressionEvaluator.cxx

+ 15 - 1
Source/cmGeneratorExpressionEvaluator.cxx

@@ -543,7 +543,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
               + (sizeof(targetPropertyTransitiveWhitelist) /
               sizeof(*targetPropertyTransitiveWhitelist));
     if (std::find_if(transBegin, transEnd,
-              TransitiveWhitelistCompare(interfacePropertyName)) != transEnd)
+              TransitiveWhitelistCompare(propertyName)) != transEnd)
       {
       const cmTarget::LinkInterface *iface = target->GetLinkInterface(
                                                     context->Config,
@@ -556,6 +556,20 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
                                           interfacePropertyName);
         }
       }
+    else if (std::find_if(transBegin, transEnd,
+              TransitiveWhitelistCompare(interfacePropertyName)) != transEnd)
+      {
+      const cmTarget::LinkImplementation *impl = target->GetLinkImplementation(
+                                                    context->Config,
+                                                    context->HeadTarget);
+      if(impl)
+        {
+        linkedTargetsContent =
+                  getLinkedTargetsContent(impl->Libraries, target,
+                                          context, &dagChecker,
+                                          interfacePropertyName);
+        }
+      }
 
     linkedTargetsContent =
           cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent);