[CMake] Problem with precompiled header attempts

Oliver Smith osmith at playnet.com
Sun Feb 26 21:12:06 EST 2012


I've spent all day trying to get a single precompiled header to work on 
a series of targets within a rather complex project. I'll profess to a 
fair amount of stabbing in the dark.

I came up with the following, but it doesn't bother building the PCH 
until the *end* of the first target. And then it fails because it 
doesn't have the compiler definitions needed.

So, how do I get my ADD_PCH(targetname) macro to prioritize the PCH 
file, without making it always build the pch?

Note: All of the candidate targets use the project include files, 
compiler flags and definitions.//

8x --- snip --- x8

    SET(_PCH_SRC "${Project_SOURCE_DIR}/cfg/syscfg.h")
    SET(_PCH_HDR ${_PCH_SRC})	# Viable as a dependency name.
    IF ( _USE_PCH )
         IF (WINDOWS)
             SET(_PCH_HDR "${_PCH_SRC}.pch")
         ELSE ()
             SET(_PCH_HDR "${_PCH_SRC}.gch")
         ENDIF()
         SET(_pchFlags "${CMAKE_CXX_FLAGS}")
         GET_DIRECTORY_PROPERTY(_pcfIncludePaths INCLUDE_DIRECTORIES)
         FOREACH (_inc ${_pcfIncludePaths})
             LIST(APPEND _pchFlags "-I" ${_inc})
         ENDFOREACH()
         GET_DIRECTORY_PROPERTY(_pcfIncludePaths COMPILE_DEFINITIONS)
         FOREACH (_inc ${_pcfIncludePaths})
             LIST(APPEND _pchFlags "-D" ${_inc})
         ENDFOREACH()
         SEPARATE_ARGUMENTS(_pchFlags)
         ADD_CUSTOM_COMMAND(
                 PRE_BUILD
                 OUTPUT ${_PCH_HDR}
                 COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} ${_pchFlags} -o ${_PCH_HDR} ${_PCH_SRC}
                 MAIN_DEPENDENCY ${_PCH_SRC}
                 IMPLICIT_DEPENDS CXX ${_PCH_SRC}
                 DEPENDS ${_PCH_SRC}
         )
    ENDIF ( _USE_PCH )

    MACRO(ADD_PCH _TARGET)
      IF ( WW2_USE_PCH )
       MESSAGE(STATUS "Adding pch to ${_TARGET}")
       add_dependencies(${_TARGET} ${_PCH_HDR})
      ENDIF ( )
    ENDMACRO()

8x --- snip --- x8

For bonus points: The business of having to copy the include paths and 
compiler definitions seems really clumsy, it's horribly platform 
dependent. Surely there's a better way say "build it the same way you'd 
build anything else in this directory"????

- Oliver

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120226/aae2e579/attachment.htm>


More information about the CMake mailing list