CMakeLists.txt 31 KB
Newer Older
1
#-----------------------------------------------------------------------------
2
cmake_minimum_required(VERSION 2.8.2)
3 4
#-----------------------------------------------------------------------------

5
PROJECT(Slicer)
6

7 8 9
#-----------------------------------------------------------------------------
# See http://cmake.org/cmake/help/cmake-2-8-docs.html#section_Policies for details
#-----------------------------------------------------------------------------
10 11 12 13 14 15
if(POLICY CMP0016)
  CMAKE_POLICY(SET CMP0016 NEW)
endif()
if(POLICY CMP0017)
  CMAKE_POLICY(SET CMP0017 OLD)
endif()
16

17 18 19 20 21 22 23 24 25 26 27
#-----------------------------------------------------------------------------
# Set a default build type if none was specified
#-----------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  message(STATUS "Setting build type to 'Debug' as none was specified.")
  set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
  # Set the possible values of build type for cmake-gui
  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
    "MinSizeRel" "RelWithDebInfo")
endif()

28 29 30 31 32 33 34
#-----------------------------------------------------------------------------
# Set the header template which defines custom export/import macros
# for shared libraries
#-----------------------------------------------------------------------------
SET(Slicer_EXPORT_HEADER_TEMPLATE "${Slicer_SOURCE_DIR}/qSlicerExport.h.in")
SET(Slicer_LOGOS_RESOURCE "${Slicer_SOURCE_DIR}/Resources/qSlicerLogos.qrc")

35 36 37 38 39
#-----------------------------------------------------------------------------
# Update CMake module path
#------------------------------------------------------------------------------
SET(CMAKE_MODULE_PATH
  ${Slicer_SOURCE_DIR}/CMake
40
  ${Slicer_SOURCE_DIR}/Extensions/CMake
41 42 43
  ${CMAKE_MODULE_PATH}
  )

44
SET(Slicer_CMAKE_DIR ${Slicer_SOURCE_DIR}/CMake)
45 46
SET(Slicer_EXTENSIONS_CMAKE_DIR ${Slicer_SOURCE_DIR}/Extensions/CMake)

47 48 49
#-----------------------------------------------------------------------------
# CMake Function(s) and Macro(s)
#-----------------------------------------------------------------------------
50
INCLUDE(CMakeDependentOption)
51 52
INCLUDE(CMakeParseArguments)
INCLUDE(Slicer3PluginsMacros)
53
INCLUDE(SlicerMacroDiscoverSystemNameAndBits)
54
INCLUDE(SlicerMacroExtractRepositoryInfo)
55 56 57 58 59
INCLUDE(SlicerMacroParseArguments)
INCLUDE(SlicerMacroBuildCLI)
INCLUDE(SlicerMacroEmptyExternalProject)
INCLUDE(SlicerFunctionInstallLibrary)

60
#-----------------------------------------------------------------------------
61
# Platform checks
62
#-----------------------------------------------------------------------------
63
INCLUDE(SlicerBlockPlatformCheck)
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

#-----------------------------------------------------------------------------
# Determine endian type
#-----------------------------------------------------------------------------

INCLUDE(TestBigEndian)
test_big_endian(CMAKE_WORDS_BIGENDIAN)

#-----------------------------------------------------------------------------
# Prerequisites
#-----------------------------------------------------------------------------
FIND_PACKAGE(Subversion)
IF(NOT Subversion_FOUND)
  MESSAGE(FATAL_ERROR "error: Install SVN and try to re-configure")
ENDIF()

FIND_PACKAGE(Git)
IF(NOT GIT_FOUND)
  MESSAGE(FATAL_ERROR "error: Install Git and try to re-configure")
ENDIF()

85 86 87
#-----------------------------------------------------------------------------
# Qt - Slicer_REQUIRED_QT_VERSION
#-----------------------------------------------------------------------------
88
SET(Slicer_REQUIRED_QT_VERSION "4.6.2")
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

#-----------------------------------------------------------------------------
# Superbuild Option - Enabled by default
#-----------------------------------------------------------------------------
OPTION(Slicer_SUPERBUILD "Build Slicer and the projects it depends on via SuperBuild.cmake." ON)
MARK_AS_ADVANCED(Slicer_SUPERBUILD)

#-----------------------------------------------------------------------------
# Build shared lib by default
#------------------------------------------------------------------------------
# option(BUILD_SHARED_LIBS "Build Slicer with shared libraries." ON)
SET(BUILD_SHARED_LIBS ON)

#-----------------------------------------------------------------------------
# Append the library version information to the library target properties.
#------------------------------------------------------------------------------
OPTION(Slicer_WITH_LIBRARY_VERSION "Build with library version information" OFF)
MARK_AS_ADVANCED(Slicer_WITH_LIBRARY_VERSION)
IF(Slicer_WITH_LIBRARY_VERSION)
  SET(Slicer_LIBRARY_PROPERTIES ${Slicer_LIBRARY_PROPERTIES}
    VERSION ${Slicer_VERSION_FULL}
    SOVERSION ${Slicer_VERSION}
  )
ENDIF()

