CMakeLists.txt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. cmake_minimum_required(VERSION 3.0)
  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. NUMBER_MIN_PROP3
  24. NUMBER_MIN_PROP4
  25. )
  26. set_property(TARGET iface1 APPEND PROPERTY
  27. COMPATIBLE_INTERFACE_NUMBER_MAX
  28. NUMBER_MAX_PROP1
  29. NUMBER_MAX_PROP2
  30. )
  31. set(CMAKE_DEBUG_TARGET_PROPERTIES
  32. BOOL_PROP1 BOOL_PROP2 BOOL_PROP3 BOOL_PROP4
  33. STRING_PROP1 STRING_PROP2 STRING_PROP3
  34. NUMBER_MIN_PROP1 NUMBER_MIN_PROP2 NUMBER_MIN_PROP3 NUMBER_MIN_PROP4
  35. NUMBER_MAX_PROP1 NUMBER_MAX_PROP2
  36. )
  37. set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP1 ON)
  38. set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP2 ON)
  39. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP1 prop1)
  40. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP2 prop2)
  41. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP1 100)
  42. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP2 200)
  43. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP3 0x10)
  44. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MIN_PROP4 0x10)
  45. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP1 100)
  46. set_property(TARGET iface1 PROPERTY INTERFACE_NUMBER_MAX_PROP2 200)
  47. add_executable(CompatibleInterface main.cpp)
  48. target_link_libraries(CompatibleInterface iface1)
  49. add_library(foo STATIC foo.cpp)
  50. add_library(bar SHARED bar.cpp)
  51. set_property(TARGET foo APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SOMEPROP)
  52. set_property(TARGET foo PROPERTY INTERFACE_SOMEPROP ON)
  53. # Use LINK_ONLY to suppress usage requirements and allow the check to pass.
  54. set_property(TARGET bar PROPERTY INTERFACE_LINK_LIBRARIES $<LINK_ONLY:foo>)
  55. set_property(TARGET CompatibleInterface PROPERTY SOMEPROP OFF)
  56. target_link_libraries(CompatibleInterface bar)
  57. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP2 ON)
  58. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP3 ON)
  59. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
  60. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3)
  61. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP1 50)
  62. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP2 250)
  63. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP3 0xa)
  64. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP4 0x1A)
  65. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP1 50)
  66. set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP2 250)
  67. target_compile_definitions(CompatibleInterface
  68. PRIVATE
  69. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP1>>:BOOL_PROP1>
  70. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP2>>:BOOL_PROP2>
  71. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3>
  72. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP1>,prop1>:STRING_PROP1>
  73. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP2>,prop2>:STRING_PROP2>
  74. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
  75. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP1>,50>:NUMBER_MIN_PROP1=50>
  76. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP2>,200>:NUMBER_MIN_PROP2=200>
  77. $<$<EQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP3>,0xA>:NUMBER_MIN_PROP3=0xA>
  78. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP4>,0x10>:NUMBER_MIN_PROP4=0x10>
  79. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP1>,100>:NUMBER_MAX_PROP1=100>
  80. $<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP2>,250>:NUMBER_MAX_PROP2=250>
  81. )
  82. add_library(iface2 SHARED iface2.cpp)
  83. generate_export_header(iface2)
  84. set_property(TARGET iface2 APPEND PROPERTY
  85. COMPATIBLE_INTERFACE_STRING
  86. Iface2_PROP
  87. )
  88. # For the LINK_LIBRARIES and related properties, we should not evaluate
  89. # properties defined only in the interface - they should be implicitly zero
  90. set_property(TARGET iface2
  91. APPEND PROPERTY
  92. LINK_INTERFACE_LIBRARIES $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP4>>:nonexistent>
  93. )
  94. target_link_libraries(CompatibleInterface iface2
  95. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:nonexistent>
  96. )
  97. # Test that this does not segfault:
  98. target_compile_definitions(CompatibleInterface
  99. PRIVATE
  100. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:SOME_DEFINE>
  101. )
  102. # The COMPATIBLE_INTERFACE_* properties are only read from dependencies
  103. # in the interface. Populating it on the CompatibleInterface target does
  104. # not have any effect on the interpretation of the INTERFACE variants
  105. # in dependencies.
  106. set_property(TARGET iface1 PROPERTY
  107. INTERFACE_NON_RELEVANT_PROP ON
  108. )
  109. set_property(TARGET iface2 PROPERTY
  110. INTERFACE_NON_RELEVANT_PROP ON
  111. )
  112. set_property(TARGET CompatibleInterface APPEND PROPERTY
  113. COMPATIBLE_INTERFACE_BOOL
  114. NON_RELEVANT_PROP
  115. )