[CMake] compile header file for precompiled gcc headers

Maik Beckmann maikbeckmann at gmx.de
Mon Dec 18 03:25:40 EST 2006


Am Sonntag, den 17.12.2006, 21:55 +0100 schrieb klaas.holwerda:
> Hi,
> 
> I want to get gcc to use precompiled headers.
>  From http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
> i read that i need to compile a header file ( containing #includes to 
> all others for instance ).
> 
> I have this haeder file, how to compile it with Cmake?
> 
> I tried CHECK_CXX_SOURCE_COMPILES( wxart2d.h DONNO )
> 
> But that does not produce a "wxart2d.gch" file.
> 
> Understand that i do not need to get an executable nor library.
> 
> Does somebody know how to do it?
> 
> Has someone already succeeded in using precompiled headers with gcc on 
> Linux, any tips?
> 
> Thanks,
> 
> Klaas


Hello

Rosegarden (http://www.rosegardenmusic.com/) uses experimental PCH
support
http://rosegarden.svn.sourceforge.net/viewvc/rosegarden/trunk/rosegarden/cmake_admin/FindPCHSupport.cmake?revision=7699&view=markup

This macro works per directory. It adds a target for precompileing the
header and every C++ source is compiled using it.  

I tweaked this version for applying PCH's per target (see attachment)

My version should be used like this:
<CMakeLists.txt>
    add_executable(test test.cpp)
    add_precompiled_header( test std_includes.h) 
</CMakeLists.txt>

It's very experimental, but now my sources using boost.fusion compile
about 6-8 times faster than without PCH.

MfG Maik

 

-------------- next part --------------
# - 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

IF(CMAKE_COMPILER_IS_GNUCXX)
    EXEC_PROGRAM(
    	${CMAKE_CXX_COMPILER} 
        ARGS 			--version 
        OUTPUT_VARIABLE _compiler_output)
    STRING(REGEX REPLACE ".* ([0-9]\\.[0-9]\\.[0-9]) .*" "\\1" 
           gcc_compiler_version ${_compiler_output})
    #MESSAGE("GCC Version: ${gcc_compiler_version}")
    IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
        SET(PCHSupport_FOUND TRUE)
    ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
        IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
            SET(PCHSupport_FOUND TRUE)
        ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
    ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)

MACRO(ADD_PRECOMPILED_HEADER _targetName _input )

    GET_FILENAME_COMPONENT(_name ${_input} NAME)
    SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
    SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch")
    MAKE_DIRECTORY(${_outdir})
    SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++")
    STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
    SET(_compiler_FLAGS ${${_flags_var_name}})
    
    GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
    FOREACH(item ${_directory_flags})
    LIST(APPEND _compiler_FLAGS "-I${item}")
    ENDFOREACH(item)

	GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS)
    LIST(APPEND _compiler_FLAGS ${_directory_flags})

    SEPARATE_ARGUMENTS(_compiler_FLAGS)
    #MESSAGE("_compiler_FLAGS: ${_compiler_FLAGS}")
    message("${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header -o ${_output} ${_source}")
    ADD_CUSTOM_COMMAND(
        OUTPUT ${_output}
        COMMAND ${CMAKE_CXX_COMPILER}
				${_compiler_FLAGS}
				-x c++-header
				-o ${_output} ${_source}
        DEPENDS ${_source} )
   	ADD_CUSTOM_TARGET(${_targetName}_gch DEPENDS ${_output})
    ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch)
    #SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include ${_name} -Winvalid-pch -H")
    #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${_name} -Winvalid-pch")
    SET_TARGET_PROPERTIES(${_targetName} PROPERTIES
    	COMPILE_FLAGS "-include ${_name} -Winvalid-pch"
    )
	
ENDMACRO(ADD_PRECOMPILED_HEADER)



More information about the CMake mailing list