#-----------------------------------------------------------------------------
115
# General Slicer Options
116 117 118 119 120 121 122
#-----------------------------------------------------------------------------
OPTION(BUILD_TESTING "Test the project" ON)
OPTION(WITH_MEMCHECK "Run tests through valgrind." OFF)
OPTION(WITH_COVERAGE "Enable/Disable coverage" OFF)
OPTION(Slicer_USE_VTK_DEBUG_LEAKS "Enable VTKs Debug Leaks functionality in both VTK and Slicer." ON)
OPTION(Slicer_BUILD_QTLOADABLEMODULES "Build Slicer QT Loadable Modules" ON)
MARK_AS_ADVANCED(Slicer_BUILD_QTLOADABLEMODULES)
123 124
OPTION(Slicer_BUILD_QTSCRIPTEDMODULES "Build Slicer Python QT Modules" ON)
MARK_AS_ADVANCED(Slicer_BUILD_QTSCRIPTEDMODULES)
125
OPTION(Slicer_BUILD_CLI       "Build Slicer CLI Plugins" ON)
126
OPTION(Slicer_BUILD_EXTENSIONS "Build Slicer 'trusted' extensions" OFF)
127 128 129 130

#-----------------------------------------------------------------------------
# External projects related options
#-----------------------------------------------------------------------------
131
OPTION(Slicer_USE_PYTHONQT    "Integrate a python-QT interpreter into Slicer." ON)
132 133 134 135 136 137
CMAKE_DEPENDENT_OPTION(
  Slicer_USE_PYTHONQT_WITH_TCL "Enable PythonQt Tcl adapter layer" ON
  "Slicer_USE_PYTHONQT" OFF)
CMAKE_DEPENDENT_OPTION(
  Slicer_USE_NUMPY "Build Slicer with NumPy" ON
  "Slicer_USE_PYTHONQT" OFF)
138 139
#OPTION(Slicer_USE_WEAVE       "Build Slicer with Weave" OFF)
#MARK_AS_ADVANCED(Slicer_USE_WEAVE)
jcfr's avatar
jcfr committed
140 141
# OPTION(Slicer_USE_BatchMake   "Build Slicer with BatchMake support." ON)
SET(Slicer_USE_BatchMake OFF CACHE INTERNAL "Build Slicer with BatchMake support." FORCE)
142 143
OPTION(Slicer_USE_MIDAS       "Build Slicer with MIDAS support." OFF)
OPTION(Slicer_USE_OPENIGTLINK "Build Slicer with OpenIGTLink support." ON)
144
OPTION(Slicer_USE_CTKAPPLAUNCHER "Configure ctkAppLauncher." ON)
145
MARK_AS_ADVANCED(Slicer_USE_CTKAPPLAUNCHER)
146

147 148
SET(Slicer_VTK_GIT_REPOSITORY "github.com/Slicer/VTK.git" CACHE STRING "repository from which to get VTK")
MARK_AS_ADVANCED(Slicer_VTK_GIT_REPOSITORY)
149
SET(Slicer_VTK_GIT_TAG "origin/slicer-4.0-gamma" CACHE STRING "VTK git tag to use")
150
MARK_AS_ADVANCED(Slicer_VTK_GIT_TAG)
151
SET(Slicer_ITK_GIT_REPOSITORY "github.com/Slicer/ITK.git" CACHE STRING "repository from which to get ITK")
152
MARK_AS_ADVANCED(Slicer_ITK_GIT_REPOSITORY)
153 154
SET(Slicer_ITK_GIT_TAG "origin/slicer-4.0" CACHE STRING "ITK git tag to use")
MARK_AS_ADVANCED(Slicer_ITK_GIT_TAG)
155

156 157 158 159 160 161 162 163
#-----------------------------------------------------------------------------
# TODO: Option allowing to enable/disable specific module should be automatically added
# The following option has been added for conveniency so that BRAINSTOOL module can be
# enabled/disabled at the superbuild level.
CMAKE_DEPENDENT_OPTION(
  Slicer_BUILD_BRAINSTOOLS "Build the BRAINS subset of registration and segmentation tools." OFF
  "Slicer_BUILD_CLI" OFF)
MARK_AS_ADVANCED(Slicer_BUILD_BRAINSTOOLS)
164

165 166 167 168 169 170 171 172 173 174 175 176 177
#-----------------------------------------------------------------------------
# Install no development files by default, but allow the user to get
# them installed by setting Slicer_INSTALL_DEVELOPMENT to true.
#-----------------------------------------------------------------------------
#OPTION(Slicer_INSTALL_DEVELOPMENT "Install Slicer extension development files." OFF)
#MARK_AS_ADVANCED(Slicer_INSTALL_DEVELOPMENT)
SET(Slicer_INSTALL_DEVELOPMENT OFF)
IF(NOT Slicer_INSTALL_DEVELOPMENT)
  SET(Slicer_INSTALL_NO_DEVELOPMENT 1)
ELSE ()
  SET(Slicer_INSTALL_NO_DEVELOPMENT 0)
ENDIF()

