CMakeLists.txt 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. cmake_minimum_required(VERSION 2.8)
  2. project(target_link_libraries)
  3. file(WRITE
  4. "${CMAKE_CURRENT_BINARY_DIR}/main.cxx"
  5. "int main() { return 0; }
  6. "
  7. )
  8. add_executable(
  9. target_link_libraries
  10. "${CMAKE_CURRENT_BINARY_DIR}/main.cxx"
  11. )
  12. macro(ASSERT_PROPERTY _target _property _value)
  13. get_target_property(_out ${_target} ${_property})
  14. if (NOT _out)
  15. set(_out "")
  16. endif()
  17. if (NOT "${_out}" STREQUAL "${_value}")
  18. message(SEND_ERROR "Target ${_target} does not have property ${_property} with value ${_value}. Actual value: ${_out}")
  19. endif()
  20. endmacro()
  21. include(GenerateExportHeader)
  22. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  23. add_library(depA SHARED depA.cpp)
  24. generate_export_header(depA)
  25. add_library(depB SHARED depB.cpp)
  26. generate_export_header(depB)
  27. target_link_libraries(depB LINK_PRIVATE depA)
  28. add_library(libgenex SHARED libgenex.cpp)
  29. generate_export_header(libgenex)
  30. set_property(TARGET depB APPEND PROPERTY
  31. LINK_LIBRARIES $<1:libgenex>
  32. )
  33. add_library(depC SHARED depC.cpp)
  34. generate_export_header(depC)
  35. target_link_libraries(depC LINK_PUBLIC depA)
  36. assert_property(depA LINK_INTERFACE_LIBRARIES "")
  37. assert_property(depB LINK_INTERFACE_LIBRARIES "")
  38. assert_property(depC LINK_INTERFACE_LIBRARIES "depA")
  39. add_executable(targetA targetA.cpp)
  40. target_link_libraries(targetA LINK_INTERFACE_LIBRARIES depA depB)
  41. assert_property(targetA LINK_INTERFACE_LIBRARIES "depA;depB")
  42. set_target_properties(targetA PROPERTIES LINK_INTERFACE_LIBRARIES "")
  43. assert_property(targetA LINK_INTERFACE_LIBRARIES "")
  44. add_subdirectory(subdir)
  45. target_link_libraries(targetA subdirlib)
  46. set_property(TARGET targetA APPEND PROPERTY
  47. INCLUDE_DIRECTORIES
  48. $<TARGET_PROPERTY:subdirlib,INTERFACE_INCLUDE_DIRECTORIES>
  49. )
  50. target_link_libraries(targetA depB depC)
  51. assert_property(targetA LINK_INTERFACE_LIBRARIES "")
  52. # Exclude depIfaceOnly from ALL so that it will only be built if something
  53. # depends on it. As it is in the link interface of depB, targetA
  54. # will depend on it. That dependency is what is being tested here.
  55. add_library(depIfaceOnly SHARED EXCLUDE_FROM_ALL depIfaceOnly.cpp)
  56. generate_export_header(depIfaceOnly)
  57. set_property(TARGET depB APPEND PROPERTY LINK_INTERFACE_LIBRARIES depIfaceOnly)