Browse Source

Use the actual dependency list returned by the compiler.

Yao Wei Tjong 姚伟忠 11 years ago
parent
commit
4db362f95c
2 changed files with 15 additions and 9 deletions
  1. 1 2
      .gitignore
  2. 14 7
      CMake/Modules/Urho3D-CMake-common.cmake

+ 1 - 2
.gitignore

@@ -60,8 +60,7 @@ install_manifest.txt
 # Precompiled header files (in case of non out-of-source)
 # Precompiled header files (in case of non out-of-source)
 *.gch/
 *.gch/
 *.pch/
 *.pch/
-*.pch.rsp
-*-pch-trigger
+*.pch.*
 
 
 # Misc.
 # Misc.
 configure*
 configure*

+ 14 - 7
CMake/Modules/Urho3D-CMake-common.cmake

@@ -527,14 +527,21 @@ macro (enable_pch HEADER_PATHNAME)
             # Make sure the precompiled headers are not stale by creating custom rules to re-compile the header as necessary
             # Make sure the precompiled headers are not stale by creating custom rules to re-compile the header as necessary
             file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PCH_FILENAME})
             file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PCH_FILENAME})
             foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})   # These two vars are mutually exclusive
             foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})   # These two vars are mutually exclusive
+                # Generate *.rsp containing configuration specific compiler flags
                 string (TOUPPER ${CONFIG} UPPERCASE_CONFIG)
                 string (TOUPPER ${CONFIG} UPPERCASE_CONFIG)
-                file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new "${COMPILE_DEFINITIONS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPERCASE_CONFIG}} ${COMPILER_EXPORT_FLAGS} ${INCLUDE_DIRECTORIES}")
+                file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new "${COMPILE_DEFINITIONS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPERCASE_CONFIG}} ${COMPILER_EXPORT_FLAGS} ${INCLUDE_DIRECTORIES} -c -x c++-header")
                 execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp)
                 execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp)
                 file (REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new)
                 file (REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp.new)
-                add_custom_command (OUTPUT ${PCH_FILENAME}-${CONFIG}-pch-trigger
-                    COMMAND ${CMAKE_CXX_COMPILER} @${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp -c -x c++-header -o ${PCH_FILENAME}/${PCH_FILENAME}.${CONFIG} ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_PATHNAME}
-                    COMMAND ${CMAKE_COMMAND} -E touch ${PCH_FILENAME}-${CONFIG}-pch-trigger
-                    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp ${HEADER_PATHNAME}
+                # Determine the dependency list
+                execute_process (COMMAND ${CMAKE_CXX_COMPILER} @${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp -MTdeps -MM -o ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.deps ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_PATHNAME})
+                file (STRINGS ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.deps DEPS)
+                string (REPLACE deps: "" DEPS ${DEPS})  # Input variable without quotes is intentional
+                string (REPLACE " " "" DEPS "${DEPS}")  # Input variable with quotes is intentional
+                # Create the rule that depends on the included headers
+                add_custom_command (OUTPUT ${HEADER_FILENAME}.${CONFIG}.pch.trigger
+                    COMMAND ${CMAKE_CXX_COMPILER} @${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp -o ${PCH_FILENAME}/${PCH_FILENAME}.${CONFIG} ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_PATHNAME}
+                    COMMAND ${CMAKE_COMMAND} -E touch ${HEADER_FILENAME}.${CONFIG}.pch.trigger
+                    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_FILENAME}.${CONFIG}.pch.rsp ${DEPS}
                     COMMENT "Precompiling header file '${HEADER_FILENAME}' for ${CONFIG} configuration")
                     COMMENT "Precompiling header file '${HEADER_FILENAME}' for ${CONFIG} configuration")
             endforeach ()
             endforeach ()
             # Use the precompiled header file
             # Use the precompiled header file
@@ -553,11 +560,11 @@ macro (enable_pch HEADER_PATHNAME)
             if (CMAKE_CONFIGURATION_TYPES)
             if (CMAKE_CONFIGURATION_TYPES)
                 # Multi-config, trigger all rules and let the compiler to choose which precompiled header is suitable to use
                 # Multi-config, trigger all rules and let the compiler to choose which precompiled header is suitable to use
                 foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES})
                 foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES})
-                    list (APPEND TRIGGERS ${PCH_FILENAME}-${CONFIG}-pch-trigger)
+                    list (APPEND TRIGGERS ${HEADER_FILENAME}.${CONFIG}.pch.trigger)
                 endforeach ()
                 endforeach ()
             else ()
             else ()
                 # Single-config, just trigger the corresponding rule matching the current build configuration
                 # Single-config, just trigger the corresponding rule matching the current build configuration
-                set (TRIGGERS ${PCH_FILENAME}-${CMAKE_BUILD_TYPE}-pch-trigger)
+                set (TRIGGERS ${HEADER_FILENAME}.${CMAKE_BUILD_TYPE}.pch.trigger)
             endif ()
             endif ()
             list (APPEND SOURCE_FILES ${TRIGGERS})
             list (APPEND SOURCE_FILES ${TRIGGERS})
         endif ()
         endif ()