178 179 180 181 182 183 184 185 186 187 188 189 190
#-----------------------------------------------------------------------------
# Documentation
#-----------------------------------------------------------------------------
OPTION(DOCUMENTATION_TARGET_IN_ALL "Include the custom target for building documentation in 'all'" OFF)
MARK_AS_ADVANCED(DOCUMENTATION_TARGET_IN_ALL)

SET(DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
 CACHE PATH "Where documentation archives should be stored")
MARK_AS_ADVANCED(DOCUMENTATION_ARCHIVES_OUTPUT_DIRECTORY)

# Attempt to discover Doxygen so that DOXYGEN_EXECUTABLE is set to an appropriate default value
FIND_PACKAGE(Doxygen QUIET)

191 192 193 194 195 196 197 198 199 200
#-----------------------------------------------------------------------------
# CTestCustom
#-----------------------------------------------------------------------------
IF(BUILD_TESTING)
  CONFIGURE_FILE(
    CMake/CTestCustom.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake 
    @ONLY)
ENDIF()

201
#-----------------------------------------------------------------------------
202 203 204 205 206 207 208
# Additional CXX/C Flags
#-----------------------------------------------------------------------------
SET(ADDITIONAL_C_FLAGS "" CACHE STRING "Additional C Flags")
MARK_AS_ADVANCED(ADDITIONAL_C_FLAGS)
SET(ADDITIONAL_CXX_FLAGS "" CACHE STRING "Additional CXX Flags")
MARK_AS_ADVANCED(ADDITIONAL_CXX_FLAGS)

209
#-----------------------------------------------------------------------------
210
# Set Slicer_{C,CXX}_REQUIRED_FLAGS variables
211
#-----------------------------------------------------------------------------
212
INCLUDE(SlicerBlockCXXRequiredFlags)
213

214 215 216
#-----------------------------------------------------------------------------
# Slicer install directories
#------------------------------------------------------------------------------
217 218 219 220 221 222 223

SET(Slicer_BIN_DIR "bin")
SET(Slicer_LIB_DIR "lib/Slicer3")
SET(Slicer_INCLUDE_DIR "include/Slicer")
SET(Slicer_SHARE_DIR "share/Slicer")
SET(Slicer_ITKFACTORIES_DIR "${Slicer_LIB_DIR}/ITKFactories")

224
SET(Slicer_INSTALL_ROOT ".")
225 226 227
IF(APPLE)
  # Set to create Bundle
  SET(Slicer_BUNDLE_LOCATION "Slicer.app/Contents")
228
  SET(Slicer_INSTALL_ROOT "${Slicer_BUNDLE_LOCATION}/")
229
ENDIF()
230

231 232 233 234
SET(Slicer_INSTALL_BIN_DIR "${Slicer_INSTALL_ROOT}/${Slicer_BIN_DIR}")
SET(Slicer_INSTALL_LIB_DIR "${Slicer_INSTALL_ROOT}/${Slicer_LIB_DIR}")
SET(Slicer_INSTALL_INCLUDE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_INCLUDE_DIR}")
SET(Slicer_INSTALL_SHARE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_SHARE_DIR}")
235 236
SET(Slicer_INSTALL_ITKFACTORIES_DIR "${Slicer_INSTALL_LIB_DIR}/ITKFactories")

237 238 239 240 241
#-----------------------------------------------------------------------------
# Qt - Slicer_REQUIRED_QT_MODULES
#-----------------------------------------------------------------------------
# Module name should be specified as they appear in FindQt4.cmake
# For example, the module name associated with the variable QT_USE_QTXML is XML.
242
SET(Slicer_REQUIRED_QT_MODULES CORE GUI NETWORK XML WEBKIT)
243 244 245 246
IF(BUILD_TESTING)
  LIST(APPEND Slicer_REQUIRED_QT_MODULES TEST)
ENDIF()

247
#-----------------------------------------------------------------------------
248 249 250 251 252 253 254
# Superbuild script
#-----------------------------------------------------------------------------
IF(Slicer_SUPERBUILD)
  INCLUDE("${CMAKE_CURRENT_SOURCE_DIR}/SuperBuild.cmake")
  RETURN()
ENDIF()

255 256 257
# Clear SlicerTargets.cmake
FILE(WRITE "${Slicer_BINARY_DIR}/SlicerTargets.cmake"
  "# Generated by CMake, do not edit!")
258

259 260 261
#-----------------------------------------------------------------------------
# Output directories.
#------------------------------------------------------------------------------
262 263 264
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Slicer_BINARY_DIR}/bin)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Slicer_BINARY_DIR}/bin)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${Slicer_BINARY_DIR}/lib)
265

266 267 268
#-----------------------------------------------------------------------------
# Today date
#-----------------------------------------------------------------------------
269
INCLUDE(SlicerFunctionToday)
270 271
TODAY(Slicer_BUILDDATE)

272 273 274 275 276
#-----------------------------------------------------------------------------
# Slicer version number.
#-----------------------------------------------------------------------------
SET(Slicer_VERSION_MAJOR "4")
SET(Slicer_VERSION_MINOR "0")
277

