[CMake] ExternalProject module -- questions

kent williams nkwmailinglists at gmail.com
Wed Apr 14 14:18:58 EDT 2010


I'm trying to come up with a workable 'super build' for our programs,
using the ExternalProject module.  I'm using CMake 2.8.0 -- not sure
if there's any substantive improvements in ExternalProject.cmake in
2.8.1 or CMake CVS.

In short, I want to build Tcl, Tk, VTK, ITK (with WrapITK), CableSwig
(for WrapITK).  My application also depends on Qt, but I'm using an
installed binary for that

My strategy is to build everything using as close to a vanilla setup
as is possible, and have each package install using the project binary
directory as the install target.  In other words, my top level
CMakeLists.txt, which includes all the ExternalProject_add macros,
sets CMAKE_INSTALL_PREFIX to CMAKE_CURRENT_BINARY_DIR

I've solved some problems for myself, but I'm running into several
confusing things:

1. VTK can't seem to build, at least with Wrapping turned on.  The
problem seems to be that it tries to build the executable 'vtk' in
VTK-prefix/src/VTK-build/Wrapping/Tcl, which contains a directory
named 'vtk'

2. The included CMakeLists.txt seems to generate projects that build
in a non-deterministic, order. Sometimes Tcl builds first, Sometimes
CableSwig.

3. I'm confused about the interaction between CMAKE_INSTALL_PREFIX,
and the ExternalProject_add parameter INSTALL_DIR. If I give
INSTALL_DIR in the ExternalProject_add macro, it still tries to
install the programs in /usr/local.  So now I explicitly set
CMAKE_INSTALL_PREFIX in the arguments to ExternalProject_add, but it
doesn't make sense that I should have to?

project(BRAINSTracer)
cmake_minimum_required(VERSION 2.8)
cmake_policy(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE on)
enable_testing()
include(Dart)
include(CPack)
include(ExternalProject)

#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
#set(CMAKE_BUNDLE_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/bin)

find_package( Qt4 REQUIRED )
if(QT_USE_FILE)
  include(${QT_USE_FILE})
  set(QT_USE_QTXML 1)
else(QT_USE_FILE)
  set( QT_LIBRARIES   ${QT_QT_LIBRARY})
endif(QT_USE_FILE)

SET(QT_CMAKE_FLAGS
-DVTK_USE_QT:BOOL=ON
-DVTK_USE_QVTK:BOOL=ON
-DVTK_USE_GUISUPPORT:BOOL=ON
-DDESIRED_QT_VERSION:STRING=4
-DVTK_USE_QVTK_QTOPENGL:BOOL=ON
)

if(APPLE)
set(QT_CMAKE_FLAGS ${QT_CMAKE_FLAGS}
-DVTK_USE_CARBON:BOOL=OFF
-DVTK_USE_COCOA:BOOL=ON
-DVTK_USE_X:BOOL=OFF
)
set(LIB_EXT dylib)
set(EXTRA_TK_FLAGS
--enable-aqua
--enable-corefoundation
)
else(APPLE)
set(QT_CMAKE_FLAGS ${QT_CMAKE_FLAGS}
-DVTK_USE_CARBON:BOOL=OFF
-DVTK_USE_COCOA:BOOL=OFF
-DVTK_USE_X:BOOL=ON
)
set(LIB_EXT .so)
endif(APPLE)

#  -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}
 SET(LOCAL_CMAKE_BUILD_OPTIONS
  -DMAKECOMMAND:STRING=${MAKECOMMAND}
  -DCMAKE_SKIP_RPATH:BOOL=ON
  -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
  -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE}
  -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}
  -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
  -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
  -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
  -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
  -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
  -DBUILD_EXAMPLES:BOOL=OFF
  -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
  -DBUILD_TESTING:BOOL=OFF
  -DCMAKE_GENERATOR:STRING=${CMAKE_GENERATOR}
  -DCMAKE_EXTRA_GENERATOR:STRING=${CMAKE_EXTRA_GENERATOR}
  -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
  -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
  -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
  -DCMAKE_BUNDLE_OUTPUT_DIRECTORY:PATH=${CMAKE_BUNDLE_OUTPUT_DIRECTORY}
  -DLIBRARY_OUTPUT_PATH:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
  -DEXECUTABLE_OUTPUT_PATH:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
  -DDART_TESTING_TIMEOUT:STRING=${DART_TESTING_TIMEOUT}
  -DMEMORYCHECK_COMMAND_OPTIONS:STRING=${MEMORYCHECK_COMMAND_OPTIONS}
  -DMEMORYCHECK_COMMAND:PATH=${MEMORYCHECK_COMMAND}
  -DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}
  -DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS}
  -DCMAKE_MODULE_LINKER_FLAGS:STRING=${CMAKE_MODULE_LINKER_FLAGS}
  -DSITE:STRING=${SITE}
  -DBUILDNAME:STRING=${BUILDNAME}
  ${QT_CMAKE_FLAGS}
)

set(TCL_DEPEND tcl)
set(proj tcl)
ExternalProject_Add(${proj}
CVS_REPOSITORY ":pserver:anonymous:@tcl.cvs.sourceforge.net:/cvsroot/tcl"
CVS_TAG -r core-8-5-7
CVS_MODULE  "tcl"
CONFIGURE_COMMAND  CMAKE_C_COMPILER="${CMAKE_C_COMPILER}"
CMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
${CMAKE_CURRENT_BINARY_DIR}/TCL-prefix/src/TCL/unix/configure
--prefix=${CMAKE_CURRENT_BINARY_DIR}
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
UPDATE_COMMAND ""
)

