CMakeLists.txt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. cmake_minimum_required(VERSION 2.8)
  2. project(TargetIncludeDirectories)
  3. macro(create_header _name)
  4. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_name}")
  5. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_name}/${_name}.h" "//${_name}.h\n")
  6. endmacro()
  7. create_header(bar)
  8. create_header(bat)
  9. create_header(foo)
  10. create_header(baz)
  11. create_header(bang)
  12. create_header(bing)
  13. create_header(bung)
  14. create_header(arguments)
  15. create_header(list)
  16. create_header(target)
  17. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  18. include_directories("${CMAKE_CURRENT_BINARY_DIR}/bar")
  19. include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/bang>")
  20. add_executable(TargetIncludeDirectories main.cpp)
  21. set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/bat")
  22. set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foo")
  23. set_property(TARGET TargetIncludeDirectories APPEND PROPERTY
  24. INCLUDE_DIRECTORIES "$<1:${CMAKE_CURRENT_BINARY_DIR}/bing>")
  25. include_directories("${CMAKE_CURRENT_BINARY_DIR}/baz")
  26. include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/bung>")
  27. include_directories("sing$<1:/ting>")
  28. include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/arguments;${CMAKE_CURRENT_BINARY_DIR}/list>")
  29. create_header(fee)
  30. create_header(fiy)
  31. create_header(foh)
  32. create_header(fum)
  33. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp" "#include \"fee.h\"\n")
  34. add_library(lib1 "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp")
  35. set_property(TARGET lib1 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fee")
  36. set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy")
  37. set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:${CMAKE_CURRENT_BINARY_DIR}/foh>")
  38. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp" "#include \"fiy.h\"\n")
  39. add_library(lib2 "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp")
  40. set_property(TARGET lib2 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fum;$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>")
  41. set_property(TARGET lib2 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>")
  42. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main3.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n#include \"fum.h\"\nint main(int,char**) { return 0; }\n")
  43. add_executable(exe3 "${CMAKE_CURRENT_BINARY_DIR}/main3.cpp")
  44. set_property(TARGET exe3 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib2,INTERFACE_INCLUDE_DIRECTORIES>")
  45. # Test cycles
  46. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib3.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n")
  47. add_library(lib3 "${CMAKE_CURRENT_BINARY_DIR}/lib3.cpp")
  48. set_property(TARGET lib3 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy;$<TARGET_PROPERTY:lib4,INTERFACE_INCLUDE_DIRECTORIES>")
  49. set_property(TARGET lib3 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy;$<TARGET_PROPERTY:lib4,INTERFACE_INCLUDE_DIRECTORIES>")
  50. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib4.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n")
  51. add_library(lib4 "${CMAKE_CURRENT_BINARY_DIR}/lib4.cpp")
  52. set_property(TARGET lib4 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foh;$<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>")
  53. set_property(TARGET lib4 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foh;$<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>")
  54. add_library(somelib::withcolons UNKNOWN IMPORTED)
  55. set_property(TARGET somelib::withcolons PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/target")
  56. set_property(TARGET somelib::withcolons PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/target")
  57. set_property(TARGET TargetIncludeDirectories
  58. APPEND PROPERTY INCLUDE_DIRECTORIES
  59. "$<TARGET_PROPERTY:somelib::withcolons,INTERFACE_INCLUDE_DIRECTORIES>"
  60. )
  61. add_custom_target(test_custom_target
  62. "some_bogus_custom_tool"
  63. $<TARGET_PROPERTY:TargetIncludeDirectories,COMPILE_DEFINITIONS>
  64. WORKING_DIRECTORY
  65. "${CMAKE_CURRENT_SOURCE_DIR}")
  66. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bad")
  67. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/bad/common.h" "#error Should not be included\n")
  68. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/good")
  69. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/good/common.h" "#include \"othergood.h\"\n")
  70. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/othergood")
  71. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/othergood/othergood.h" "// No error\n")
  72. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libothergood.cpp" "// No content \n")
  73. add_library(libothergood "${CMAKE_CURRENT_BINARY_DIR}/libothergood.cpp")
  74. set_property(TARGET libothergood APPEND PROPERTY
  75. INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/othergood"
  76. )
  77. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libgood.cpp" "// No content \n")
  78. add_library(libgood "${CMAKE_CURRENT_BINARY_DIR}/libgood.cpp")
  79. set_property(TARGET libgood APPEND PROPERTY
  80. INTERFACE_INCLUDE_DIRECTORIES
  81. "${CMAKE_CURRENT_BINARY_DIR}/good;$<TARGET_PROPERTY:libothergood,INTERFACE_INCLUDE_DIRECTORIES>"
  82. )
  83. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libbad.cpp" "// No content \n")
  84. add_library(libbad "${CMAKE_CURRENT_BINARY_DIR}/libbad.cpp")
  85. set_property(TARGET libbad APPEND PROPERTY
  86. INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/bad"
  87. )
  88. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib5.cpp" "#include \"common.h\"\n")
  89. add_library(lib5 "${CMAKE_CURRENT_BINARY_DIR}/lib5.cpp")
  90. # Assuming the link order must be:
  91. target_link_libraries(lib5 libbad libgood)
  92. # Oops!.
  93. # As include directory order and link order are the same when using target_link_libraries, we have to
  94. # get the libgood includes in before the libbad includes.
  95. # We do that with this command:
  96. target_include_directories(lib5
  97. BEFORE PRIVATE $<LINKED:libgood>
  98. )