diff options
Diffstat (limited to 'cmake/macros/FindPCHSupport.cmake')
| -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(  | 
