[CMake] Use of ExternalProject_Add to build another CMake based project

David Cole david.cole at kitware.com
Wed Mar 24 17:24:07 EDT 2010


Basically, FindBoost.cmake would have to accept a "BOOST_DIR" input that
*told* it where Boost was. It would then not do any "finding" at all, but
trust the input to tell it where boost things were...

(Like VTK does.)

Then, after building Boost with ExternalProject_Add, you could build other
things that depend on it with ExternalProject_Add and tell those other
things "-D BOOST_DIR= where I built or installed it in the previous
ExternalProject_Add"... Then those things in their CMakeLists.txt files,
would be able to do a FindBoost call and get correct results because they
have the BOOST_DIR defined for them...

Basically, if you use ExternalProject_Add to build *some* components in a
project, you should use it to build *all* components in a project. Then, the
one at the end of the dependency chain, by the time it gets to do its real
configure/build and install, all of its dependencies are built and installed
already.

You should NOT try to mix & match ExternalProject_Add and "finding" stuff.
You should use ExternalProject_Add to build/install stuff in a known
location and then reference it there directly, without any "find" calls.

Does that make sense?

I know it's complex, ... but it's complex.


HTH,
David


On Wed, Mar 24, 2010 at 5:10 PM, Michael Jackson <
mike.jackson at bluequartz.net> wrote:

> What all is needed in a CMake project to make it work correctly/better with
> ExternalProject_Add(). Here is what I am trying. Project A (Boost) should be
> built before Project B (MXA). I used to do all this manually but I started
> looking at ExternalProject_Add() to see if that could help me and others
> build my project easier.
>
>  I simply have the following in a CMakeLists.txt file
> project (Combined)
> cmake_minimum_required(VERSION 2.8)
> include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
>
> SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY  ${PROJECT_BINARY_DIR}/Bin )
>
> # --------- Setup the Executable output Directory -------------
> SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
>
> # --------- Setup the Executable output Directory -------------
> SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin )
>
> set (EP_BASE "Boost")
> ExternalProject_Add(
>    Boost
>                TMP_DIR Boost/tmp
>                STAMP_DIR Boost/stamp
>                DOWNLOAD_DIR Boost/Download
>    DOWNLOAD_COMMAND ""
>    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../MXABoost
>                CMAKE_ARGS -DBOOST_INCLUDE_INSTALL_DIR=include/boost-1_36
> -DBUILD_SOVERSIONED=OFF -DBOOST_LIB_INSTALL_DIR=lib -DENABLE_DEBUG=ON
> -DENABLE_MULTI_THREADED=ON -DENABLE_RELEASE=ON -DENABLE_SHARED=OFF
> -DENABLE_SINGLE_THREADED=OFF -DENABLE_STATIC=ON -DINSTALL_VERSIONED=OFF
> -DWITH_MPI=OFF -DWITH_PYTHON=OFF
> -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/Boost/Install
>    BINARY_DIR Boost/Build
>                BUILD_COMMAND make -j16
>    INSTALL_DIR Boost/Install
> )
>
> set ($ENV{BOOST_ROOT} "${PROJECT_BINARY_DIR}/Boost/Install")
> set (BOOST_ROOT "${PROJECT_BINARY_DIR}/Boost/Install")
> # ---------- Find Boost Headers/Libraries -----------------------
> SET (Boost_FIND_REQUIRED TRUE)
> SET (Boost_FIND_QUIETLY TRUE)
> set (Boost_USE_MULTITHREADED TRUE)
> set (Boost_USE_STATIC_LIBS TRUE)
> SET (Boost_ADDITIONAL_VERSIONS "1.36" "1.36.0" "1.41" "1.41.0" "1.39"
> "1.39.0")
>
> # --------------------------------------------------------------------
> # MXA_BOOST_HEADERS_ONLY determines if any boost libraries are going to
> # be found with the boost headers. For MXADataModel itself NO boost
> # libraries are required but if you choose to build the ImportGenerator
> # program then you will need the boost program_options library.
> if ( NOT MXA_BOOST_HEADERS_ONLY)
>  set (MXA_BOOST_COMPONENTS program_options )
> endif()
>
>
> include(${PROJECT_BINARY_DIR}/Boost/Install/share/cmake/boost/BoostConfig.cmake)
> #FIND_PACKAGE(Boost COMPONENTS  ${MXA_BOOST_COMPONENTS} )
> INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
> LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
> #------ END CMAKELISTS.TXT FILE -------------
>
>
> The problem becomes none of the normal BoostConfig.cmake or anything else
> is available at cmake time? At least not the first time through because
> Boost is NOT built yet. This seems like a chicken-and-egg thing going on but
> I am sure I am just missing something. Or maybe this was not the intent of
> ExternalProject_Add and we should just use "add_subdirs()" instead?
>
> Help..
> ___________________________________________________________
> Mike Jackson                      www.bluequartz.net
> Principal Software Engineer       mike.jackson at bluequartz.net
> BlueQuartz Software               Dayton, Ohio
>
>
> _______________________________________________
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100324/b5143774/attachment.htm>


More information about the CMake mailing list