set(buildTK True)
if(buildTK)
set(TK_DEPEND tk)
set(proj tk)
ExternalProject_Add(${proj}
CVS_REPOSITORY ":pserver:anonymous:@tcl.cvs.sourceforge.net:/cvsroot/tktoolkit"
CVS_TAG -r core-8-5-7
CVS_MODULE  "tk"
CONFIGURE_COMMAND  CMAKE_C_COMPILER="${CMAKE_C_COMPILER}"
CMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
${CMAKE_CURRENT_BINARY_DIR}/TK-prefix/src/TK/unix/configure
--prefix=${CMAKE_CURRENT_BINARY_DIR}
--with-tcl=${CMAKE_CURRENT_BINARY_DIR}/lib ${EXTRA_TK_FLAGS}
DEPENDS ${TCL_DEPEND}
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
UPDATE_COMMAND ""
)
else(buildTK)
set(TK_DEPEND "")
endif(buildTK)

#
# build VTK
set(VTK_DEPEND VTK)
set(proj VTK)

ExternalProject_Add(${proj}
CVS_REPOSITORY ":pserver:anonymous at public.kitware.com:/cvsroot/VTK"
CVS_TAG -r VTK-5-4-2
CVS_MODULE "VTK"
CMAKE_ARGS ${LOCAL_CMAKE_BUILD_OPTIONS} -DVTK_WRAP_TCL:BOOL=ON
-DTCL_INCLUDE_PATH:PATH=${CMAKE_CURRENT_BINARY_DIR}/include
-DTCL_LIBRARY:FILEPATH=${CMAKE_CURRENT_BINARY_DIR}/lib/libtcl8.5.${LIB_EXT}
-DTCL_TCLSH:FILEPATH=${CMAKE_CURRENT_BINARY_DIR}/bin/tclsh8.5
-DVTK_USE_TK:BOOL=yes
-DTK_INCLUDE_PATH:PATH=${CMAKE_CURRENT_BINARY_DIR}/include
-DTK_LIBRARY:FILEPATH=${CMAKE_CURRENT_BINARY_DIR}/lib/libtk8.5.${LIB_EXT}
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${TCL_DEPEND} ${TK_DEPEND}
UPDATE_COMMAND ""
)

set(CABLESWIG_DEPEND CableSwig)
set(proj CableSwig)
ExternalProject_add(${proj}
CVS_REPOSITORY ":pserver:anonymous at public.kitware.com:/cvsroot/CableSwig"
CVS_TAG -r ITK-3-16
CVS_MODULE "CableSwig"
CMAKE_ARGS ${LOCAL_CMAKE_BUILD_OPTIONS}
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
UPDATE_COMMAND ""
)

#
# build ITK
set(ITK_DEPEND Insight)
set(proj Insight)
ExternalProject_add(${proj}
CVS_REPOSITORY ":pserver:anoncvs at www.vtk.org:/cvsroot/Insight"
CVS_TAG -r ITK-3-16
CVS_MODULE "Insight"
CMAKE_ARGS ${LOCAL_CMAKE_BUILD_OPTIONS}
-DCableSwig_DIR:PATH=${CMAKE_INSTALL_PREFIX}/lib
-DTCL_INCLUDE_PATH:PATH=${CMAKE_CURRENT_BINARY_DIR}/include
-DUSE_WRAP_ITK:BOOL=ON
-DWRAP_ITK_TCL:BOOL=ON
-DWRAP_ITK_JAVA:BOOL=OFF
-DWRAP_ITK_PYTHON:BOOL=OFF
-DWRAP_complex_float:BOOL=OFF
-DWRAP_covariant_vector_float:BOOL=OFF
-DWRAP_float:BOOL=ON
-DWRAP_rgb_signed_short:BOOL=OFF
-DWRAP_rgb_unsigned_char:BOOL=OFF
-DWRAP_rgb_unsigned_short:BOOL=OFF
-DWRAP_signed_short:BOOL=ON
-DWRAP_unsigned_char:BOOL=ON
-DWRAP_unsigned_short:BOOL=OFF
-DWRAP_vector_float:BOOL=ON
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${CABLESWIG_DEPEND}
UPDATE_COMMAND ""
)

 set(GenerateCLP_DIR ${CMAKE_INSTALL_PREFIX}/lib/GenerateCLP)

set(SEM_DEPEND SlicerExecutionModel)
set(proj SlicerExecutionModel)
ExternalProject_Add(${proj}
  SVN_REPOSITORY "http://svn.slicer.org/Slicer3/trunk/Libs/SlicerExecutionModel"
  SOURCE_DIR SlicerExecutionModel
  BINARY_DIR SlicerExecutionModel-build
  DEPENDS  ${ITK_DEPEND}
  CMAKE_GENERATOR ${gen}
  CMAKE_ARGS
    ${LOCAL_CMAKE_BUILD_OPTIONS}
    -DITK_DIR:PATH=${ITK_DIR}
  INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
)

set(proj BRAINSTracerQt)
ExternalProject_Add(${proj}
  URL file://${CMAKE_CURRENT_SOURCE_DIR}/${proj}
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${proj}
  BINARY_DIR ${proj}-build
  DEPENDS  ${VTK_DEPEND} ${SEM_DEPEND}
  CMAKE_GENERATOR ${gen}
  CMAKE_ARGS
    ${LOCAL_CMAKE_BUILD_OPTIONS}
 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
)


More information about the CMake mailing list