diff options
author | Naios <naios-dev@live.de> | 2016-03-13 17:57:26 +0100 |
---|---|---|
committer | Naios <naios-dev@live.de> | 2016-03-19 23:19:51 +0100 |
commit | 853eee75b0f36b7d26262df50ba477d8ab96dfe6 (patch) | |
tree | 8fe87ad28d98e476648c719d34bc5a78c64a2d25 | |
parent | b0ac332d58cc7d7e2da4ba26efc2f3416c674784 (diff) |
CMake: Add inherited include directories and definitions to precompiled headers
(cherry picked from commit 2413a82b9343178b613bc6309125eecec8aa9123)
-rw-r--r-- | cmake/macros/FindPCHSupport.cmake | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/cmake/macros/FindPCHSupport.cmake b/cmake/macros/FindPCHSupport.cmake index 49d4be904d1..6edc8e92890 100644 --- a/cmake/macros/FindPCHSupport.cmake +++ b/cmake/macros/FindPCHSupport.cmake @@ -1,17 +1,49 @@ -FUNCTION(GET_COMMON_PCH_PARAMS PCH_HEADER PCH_FE INCLUDE_PREFIX) +FUNCTION(GET_COMMON_PCH_PARAMS TARGET_NAME_LIST PCH_HEADER PCH_FE INCLUDE_PREFIX) GET_FILENAME_COMPONENT(PCH_HEADER_N ${PCH_HEADER} NAME) GET_DIRECTORY_PROPERTY(TARGET_INCLUDES INCLUDE_DIRECTORIES) + # Stores the inherited dependency definitions and include directories + # from the given target into the given variables + MACRO(CollectIncludes target inherited_includes inherited_definitions) + # Append the includes and definitions of the current target to the list + get_property(included TARGET ${target} PROPERTY INTERFACE_INCLUDE_DIRECTORIES) + LIST(APPEND "${inherited_includes}" ${included}) + get_property(definitions TARGET ${target} PROPERTY INTERFACE_COMPILE_DEFINITIONS) + FOREACH(def ${definitions}) + LIST(APPEND "${inherited_definitions}" "-D${def}") + ENDFOREACH() + # Add all inherited link targets which weren't included already + get_property(links TARGET ${target} PROPERTY INTERFACE_LINK_LIBRARIES) + # TODO Maybe catch circular dependencies? + FOREACH(target_link ${links}) + IF(TARGET ${target_link}) + CollectIncludes(${target_link} "${inherited_includes}" "${inherited_definitions}") + ENDIF() + ENDFOREACH() + ENDMACRO() + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + CollectIncludes(${TARGET_NAME} TARGET_INCLUDES TARGET_DEFINITIONS) + ENDFOREACH() + + LIST(REMOVE_DUPLICATES TARGET_INCLUDES) + LIST(REMOVE_DUPLICATES TARGET_DEFINITIONS) + FOREACH(ITEM ${TARGET_INCLUDES}) LIST(APPEND INCLUDE_FLAGS_LIST "${INCLUDE_PREFIX}\"${ITEM}\" ") ENDFOREACH(ITEM) + SET(PCH_INCLUDES ${TARGET_INCLUDES} PARENT_SCOPE) + SET(PCH_DEFINITIONS ${TARGET_DEFINITIONS} PARENT_SCOPE) SET(PCH_HEADER_NAME ${PCH_HEADER_N} PARENT_SCOPE) SET(PCH_HEADER_OUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_N}.${PCH_FE} PARENT_SCOPE) SET(INCLUDE_FLAGS ${INCLUDE_FLAGS_LIST} PARENT_SCOPE) ENDFUNCTION(GET_COMMON_PCH_PARAMS) FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME_LIST INCLUDE_FLAGS IN PCH_SRC OUT) + include_directories(${PCH_INCLUDES}) + add_definitions(${PCH_DEFINITIONS}) + IF (CMAKE_BUILD_TYPE) STRING(TOUPPER _${CMAKE_BUILD_TYPE} CURRENT_BUILD_TYPE) ENDIF () @@ -62,7 +94,7 @@ FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME_LIST INCLUDE_FLAGS IN PCH_SRC OUT) ENDFUNCTION(GENERATE_CXX_PCH_COMMAND) FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "gch" "-I") + GET_COMMON_PCH_PARAMS("${TARGET_NAME_LIST}" ${PCH_HEADER} "gch" "-I") GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) @@ -74,7 +106,7 @@ FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) ENDFUNCTION(ADD_CXX_PCH_GCC) FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "-I") + GET_COMMON_PCH_PARAMS("${TARGET_NAME_LIST}" ${PCH_HEADER} "pch" "-I") GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) @@ -86,7 +118,7 @@ FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) ENDFUNCTION(ADD_CXX_PCH_CLANG) FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "/I") + GET_COMMON_PCH_PARAMS("${TARGET_NAME_LIST}" ${PCH_HEADER} "pch" "/I") FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) SET_TARGET_PROPERTIES( |