From 6fbe3ce4ef1178cc4f2f14f281cd48ef82a11e03 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 23 Jan 2013 22:17:14 +0100 Subject: [PATCH] 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. --- Source/cmGeneratorExpressionDAGChecker.cxx | 10 ++++++++-- Tests/CompatibleInterface/CMakeLists.txt | 16 ++++++++++++++++ Tests/CompatibleInterface/iface2.cpp | 7 +++++++ Tests/CompatibleInterface/iface2.h | 13 +++++++++++++ Tests/CompatibleInterface/main.cpp | 5 ++++- 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 Tests/CompatibleInterface/iface2.cpp create mode 100644 Tests/CompatibleInterface/iface2.h diff --git a/Source/cmGeneratorExpressionDAGChecker.cxx b/Source/cmGeneratorExpressionDAGChecker.cxx index 057f4c3d5..269211b92 100644 --- a/Source/cmGeneratorExpressionDAGChecker.cxx +++ b/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); } diff --git a/Tests/CompatibleInterface/CMakeLists.txt b/Tests/CompatibleInterface/CMakeLists.txt index d0eb60f25..728065231 100644 --- a/Tests/CompatibleInterface/CMakeLists.txt +++ b/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_PROP2> $<$>: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 $<$>:nonexistant> +) +target_link_libraries(CompatibleInterface iface2) diff --git a/Tests/CompatibleInterface/iface2.cpp b/Tests/CompatibleInterface/iface2.cpp new file mode 100644 index 000000000..a9b501508 --- /dev/null +++ b/Tests/CompatibleInterface/iface2.cpp @@ -0,0 +1,7 @@ + +#include "iface2.h" + +int Iface2::foo() +{ + return 0; +} diff --git a/Tests/CompatibleInterface/iface2.h b/Tests/CompatibleInterface/iface2.h new file mode 100644 index 000000000..ef4ebeec2 --- /dev/null +++ b/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 diff --git a/Tests/CompatibleInterface/main.cpp b/Tests/CompatibleInterface/main.cpp index b7c66386c..ae0e985c8 100644 --- a/Tests/CompatibleInterface/main.cpp +++ b/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(); }