CMakeLists.txt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. cmake_minimum_required(VERSION 2.8)
  2. project(CompatibleInterface)
  3. include(GenerateExportHeader)
  4. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  5. add_library(iface1 INTERFACE)
  6. set_property(TARGET iface1 APPEND PROPERTY
  7. COMPATIBLE_INTERFACE_BOOL
  8. BOOL_PROP1
  9. BOOL_PROP2
  10. BOOL_PROP3
  11. BOOL_PROP4
  12. )
  13. set_property(TARGET iface1 APPEND PROPERTY
  14. COMPATIBLE_INTERFACE_STRING
  15. STRING_PROP1
  16. STRING_PROP2
  17. STRING_PROP3
  18. )
  19. set_property(TARGET iface1 APPEND PROPERTY
  20. COMPATIBLE_INTERFACE_NUMBER_MIN
  21. NUMBER_MIN_PROP1
  22. NUMBER_MIN_PROP2
  23. )
  24. set_property(TARGET iface1 APPEND PROPERTY
  25. COMPATIBLE_INTERFACE_NUMBER_MAX
  26. NUMBER_MAX_PROP1
  27. NUMBER_MAX_PROP2
  28. )
  29. set(CMAKE_DEBUG_TARGET_PROPERTIES
  30. BOOL_PROP1 BOOL_PROP2 BOOL_PROP3 BOOL_PROP4
  31. STRING_PROP1 STRING_PROP2 STRING_PROP3
  32. NUMBER_MIN_PROP1 NUMBER_MIN_PROP2
  33. NUMBER_MAX_PROP1 NUMBER_MAX_PROP2
  34. )
  35. set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP1 ON)
  36. set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP2 ON)
  37. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP1 prop1)
  38. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP2 prop2)
  39. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP1 100)
  40. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP2 200)
  41. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP1 100)
  42. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP2 200)
  43. add_executable(CompatibleInterface main.cpp)
  44. target_link_libraries(CompatibleInterface iface1)
  45. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP2 ON)
  46. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP3 ON)
  47. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
  48. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3)
  49. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP1 50)
  50. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP2 250)
  51. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP1 50)
  52. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP2 250)
  53. target_compile_definitions(CompatibleInterface
  54. PRIVATE
  55. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP1>>:BOOL_PROP1>
  56. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP2>>:BOOL_PROP2>
  57. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3>
  58. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP1>,prop1>:STRING_PROP1>
  59. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP2>,prop2>:STRING_PROP2>
  60. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
  61. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP1>,50>:NUMBER_MIN_PROP1=50>
  62. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP2>,200>:NUMBER_MIN_PROP2=200>
  63. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP1>,100>:NUMBER_MAX_PROP1=100>
  64. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP2>,250>:NUMBER_MAX_PROP2=250>
  65. )
  66. add_library(iface2 SHARED iface2.cpp)
  67. generate_export_header(iface2)
  68. set_property(TARGET iface2 APPEND PROPERTY
  69. COMPATIBLE_INTERFACE_STRING
  70. Iface2_PROP
  71. )
  72. # For the LINK_LIBRARIES and related properties, we should not evaluate
  73. # properties defined only in the interface - they should be implicitly zero
  74. set_property(TARGET iface2
  75. APPEND PROPERTY
  76. LINK_INTERFACE_LIBRARIES $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP4>>:nonexistent>
  77. )
  78. target_link_libraries(CompatibleInterface iface2
  79. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:nonexistent>
  80. )
  81. # Test that this does not segfault:
  82. target_compile_definitions(CompatibleInterface
  83. PRIVATE
  84. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:SOME_DEFINE>
  85. )
  86. # The COMPATIBLE_INTERFACE_* properties are only read from dependencies
  87. # in the interface. Populating it on the CompatibleInterface target does
  88. # not have any effect on the interpretation of the INTERFACE variants
  89. # in dependencies.
  90. set_property(TARGET iface1 PROPERTY
  91. INTERFACE_NON_RELEVANT_PROP ON
  92. )
  93. set_property(TARGET iface2 PROPERTY
  94. INTERFACE_NON_RELEVANT_PROP ON
  95. )
  96. set_property(TARGET CompatibleInterface APPEND PROPERTY
  97. COMPATIBLE_INTERFACE_BOOL
  98. NON_RELEVANT_PROP
  99. )