278
IF(NOT Slicer_VERSION_PATCH)
279
  SET(Slicer_VERSION_PATCH "gamma-${Slicer_BUILDDATE}")
280
ENDIF()
281

282 283 284
SET(Slicer_VERSION      "${Slicer_VERSION_MAJOR}.${Slicer_VERSION_MINOR}")
SET(Slicer_VERSION_FULL "${Slicer_VERSION}.${Slicer_VERSION_PATCH}")

285
#-----------------------------------------------------------------------------
286
# Qt plugins (imageformats, ...) relative directories
287
#------------------------------------------------------------------------------
288 289
SET(Slicer_QtPlugins_DIR "lib/QtPlugins")
SET(Slicer_INSTALL_QtPlugins_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QtPlugins_DIR}")
290

291 292 293
#-----------------------------------------------------------------------------
# Plugins and Modules relative directories
#------------------------------------------------------------------------------
294 295 296 297
SET(Slicer_PLUGINS_BIN_DIR "plugins")
SET(Slicer_PLUGINS_LIB_DIR "plugins")
SET(Slicer_PLUGINS_INCLUDE_DIR "${Slicer_INCLUDE_DIR}/plugins")
SET(Slicer_PLUGINS_SHARE_DIR "${Slicer_SHARE_DIR}/plugins")
298

299 300 301 302
SET(Slicer_INSTALL_PLUGINS_BIN_DIR "${Slicer_INSTALL_ROOT}/${Slicer_PLUGINS_BIN_DIR}")
SET(Slicer_INSTALL_PLUGINS_LIB_DIR "${Slicer_INSTALL_ROOT}/${Slicer_PLUGINS_LIB_DIR}")
SET(Slicer_INSTALL_PLUGINS_INCLUDE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_PLUGINS_INCLUDE_DIR}")
SET(Slicer_INSTALL_PLUGINS_SHARE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_PLUGINS_SHARE_DIR}")
303

304
SET(Slicer_HOME "${Slicer_BINARY_DIR}")
305 306

#-----------------------------------------------------------------------------
307 308
# Avoid linker bug in Mac OS 10.5
# See http://wiki.finkproject.org/index.php/Fink:Packaging:Preparing_for_10.5#OpenGL_Bug
309
#
310
IF(APPLE)
311 312
  SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,-dylib_file,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
  SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-dylib_file,/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib")
313
ENDIF()
314

315 316
#-----------------------------------------------------------------------------
# Slicer include and libraries subdirectory
317 318
#

319 320
SET(Slicer_Base_LIBRARIES CACHE INTERNAL "Slicer Base libraries" FORCE)
SET(Slicer_Base_INCLUDE_DIRS CACHE INTERNAL "Slicer Base includes" FORCE)
321
SET(Slicer_ModuleLogic_INCLUDE_DIRS CACHE INTERNAL "Slicer Module logic includes" FORCE)
322 323
SET(Slicer_ModuleMRML_INCLUDE_DIRS CACHE INTERNAL "Slicer Module MRML includes" FORCE)
SET(Slicer_ModuleWidgets_INCLUDE_DIRS CACHE INTERNAL "Slicer Module Widgets includes" FORCE)
324

325 326
#-----------------------------------------------------------------------------
# Get sytem name and architecture
327
#-----------------------------------------------------------------------------
328
SlicerMacroDiscoverSystemNameAndBits(VAR_PREFIX Slicer)
329
MESSAGE(STATUS "Configuring Slicer for architecture ${Slicer_BUILD}")
330

331
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
332
# Testing
333
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
334
IF(BUILD_TESTING)
335
  
336
  SET(Slicer_LAUNCHER_EXECUTABLE ${Slicer_BINARY_DIR}/Slicer)
337
  SET(Slicer_LAUNCH_COMMAND ${Slicer_LAUNCHER_EXECUTABLE} --launcher-no-splash --launch)
338

339
  INCLUDE(CTest)
340
  INCLUDE(SlicerMacroPythonTesting)
341

342 343 344 345 346
  INCLUDE(MIDAS)
  SET(MIDAS_REST_URL "http://midas.kitware.com/api/rest" CACHE STRING "The MIDAS server where testing data resides")
  SET(MIDAS_KEY_DIR "${Slicer_SOURCE_DIR}/Testing/Data")
  SET(MIDAS_DATA_DIR "${Slicer_BINARY_DIR}/MIDAS_Data")

