[CMake] External_Project_Add() and custom build configurations ?

Glenn Coombs glenn.coombs at gmail.com
Tue Jul 5 12:02:18 EDT 2011


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:

ExternalProject_Add(external_proj
    PREFIX                ${CMAKE_BINARY_DIR}/external_proj
    SOURCE_DIR            ${CMAKE_SOURCE_DIR}/external_proj
    CMAKE_ARGS            -DCMAKE_BUILD_TYPE:STRING=Release
                        -DMETAGS_DIR=${METASIM_INSTALL_DIR}
    BUILD_COMMAND        ${CMAKE_COMMAND}
                        -DBUILD_TARGET:STRING=external_proj
                        -DBUILD_CONFIG:STRING=${CMAKE_CFG_INTDIR}
                        -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:")
message("    BUILD_TARGET=${BUILD_TARGET}")
message("    BUILD_CONFIG=${BUILD_CONFIG}")
message("    CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}")

set (standardConfigs    Release Debug RelWithDebInfo MinSizeRel)

# map each build config in extraConfigs to the item in the same position in
extraConfigsMap
set (extraConfigs        ReleaseNoHidebug    DebugPthreads
DebugOptimised)
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}")
    endif()
    list(GET extraConfigsMap ${pos} BUILD_CONFIG)
    message("  MAPPED CONFIG: ${BUILD_CONFIG}")
endif()

execute_process(
    COMMAND ${CMAKE_COMMAND}
    --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 ?

--
Glenn


On 1 July 2011 18:01, David Cole <david.cole at kitware.com> wrote:

> On Fri, Jul 1, 2011 at 7:23 AM, Glenn Coombs <glenn.coombs at gmail.com>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 www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>>
>
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20110705/4df427ae/attachment.htm>


More information about the CMake mailing list