With ExternalProject_Add, you have to specify the location of boost that you have built/installed directly to the thing that wants to know where it is. It cannot use FIND_PACKAGE to find boost until after boost is built/installed.

So you would specify boost's location to the later projects that depend on it by using a -D argument to tell it where it is directly. Then there is no "finding" required.

I don't know if this is easily do-able with Boost and ExternalProject_Add... (mainly because I'm not that familiar with boost usage...) but we certainly do it all the time with packages like VTK. The project that depends on VTK gets a -D VTK_DIR to tell it where it is so that find_package is a no-op find, but just defines the right variables in terms of that VTK_DIR.

I would think boost should be similar, but I know it's more complex than that just by listening in on lists like this...


Hopefully this helps to clarify rather than muddy things a bit,
David Cole
Kitware, Inc.


On Wed, Mar 24, 2010 at 5:04 PM, Michael Jackson <mike.jackson@bluequartz.net> wrote:
I have been playing with "ExternalProject_Add" and I don't think you are going to be able to do what you are trying to do. I was using the following:

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})

The problem is that all the files that Find_package() would normally use are NOT available the first time CMake is run. They would ONLY be available after boost is compiled and installed. So this seems to be a chicken-and-egg thing. Not sure what to do except ask on the CMake Users Mailing list.

sorry

___________________________________________________________
Mike Jackson                      www.bluequartz.net
Principal Software Engineer       mike.jackson@bluequartz.net
BlueQuartz Software               Dayton, Ohio


On Mar 24, 2010, at 3:56 PM, Brian Davis wrote:



On Wed, Mar 24, 2010 at 2:44 PM, Michael Jackson <mike.jackson@bluequartz.net> wrote:
The Boost-CMake (IMHO) sort of "abused" the cmake system somewhat in order to make it more "bjam" like.

In practice if the first pass of FindBoost.cmake does not find anything then I usually have to manually go into the CMakeCache.txt file and remove all the boost variables and re-run CMake. You can also probably do this using the CMake-Gui program.


I posted a desirement in the CMake Mantis bug tracker only to find out that all one has to do in CMake GUI is File->"Delete Cache" then config, config, generate, wait for CMake VS Macros to notice something is awry and update the pojects... I still wish there were a button.  If I could get a heart rate monitor to sense my level of frustration and automatically rerun a script to delete the cache I think this would be the optimal solution.


Basically for each library, look in boost/libs/filesystem/CMakeLists.txt. That file should get you started in the right location to start trying to figure out what is going wrong.


Thanks for the words of advice I will keep hacking until I find out what I am doing wrong.

Brian
_______________________________________________
Boost-cmake mailing list
Boost-cmake@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-cmake

_______________________________________________
Boost-cmake mailing list
Boost-cmake@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-cmake