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:anonym...@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:anonym...@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:anon...@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} ) _______________________________________________ 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