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.
This commit is contained in:
Stephen Kelly 2013-01-23 22:17:14 +01:00 committed by Brad King
parent 76ace2b95a
commit 6fbe3ce4ef
5 changed files with 48 additions and 3 deletions

View File

@ -114,8 +114,14 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries()
const cmGeneratorExpressionDAGChecker *parent = this->Parent; const cmGeneratorExpressionDAGChecker *parent = this->Parent;
while (parent) while (parent)
{ {
parent = parent->Parent;
top = 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);
} }

View File

@ -3,12 +3,16 @@ cmake_minimum_required(VERSION 2.8)
project(CompatibleInterface) project(CompatibleInterface)
include(GenerateExportHeader)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_library(iface1 empty.cpp) add_library(iface1 empty.cpp)
set_property(TARGET iface1 APPEND PROPERTY set_property(TARGET iface1 APPEND PROPERTY
COMPATIBLE_INTERFACE_BOOL COMPATIBLE_INTERFACE_BOOL
BOOL_PROP1 BOOL_PROP1
BOOL_PROP2 BOOL_PROP2
BOOL_PROP3 BOOL_PROP3
BOOL_PROP4
) )
set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP1 ON) 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_PROP2>>:BOOL_PROP2>
$<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3> $<$<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)

View File

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

View File

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

View File

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