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:<br><br><span style="font-family: courier new,monospace;">ExternalProject_Add(external_proj</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> PREFIX ${CMAKE_BINARY_DIR}/external_proj</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> SOURCE_DIR ${CMAKE_SOURCE_DIR}/external_proj</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=Release</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> -DMETAGS_DIR=${METASIM_INSTALL_DIR}</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> BUILD_COMMAND ${CMAKE_COMMAND}<br> -DBUILD_TARGET:STRING=external_proj</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> -DBUILD_CONFIG:STRING=${CMAKE_CFG_INTDIR}</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> -P ${CMAKE_SOURCE_DIR}/ExProjectBuild.cmake</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> INSTALL_COMMAND ""</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">)</span><br><br>And then the ExProjectBuild.cmake file invokes cmake --build with the build config changed appropriately when necessary:<br><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">message("In ExternalProjectBuild:")</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">message(" BUILD_TARGET=${BUILD_TARGET}")</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">message(" BUILD_CONFIG=${BUILD_CONFIG}")</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">message(" CMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}")</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">set (standardConfigs Release Debug RelWithDebInfo MinSizeRel)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"># map each build config in extraConfigs to the item in the same position in extraConfigsMap</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">set (extraConfigs ReleaseNoHidebug DebugPthreads DebugOptimised)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">set (extraConfigsMap Release Debug Debug)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">list(FIND standardConfigs ${BUILD_CONFIG} pos)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">if (pos LESS 0)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> list(FIND extraConfigs ${BUILD_CONFIG} pos)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> if (pos LESS 0)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> message(FATAL_ERROR "Unknown build config: ${BUILD_CONFIG}")</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> endif()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> list(GET extraConfigsMap ${pos} BUILD_CONFIG)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> message(" MAPPED CONFIG: ${BUILD_CONFIG}")</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">endif()</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">execute_process(</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"> COMMAND ${CMAKE_COMMAND}</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"> --build ${CMAKE_BINARY_DIR} --config ${BUILD_CONFIG}</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">)</span><br><br>Is that what you meant when you suggested using a custom BUILD_COMMAND ? Or was there a simpler way to do it ?<br><br>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.<br>
<br>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 ?<br>
<br>--<br>Glenn<br><br><br><div class="gmail_quote">On 1 July 2011 18:01, David Cole <span dir="ltr"><<a href="mailto:david.cole@kitware.com">david.cole@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="gmail_quote"><div><div></div><div class="h5">On Fri, Jul 1, 2011 at 7:23 AM, Glenn Coombs <span dir="ltr"><<a href="mailto:glenn.coombs@gmail.com" target="_blank">glenn.coombs@gmail.com</a>></span> wrote:<br>
</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div></div><div class="h5">
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:<br><br><span style="font-family:courier new,monospace">include(ExternalProject)</span><br style="font-family:courier new,monospace">
<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">ExternalProject_Add(external_proj</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"> PREFIX ${CMAKE_BINARY_DIR}/external_proj</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace"> SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/proj/dir</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"> CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=Release</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace"> -DMETAGS_DIR=${CMAKE_BINARY_DIR}/meta_install</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"> INSTALL_COMMAND ""</span><br style="font-family:courier new,monospace">
<span style="font-family:courier new,monospace">)</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"></span><br>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:<br>
<br><span style="font-family:courier new,monospace">Debug: VCExpress.exe myProj.sln /build Debug /project external_proj</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">
DebugOptimised: VCExpress.exe myProj.sln /build DebugOptimised /project external_proj</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">
</span><br>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. <br>
<br>--<br><font color="#888888">Glenn<br><br>
</font><br></div></div>_______________________________________________<br>
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a><br></blockquote></div><br>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.<br>
<br>HTH,<br><font color="#888888">David<br><br>
</font></blockquote></div><br>