347 348
  SET(CXX_TEST_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
  MARK_AS_ADVANCED(TCL_TCLSH DART_ROOT)
349 350
    
  CONFIGURE_FILE(
351
    ${Slicer_SOURCE_DIR}/CTestConfig.cmake
352
    ${Slicer_BINARY_DIR}/${Slicer_BIN_DIR}/CTestConfig.cmake 
353 354
    COPYONLY)
    
355
ENDIF()
hliu's avatar
hliu committed
356

357
#-----------------------------------------------------------------------------
358 359 360 361
# ITK
#-----------------------------------------------------------------------------
FIND_PACKAGE(ITK REQUIRED)
INCLUDE(${ITK_USE_FILE})
362

363 364 365
#-----------------------------------------------------------------------------
# VTK
#-----------------------------------------------------------------------------
366 367
FIND_PACKAGE(VTK REQUIRED)
IF(NOT VTK_USE_QVTK)
368
  MESSAGE(FATAL_ERROR "error: VTK was not configured to use QT, you probably need to recompile it with VTK_USE_GUISUPPORT ON, VTK_USE_QVTK ON, DESIRED_QT_VERSION 4 and QT_QMAKE_EXECUTABLE set appropriatly. Note that Qt >= ${Slicer_REQUIRED_QT_VERSION} is *required*")
369
ENDIF()
370
INCLUDE(${VTK_USE_FILE})
371 372

#-----------------------------------------------------------------------------
373
# CTK
374
#-----------------------------------------------------------------------------
375 376
FIND_PACKAGE(CTK REQUIRED)
INCLUDE(${CTK_USE_FILE})
377 378 379 380 381 382

#-----------------------------------------------------------------------------
# qCDashAPI
#-----------------------------------------------------------------------------
FIND_PACKAGE(qCDashAPI REQUIRED)
INCLUDE(${qCDashAPI_USE_FILE})
383

384
#-----------------------------------------------------------------------------
385
# Qt 
386
#-----------------------------------------------------------------------------
387
INCLUDE(SlicerBlockFindQtAndCheckVersion)
388

389
#-----------------------------------------------------------------------------
390
# Update CMake module path
391
#-----------------------------------------------------------------------------
392 393 394 395 396
SET(CMAKE_MODULE_PATH
  ${VTK_CMAKE_DIR}
  ${CTK_CMAKE_DIR} 
  ${CMAKE_MODULE_PATH} 
  ${CTK_CMAKE_UTILITIES_DIR})
397

398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
#-----------------------------------------------------------------------------
# Set Slicer_PYTHON_VERSION and Slicer_PYTHON_VERSION_DOT
#-----------------------------------------------------------------------------
IF(Slicer_USE_PYTHONQT)
  FIND_PACKAGE(PythonLibs REQUIRED)
  FIND_PACKAGE(PythonInterp REQUIRED)
  # Extract python lib path
  get_filename_component(PYTHON_DIR_PATH ${PYTHON_EXECUTABLE} PATH)
  SET(PYTHON_LIBRARY_PATH ${PYTHON_DIR_PATH}/../lib)
  IF(WIN32)
    SET(PYTHON_LIBRARY_PATH ${PYTHON_DIR_PATH})
  ENDIF()
  ctkMacroSetPaths("${PYTHON_LIBRARY_PATH}")
  EXECUTE_PROCESS(
    COMMAND ${PYTHON_EXECUTABLE} -c "import sys; print sys.version[:3]"
    OUTPUT_VARIABLE Slicer_PYTHON_VERSION_DOT
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  STRING(REGEX REPLACE "[.]" "" Slicer_PYTHON_VERSION ${Slicer_PYTHON_VERSION_DOT})
  MESSAGE(STATUS "Configuring Slicer with python ${Slicer_PYTHON_VERSION_DOT}")
ENDIF()

419
#-----------------------------------------------------------------------------
420 421
# PythonQt
#-----------------------------------------------------------------------------
422 423 424 425
IF(Slicer_USE_PYTHONQT)
  IF(NOT VTK_WRAP_PYTHON)
    MESSAGE(FATAL_ERROR "Since Slicer_USE_PYTHONQT is ON, VTK_WRAP_PYTHON is expected to be ON. Re-configure VTK with python wrapping.")
  ENDIF()
426

427
  INCLUDE(vtkMacroKitPythonWrap)
428

429 430 431 432 433 434 435
  SET(PYTHONQT_INSTALL_DIR ${CTK_PYTHONQT_INSTALL_DIR})
  LINK_DIRECTORIES(${PYTHONQT_INSTALL_DIR}/lib)
  INCLUDE(ctkMacroWrapPythonQt)
  INCLUDE(ctkMacroCompilePythonScript)
  
  # Enable qMRMLWidgets python wrapping
  SET(qMRMLWidgets_WRAP_PYTHON ON)
436
ENDIF()
437

438
#-----------------------------------------------------------------------------
439 440 441 442
# Teem
#-----------------------------------------------------------------------------
FIND_PACKAGE(Teem REQUIRED)
INCLUDE(${Teem_USE_FILE})
443

444
#-----------------------------------------------------------------------------
445 446 447
# SlicerLibCurl
#-----------------------------------------------------------------------------
FIND_PACKAGE(SLICERLIBCURL REQUIRED)
448
INCLUDE(${SLICERLIBCURL_USE_FILE})
449

450 451 452 453 454
#-----------------------------------------------------------------------------
# LibArchive
#-----------------------------------------------------------------------------
FIND_PACKAGE(LibArchive REQUIRED)

455
#-----------------------------------------------------------------------------
456 457
# BatchMake
#-----------------------------------------------------------------------------
458
IF(Slicer_USE_BatchMake)
459 460
  FIND_PACKAGE(BatchMake REQUIRED)
  INCLUDE(${BatchMake_USE_FILE})
461
ENDIF()
462

463
#-----------------------------------------------------------------------------
464
# OpenIGTLink
465
#-----------------------------------------------------------------------------
466
IF(Slicer_USE_OPENIGTLINK)
467 468
  FIND_PACKAGE(OpenIGTLink REQUIRED)
  INCLUDE(${OpenIGTLink_USE_FILE})
469
ENDIF()
hliu's avatar
hliu committed
470

471 472
#-----------------------------------------------------------------------------
# Need some Tcl/Tk info
473
#-----------------------------------------------------------------------------
474 475 476 477 478
# TODO: these should be passed in by SuperBuild
# For now, use 3.2 as a fallback - we haven't changed versions in years and probably 
# never will, so this is always likely to work.
# This is needed so the launcher can set the paths to the correct subdirectories
# for incrTcl and incrTk
479 480 481 482 483 484 485 486 487

# On 64bit Windows we use a prebuilt tcl 8.5.
IF(WIN32 AND "${CMAKE_SIZEOF_VOID_P}" EQUAL 8)
  SET(TCL_TK_VERSION_DOT "8.5")
  SET(TCL_TK_VERSION "85")
ELSE()
  SET(TCL_TK_VERSION_DOT "8.4")
  SET(TCL_TK_VERSION "84")
ENDIF()
488 489
SET(INCR_TCL_VERSION_DOT "3.2")
SET(INCR_TCL_VERSION "32")
490

491 492 493 494 495
#-----------------------------------------------------------------------------
# Python Version info
#-----------------------------------------------------------------------------


496
#-----------------------------------------------------------------------------
497 498 499 500 501 502 503
# Set Slicer buildin libraries *_DIR variables
#-----------------------------------------------------------------------------
SET(TCLAP_DIR ${Slicer_BINARY_DIR}/Libs/SlicerExecutionModel/tclap)
SET(ModuleDescriptionParser_DIR ${Slicer_BINARY_DIR}/Libs/SlicerExecutionModel/ModuleDescriptionParser)
SET(GenerateCLP_DIR ${Slicer_BINARY_DIR}/Libs/SlicerExecutionModel/GenerateCLP)
SET(GenerateLM_DIR ${Slicer_BINARY_DIR}/Libs/GenerateLM)
SET(vtkITK_DIR ${Slicer_BINARY_DIR}/Libs/vtkITK)
504

jcfr's avatar
jcfr committed
505
#-----------------------------------------------------------------------------
506
# Qt Loadable and Scripted Modules
507
#-----------------------------------------------------------------------------
508
IF(Slicer_BUILD_QTLOADABLEMODULES)
509 510 511 512
  SET(Slicer_QTLOADABLEMODULES_BIN_DIR "qt-loadable-modules")
  SET(Slicer_QTLOADABLEMODULES_LIB_DIR "qt-loadable-modules")
  SET(Slicer_QTLOADABLEMODULES_INCLUDE_DIR "${Slicer_INCLUDE_DIR}/qt-loadable-modules")
  SET(Slicer_QTLOADABLEMODULES_SHARE_DIR "${Slicer_SHARE_DIR}/qt-loadable-modules")
513

514 515 516 517
  SET(Slicer_INSTALL_QTLOADABLEMODULES_BIN_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTLOADABLEMODULES_BIN_DIR}")
  SET(Slicer_INSTALL_QTLOADABLEMODULES_LIB_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTLOADABLEMODULES_LIB_DIR}")
  SET(Slicer_INSTALL_QTLOADABLEMODULES_INCLUDE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTLOADABLEMODULES_INCLUDE_DIR}")
  SET(Slicer_INSTALL_QTLOADABLEMODULES_SHARE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTLOADABLEMODULES_SHARE_DIR}")
518
ENDIF()
519

520
IF(Slicer_BUILD_QTSCRIPTEDMODULES)
521 522 523 524
  SET(Slicer_QTSCRIPTEDMODULES_BIN_DIR "qt-scripted-modules")
  SET(Slicer_QTSCRIPTEDMODULES_LIB_DIR "qt-scripted-modules")
  SET(Slicer_QTSCRIPTEDMODULES_INCLUDE_DIR "${Slicer_INCLUDE_DIR}/qt-scripted-modules")
  SET(Slicer_QTSCRIPTEDMODULES_SHARE_DIR "${Slicer_SHARE_DIR}/qt-scripted-modules")
525

526 527 528 529
  SET(Slicer_INSTALL_QTSCRIPTEDMODULES_BIN_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTSCRIPTEDMODULES_BIN_DIR}")
  SET(Slicer_INSTALL_QTSCRIPTEDMODULES_LIB_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTSCRIPTEDMODULES_LIB_DIR}")
  SET(Slicer_INSTALL_QTSCRIPTEDMODULES_INCLUDE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTSCRIPTEDMODULES_INCLUDE_DIR}")
  SET(Slicer_INSTALL_QTSCRIPTEDMODULES_SHARE_DIR "${Slicer_INSTALL_ROOT}/${Slicer_QTSCRIPTEDMODULES_SHARE_DIR}")
530
ENDIF()
jcfr's avatar
jcfr committed
531

532

533 534
# --------------------------------------------------------------------------
# Configure and install headers
535 536 537 538 539 540 541 542 543 544
# --------------------------------------------------------------------------
SET(files 
  vtkSlicerConfigure.h
  vtkSlicerVersionConfigure.h
  Scripts/runValgrind.sh
  Scripts/runValgrindForOneModule.sh
  Scripts/runValgrindForOneModuleWithSlicer4AndQT.sh
  Scripts/computeCodeCoverageLocally.sh
  Scripts/computeCodeCoverageForOneTest.sh
  Scripts/runExperimentalOffScreen.sh
545
  )
546 547 548 549 550 551
FOREACH(f ${files})
  CONFIGURE_FILE(
    ${CMAKE_CURRENT_SOURCE_DIR}/${f}.in
    ${CMAKE_CURRENT_BINARY_DIR}/${f}
    )
ENDFOREACH()
552

553 554 555 556 557 558 559
IF(NOT Slicer_INSTALL_NO_DEVELOPMENT)
  INSTALL(FILES 
    "${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerConfigure.h"
    "${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerVersionConfigure.h"
    DESTINATION ${Slicer_INSTALL_INCLUDE_DIR} COMPONENT Development
    )
ENDIF()
560 561

#-----------------------------------------------------------------------------
562 563 564 565 566 567 568 569 570 571 572 573
# Set COVERAGE_{C,CXX}_FLAGS variables
#-----------------------------------------------------------------------------
INCLUDE(SlicerBlockCXXCoverageFlags)

#-----------------------------------------------------------------------------
# Set {ITK,VTK}_REQUIRED_{C,CXX}_FLAGS variables
#-----------------------------------------------------------------------------
INCLUDE(vtkDetermineCompilerFlags)
INCLUDE(ITKPlatformSpecificChecks)

#-----------------------------------------------------------------------------
# Set CMAKE_{C,CXX}_FLAGS variables
574
#-----------------------------------------------------------------------------
575 576
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT} ${Slicer_REQUIRED_C_FLAGS} ${ITK_REQUIRED_C_FLAGS} ${VTK_REQUIRED_C_FLAGS} ${COVERAGE_C_FLAGS} ${ADDITIONAL_C_FLAGS}" CACHE STRING "CMake C Flags" FORCE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} ${Slicer_REQUIRED_CXX_FLAGS} ${ITK_REQUIRED_CXX_FLAGS} ${VTK_REQUIRED_CXX_FLAGS} ${COVERAGE_CXX_FLAGS} ${ADDITIONAL_CXX_FLAGS}" CACHE STRING "CMake CXX Flags" FORCE)
577

