CMakeLists.txt 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. cmake_minimum_required(VERSION 2.8)
  2. project(CompatibleInterface)
  3. include(GenerateExportHeader)
  4. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  5. add_library(iface1 empty.cpp)
  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 PROPERTY INTERFACE_BOOL_PROP1 ON)
  20. set_property(TARGET iface1 PROPERTY INTERFACE_BOOL_PROP2 ON)
  21. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP1 prop1)
  22. set_property(TARGET iface1 PROPERTY INTERFACE_STRING_PROP2 prop2)
  23. add_executable(CompatibleInterface main.cpp)
  24. target_link_libraries(CompatibleInterface iface1)
  25. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP2 ON)
  26. set_property(TARGET CompatibleInterface PROPERTY BOOL_PROP3 ON)
  27. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
  28. set_property(TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3)
  29. target_compile_definitions(CompatibleInterface
  30. PRIVATE
  31. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP1>>:BOOL_PROP1>
  32. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP2>>:BOOL_PROP2>
  33. $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP3>>:BOOL_PROP3>
  34. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP1>,prop1>:STRING_PROP1>
  35. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP2>,prop2>:STRING_PROP2>
  36. $<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
  37. )
  38. add_library(iface2 SHARED iface2.cpp)
  39. generate_export_header(iface2)
  40. set_property(TARGET iface2 APPEND PROPERTY
  41. COMPATIBLE_INTERFACE_STRING
  42. Iface2_PROP
  43. )
  44. # For the LINK_LIBRARIES and related properties, we should not evaluate
  45. # properties defined only in the interface - they should be implicitly zero
  46. set_property(TARGET iface2
  47. APPEND PROPERTY
  48. LINK_INTERFACE_LIBRARIES $<$<BOOL:$<TARGET_PROPERTY:BOOL_PROP4>>:nonexistant>
  49. )
  50. target_link_libraries(CompatibleInterface iface2
  51. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:nonexistant>
  52. )
  53. # Test that this does not segfault:
  54. target_compile_definitions(CompatibleInterface
  55. PRIVATE
  56. $<$<BOOL:$<TARGET_PROPERTY:Iface2_PROP>>:SOME_DEFINE>
  57. )
  58. # The COMPATIBLE_INTERFACE_* properties are only read from dependencies
  59. # in the interface. Populating it on the CompatibleInterface target does
  60. # not have any affect on the interpretation of the INTERFACE variants
  61. # in dependencies.
  62. set_property(TARGET iface1 PROPERTY
  63. INTERFACE_NON_RELEVANT_PROP ON
  64. )
  65. set_property(TARGET iface2 PROPERTY
  66. INTERFACE_NON_RELEVANT_PROP ON
  67. )
  68. set_property(TARGET CompatibleInterface APPEND PROPERTY
  69. COMPATIBLE_INTERFACE_BOOL
  70. NON_RELEVANT_PROP
  71. )