2013-01-19 14:21:14 +04:00
|
|
|
|
|
|
|
cmake_minimum_required(VERSION 2.8)
|
|
|
|
|
|
|
|
project(CompatibleInterface)
|
|
|
|
|
2013-01-24 01:17:14 +04:00
|
|
|
include(GenerateExportHeader)
|
|
|
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
|
|
|
2012-11-02 18:47:40 +04:00
|
|
|
add_library(iface1 INTERFACE)
|
2013-01-19 14:21:14 +04:00
|
|
|
set_property(TARGET iface1 APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_BOOL
|
|
|
|
BOOL_PROP1
|
|
|
|
BOOL_PROP2
|
|
|
|
BOOL_PROP3
|
2013-01-24 01:17:14 +04:00
|
|
|
BOOL_PROP4
|
2013-01-19 14:21:14 +04:00
|
|
|
)
|
2013-01-06 16:49:20 +04:00
|
|
|
set_property(TARGET iface1 APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_STRING
|
|
|
|
STRING_PROP1
|
|
|
|
STRING_PROP2
|
|
|
|
STRING_PROP3
|
|
|
|
)
|
cmTarget: Add interface for compatible numeric properties
When using the boost MPL library, one can set a define to increase
the limit of how many variadic elements should be supported. The
default for BOOST_MPL_LIMIT_VECTOR_SIZE is 20:
http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/limit-vector-size.html
If the foo library requires that to be set to 30, and the independent
bar library requires it to be set to 40, consumers of both need to set
it to 40.
add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_boost_mpl_vector_size 30)
set_property(TARGET foo PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(foo INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_library(bar INTERFACE)
set_property(TARGET bar PROPERTY INTERFACE_boost_mpl_vector_size 40)
# Technically the next two lines are redundant, but as foo and bar are
# independent, they both set these interfaces.
set_property(TARGET bar PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(bar INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_executable(user)
target_link_libraries(user foo bar)
Because the TARGET_PROPERTY reads the boost_mpl_vector_size property
from the HEAD of the dependency graph (the user target), and because
that property appears in the COMPATIBLE_INTERFACE_NUMBER_MAX of
the dependencies of the user target, the maximum value for it is
chosen for the compile definition, ie, 40.
There are also use-cases for choosing the minimum value of a number.
In Qt, deprecated API can be disabled by version. Setting the
definition QT_DISABLE_DEPRECATED_BEFORE=0 disables no deprecated
API. Setting it to 0x501000 disables API which was deprecated before
Qt 5.1 etc.
If two dependencies require the use of API which was deprecated in
different Qt versions, then COMPATIBLE_INTERFACE_NUMBER_MIN can be
used to ensure that both can compile.
2013-10-22 21:51:36 +04:00
|
|
|
set_property(TARGET iface1 APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_NUMBER_MIN
|
|
|
|
NUMBER_MIN_PROP1
|
|
|
|
NUMBER_MIN_PROP2
|
|
|
|
)
|
|
|
|
set_property(TARGET iface1 APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_NUMBER_MAX
|
|
|
|
NUMBER_MAX_PROP1
|
|
|
|
NUMBER_MAX_PROP2
|
|
|
|
)
|
2013-01-19 14:21:14 +04:00
|
|
|
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP1 ON)
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP2 ON)
|
2013-01-06 16:49:20 +04:00
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP1 prop1)
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP2 prop2)
|
cmTarget: Add interface for compatible numeric properties
When using the boost MPL library, one can set a define to increase
the limit of how many variadic elements should be supported. The
default for BOOST_MPL_LIMIT_VECTOR_SIZE is 20:
http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/limit-vector-size.html
If the foo library requires that to be set to 30, and the independent
bar library requires it to be set to 40, consumers of both need to set
it to 40.
add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_boost_mpl_vector_size 30)
set_property(TARGET foo PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(foo INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_library(bar INTERFACE)
set_property(TARGET bar PROPERTY INTERFACE_boost_mpl_vector_size 40)
# Technically the next two lines are redundant, but as foo and bar are
# independent, they both set these interfaces.
set_property(TARGET bar PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(bar INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_executable(user)
target_link_libraries(user foo bar)
Because the TARGET_PROPERTY reads the boost_mpl_vector_size property
from the HEAD of the dependency graph (the user target), and because
that property appears in the COMPATIBLE_INTERFACE_NUMBER_MAX of
the dependencies of the user target, the maximum value for it is
chosen for the compile definition, ie, 40.
There are also use-cases for choosing the minimum value of a number.
In Qt, deprecated API can be disabled by version. Setting the
definition QT_DISABLE_DEPRECATED_BEFORE=0 disables no deprecated
API. Setting it to 0x501000 disables API which was deprecated before
Qt 5.1 etc.
If two dependencies require the use of API which was deprecated in
different Qt versions, then COMPATIBLE_INTERFACE_NUMBER_MIN can be
used to ensure that both can compile.
2013-10-22 21:51:36 +04:00
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP1 100)
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP2 200)
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP1 100)
|
|
|
|
set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP2 200)
|
2013-01-19 14:21:14 +04:00
|
|
|
|
|
|
|
add_executable(CompatibleInterface main.cpp)
|
|
|
|
target_link_libraries(CompatibleInterface iface1)
|
|
|
|
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP2 ON)
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP3 ON)
|
2013-01-06 16:49:20 +04:00
|
|
|
set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3)
|
cmTarget: Add interface for compatible numeric properties
When using the boost MPL library, one can set a define to increase
the limit of how many variadic elements should be supported. The
default for BOOST_MPL_LIMIT_VECTOR_SIZE is 20:
http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/limit-vector-size.html
If the foo library requires that to be set to 30, and the independent
bar library requires it to be set to 40, consumers of both need to set
it to 40.
add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_boost_mpl_vector_size 30)
set_property(TARGET foo PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(foo INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_library(bar INTERFACE)
set_property(TARGET bar PROPERTY INTERFACE_boost_mpl_vector_size 40)
# Technically the next two lines are redundant, but as foo and bar are
# independent, they both set these interfaces.
set_property(TARGET bar PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(bar INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_executable(user)
target_link_libraries(user foo bar)
Because the TARGET_PROPERTY reads the boost_mpl_vector_size property
from the HEAD of the dependency graph (the user target), and because
that property appears in the COMPATIBLE_INTERFACE_NUMBER_MAX of
the dependencies of the user target, the maximum value for it is
chosen for the compile definition, ie, 40.
There are also use-cases for choosing the minimum value of a number.
In Qt, deprecated API can be disabled by version. Setting the
definition QT_DISABLE_DEPRECATED_BEFORE=0 disables no deprecated
API. Setting it to 0x501000 disables API which was deprecated before
Qt 5.1 etc.
If two dependencies require the use of API which was deprecated in
different Qt versions, then COMPATIBLE_INTERFACE_NUMBER_MIN can be
used to ensure that both can compile.
2013-10-22 21:51:36 +04:00
|
|
|
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP1 50)
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP2 250)
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP1 50)
|
|
|
|
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP2 250)
|
2013-01-19 14:21:14 +04:00
|
|
|
|
|
|
|
target_compile_definitions(CompatibleInterface
|
|
|
|
PRIVATE
|
|
|
|
$<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP1>>:BOOL_PROP1>
|
|
|
|
$<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP2>>:BOOL_PROP2>
|
|
|
|
$<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3>
|
2013-01-06 16:49:20 +04:00
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP1>,prop1>:STRING_PROP1>
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP2>,prop2>:STRING_PROP2>
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
|
cmTarget: Add interface for compatible numeric properties
When using the boost MPL library, one can set a define to increase
the limit of how many variadic elements should be supported. The
default for BOOST_MPL_LIMIT_VECTOR_SIZE is 20:
http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/limit-vector-size.html
If the foo library requires that to be set to 30, and the independent
bar library requires it to be set to 40, consumers of both need to set
it to 40.
add_library(foo INTERFACE)
set_property(TARGET foo PROPERTY INTERFACE_boost_mpl_vector_size 30)
set_property(TARGET foo PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(foo INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_library(bar INTERFACE)
set_property(TARGET bar PROPERTY INTERFACE_boost_mpl_vector_size 40)
# Technically the next two lines are redundant, but as foo and bar are
# independent, they both set these interfaces.
set_property(TARGET bar PROPERTY COMPATIBLE_INTERFACE_NUMBER_MAX boost_mpl_vector_size)
target_compile_definitions(bar INTERFACE BOOST_MPL_LIMIT_VECTOR_SIZE=$<TARGET_PROPERTY:boost_mpl_vector_size>)
add_executable(user)
target_link_libraries(user foo bar)
Because the TARGET_PROPERTY reads the boost_mpl_vector_size property
from the HEAD of the dependency graph (the user target), and because
that property appears in the COMPATIBLE_INTERFACE_NUMBER_MAX of
the dependencies of the user target, the maximum value for it is
chosen for the compile definition, ie, 40.
There are also use-cases for choosing the minimum value of a number.
In Qt, deprecated API can be disabled by version. Setting the
definition QT_DISABLE_DEPRECATED_BEFORE=0 disables no deprecated
API. Setting it to 0x501000 disables API which was deprecated before
Qt 5.1 etc.
If two dependencies require the use of API which was deprecated in
different Qt versions, then COMPATIBLE_INTERFACE_NUMBER_MIN can be
used to ensure that both can compile.
2013-10-22 21:51:36 +04:00
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP1>,50>:NUMBER_MIN_PROP1=50>
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP2>,200>:NUMBER_MIN_PROP2=200>
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP1>,100>:NUMBER_MAX_PROP1=100>
|
|
|
|
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP2>,250>:NUMBER_MAX_PROP2=250>
|
2013-01-19 14:21:14 +04:00
|
|
|
)
|
2013-01-24 01:17:14 +04:00
|
|
|
|
|
|
|
|
|
|
|
add_library(iface2 SHARED iface2.cpp)
|
|
|
|
generate_export_header(iface2)
|
|
|
|
|
2013-01-31 14:18:49 +04:00
|
|
|
set_property(TARGET iface2 APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_STRING
|
|
|
|
Iface2_PROP
|
|
|
|
)
|
|
|
|
|
2013-01-24 01:17:14 +04:00
|
|
|
# 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
|
2013-05-01 13:36:14 +04:00
|
|
|
LINK_INTERFACE_LIBRARIES $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP4>>:nonexistent>
|
2013-01-24 01:17:14 +04:00
|
|
|
)
|
2013-01-31 14:18:49 +04:00
|
|
|
target_link_libraries(CompatibleInterface iface2
|
2013-05-01 13:36:14 +04:00
|
|
|
$<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:nonexistent>
|
2013-01-31 14:18:49 +04:00
|
|
|
)
|
|
|
|
# Test that this does not segfault:
|
|
|
|
target_compile_definitions(CompatibleInterface
|
|
|
|
PRIVATE
|
|
|
|
$<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:SOME_DEFINE>
|
|
|
|
)
|
2013-02-07 03:43:54 +04:00
|
|
|
|
|
|
|
# The COMPATIBLE_INTERFACE_* properties are only read from dependencies
|
|
|
|
# in the interface. Populating it on the CompatibleInterface target does
|
2012-11-07 20:13:09 +04:00
|
|
|
# not have any effect on the interpretation of the INTERFACE variants
|
2013-02-07 03:43:54 +04:00
|
|
|
# in dependencies.
|
|
|
|
set_property(TARGET iface1 PROPERTY
|
|
|
|
INTERFACE_NON_RELEVANT_PROP ON
|
|
|
|
)
|
|
|
|
set_property(TARGET iface2 PROPERTY
|
|
|
|
INTERFACE_NON_RELEVANT_PROP ON
|
|
|
|
)
|
|
|
|
set_property(TARGET CompatibleInterface APPEND PROPERTY
|
|
|
|
COMPATIBLE_INTERFACE_BOOL
|
|
|
|
NON_RELEVANT_PROP
|
|
|
|
)
|