[CMake] Precompiled headers

Anders Backman andersb at cs.umu.se
Tue May 6 16:10:20 EDT 2008


Ok, that make sense of course...Just read the 2.6 documentation.

Is there anyone that have tried to use this script in visualstudio
lately with good result?

I get quite a few very confusing errors and warnings related to this:


2>------ Build started: Project: agx_rendering, Configuration: Debug
Win32 ------
2>Generating pch.h.pch
2>pch.cpp
2>Compiling...
2>main.cpp
2>.\src\agxOSG\main.cpp(1) : warning C4653: compiler option
'Optimizations (one or more of /Oawstgp[y]) or debug checks (one or
more of /GZ, /RTCcsu)' inconsistent with precompiled header; current
command-line option ignored
2>.\src\agxOSG\main.cpp(1) : error C2855: command-line option '/Zi'
inconsistent with precompiled header
2>.\src\agxOSG\main.cpp(1) : error C2859:
c:\projects\algoryx\anders\rendering\debug\agx_rendering.pdb is not
the pdb file that was used when this precompiled header was created,
recreate the precompiled header.
2>.\src\agxOSG\main.cpp(1) : error C2859:
c:\projects\algoryx\anders\rendering\debug\agx_rendering.idb is not
the idb file that was used when this precompiled header was created,
recreate the precompiled header.
2>agx_rendering.h
2>.\include\agxOSG\agx_rendering.h(1) : warning C4653: compiler option
'Optimizations (one or more of /Oawstgp[y]) or debug checks (one or
more of /GZ, /RTCcsu)' inconsistent with precompiled header; current
command-line option ignored
2>.\include\agxOSG\agx_rendering.h(1) : error C2855: command-line
option '/Zi' inconsistent with precompiled header
2>.\include\agxOSG\agx_rendering.h(1) : error C2859:
c:\projects\algoryx\anders\rendering\debug\agx_rendering.pdb is not
the pdb file that was used when this precompiled header was created,
recreate the precompiled header.
2>.\include\agxOSG\agx_rendering.h(1) : error C2859:
c:\projects\algoryx\anders\rendering\debug\agx_rendering.idb is not
the idb file that was used when this precompiled header was created,
recreate the precompiled header.
2>Generating Code...


Tampering a bit with the settings, for example setting
C++->General->Debug Information Format to Disabled, makes it build...

However this also disables debugging more or less.
So Im still struggling with how to get a larger project to work with
this. I guess I need to read up on precompiled headers...

Before spending too much time on this, is there anyone with good
experiences from using pch/cmake/visual studio?

/Anders

