[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