578
#-----------------------------------------------------------------------------
579
# Generate SlicerVersion.txt
580
#-----------------------------------------------------------------------------
581

582
SlicerMacroExtractRepositoryInfo(VAR_PREFIX Slicer)
583

584
SET(slicer_version_file ${Slicer_HOME}/lib/Slicer3/SlicerVersion.txt)
585

586 587 588 589 590
# Note that Slicer_BUILD is set above
CONFIGURE_FILE(
  ${CMAKE_CURRENT_SOURCE_DIR}/SlicerVersion.txt.in
  ${slicer_version_file}
  )
591

592
INSTALL(FILES
593
  ${slicer_version_file}
594 595 596 597
  DESTINATION ${Slicer_INSTALL_LIB_DIR}
  COMPONENT Development
  )

598 599 600 601 602
#-----------------------------------------------------------------------------
# Includes
#-----------------------------------------------------------------------------

INCLUDE_DIRECTORIES(
603 604
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}
605 606
  )
  
607
#-----------------------------------------------------------------------------
608
# Subdirectories
609 610 611 612 613
#-----------------------------------------------------------------------------

ADD_SUBDIRECTORY(Libs)
ADD_SUBDIRECTORY(Base)
ADD_SUBDIRECTORY(Resources)
614

615
#-----------------------------------------------------------------------------
616
# Macro useful to build ModuleLogic, ModuleMRML and ModuleWidgets libraries
617
#-----------------------------------------------------------------------------
618
INCLUDE(SlicerMacroBuildModuleQtLibrary)
619
INCLUDE(SlicerMacroBuildModuleVTKLibrary)
620
INCLUDE(SlicerMacroPythonWrapModuleVTKLibrary)
621
INCLUDE(SlicerMacroBuildModuleLogic)
622
INCLUDE(SlicerMacroBuildModuleMRML)
623
INCLUDE(SlicerMacroBuildModuleWidgets)
624