On Tue, May 6, 2008 at 9:11 PM, Anders Backman <andersb at cs.umu.se> wrote:
> Hi and thanks for the tip...
>
>  However, when I try this (Im using VS2008, CMake 2.4-patch 8) I get
>  some problems.
>  I have nailed this down to the following command:
>
>
>
>  #usual add_executable etc... works just fine!
>  add_executable(rendering file1.cpp ...)
>  .
>  .
>  .
>
>  get_target_property(OBJECT_FILES rendering SOURCES)
>  message("Msg: ${OBJECT_FILES}")
>
>
>
>  Output is:
>
>  Msg: NOTFOUND
>
>
>  Now I have tried quite a few various properties, and it seems to not
>  give me much output what so ever...
>
>  There are a few properties that actually works:
>
>  DEBUG_LOCATION
>  TYPE
>
>  That is, the one documented at: http://www.cmake.org/HTML/CMake-2.4.html
>
>  So, what version of cmake are you using?
>  Or are the SOURCES property a platform dependent property?
>
>  /Anders
>
>
>
>
>  On Tue, May 6, 2008 at 4:06 PM, Rodolfo Lima <rodolfo at rodsoft.org> wrote:
>  > Anders Backman escreveu:
>  >
>  >
>  >
>  > > So is there are portable way of handling this in cmake?
>  > >
>  >
>  >  I've been using the attached script and it has been working nicely for my
>  > needs.
>  >
>  >  The usage is:
>  >
>  >
>  >  include(PCHSupport)
>  >  add_executable(test test.cpp pch.h)
>  >  ADD_PRECOMPILED_HEADER(test pch.h)
>  >
>  >  I'm using it with gcc, but it should work with MS Visual Studio too.
>  >
>  >  Regards,
>  >  rod
>  >
>  > # - Try to find precompiled headers support for GCC 3.4 and 4.x
>  >  # Once done this will define:
>  >  #
>  >  # Variable:
>  >  #   PCHSupport_FOUND
>  >  #
>  >  # Macro:
>  >  #   ADD_PRECOMPILED_HEADER  _targetName _input  _dowarn
>  >
>  >  set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
>  >
>  >  IF(CMAKE_COMPILER_IS_GNUCXX)
>  >     # Verifies if GCC supports precompiled header
>  >     # Its version should be >= 3.4.0
>  >     EXEC_PROGRAM(
>  >         ${CMAKE_CXX_COMPILER}
>  >         ARGS    ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
>  >         OUTPUT_VARIABLE gcc_compiler_version)
>  >         #MESSAGE("GCC Version: ${gcc_compiler_version}")
>  >     IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
>  >         SET(PCHSupport_FOUND TRUE)
>  >     ELSE()
>  >         IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
>  >             SET(PCHSupport_FOUND TRUE)
>  >         ENDIF()
>  >     ENDIF()
>  >
>  >         SET(_PCH_include_prefix -I)
>  >  ELSE()
>  >     IF(WIN32)
>  >         SET(PCHSupport_FOUND TRUE) # for experimental msvc support
>  >         SET(_PCH_include_prefix /I)
>  >     ELSE()
>  >         SET(PCHSupport_FOUND FALSE)
>  >     ENDIF()
>  >  ENDIF()
>  >
>  >
>  >  MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags)
>  >     SET(${_out_compile_flags} ${CMAKE_CXX_FLAGS} )
>  >
>  >     STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
>  >     if(${_flags_var_name})
>  >         list(APPEND ${_out_compile_flags} ${${_flags_var_name}} )
>  >     endif(${_flags_var_name})
>  >
>  >     # If the compiler is g++ and the target type is shared library, we have
>  >     # to add -fPIC to its compile flags.
>  >     IF(CMAKE_COMPILER_IS_GNUCXX)
>  >         GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE)
>  >         IF(${_targetType} STREQUAL SHARED_LIBRARY)
>  >             LIST(APPEND ${_out_compile_flags} -fPIC)
>  >         ENDIF()
>  >     ELSE(MSVC)
>  >         LIST(APPEND ${_out_compile_flags}
>  > /Fd${CMAKE_CURRENT_BINARY_DIR}/${_PCH_current_target}.pdb)
>  >     ENDIF()
>  >
>  >     # Add all include directives...
>  >     GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES )
>  >     FOREACH(item ${DIRINC})
>  >         LIST(APPEND ${_out_compile_flags} ${_PCH_include_prefix}${item})
>  >     ENDFOREACH(item)
>  >
>  >     # Add all definitions...
>  >     GET_TARGET_PROPERTY(_compiler_flags ${_PCH_current_target}
>  > COMPILE_FLAGS)
>  >         if(_compiler_flags)
>  >                 LIST(APPEND ${_out_compile_flags} ${_compiler_flags})
>  >         endif()
>  >
>  >     GET_DIRECTORY_PROPERTY(_directory_flags COMPILE_DEFINITIONS)
>  >         if(_directory_flags)
>  >                 foreach(flag ${_directory_flags})
>  >                         LIST(APPEND ${_out_compile_flags} -D${flag})
>  >                 endforeach(flag)
>  >         endif(_directory_flags)
>  >
>  >     STRING(TOUPPER "COMPILE_DEFINITIONS_${CMAKE_BUILD_TYPE}"
>  > _defs_prop_name)
>  >     GET_DIRECTORY_PROPERTY(_directory_flags ${_defs_prop_name})
>  >         if(_directory_flags)
>  >                 foreach(flag ${_directory_flags})
>  >                         LIST(APPEND ${_out_compile_flags} -D${flag})
>  >                 endforeach(flag)
>  >         endif(_directory_flags)
>  >
>  >     get_target_property(_target_flags ${_PCH_current_target}
>  > COMPILE_DEFINITIONS)
>  >         if(_target_flags)
>  >                 foreach(flag ${_target_flags})
>  >                         LIST(APPEND ${_out_compile_flags} -D${flag})
>  >                 endforeach(flag)
>  >         endif(_target_flags)
>  >
>  >     get_target_property(_target_flags ${_PCH_current_target}
>  > ${_defs_prop_name})
>  >         if(_target_flags)
>  >                 foreach(flag ${_target_flags})
>  >                         LIST(APPEND ${_out_compile_flags} -D${flag})
>  >                 endforeach(flag)
>  >         endif(_target_flags)
>  >
>  >     SEPARATE_ARGUMENTS(${_out_compile_flags})
>  >  ENDMACRO(_PCH_GET_COMPILE_FLAGS)
>  >
>  >
>  >  MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output)
>  >         FILE(TO_NATIVE_PATH ${_input} _native_input)
>  >         FILE(TO_NATIVE_PATH ${_output} _native_output)
>  >
>  >         IF(CMAKE_COMPILER_IS_GNUCXX)
>  >         IF(CMAKE_CXX_COMPILER_ARG1)
>  >                 # remove leading space in compiler argument
>  >             STRING(REGEX REPLACE "^ +" "" pchsupport_compiler_cxx_arg1
>  > ${CMAKE_CXX_COMPILER_ARG1})
>  >         ELSE()
>  >             SET(pchsupport_compiler_cxx_arg1 "")
>  >         ENDIF()
>  >         SET(${out_command}
>  >             ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1}
>  > ${_compile_FLAGS}     -x c++-header -o ${_output} ${_input})
>  >     ELSE()
>  >         set(_tempdir
>  > ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_PCH_current_target}.dir)
>  >         GET_FILENAME_COMPONENT(_namewe ${_input} NAME_WE)
>  >         SET(_pchsource ${_tempdir}/${_namewe}.cpp)
>  >         FILE(TO_NATIVE_PATH ${_pchsource} _native_pchsource)
>  >
>  >                 SET(_dummy_str "#include \"${_input}\"")
>  >                 FILE(WRITE ${_pchsource} ${_dummy_str})
>  >
>  >                 SET(${out_command}
>  >                         ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} /c
>  > /Fp${_native_output} /Yc${_native_input} /Fo${_tempdir}/
>  > ${_native_pchsource} /nologo)
>  >         ENDIF()
>  >  ENDMACRO(_PCH_GET_COMPILE_COMMAND )
>  >
>  >  MACRO(_PCH_GET_TARGET_COMPILE_FLAGS _cflags  _header_name _pch_path _dowarn
>  > )
>  >     FILE(TO_NATIVE_PATH ${_pch_path} _native_pch_path)
>  >  #message(${_native_pch_path})
>  >
>  >     IF(CMAKE_COMPILER_IS_GNUCXX)
>  >         # for use with distcc and gcc>4.0.1 if preprocessed files are
>  > accessible
>  >         # on all remote machines set
>  >         # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess
>  >         # if you want warnings for invalid header files (which is very
>  >         # inconvenient if you have different versions of the headers for
>  >         # different build types you may set _pch_dowarn
>  >         LIST(APPEND ${_cflags} ${PCH_ADDITIONAL_COMPILER_FLAGS})
>  >                 IF (_dowarn)
>  >             LIST(APPEND ${_cflags} -Winvalid-pch)
>  >                 ENDIF ()
>  >     ELSE()
>  >         set(${_cflags} "/Fp${_native_pch_path}" "/Yu${_header_name}" )
>  >     ENDIF()
>  >
>  >         get_target_property(_old_target_cflags ${_PCH_current_target}
>  > COMPILE_FLAGS)
>  >         if(_old_target_cflags)
>  >                 list(APPEND ${_cflags} ${_old_target_cflags})
>  >         endif()
>  >
>  >     STRING(REPLACE ";" " " ${_cflags} "${${_cflags}}")
>  >  ENDMACRO(_PCH_GET_TARGET_COMPILE_FLAGS )
>  >
>  >  MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output)
>  >     GET_FILENAME_COMPONENT(_name ${_input} NAME)
>  >     if(CMAKE_COMPILER_IS_GNUCXX)
>  >         set(_build "")
>  >         IF(CMAKE_BUILD_TYPE)
>  >             set(_build _${CMAKE_BUILD_TYPE})
>  >         endif()
>  >                 file(MAKE_DIRECTORY
>  > ${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch)
>  >         SET(_output
>  > "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch/${_targetName}${_build}.h++")
>  >     else()
>  >         SET(_output
>  > "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${_name}.pch")
>  >     endif()
>  >  ENDMACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input)
>  >
>  >  MACRO(ADD_PRECOMPILED_HEADER _targetName _input)
>  >     SET(_PCH_current_target ${_targetName})
>  >
>  >         if(${ARGN})
>  >                 set(_dowarn 1)
>  >         else()
>  >                 set(_dowarn 0)
>  >         endif()
>  >
>  >     GET_FILENAME_COMPONENT(_name ${_input} NAME)
>  >     GET_FILENAME_COMPONENT(_path ${_input} PATH)
>  >     GET_PRECOMPILED_HEADER_OUTPUT( ${_targetName} ${_input} _output)
>  >     GET_FILENAME_COMPONENT(_outdir ${_output} PATH )
>  >
>  >     FILE(MAKE_DIRECTORY ${_outdir})
>  >
>  >     _PCH_GET_COMPILE_FLAGS(_compile_FLAGS)
>  >
>  >     # Ensure same directory! Required by gcc
>  >     IF(NOT ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
>  >         SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${_name}
>  > PROPERTIES GENERATED 1)
>  >         ADD_CUSTOM_COMMAND(OUTPUT       ${CMAKE_CURRENT_BINARY_DIR}/${_name}
>  >                            COMMAND ${CMAKE_COMMAND} -E copy
>  > ${CMAKE_CURRENT_SOURCE_DIR}/${_input} ${CMAKE_CURRENT_BINARY_DIR}/${_name}
>  >                            DEPENDS ${_input})
>  >     ENDIF()
>  >
>  >  #message("_command  ${_input} ${_output}")
>  >     _PCH_GET_COMPILE_COMMAND(_command  ${CMAKE_CURRENT_BINARY_DIR}/${_name}
>  > ${_output} )
>  >
>  >     ADD_CUSTOM_COMMAND(OUTPUT ${_output}
>  >                        COMMAND ${_command}
>  >                        IMPLICIT_DEPENDS CXX
>  > ${CMAKE_CURRENT_BINARY_DIR}/${_name})
>  >
>  >     GET_TARGET_PROPERTY(_sources ${_targetName} SOURCES)
>  >     FOREACH(_src ${_sources})
>  >         SET_SOURCE_FILES_PROPERTIES(${_src} PROPERTIES OBJECT_DEPENDS
>  > ${_output})
>  >     ENDFOREACH()
>  >     endif()
>  >
>  >     _PCH_GET_TARGET_COMPILE_FLAGS(_target_cflags ${_name} ${_output}
>  > ${_dowarn})
>  >
>  >         if(_target_c_flags)
>  >                 SET_TARGET_PROPERTIES(${_targetName}
>  >                                                           PROPERTIES
>  >                                                           COMPILE_FLAGS
>  > ${_target_cflags} )
>  >         endif(_target_c_flags)
>  >  ENDMACRO(ADD_PRECOMPILED_HEADER)
>  >
>  > _______________________________________________
>  >  CMake mailing list
>  >  CMake at cmake.org
>  >  http://www.cmake.org/mailman/listinfo/cmake
>
>
> >
>
>
>
>  --
>
>
>  ________________________________________________________________
>   Anders Backman Email: andersb at cs.umu.se
>   HPC2N/VRlab Phone: +46 (0)90-786 9936
>   Umea university Cellular: +46 (0)70-392 64 67
>   S-901 87 UMEA SWEDEN Fax: +46 90-786 6126
>   http://www.cs.umu.se/~andersb
>



-- 


________________________________________________________________
 Anders Backman Email: andersb at cs.umu.se
 HPC2N/VRlab Phone: +46 (0)90-786 9936
 Umea university Cellular: +46 (0)70-392 64 67
 S-901 87 UMEA SWEDEN Fax: +46 90-786 6126
 http://www.cs.umu.se/~andersb


More information about the CMake mailing list