[CMake] Set Source Property For Specific Target

Michael Hertling mhertling at online.de
Wed Mar 16 21:49:50 EDT 2011


On 03/16/2011 09:19 PM, Kawicki, Ryan H wrote:
> Quick question.
> 
> I am trying to add precompiled headers to a project that has been converted to use Cmake.
> 
> In our library directory, we include all our source and build two targets (one static and one dynamic), but setting multiple source values only affects the source and not the source associated to a particular target.  Is there a way to get around this issue or something in the works to correct this, like an optional target command?
> 
> Thanks...
> 
> Code below describing the issue:
> 
> FUNCTION (ADD_MSVC_PRECOMPILED_HEADERS
>           PrecompiledSource PrecompiledHeader TargetProject)
>   IF (MSVC)
>     # define the location of the precompiled header
>     SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${TargetProject}.pch")
>     # set the target project to use the precompiled binary
>     SET_PROPERTY(TARGET ${TargetProject}
>                  APPEND
>                  PROPERTY COMPILE_FLAGS
>                  "/Yu\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\"")
>     # set the source file to compile out the pch
>     SET_PROPERTY(SOURCE ${PrecompiledSource}
>                  APPEND
>                  PROPERTY COMPILE_FLAGS
>                  "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\"")
>   ENDIF (MSVC)
> ENDFUNCTION (ADD_MSVC_PRECOMPILED_HEADERS)
> 
> ADD_LIBRARY(MyLibDynamic SHARED ${SRC})
> ADD_LIBRARY(MyLibStatic STATIC ${SRC})
> 
> ADD_MSVC_PRECOMPILED_HEADERS(StdAfx.cpp StdAfx.h MyLibDynamic)
> ADD_MSVC_PRECOMPILED_HEADERS(StdAfx.cpp StdAfx.h MyLibStatic)
> 
> When MyLibDynamic builds, it builds MyLibStatic.pch but tries to find MyLibDynamic.pch.
> This is because the second function call to setup precompiled headers modifies
> what appears to be a property that is not unique to all targets added at the same
> directory level of the CMakeLists.
> 
> Thanks again. . .

You might copy or symlink the concerned sources, one per target,
and impose the properties on these symlinks, e.g. as follows:

ADD_CUSTOM_COMMAND(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/StdAfxDynamic.cpp
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/StdAfxStatic.cpp
    COMMAND ${CMAKE_COMMAND} -E create_symlink
        ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp
        ${CMAKE_CURRENT_BINARY_DIR}/StdAfxDynamic.cpp
    COMMAND ${CMAKE_COMMAND} -E create_symlink
        ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp
        ${CMAKE_CURRENT_BINARY_DIR}/StdAfxStatic.cpp
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp
)

ADD_LIBRARY(MyLibDynamic SHARED StdAfxDynamic.cpp ${SRC})
ADD_LIBRARY(MyLibStatic STATIC StdAfxStatic.cpp ${SRC})

ADD_MSVC_PRECOMPILED_HEADERS(StdAfxDynamic.cpp StdAfx.h MyLibDynamic)
ADD_MSVC_PRECOMPILED_HEADERS(StdAfxStatic.cpp StdAfx.h MyLibStatic)

Of course, SRC mustn't contain StdAfx.cpp anymore for this to work.

'hope that helps.

Regards,

Michael


More information about the CMake mailing list