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:
parent
76ace2b95a
commit
6fbe3ce4ef
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
#include "iface2.h"
|
||||||
|
|
||||||
|
int Iface2::foo()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
#ifndef IFACE2_H
|
||||||
|
#define IFACE2_H
|
||||||
|
|
||||||
|
#include "iface2_export.h"
|
||||||
|
|
||||||
|
class IFACE2_EXPORT Iface2
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int foo();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue