[CMake] Precompiled Headers

Sylvain Benner benner at virtools.com
Thu Jun 1 10:29:17 EDT 2006


> Has anyone had any luck with precompiled headers on visual studio 2005?
> 
> For Visual Studio 6, i added additional parameters to each compiled 
> file. I then told one specific file to build the precompiled headers. 
> This worked in vs6, but in 2005 the ide must have the actual projects 
> setup for precompiled headers. This "hack" won't work on 2005.
> 
> I know there have been requests to add precompiled headers, but I was 
> wondering if anyone has written a custom add-in to cmake to do this. If 
> not, I am going to have to write one.
> 

I think the best way to achieve this is to write your own generator but I'm not a master of CMake so maybe there is a simplier way.
Anyway I will describe how I added precompiled header in case it can help you, or someone else.

The basic idea is to add properties to the files and retrieve them is a custom made generator. 
To do this I have a module file which contains a big FOREACH loop. It loops on the source list and add the properties to each file when it encounters one.

The list of files : 

LIST(APPEND GLOBAL_FILE_DESC

    "Source Files"

    "Source Files/Module"
        @CREATE_PCH "source/dummy.cpp"
        "dummy.h"
        @USE_PCH "source/dummy2.cpp"
        "dummy2.h"
        @NO_PCH "source/dummy3.cpp"
        "dummy3.h"

    "Source Files/Docs"
        @EXCLUDE "dummy.dox"

    "Resource Files"
        "resources/dummy.rc"

)

This loop adds properties and sourcegroup. The sub loops allow to add properties or file groups from our master CMakeLists.txt directly.

FOREACH(SOURCE_DESCRIPTION ${GLOBAL_FILE_DESC})

    # look for the nature of the entry
    
    IF(${SOURCE_DESCRIPTION} MATCHES "@.*")
    
        # this is a property
        # ------------------
        FOREACH(FILE_PROPERTY ${FILE_PROPERTIES})
            IF(${SOURCE_DESCRIPTION} MATCHES "@(${FILE_PROPERTY})$")
               # add this property to the current properties
                LIST(APPEND CUR_PROPERTIES ${${FILE_PROPERTY}_PROPERTY} ${${FILE_PROPERTY}_VALUE})
            ENDIF(${SOURCE_DESCRIPTION} MATCHES "@(${FILE_PROPERTY})$")
        ENDFOREACH(FILE_PROPERTY ${FILE_PROPERTIES})
        
    ELSE(${SOURCE_DESCRIPTION} MATCHES "@.*")
        IF(${SOURCE_DESCRIPTION} MATCHES ".*[.].*$")

            # this is a file
            # --------------
            FOREACH(FILE_GROUP ${FILE_GROUPS})
                IF(${SOURCE_DESCRIPTION} MATCHES ".*[.](${REGISTRED_${FILE_GROUP}_EXT})")
                    # add the file to its group
                    LIST(APPEND ${FILE_GROUP} ${SOURCE_DESCRIPTION})
                    IF(CUR_PROPERTIES)
                        # add current properties to the file
                        SET_SOURCE_FILES_PROPERTIES(${SOURCE_DESCRIPTION} PROPERTIES ${CUR_PROPERTIES})
                        SET(CUR_PROPERTIES "")
                    ENDIF(CUR_PROPERTIES)
                ENDIF(${SOURCE_DESCRIPTION} MATCHES ".*[.](${REGISTRED_${FILE_GROUP}_EXT})")
            ENDFOREACH(FILE_GROUP ${FILE_GROUPS})
            # add the file to the current folder list
            LIST(APPEND CUR_FOLDER_LIST ${SOURCE_DESCRIPTION}) 
            
        ELSE(${SOURCE_DESCRIPTION} MATCHES ".*[.].*$")
        
            # this is a source folder
            # -----------------------
            IF(CUR_FOLDER)
                # we meet a valid source folder
                SOURCE_GROUP(${CUR_FOLDER} FILES ${CUR_FOLDER_LIST})
                SET(CUR_FOLDER_LIST "")
            ENDIF(CUR_FOLDER)
            SET(CUR_FOLDER ${SOURCE_DESCRIPTION})            
            
        ENDIF(${SOURCE_DESCRIPTION} MATCHES ".*[.].*$")
    ENDIF(${SOURCE_DESCRIPTION} MATCHES "@.*")    
ENDFOREACH(SOURCE_DESCRIPTION ${GLOBAL_FILE_DESC})

# create the last source folder
IF(CUR_FOLDER)
    SOURCE_GROUP(${CUR_FOLDER} FILES ${CUR_FOLDER_LIST})
ENDIF(CUR_FOLDER)

# merge all file groups into one group
FOREACH(FILE_GROUP ${FILE_GROUPS})
    IF(${FILE_GROUP})
        LIST(APPEND TARGET_FILES ${${FILE_GROUP}})
    ENDIF(${FILE_GROUP})
ENDFOREACH(FILE_GROUP ${FILE_GROUPS})

After this, you create your own generator where you retrieve the properties and write them to the project files.
Hope that will help you a bit.

Sylvain
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/cmake/attachments/20060601/bb926438/attachment.html


More information about the CMake mailing list