| |
| cmake_minimum_required(VERSION 2.8.12) |
| |
| project(TargetIncludeDirectories) |
| |
| macro(create_header _name) |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_name}") |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_name}/${_name}.h" "/* ${_name}.h */\n") |
| endmacro() |
| |
| create_header(bar) |
| create_header(bat) |
| create_header(foo) |
| create_header(baz) |
| create_header(bang) |
| create_header(bing) |
| create_header(bung) |
| create_header(arguments) |
| create_header(list) |
| create_header(target1) |
| create_header(target2) |
| |
| set(CMAKE_INCLUDE_CURRENT_DIR ON) |
| |
| include_directories("${CMAKE_CURRENT_BINARY_DIR}/bar") |
| include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/bang>") |
| |
| add_executable(TargetIncludeDirectories main.cpp) |
| |
| set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/bat") |
| set_property(TARGET TargetIncludeDirectories APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foo") |
| set_property(TARGET TargetIncludeDirectories APPEND PROPERTY |
| INCLUDE_DIRECTORIES "$<1:${CMAKE_CURRENT_BINARY_DIR}/bing>") |
| |
| include_directories("${CMAKE_CURRENT_BINARY_DIR}/baz") |
| include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/bung>") |
| include_directories("sing$<1:/ting>") |
| |
| include_directories("$<1:${CMAKE_CURRENT_BINARY_DIR}/arguments;${CMAKE_CURRENT_BINARY_DIR}/list>") |
| |
| create_header(fee) |
| create_header(fiy) |
| create_header(foh) |
| create_header(fum) |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp" "#include \"fee.h\"\n") |
| add_library(lib1 "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp") |
| set_property(TARGET lib1 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fee") |
| set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy") |
| set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:${CMAKE_CURRENT_BINARY_DIR}/foh>") |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp" "#include \"fiy.h\"\n") |
| add_library(lib2 "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp") |
| set_property(TARGET lib2 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fum;$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>") |
| set_property(TARGET lib2 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>") |
| |
| 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") |
| add_executable(exe3 "${CMAKE_CURRENT_BINARY_DIR}/main3.cpp") |
| set_property(TARGET exe3 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib2,INTERFACE_INCLUDE_DIRECTORIES>") |
| |
| # Test cycles |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib3.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n") |
| add_library(lib3 "${CMAKE_CURRENT_BINARY_DIR}/lib3.cpp") |
| set_property(TARGET lib3 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy;$<TARGET_PROPERTY:lib4,INTERFACE_INCLUDE_DIRECTORIES>") |
| set_property(TARGET lib3 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy;$<TARGET_PROPERTY:lib4,INTERFACE_INCLUDE_DIRECTORIES>") |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib4.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n") |
| add_library(lib4 "${CMAKE_CURRENT_BINARY_DIR}/lib4.cpp") |
| set_property(TARGET lib4 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foh;$<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>") |
| set_property(TARGET lib4 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/foh;$<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>") |
| |
| add_library(somelib::withcolons UNKNOWN IMPORTED) |
| set_property(TARGET somelib::withcolons PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/target1") |
| set_property(TARGET somelib::withcolons PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/target1") |
| |
| set_property(TARGET TargetIncludeDirectories |
| APPEND PROPERTY INCLUDE_DIRECTORIES |
| "$<TARGET_PROPERTY:somelib::withcolons,INTERFACE_INCLUDE_DIRECTORIES>" |
| ) |
| |
| add_library(somelib_aliased UNKNOWN IMPORTED GLOBAL) |
| set_property(TARGET somelib_aliased PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/target2") |
| add_library(somelib::withcolons2 ALIAS somelib_aliased) |
| |
| set_property(TARGET TargetIncludeDirectories |
| APPEND PROPERTY INCLUDE_DIRECTORIES |
| "$<TARGET_PROPERTY:somelib::withcolons2,INTERFACE_INCLUDE_DIRECTORIES>" |
| ) |
| |
| add_custom_target(test_custom_target |
| "some_bogus_custom_tool" |
| $<TARGET_PROPERTY:TargetIncludeDirectories,COMPILE_DEFINITIONS> |
| WORKING_DIRECTORY |
| "${CMAKE_CURRENT_SOURCE_DIR}") |
| |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bad") |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/bad/common.h" "#error Should not be included\n") |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/good") |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/good/common.h" "#include \"othergood.h\"\n") |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/othergood") |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/othergood/othergood.h" "/* No error */\n") |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libothergood.cpp" "// No content \n") |
| add_library(libothergood "${CMAKE_CURRENT_BINARY_DIR}/libothergood.cpp") |
| set_property(TARGET libothergood APPEND PROPERTY |
| INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/othergood" |
| ) |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libgood.cpp" "// No content \n") |
| add_library(libgood "${CMAKE_CURRENT_BINARY_DIR}/libgood.cpp") |
| set_property(TARGET libgood APPEND PROPERTY |
| INTERFACE_INCLUDE_DIRECTORIES |
| "${CMAKE_CURRENT_BINARY_DIR}/good;$<TARGET_PROPERTY:libothergood,INTERFACE_INCLUDE_DIRECTORIES>" |
| ) |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libbad.cpp" "// No content \n") |
| add_library(libbad "${CMAKE_CURRENT_BINARY_DIR}/libbad.cpp") |
| set_property(TARGET libbad APPEND PROPERTY |
| INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/bad" |
| ) |
| |
| add_library(lib6 SHARED other.cpp) |
| add_library(lib7 SHARED other.cpp) |
| target_link_libraries(lib7 $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:lib6>) |
| target_include_directories(lib7 PUBLIC $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:/lib7/include>) |
| add_custom_target(head_target_test "some_bogus_custom_tool \"$<TARGET_PROPERTY:lib7,INCLUDE_DIRECTORIES>$<TARGET_PROPERTY:lib7,INTERFACE_INCLUDE_DIRECTORIES>\"") |
| |
| add_library(includes_source_good empty.cpp) |
| target_include_directories(includes_source_good |
| INTERFACE |
| "${CMAKE_CURRENT_BINARY_DIR}/good" |
| "${CMAKE_CURRENT_BINARY_DIR}/othergood/" |
| ) |
| add_library(includes_source_bad empty.cpp) |
| target_include_directories(includes_source_bad |
| INTERFACE |
| "${CMAKE_CURRENT_BINARY_DIR}/bad" |
| ) |
| |
| add_library(includes_proxy SHARED empty.cpp) |
| target_link_libraries(includes_proxy includes_source_good) |
| target_link_libraries(includes_proxy LINK_INTERFACE_LIBRARIES includes_source_bad) |
| add_executable(copy_includes copy_includes.cpp) |
| target_include_directories(copy_includes PRIVATE $<TARGET_PROPERTY:includes_proxy,INCLUDE_DIRECTORIES>) |
| |
| |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib5.cpp" "#include \"common.h\"\n") |
| add_library(lib5 "${CMAKE_CURRENT_BINARY_DIR}/lib5.cpp") |
| |
| # Assuming the link order must be: |
| target_link_libraries(lib5 libbad libgood) |
| |
| # Oops!. |
| # As include directory order and link order are the same when using target_link_libraries, we have to |
| # get the libgood includes in before the libbad includes. |
| # We do that with this command: |
| target_include_directories(lib5 |
| BEFORE PRIVATE $<TARGET_PROPERTY:libgood,INTERFACE_INCLUDE_DIRECTORIES> |
| ) |
| |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/prefix_foo/prefix_bar/prefix_bat") |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/prefix_foo/prefix_bar/prefix_bat/prefix_foo_bar_bat.h" "/* prefix_foo_bar_bat.h */\n") |
| |
| target_include_directories(TargetIncludeDirectories PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/prefix_$<JOIN:foo;bar;bat,/prefix_>") |
| |
| # Test that the language generator expressions work |
| set_property(TARGET TargetIncludeDirectories |
| APPEND PROPERTY INCLUDE_DIRECTORIES |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,C>:${CMAKE_CURRENT_BINARY_DIR}/bad>" |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:${CMAKE_CURRENT_BINARY_DIR}/good>" |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:${CMAKE_CURRENT_BINARY_DIR}/othergood/>" |
| ) |
| |
| add_executable(TargetIncludeDirectories_C main.c) |
| set_property(TARGET TargetIncludeDirectories_C |
| APPEND PROPERTY INCLUDE_DIRECTORIES |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:${CMAKE_CURRENT_BINARY_DIR}/bad>" |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,C>:${CMAKE_CURRENT_BINARY_DIR}/good>" |
| "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,C>:${CMAKE_CURRENT_BINARY_DIR}/othergood/>" |
| ) |