aboutsummaryrefslogtreecommitdiff
path: root/cmake/macros
diff options
context:
space:
mode:
authorNaios <naios-dev@live.de>2016-03-13 17:57:26 +0100
committerNaios <naios-dev@live.de>2016-03-19 23:19:51 +0100
commit853eee75b0f36b7d26262df50ba477d8ab96dfe6 (patch)
tree8fe87ad28d98e476648c719d34bc5a78c64a2d25 /cmake/macros
parentb0ac332d58cc7d7e2da4ba26efc2f3416c674784 (diff)
CMake: Add inherited include directories and definitions to precompiled headers
(cherry picked from commit 2413a82b9343178b613bc6309125eecec8aa9123)
Diffstat (limited to 'cmake/macros')
-rw-r--r--cmake/macros/FindPCHSupport.cmake40
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(