This had me stumped for a while until I came across the -P command line
option to cmake.  I have now added a build command to my external project
like so:

    PREFIX                ${CMAKE_BINARY_DIR}/external_proj
    SOURCE_DIR            ${CMAKE_SOURCE_DIR}/external_proj
                        -P ${CMAKE_SOURCE_DIR}/ExProjectBuild.cmake
    INSTALL_COMMAND        ""

And then the ExProjectBuild.cmake file invokes cmake --build with the build
config changed appropriately when necessary:

message("In ExternalProjectBuild:")

set (standardConfigs    Release Debug RelWithDebInfo MinSizeRel)

# map each build config in extraConfigs to the item in the same position in
set (extraConfigs        ReleaseNoHidebug    DebugPthreads
set (extraConfigsMap    Release                Debug            Debug)

list(FIND standardConfigs ${BUILD_CONFIG} pos)
if (pos LESS 0)
    list(FIND extraConfigs ${BUILD_CONFIG} pos)
    if (pos LESS 0)
        message(FATAL_ERROR "Unknown build config: ${BUILD_CONFIG}")
    list(GET extraConfigsMap ${pos} BUILD_CONFIG)
    message("  MAPPED CONFIG: ${BUILD_CONFIG}")

    --build ${CMAKE_BINARY_DIR} --config ${BUILD_CONFIG}

Is that what you meant when you suggested using a custom BUILD_COMMAND ?  Or
was there a simpler way to do it ?

Also, I note that when I clean the external project in Visual Studio it
doesn't really clean it (i.e. after the clean a build still thinks there is
nothing to do).  And the clean doesn't invoke my ExProjectBuild script.

If I manually run "cmake --build externalProjectDir --target clean" from the
command line then it does clean the project properly.  Is
ExternalProject_Add() missing some functionality here, or have I
misunderstood something ?


On 1 July 2011 18:01, David Cole <> wrote:

> On Fri, Jul 1, 2011 at 7:23 AM, Glenn Coombs <>wrote:
>> I have just started using some externally supplied cmake projects in my
>> cmake project.  To do this I added these lines to my top level
>> CMakeLists.txt file:
>> include(ExternalProject)
>> ExternalProject_Add(external_proj
>>     PREFIX                ${CMAKE_BINARY_DIR}/external_proj
>>     SOURCE_DIR            ${CMAKE_SOURCE_DIR}/external/proj/dir
>>     CMAKE_ARGS            -DCMAKE_BUILD_TYPE:STRING=Release
>>                           -DMETAGS_DIR=${CMAKE_BINARY_DIR}/meta_install
>>     INSTALL_COMMAND        ""
>> )
>> And that worked very well.  Inside Visual Studio when I build my project
>> it automatically runs the cmake configure step for the external projects and
>> builds them as well.  The problem I have just discovered is when using a
>> build configuration other than the default ones.  I can build Debug and
>> Release configurations fine.  My project also has a DebugOptimised
>> configuration but the external projects don't.  When I try to build my
>> project it fails to build the external projects.  I used build_command() to
>> see what commands would be used to build each configuration and I can see
>> the cause of the problem:
>> Debug:          VCExpress.exe myProj.sln /build Debug          /project
>> external_proj
>> DebugOptimised: VCExpress.exe myProj.sln /build DebugOptimised /project
>> external_proj
>> Is there a way to tell cmake how to map my build configurations onto those
>> that an external project has ?  In this case I would like to build the
>> external project as Debug when I am building my project as DebugOptimised.
>> --
>> Glenn
>> _______________________________________________
>> Powered by
>> Visit other Kitware open-source projects at
>> Please keep messages on-topic and check the CMake FAQ at:
>> Follow this link to subscribe/unsubscribe:
> With Visual Studio builds, external projects get built (by default) with
> the same configuration as the outer project. If you want a different
> configuration built, then you will have to customize the BUILD_COMMAND. You
> can look in the source for ExternalProject.cmake to see how the default
> BUILD_COMMAND is constructed and go from there.
> HTH,
> David
Powered by

Visit other Kitware open-source projects at

Please keep messages on-topic and check the CMake FAQ at:

Follow this link to subscribe/unsubscribe:

Reply via email to