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

Michael Jackson mike.jackson at bluequartz.net
Wed Mar 24 17:10:40 EDT 2010


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




More information about the CMake mailing list