625 626 627 628 629 630
#-----------------------------------------------------------------------------
# Slicer Core and GUI library
#-----------------------------------------------------------------------------
SET(Slicer_CORE_LIBRARY qSlicerBaseQTCore)
SET(Slicer_GUI_LIBRARY qSlicerBaseQTGUI)

631 632 633
#-----------------------------------------------------------------------------
# Module Logic
#-----------------------------------------------------------------------------
634

635 636 637 638 639 640 641 642 643 644 645 646 647
# KWWidgets and Qt modules share the same logics typically located in the
# kwwdigets modules. When KWWidgets is not build, the logic are missing for Qt
# we need to manually add them:
# Loop through Modules subdirectory and try to include Logic subdirectory if it exists
FILE(GLOB modules_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Modules/*)
FOREACH(subdir ${modules_subdirs})
  IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${subdir}/Logic)
    ADD_SUBDIRECTORY(${subdir}/Logic)
  ENDIF()
  FILE(GLOB subsubdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${subdir}/*)
  FOREACH(subsubdir ${subsubdirs})
    IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${subsubdir}/Logic)
      ADD_SUBDIRECTORY(${subsubdir}/Logic)
648 649
    ENDIF()
  ENDFOREACH()
650
ENDFOREACH()
651

652
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
653
# Qt Loadable Modules
654 655
#-----------------------------------------------------------------------------

656
IF(Slicer_BUILD_QTLOADABLEMODULES)
657
  ADD_SUBDIRECTORY(QTModules)
658
ENDIF()
659

660
IF(Slicer_BUILD_QTSCRIPTEDMODULES)
661 662 663
  ADD_SUBDIRECTORY(QTScriptedModules)
ENDIF()

664
#-----------------------------------------------------------------------------
665 666 667 668
# Applications - Added after Modules to capture the TractTracing in the correct ordering.
#-----------------------------------------------------------------------------

ADD_SUBDIRECTORY(Applications)
669

670 671
#-----------------------------------------------------------------------------
# Testing
672 673
#-----------------------------------------------------------------------------

jcfr's avatar
jcfr committed
674
IF(BUILD_TESTING)
675
  ADD_SUBDIRECTORY(Testing)
676
ENDIF()
677

678
# Install testing data
679

680 681 682 683 684 685 686 687
IF(NOT Slicer_INSTALL_NO_DEVELOPMENT)
  INSTALL(DIRECTORY
    Testing
    DESTINATION ${Slicer_INSTALL_SHARE_DIR} COMPONENT Development
    PATTERN ".svn" EXCLUDE
    PATTERN "CMakeLists.txt" EXCLUDE
    )
ENDIF()
688 689

#-----------------------------------------------------------------------------
690
# Launcher for slicer
691
#-----------------------------------------------------------------------------
692
ADD_SUBDIRECTORY(Utilities/Launcher)
693

694 695
# on Mac we need to include the path of each Qt Framework in DYLD_LIBRARY_PATH in the launcher.
IF(APPLE)
696
  SET (QTLIBLIST QTCORE QTGUI QTNETWORK QTXML QTTEST QTSCRIPT QTSQL QTOPENGL QTWEBKIT PHONON QTXMLPATTERNS)
697

698 699 700 701 702 703 704
  FOREACH(qtlib ${QTLIBLIST})
    IF(QT_${qtlib}_LIBRARY_RELEASE AND APPLE)
        GET_FILENAME_COMPONENT(QT_FRAMEWORK_NAME_tmp ${QT_${qtlib}_LIBRARY_RELEASE} NAME)
        SET(Slicer_QT_FRAMEWORK_DIRS "lib/Qt/${QT_FRAMEWORK_NAME_tmp}/Versions/4:${Slicer_QT_FRAMEWORK_DIRS}")
    ENDIF()
  ENDFOREACH()
ENDIF()
705

706
CONFIGURE_FILE(
707
  ${Slicer_SOURCE_DIR}/launch.tcl.in
708
  "${Slicer_BINARY_DIR}/${Slicer_LIB_DIR}/launch.tcl"
709 710
  )
INSTALL(
711
  FILES "${Slicer_BINARY_DIR}/${Slicer_LIB_DIR}/launch.tcl"
712
  DESTINATION ${Slicer_INSTALL_LIB_DIR}
713
  )
714 715

#-----------------------------------------------------------------------------
716
# Documentation
717 718
#-----------------------------------------------------------------------------

719
ADD_SUBDIRECTORY(Utilities/Doxygen)
720

721 722 723 724 725 726 727 728 729 730 731 732 733 734
IF(NOT Slicer_INSTALL_NO_DEVELOPMENT)
  FILE(GLOB cmake_files "${CMAKE_CURRENT_SOURCE_DIR}/CMake/*.cmake")
  INSTALL(
    FILES ${cmake_files}
    DESTINATION ${Slicer_INSTALL_LIB_DIR}/CMake COMPONENT Development
    )

  INSTALL(FILES
    ${Slicer_BINARY_DIR}/UseSlicer.cmake
    ${Slicer_BINARY_DIR}/SlicerConfig.cmake
    DESTINATION ${Slicer_INSTALL_LIB_DIR}
    COMPONENT Development
    )
ENDIF()
735

736 737 738 739 740
#-----------------------------------------------------------------------------
# The commands in this directory are intended to be executed as
# the end of the whole configuration process, as a "last step".
# This directory is typically the last add_subdirectory in the main CMakeLists.txt.
ADD_SUBDIRECTORY(Utilities/LastConfigureStep)
741