浏览代码

Exclude the LINK_LIBRARIES related properties from INTERFACE evaluation.

These interface-related link-libraries properties are used to determine
the value of the other INTERFACE properties, so we were getting infinite
recursion and segfaults otherwise.
Stephen Kelly 12 年之前
父节点
当前提交
6fbe3ce4ef

+ 8 - 2
Source/cmGeneratorExpressionDAGChecker.cxx

@@ -114,8 +114,14 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries()
   const cmGeneratorExpressionDAGChecker *parent = this->Parent;
   while (parent)
     {
-    parent = parent->Parent;
     top = parent;
+    parent = parent->Parent;
     }
-  return top->Property == "LINK_LIBRARIES";
+
+  const char *prop = top->Property.c_str();
+  return (strcmp(prop, "LINK_LIBRARIES") == 0
+       || strcmp(prop, "LINK_INTERFACE_LIBRARIES") == 0
+       || strcmp(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES") == 0
+       || strncmp(prop, "LINK_INTERFACE_LIBRARIES_", 26) == 0
+       || strncmp(prop, "IMPORTED_LINK_INTERFACE_LIBRARIES_", 35) == 0);
 }

+ 16 - 0
Tests/CompatibleInterface/CMakeLists.txt

@@ -3,12 +3,16 @@ cmake_minimum_required(VERSION 2.8)
 
 project(CompatibleInterface)
 
+include(GenerateExportHeader)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
 add_library(iface1 empty.cpp)
 set_property(TARGET iface1 APPEND PROPERTY
   COMPATIBLE_INTERFACE_BOOL
     BOOL_PROP1
     BOOL_PROP2
     BOOL_PROP3
+    BOOL_PROP4
 )
 
 set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP1 ON)
@@ -26,3 +30,15 @@ target_compile_definitions(CompatibleInterface
     $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP2>>:BOOL_PROP2>
     $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3>
 )
+
+
+add_library(iface2 SHARED iface2.cpp)
+generate_export_header(iface2)
+
+# For the LINK_LIBRARIES and related properties, we should not evaluate
+# properties defined only in the interface - they should be implicitly zero
+set_property(TARGET iface2
+  APPEND PROPERTY
+    LINK_INTERFACE_LIBRARIES $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP4>>:nonexistant>
+)
+target_link_libraries(CompatibleInterface iface2)

+ 7 - 0
Tests/CompatibleInterface/iface2.cpp

@@ -0,0 +1,7 @@
+
+#include "iface2.h"
+
+int Iface2::foo()
+{
+  return 0;
+}

+ 13 - 0
Tests/CompatibleInterface/iface2.h

@@ -0,0 +1,13 @@
+
+#ifndef IFACE2_H
+#define IFACE2_H
+
+#include "iface2_export.h"
+
+class IFACE2_EXPORT Iface2
+{
+public:
+  int foo();
+};
+
+#endif

+ 4 - 1
Tests/CompatibleInterface/main.cpp

@@ -11,7 +11,10 @@
 #error Expected BOOL_PROP3
 #endif
 
+#include "iface2.h"
+
 int main(int argc, char **argv)
 {
-  return 0;
+  Iface2 if2;
+  return if2.foo();
 }