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

5
PROJECT(Slicer)
6

7 8 9 10 11
#-----------------------------------------------------------------------------
# See http://cmake.org/cmake/help/cmake-2-8-docs.html#section_Policies for details
#-----------------------------------------------------------------------------

SET(project_policies
12
  CMP0001 # NEW: CMAKE_BACKWARDS_COMPATIBILITY should no longer be used.
13
  CMP0002 # NEW: Logical target names must be globally unique.
14
  CMP0003 # NEW: Libraries linked via full path no longer produce linker search paths.
15 16 17 18 19 20
  CMP0004 # NEW: Libraries linked may NOT have leading or trailing whitespace.
  CMP0005 # NEW: Preprocessor definition values are now escaped automatically.
  CMP0006 # NEW: Installing MACOSX_BUNDLE targets requires a BUNDLE DESTINATION.
  CMP0007 # NEW: List command no longer ignores empty elements.
  CMP0008 # NEW: Libraries linked by full-path must have a valid library file name.
  CMP0009 # NEW: FILE GLOB_RECURSE calls should not follow symlinks by default.
jcfr's avatar
jcfr committed
21
  CMP0010 # NEW: Bad variable reference syntax is an error.
22
  CMP0011 # NEW: Included scripts do automatic cmake_policy PUSH and POP.
23
  CMP0012 # NEW: if() recognizes numbers and boolean constants.
jcfr's avatar
jcfr committed
24
  CMP0013 # NEW: Duplicate binary directories are not allowed.
25
  CMP0014 # NEW: Input directories must have CMakeLists.txt
26 27 28 29 30 31
  )
FOREACH(policy ${project_policies})
  IF(POLICY ${policy})
    CMAKE_POLICY(SET ${policy} NEW)
  ENDIF()
ENDFOREACH()
32

jcfr's avatar
jcfr committed
33 34 35 36 37 38 39 40
#-----------------------------------------------------------------------------
# CMake Function(s) and Macro(s)
#-----------------------------------------------------------------------------

INCLUDE(CMake/Slicer3PersistenceMacros.cmake)
INCLUDE(CMake/SlicerParseArgumentsMacro.cmake)
INCLUDE(CMake/Slicer3PluginsMacros.cmake)
INCLUDE(CMake/SlicerMacroEmptyExternalProject.cmake)
41
INCLUDE(CMake/SlicerFunctionCheckCompilerFlags.cmake)
jcfr's avatar
jcfr committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158

#-----------------------------------------------------------------------------
# Platform check
#-----------------------------------------------------------------------------

SET(PLATFORM_CHECK true)

if(PLATFORM_CHECK)
  # See CMake/Modules/Platform/Darwin.cmake)
  #   6.x == Mac OSX 10.2 (Jaguar)
  #   7.x == Mac OSX 10.3 (Panther)
  #   8.x == Mac OSX 10.4 (Tiger)
  #   9.x == Mac OSX 10.5 (Leopard)
  #  10.x == Mac OSX 10.6 (Snow Leopard)
  if (DARWIN_MAJOR_VERSION LESS "8")
    message(FATAL_ERROR "Only Mac OSX >= 10.4 are supported !")
  endif()
endif()

#-----------------------------------------------------------------------------
# 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()

SET(minimum_required_qt_version "4.6.2")

#-----------------------------------------------------------------------------
# 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()

#-----------------------------------------------------------------------------
# Additional Slicer Options
#-----------------------------------------------------------------------------
OPTION(BUILD_DOCUMENTATION "Build Slicer Documentation" OFF)
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)
OPTION(Slicer_BUILD_CLI       "Build Slicer CLI Plugins" ON)
OPTION(Slicer_USE_PYTHONQT    "Integrate a python-QT interpreter into Slicer." ON)
OPTION(Slicer_USE_PYTHONQT_WITH_TCL "Enable PythonQt Tcl adapter layer" ON)
#MARK_AS_ADVANCED(Slicer_USE_PYTHONQT_WITH_TCL)
OPTION(Slicer_USE_BatchMake   "Build Slicer with BatchMake support." ON)
OPTION(Slicer_USE_MIDAS       "Build Slicer with MIDAS support." OFF)
OPTION(Slicer_USE_OPENIGTLINK "Build Slicer with OpenIGTLink support." ON)
OPTION(Slicer_USE_OPENCV      "Build Slicer with OpenCV support." OFF)
OPTION(Slicer_USE_CTKAPPLAUNCHER "Configure ctkAppLauncher." OFF)
MARK_AS_ADVANCED(Slicer_USE_CTKAPPLAUNCHER)

# Slicer implicitly uses Qt
SET(Slicer_USE_QT ON CACHE INTERNAL "Build Slicer with Qt")

# The following options are deprecated and will be removed 
# when the port is complete
OPTION(Slicer_USE_KWWIDGETS "Deprecated - Build Slicer with KWWidgets" OFF)
MARK_AS_ADVANCED(Slicer_USE_KWWIDGETS)
if(Slicer_USE_KWWIDGETS)
  OPTION(Slicer_USE_PYTHON "Deprecated - Integrate a python interpreter into Slicer." OFF)
  OPTION(Slicer_BUILD_MODULES "Deprecated - Build Slicer Modules" ON)
  MARK_AS_ADVANCED(Slicer_USE_PYTHON Slicer_BUILD_MODULES)
endif()

#-----------------------------------------------------------------------------
# Update CMake module path
#------------------------------------------------------------------------------

# Make sure VTK_CMAKE_DIR is at the beginning so that VTK's FindTCL is
# used before CMake's FindTCL.
SET(CMAKE_MODULE_PATH
  ${VTK_CMAKE_DIR}
  ${Slicer_SOURCE_DIR}/CMake
  ${Slicer_BINARY_DIR}/CMake
  ${CMAKE_MODULE_PATH}
  )
  
SET(Slicer_CMAKE_DIR "${Slicer_SOURCE_DIR}/CMake" CACHE INTERNAL "")

#-----------------------------------------------------------------------------
159 160 161 162 163 164 165 166 167 168 169 170 171
# 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)

#-----------------------------------------------------------------------------
# Slicer C/CXX Flags
#-----------------------------------------------------------------------------
SET(Slicer_C_FLAGS "${ADDITIONAL_C_FLAGS}")
SET(Slicer_CXX_FLAGS "${ADDITIONAL_CXX_FLAGS}")
172 173 174 175 176 177 178 179 180 181 182 183

IF(CMAKE_COMPILER_IS_GNUCXX)
  SET(cflags "-Wall -Wextra -Wpointer-arith -Winvalid-pch -Wcast-align -Wwrite-strings -D_FORTIFY_SOURCE=2")
  SlicerFunctionCheckCompilerFlags("-fdiagnostics-show-option" cflags)
  SlicerFunctionCheckCompilerFlags("-fstack-protector-all" cflags)
  IF(MINGW)
    # suppress warnings about auto imported symbols
    SET(Slicer_CXX_FLAGS "-Wl,--enable-auto-import ${Slicer_CXX_FLAGS}")
  ENDIF()
  
  SET(Slicer_C_FLAGS "${cflags} ${Slicer_C_FLAGS}")
  SET(Slicer_CXX_FLAGS "${cflags} -Woverloaded-virtual -Wold-style-cast -Wstrict-null-sentinel -Wsign-promo ${Slicer_CXX_FLAGS}")
184 185
ENDIF()

186
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
187 188 189 190 191 192 193 194
# Superbuild script
#-----------------------------------------------------------------------------

IF(Slicer_SUPERBUILD)
  INCLUDE("${CMAKE_CURRENT_SOURCE_DIR}/SuperBuild.cmake")
  RETURN()
ENDIF()

jcfr's avatar
jcfr committed
195 196
#-----------------------------------------------------------------------------
# Output directories.
jcfr's avatar
jcfr committed
197 198
#------------------------------------------------------------------------------

jcfr's avatar
jcfr committed
199 200 201
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)
202

jcfr's avatar
jcfr committed
203 204 205 206 207 208 209 210 211 212 213 214
#-----------------------------------------------------------------------------
# Slicer version number.
#-----------------------------------------------------------------------------

SET(Slicer_VERSION_MAJOR "4")
SET(Slicer_VERSION_MINOR "0")
IF(NOT Slicer_VERSION_PATCH)
  SET(Slicer_VERSION_PATCH "alpha")
ENDIF()
SET(Slicer_VERSION      "${Slicer_VERSION_MAJOR}.${Slicer_VERSION_MINOR}")
SET(Slicer_VERSION_FULL "${Slicer_VERSION}.${Slicer_VERSION_PATCH}")

215
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
216
# Install directories
jcfr's avatar
jcfr committed
217 218 219 220 221 222 223
#------------------------------------------------------------------------------

SET(Slicer_INSTALL_BIN_DIR "bin")
SET(Slicer_INSTALL_LIB_DIR "lib/Slicer3")
SET(Slicer_INSTALL_INCLUDE_DIR "include/Slicer")
SET(Slicer_INSTALL_SHARE_DIR "share/Slicer")
SET(Slicer_INSTALL_ITKFACTORIES_DIR "${Slicer_INSTALL_LIB_DIR}/ITKFactories")
224

jcfr's avatar
jcfr committed
225 226 227 228 229
SET(Slicer_INSTALL_PLUGINS_BIN_DIR "${Slicer_INSTALL_LIB_DIR}/Plugins")
SET(Slicer_INSTALL_PLUGINS_LIB_DIR "${Slicer_INSTALL_LIB_DIR}/Plugins")
SET(Slicer_INSTALL_PLUGINS_INCLUDE_DIR "${Slicer_INSTALL_INCLUDE_DIR}/Plugins")
SET(Slicer_INSTALL_PLUGINS_SHARE_DIR "${Slicer_INSTALL_SHARE_DIR}/Plugins")
SET(Slicer_INSTALL_PLUGINS_CACHE_DIR "${Slicer_INSTALL_LIB_DIR}/PluginsCache")
230

jcfr's avatar
jcfr committed
231 232 233 234
SET(Slicer_INSTALL_MODULES_BIN_DIR "${Slicer_INSTALL_LIB_DIR}/Modules")
SET(Slicer_INSTALL_MODULES_LIB_DIR "${Slicer_INSTALL_LIB_DIR}/Modules")
SET(Slicer_INSTALL_MODULES_INCLUDE_DIR "${Slicer_INSTALL_INCLUDE_DIR}/Modules")
SET(Slicer_INSTALL_MODULES_SHARE_DIR "${Slicer_INSTALL_SHARE_DIR}/Modules")
235

jcfr's avatar
jcfr committed
236
SET(Slicer_HOME "${Slicer_BINARY_DIR}")
237

238 239
#-----------------------------------------------------------------------------
# Convenient macro allowing to download a file
jcfr's avatar
jcfr committed
240 241
#------------------------------------------------------------------------------

242
MACRO(downloadFile url dest)
243 244 245 246 247 248 249
  IF(NOT EXISTS ${dest})
    FILE(DOWNLOAD ${url} ${dest} STATUS status)
    LIST(GET status 0 error_code)
    LIST(GET status 1 error_msg)
    IF(error_code)
      MESSAGE(FATAL_ERROR "error: Failed to download ${url} - ${error_msg}")
    ENDIF()
250 251
  ELSE()
    # Make sure the file is not empty
252 253 254
    FILE(READ ${dest} dest_content LIMIT 4)
    STRING(LENGTH "${dest_content}" dest_length)
    IF(NOT "${dest_length}" EQUAL 4)
255 256 257
      FILE(REMOVE ${dest})
      downloadFile(${url} ${dest})
    ENDIF()
258 259 260
  ENDIF()
ENDMACRO()

261
#-----------------------------------------------------------------------------
262 263
# Disable the warnings that DevStudio 2005 emits wrt to sprintf, strcpu, etc.
#
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
# warnings (copied from ITK's CMake files so that ITK templated code will compile
# correctly).
IF(WIN32)
  IF(NOT BORLAND)
    IF(NOT CYGWIN)
      IF(NOT MINGW)
        ADD_DEFINITIONS(
          -D_CRT_FAR_MAPPINGS_NO_DEPRECATE
          -D_CRT_IS_WCTYPE_NO_DEPRECATE
          -D_CRT_MANAGED_FP_NO_DEPRECATE
          -D_CRT_NONSTDC_NO_DEPRECATE
          -D_CRT_SECURE_NO_DEPRECATE
          -D_CRT_SECURE_NO_DEPRECATE_GLOBALS
          -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
          -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
          -D_CRT_VCCLRIT_NO_DEPRECATE
          -D_SCL_SECURE_NO_DEPRECATE
          )
283 284 285 286
      ENDIF()
    ENDIF()
  ENDIF()
ENDIF()
287

288 289
# Disable warning C4996: [...] This function or variable may be unsafe. [...]
# To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
290
IF(MSVC90)
291
  add_definitions(-D_CRT_SECURE_NO_WARNINGS)
292
ENDIF()
293

294
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
295 296
# Avoid linker bug in Mac OS 10.5
# See http://wiki.finkproject.org/index.php/Fink:Packaging:Preparing_for_10.5#OpenGL_Bug
297
#
298
IF(APPLE)
jcfr's avatar
jcfr committed
299 300
  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")
301
ENDIF()
302

303 304
#-----------------------------------------------------------------------------
# Slicer include and libraries subdirectory
305
#
306 307
slicer3_set_persistent_property(Slicer_Libs_LIBRARIES "")
slicer3_set_persistent_property(Slicer_Base_LIBRARIES "")
308 309
slicer3_set_persistent_property(Slicer_Modules_LIBRARIES "")
slicer3_set_persistent_property(Slicer_QTModules_LIBRARIES "")
310

311 312
slicer3_set_persistent_property(Slicer_Libs_INCLUDE_DIRS "")
slicer3_set_persistent_property(Slicer_Base_INCLUDE_DIRS "")
313 314
slicer3_set_persistent_property(Slicer_Modules_INCLUDE_DIRS "")
slicer3_set_persistent_property(Slicer_QTModules_INCLUDE_DIRS "")
pieper's avatar
pieper committed
315

316 317
#-----------------------------------------------------------------------------
# Get sytem name and architecture
jcfr's avatar
jcfr committed
318 319
#-----------------------------------------------------------------------------

320
SET(Slicer_BUILD NA)
jcfr's avatar
jcfr committed
321
INCLUDE(CMake/DiscoverSystemNameAndBits.cmake)
322
MESSAGE(STATUS "Slicer_BUILD:${Slicer_BUILD}")
323

324
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
325
# Testing
jcfr's avatar
jcfr committed
326
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
327
IF(BUILD_TESTING)
jcfr's avatar
jcfr committed
328 329 330
  
  SET(LAUNCH_EXE ${Slicer_BINARY_DIR}/Slicer3 --launch)
  
331
  ENABLE_TESTING()
jcfr's avatar
jcfr committed
332
  
333
  INCLUDE(CTest)
jcfr's avatar
jcfr committed
334
  
335 336
  SET(CXX_TEST_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
  MARK_AS_ADVANCED(TCL_TCLSH DART_ROOT)
jcfr's avatar
jcfr committed
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
  
  CONFIGURE_FILE(
    CMake/CTestCustom.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake 
    @ONLY)
    
  CONFIGURE_FILE(
    ${Slicer_SOURCE_DIR}/CTestConfig.cmake
    ${Slicer_BINARY_DIR}/${Slicer_INSTALL_LIB_DIR}/CTestConfig.cmake 
    COPYONLY)
  
  CONFIGURE_FILE(
    ${Slicer_SOURCE_DIR}/CMake/RemoveTemporaryFiles.cmake.in
    ${Slicer_BINARY_DIR}/CMake/RemoveTemporaryFiles.cmake
    @ONLY)
    
  CONFIGURE_FILE(
    ${Slicer_SOURCE_DIR}/CMake/Slicer3SampleBuildTest.cmake.in
    ${Slicer_BINARY_DIR}/CMake/Slicer3SampleBuildTest.cmake 
    @ONLY)
    
358
ENDIF()
hliu's avatar
hliu committed
359

360 361
#-----------------------------------------------------------------------------
# Since modules are KWWidgets based, unset there variables
362
IF(NOT Slicer_USE_KWWIDGETS)
363
  # Since the module Logic is shared between QTModules and regular Modules,
364
  # the associated BIN, LIB and INCLUDE directory shouldn't be unset
365 366 367 368
  #UNSET(Slicer_INSTALL_MODULES_BIN_DIR)
  #UNSET(Slicer_INSTALL_MODULES_LIB_DIR)
  #UNSET(Slicer_INSTALL_MODULES_INCLUDE_DIR)
  UNSET(Slicer_INSTALL_MODULES_SHARE_DIR)
369
ENDIF()
370

371 372 373
# Relax some constraints related to the build settings file. This was
# preventing people from using the same compiler but with a different generator,
# or just the same compiler installed in a non-standard location.
374
IF(Slicer_USE_KWWIDGETS)
jcfr's avatar
jcfr committed
375
  SET(SKIP_KWWidgets_BUILD_SETTINGS_FILE 1)
376
ENDIF()
jcfr's avatar
jcfr committed
377 378 379
SET(SKIP_VTK_BUILD_SETTINGS_FILE 1)
SET(SKIP_ITK_BUILD_SETTINGS_FILE 1)
SET(SKIP_Teem_BUILD_SETTINGS_FILE 1)
380 381

#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
382 383 384
# Python
#-----------------------------------------------------------------------------

385
IF(Slicer_USE_PYTHON OR Slicer_USE_PYTHONQT)
jcfr's avatar
jcfr committed
386 387
  FIND_PACKAGE(PythonLibs)
  FIND_PACKAGE(PythonInterp)
388
ENDIF()
389

390
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
391 392 393
# ITK
#-----------------------------------------------------------------------------
FIND_PACKAGE(ITK REQUIRED)
394
IF(NOT ITK_FOUND)
395
  message(FATAL_ERROR "Need ITK to build")
396
ENDIF()
jcfr's avatar
jcfr committed
397
INCLUDE(${ITK_USE_FILE})
398

jcfr's avatar
jcfr committed
399
IF(Slicer_USE_KWWIDGETS)
400
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
401
# Deprecated - KWWidgets 
402 403 404 405
#-----------------------------------------------------------------------------
  FIND_PACKAGE(KWWidgets REQUIRED)
  IF(NOT KWWidgets_FOUND)
    MESSAGE(FATAL_ERROR "Need KWWidgets to build")
406
  ENDIF()
407
  INCLUDE(${KWWidgets_USE_FILE})
408
  
409
ELSE()
jcfr's avatar
jcfr committed
410 411 412
#-----------------------------------------------------------------------------
# VTK
#-----------------------------------------------------------------------------
413 414
  FIND_PACKAGE(VTK REQUIRED)
  IF(NOT VTK_FOUND)
415
    MESSAGE(FATAL_ERROR "Need VTK to build")
jcfr's avatar
jcfr committed
416 417 418
  ENDIF()
  IF(NOT VTK_USE_QVTK)
    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 >= ${minimum_required_qt_version} is *required*")
419
  ENDIF()
420
  INCLUDE(${VTK_USE_FILE})
421
  
422
ENDIF()
423 424

#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
425
# Qt 
426
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
IF(Slicer_USE_QT)
  SET(extra_error_message)
  IF(NOT DEFINED QT_QMAKE_EXECUTABLE AND EXISTS "${VTK_QT_QMAKE_EXECUTABLE}")
    SET(QT_QMAKE_EXECUTABLE ${VTK_QT_QMAKE_EXECUTABLE})
    SET(extra_error_message "You should probably reconfigure VTK.")
  ENDIF()
  
  FIND_PACKAGE(Qt4)
  IF(NOT QT4_FOUND)
    MESSAGE(FATAL_ERROR "error: Qt >= ${minimum_required_qt_version} was not found on your system. You probably need to set the QT_QMAKE_EXECUTABLE variable.")
  ENDIF()
  
  # Check version, note that ${QT_VERSION_PATCH} could also be used
  IF("${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}" VERSION_LESS "${minimum_required_qt_version}")
    MESSAGE(FATAL_ERROR "error: Slicer requires Qt >= ${minimum_required_qt_version} -- you cannot use Qt ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}. ${extra_error_message}")
  ENDIF()
  
  MESSAGE(STATUS "Configuring Slicer with Qt ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH}")
  
  # Enable modules
  SET(QT_USE_QTNETWORK ON)
  SET(QT_USE_QTTEST ${BUILD_TESTING})

  # Includes Qt headers
  INCLUDE(${QT_USE_FILE})
452
ENDIF()
453 454

#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
# CTK
#-----------------------------------------------------------------------------
SET(git_repo http://github.com/commontk/CTK/raw/master/)

IF(Slicer_USE_QT)
  SET(file Utilities/CMake/FindCTK.cmake)
  downloadFile(${git_repo}/${file} ${Slicer_BINARY_DIR}/CMake/FindCTK.cmake)

  FIND_PACKAGE(CTK REQUIRED)
  IF(CTK_FOUND)
    INCLUDE(${CTK_USE_FILE})
    # Update CMake module path
    SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CTK_CMAKE_UTILITIES_DIR})
    IF(Slicer_USE_PYTHONQT)
      SET(PYTHONQT_INSTALL_DIR ${CTK_PYTHONQT_INSTALL_DIR})
      LINK_DIRECTORIES(${PYTHONQT_INSTALL_DIR}/lib)
      INCLUDE(${CTK_CMAKE_DIR}/ctkMacroWrapPythonQt.cmake)
    ENDIF()
473 474
  ENDIF()
ENDIF()
475

476
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
477 478
# PythonQt
#-----------------------------------------------------------------------------
479
IF(Slicer_USE_QT)
480
  IF(Slicer_USE_PYTHONQT)
481
    IF(NOT VTK_WRAP_PYTHON)
482
      MESSAGE(FATAL_ERROR "Since both Slicer_USE_QT and Slicer_USE_PYTHONQT are ON, VTK_WRAP_PYTHON is expected to be ON. Disable Slicer_USE_PYTHONQT or re-configure VTK with python wrapping.")
483
    ENDIF()
484
    # Include convenient script allowing to copy and compile python scripts
485
    INCLUDE(${Slicer_CMAKE_DIR}/SlicerCompilePythonScripts.cmake)
486
    # Enable qMRMLWidgets python wrapping
487
    SET(qMRMLWidgets_WRAP_PYTHON OFF)
488 489
  ENDIF()
ENDIF()
490

491
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
492 493 494
# Teem
#-----------------------------------------------------------------------------
FIND_PACKAGE(Teem REQUIRED)
495
IF(NOT Teem_FOUND)
496
  message(FATAL_ERROR "Need Teem to build")
497
ENDIF()
jcfr's avatar
jcfr committed
498
INCLUDE(${Teem_USE_FILE})
499

500
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
501 502 503
# SlicerLibCurl
#-----------------------------------------------------------------------------
FIND_PACKAGE(SLICERLIBCURL REQUIRED)
504
IF(SLICERLIBCURL_FOUND)
jcfr's avatar
jcfr committed
505
  INCLUDE(${SLICERLIBCURL_USE_FILE})
506
ENDIF()
507 508

#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
509 510
# BatchMake
#-----------------------------------------------------------------------------
511
IF(Slicer_USE_BatchMake)
jcfr's avatar
jcfr committed
512 513
  FIND_PACKAGE(BatchMake REQUIRED)
  INCLUDE(${BatchMake_USE_FILE})
514
ENDIF()
515

516
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
517
# OpenIGTLink
518
#-----------------------------------------------------------------------------
519
IF(Slicer_USE_OPENIGTLINK)
jcfr's avatar
jcfr committed
520 521
  FIND_PACKAGE(OpenIGTLink REQUIRED)
  INCLUDE(${OpenIGTLink_USE_FILE})
522
ENDIF()
hliu's avatar
hliu committed
523

524
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
525 526
# OpenCV (Built in Slicer3-lib)
#-----------------------------------------------------------------------------
527
IF(Slicer_USE_OPENCV)
jcfr's avatar
jcfr committed
528
  FIND_PACKAGE(OpenCV REQUIRED)
529 530 531 532

  IF(OPENCV_BUILD_SETTINGS_FILE AND NOT SKIP_OPENCV_BUILD_SETTINGS_FILE)
    INCLUDE(${CMAKE_ROOT}/Modules/CMakeImportBuildSettings.cmake)
    CMAKE_IMPORT_BUILD_SETTINGS(${OPENCV_BUILD_SETTINGS_FILE})
533
  ENDIF()
534 535 536 537 538 539 540 541 542 543 544 545 546
  
  # Add compiler flags needed to use OPENCV.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENCV_REQUIRED_C_FLAGS}")
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_REQUIRED_CXX_FLAGS}")
  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCV_REQUIRED_LINK_FLAGS}")
  SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OPENCV_REQUIRED_LINK_FLAGS}")
  SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OPENCV_REQUIRED_LINK_FLAGS}")
  
  # Add include directories needed to use OPENCV.
  INCLUDE_DIRECTORIES(BEFORE ${OPENCV_INCLUDE_DIRS})
  
  # Add link directories needed to use OPENCV.
  LINK_DIRECTORIES(${OPENCV_LIBRARY_DIRS})
jcfr's avatar
jcfr committed
547
  #INCLUDE(${OPENCV_USE_FILE})
548
ENDIF()
549 550


551 552
#-----------------------------------------------------------------------------
# Need some Tcl/Tk info
jcfr's avatar
jcfr committed
553
#-----------------------------------------------------------------------------
554
IF(VTK_WRAP_TCL)
jcfr's avatar
jcfr committed
555
  INCLUDE("${VTK_CMAKE_DIR}/vtkTclTkMacros.cmake")
556
  VTK_GET_TCL_TK_VERSION(TCL_TK_MAJOR_VERSION TCL_TK_MINOR_VERSION)
jcfr's avatar
jcfr committed
557 558
  SET(TCL_TK_VERSION_DOT "${TCL_TK_MAJOR_VERSION}.${TCL_TK_MINOR_VERSION}")
  SET(TCL_TK_VERSION "${TCL_TK_MAJOR_VERSION}${TCL_TK_MINOR_VERSION}")
559
  IF(Slicer_USE_KWWIDGETS)
jcfr's avatar
jcfr committed
560
    INCLUDE("${KWWidgets_CMAKE_DIR}/KWWidgetsTclTkMacros.cmake")
561
    incr_tcl_get_version(INCR_TCL_MAJOR_VERSION INCR_TCL_MINOR_VERSION)
jcfr's avatar
jcfr committed
562 563
    SET(INCR_TCL_VERSION_DOT "${INCR_TCL_MAJOR_VERSION}.${INCR_TCL_MINOR_VERSION}")
    SET(INCR_TCL_VERSION "${INCR_TCL_MAJOR_VERSION}${INCR_TCL_MINOR_VERSION}")
564 565
  ENDIF()
ELSE()
566 567 568 569 570
  # 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
jcfr's avatar
jcfr committed
571 572 573 574
  SET(TCL_TK_VERSION_DOT "8.4")
  SET(TCL_TK_VERSION "84")
  SET(INCR_TCL_VERSION_DOT "3.2")
  SET(INCR_TCL_VERSION "32")
575
ENDIF()
576

jcfr's avatar
jcfr committed
577 578
#-----------------------------------------------------------------------------
# DEPRECATED - Remove the following section when port to Qt is completed
579
#-----------------------------------------------------------------------------
barre's avatar
barre committed
580 581 582
# Generate the default setup paths scripts.
# Generate some useful scripts that can be used to setup various environment 
# variables and launch the executable properly against external packages.
jcfr's avatar
jcfr committed
583
#-----------------------------------------------------------------------------
584
IF(Slicer_USE_KWWIDGETS)
jcfr's avatar
jcfr committed
585 586
  INCLUDE("${KWWidgets_CMAKE_DIR}/KWWidgetsPathsMacros.cmake")
  SET(extra_dirs
587 588
    "${Teem_DIR}/bin"
    "${BatchMake_DIR}/bin"
589
    "${OpenIGTLink_DIR}/bin"
590 591 592 593
    "${Slicer_HOME}/${Slicer_INSTALL_PLUGINS_BIN_DIR}"
    "${Slicer_HOME}/${Slicer_INSTALL_PLUGINS_LIB_DIR}"
    "${Slicer_HOME}/${Slicer_INSTALL_MODULES_BIN_DIR}"
    "${Slicer_HOME}/${Slicer_INSTALL_MODULES_LIB_DIR}"
594 595 596 597
    )
  kwwidgets_generate_setup_paths_scripts(
    "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" "Slicer3SetupPaths"
    "${extra_dirs}"
598
  )
599
ENDIF()
barre's avatar
barre committed
600

jcfr's avatar
jcfr committed
601 602
#-----------------------------------------------------------------------------
# DEPRECATED - Remove the following section when port to Qt is completed
603
#-----------------------------------------------------------------------------
barre's avatar
barre committed
604 605 606 607 608
# VTK 5.0 does not have VTK_CMAKE_DIR
# Alternatively you could use KWWidget's wrapping, which encapsulate
# the differences between various VTK versions:
#  INCLUDE("${KWWidgets_CMAKE_DIR}/KWWidgetsWrappingMacros.cmake")
#  KWWidgets_WRAP_TCL(${LIB_NAME} LIB_TCL_SRCS "${LIB_SRCS}" "")
jcfr's avatar
jcfr committed
609
#-----------------------------------------------------------------------------
610
IF(Slicer_USE_KWWIDGETS)
611
  IF(NOT VTK_CMAKE_DIR)
jcfr's avatar
jcfr committed
612
    SET(VTK_CMAKE_DIR "${VTK_SOURCE_DIR}/CMake")
613
  ENDIF()
jcfr's avatar
jcfr committed
614
  INCLUDE("${VTK_CMAKE_DIR}/vtkWrapTcl.cmake")
615
ENDIF()
616

jcfr's avatar
jcfr committed
617 618 619

#-----------------------------------------------------------------------------
# DEPRECATED - Remove the following section when port to Qt is completed
620 621
#-----------------------------------------------------------------------------
# Check versions of VTK to track CVS HEAD
jcfr's avatar
jcfr committed
622
#-----------------------------------------------------------------------------
623
IF(Slicer_USE_KWWIDGETS)
jcfr's avatar
jcfr committed
624
  FIND_PACKAGE(VTK REQUIRED)
625
  IF(EXISTS ${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
jcfr's avatar
jcfr committed
626
    INCLUDE(${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
627
  else()
628
    #MESSAGE("Using local version of VTKVersionMacros for compatibility.")
jcfr's avatar
jcfr committed
629
    INCLUDE(${Slicer_SOURCE_DIR}/Scripts/VTKVersionMacros.cmake)
630
  ENDIF()
631 632

  vtk_get_source_revision_and_date(VTKsource_revision VTKsource_date)
633
  IF(VTKsource_revision LESS 1.2196)
634
    message(FATAL_ERROR "Sorry, your VTK library was last updated on ${VTKsource_date}. Its source revision, according to vtkKWWidgetsVersion.h, is ${VTKsource_revision}. Please update to a newer revision.")
635 636
  ENDIF()
ENDIF()
637

638
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
639 640 641 642 643 644 645 646
# 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(LoadableModule_DIR ${Slicer_BINARY_DIR}/Libs/LoadableModule)
SET(vtkITK_DIR ${Slicer_BINARY_DIR}/Libs/vtkITK)
647

jcfr's avatar
jcfr committed
648 649
#-----------------------------------------------------------------------------
# Qt Loadable Modules
jcfr's avatar
jcfr committed
650
#-----------------------------------------------------------------------------
651
IF(Slicer_USE_QT)
652 653
  IF(Slicer_BUILD_QTLOADABLEMODULES)
    ADD_DEFINITIONS(-DSlicer_BUILD_QTLOADABLEMODULES)
jcfr's avatar
jcfr committed
654 655 656 657
    SET(Slicer_INSTALL_QTLOADABLEMODULES_BIN_DIR "${Slicer_INSTALL_LIB_DIR}/QTLoadableModules")
    SET(Slicer_INSTALL_QTLOADABLEMODULES_LIB_DIR "${Slicer_INSTALL_LIB_DIR}/QTLoadableModules")
    SET(Slicer_INSTALL_QTLOADABLEMODULES_INCLUDE_DIR "${Slicer_INSTALL_INCLUDE_DIR}/QTLoadableModules")
    SET(Slicer_INSTALL_QTLOADABLEMODULES_SHARE_DIR "${Slicer_INSTALL_SHARE_DIR}/QTLoadableModules")
658 659
  ENDIF()
ENDIF()
jcfr's avatar
jcfr committed
660

661 662
# --------------------------------------------------------------------------
# Configure and install headers
jcfr's avatar
jcfr committed
663 664 665 666 667 668 669 670 671 672
# --------------------------------------------------------------------------
SET(files 
  vtkSlicerConfigure.h
  vtkSlicerVersionConfigure.h
  Scripts/runValgrind.sh
  Scripts/runValgrindForOneModule.sh
  Scripts/runValgrindForOneModuleWithSlicer4AndQT.sh
  Scripts/computeCodeCoverageLocally.sh
  Scripts/computeCodeCoverageForOneTest.sh
  Scripts/runExperimentalOffScreen.sh
673
  )
jcfr's avatar
jcfr committed
674 675 676 677 678 679
FOREACH(f ${files})
  CONFIGURE_FILE(
    ${CMAKE_CURRENT_SOURCE_DIR}/${f}.in
    ${CMAKE_CURRENT_BINARY_DIR}/${f}
    )
ENDFOREACH()
680 681

INSTALL(FILES 
682
  "${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerConfigure.h"
683
  "${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerVersionConfigure.h"
684
  DESTINATION ${Slicer_INSTALL_INCLUDE_DIR} COMPONENT Development
685
  )
686 687 688 689 690 691 692

#-----------------------------------------------------------------------------
# Set C/CXX Flags
#-----------------------------------------------------------------------------
SET(CMAKE_CXX_FLAGS ${Slicer_CXX_FLAGS} CACHE STRING "CMake C Flags" FORCE)
SET(CMAKE_C_FLAGS ${Slicer_C_FLAGS} CACHE STRING "CMake CXX Flags" FORCE)

693
#-----------------------------------------------------------------------------
694
# Generate SlicerVersion.txt
jcfr's avatar
jcfr committed
695
#-----------------------------------------------------------------------------
696

jcfr's avatar
jcfr committed
697
INCLUDE(CMake/SlicerTodayMacro.cmake)
698 699

# Get build time
700
TODAY(Slicer_BUILDDATE)
701

702
# Note that Slicer_BUILD is set above
703

704 705
SET(Slicer_WC_URL NA)
SET(Slicer_WC_REVISION 0)
706 707

# Case where Slicer is checkout using SVN
708
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.svn)
709 710
  Subversion_WC_INFO(${CMAKE_CURRENT_SOURCE_DIR} Slicer3)
  CONFIGURE_FILE(
711 712
    ${CMAKE_CURRENT_SOURCE_DIR}/SlicerVersion.txt.in 
    ${Slicer_HOME}/lib/Slicer3/SlicerVersion.txt
713 714 715 716
    )
ENDIF()

# Case where Slicer is checkout using Git-SVN
717
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git/svn/refs/remotes/trunk)
718
  FIND_PACKAGE(Git)
719
  IF(NOT GIT_FOUND)
720
    MESSAGE(FATAL_ERROR "error: Failed to locate Git")
721 722
  ENDIF(NOT GIT_FOUND)
  GIT_WC_INFO(${CMAKE_CURRENT_SOURCE_DIR} Slicer3)
723
  CONFIGURE_FILE(
724 725
    ${CMAKE_CURRENT_SOURCE_DIR}/SlicerVersion.txt.in
    ${Slicer_HOME}/lib/Slicer3/SlicerVersion.txt
726 727 728
    )
ENDIF()

729

jcfr's avatar
jcfr committed
730 731 732 733 734 735 736 737 738
#-----------------------------------------------------------------------------
# Includes
#-----------------------------------------------------------------------------

INCLUDE_DIRECTORIES(
  "${CMAKE_CURRENT_SOURCE_DIR}"
  "${CMAKE_CURRENT_BINARY_DIR}"
  )
  
739
#-----------------------------------------------------------------------------
pieper's avatar
pieper committed
740
# Subdirectories
jcfr's avatar
jcfr committed
741 742 743 744 745
#-----------------------------------------------------------------------------

ADD_SUBDIRECTORY(Libs)
ADD_SUBDIRECTORY(Base)
ADD_SUBDIRECTORY(Resources)
746

747
#-----------------------------------------------------------------------------
748
# At this point, let's not have the applications and modules guess which
749
# include paths or libraries they need, but use Slicer3_*_LIBRARIES and
750
# Slicer_*_INCLUDE_DIRS instead. As far as modules are concerned, both
751
# variables are actually set automatically by the import script when building
752
# against a Slicer build or installed tree. When in-source, we need to
753 754 755
# set both variables now. Retrieve them from the persistent property cache
# since they were collected in each subdir (which makes it impossible to
# use normal variables, since a new scope is created in each subdir).
756
#
757 758
slicer3_get_persistent_property(Slicer_Libs_LIBRARIES Slicer_Libs_LIBRARIES)
slicer3_get_persistent_property(Slicer_Base_LIBRARIES Slicer_Base_LIBRARIES)
759

760 761
slicer3_get_persistent_property(Slicer_Libs_INCLUDE_DIRS Slicer_Libs_INCLUDE_DIRS)
slicer3_get_persistent_property(Slicer_Base_INCLUDE_DIRS Slicer_Base_INCLUDE_DIRS)
pieper's avatar
pieper committed
762

763

764 765
#-----------------------------------------------------------------------------
# Module Logic
jcfr's avatar
jcfr committed
766
#-----------------------------------------------------------------------------
767

768
INCLUDE("${Slicer_CMAKE_DIR}/SlicerModuleLogicMacros.cmake")
769

770
IF(NOT Slicer_USE_KWWIDGETS)
771 772 773
  # 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:
774 775 776 777 778 779
  # 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()
780
    FILE(GLOB subsubdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${subdir}/*)
781
    FOREACH(subsubdir ${subsubdirs})
782 783
      IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${subsubdir}/Logic)
        ADD_SUBDIRECTORY(${subsubdir}/Logic)
784 785
      ENDIF()
    ENDFOREACH()
786 787
  ENDFOREACH()
ENDIF()
788 789


jcfr's avatar
jcfr committed
790 791
#-----------------------------------------------------------------------------
# DEPRECATED - Remove the following section when port to Qt is completed
792 793
#-----------------------------------------------------------------------------
# Modules and CLI
jcfr's avatar
jcfr committed
794
#-----------------------------------------------------------------------------
795
IF(Slicer_USE_KWWIDGETS)
jcfr's avatar
jcfr committed
796
  INCLUDE("${Slicer_CMAKE_DIR}/Slicer3ModulesMacros.cmake")
797
  
798
  IF(Slicer_BUILD_MODULES)
jcfr's avatar
jcfr committed
799
    ADD_SUBDIRECTORY(Modules)
800
  else(Slicer_BUILD_MODULES)
801
    # if Slicer_BUILD_CLI is ON, we still need at least the CommandLineModule
802
    # so that we can have CLI, without all the other modules
803
    IF(Slicer_BUILD_CLI)
jcfr's avatar
jcfr committed
804
      ADD_SUBDIRECTORY(Modules/CommandLineModule)
805
    ENDIF(Slicer_BUILD_CLI)
806
  ENDIF(Slicer_BUILD_MODULES)
807
ENDIF()
808 809 810

#-----------------------------------------------------------------------------
# Module EMSegment libraries
jcfr's avatar
jcfr committed
811
#-----------------------------------------------------------------------------
812
# The EMSegment{Registration,Graph,Algorithm,MRML} libraries are built from the top-level
813
# CMakeLists.txt. Doing so allow to build these libraries also if Slicer_USE_KWWIDGETS is OFF
814

815
IF(Slicer_BUILD_MODULES OR Slicer_BUILD_QTLOADABLEMODULES)
jcfr's avatar
jcfr committed
816
  INCLUDE("${Slicer_CMAKE_DIR}/Slicer3ModulesMacros.cmake")
817 818 819 820
  ADD_SUBDIRECTORY(Modules/EMSegment/Algorithm)
  ADD_SUBDIRECTORY(Modules/EMSegment/MRML)
  ADD_SUBDIRECTORY(Modules/EMSegment/Registration)
  ADD_SUBDIRECTORY(Modules/EMSegment/Graph)
821
ENDIF()
822

823 824 825
# Since EMSegment module expects Volume module and its associated library to be
# built beforehand,let's enfore that by building EMSegment here.
# Note that EMSegment has been commented in Modules/CMakeLists.txt
826
IF(Slicer_USE_KWWIDGETS)
827
  IF(Slicer_BUILD_MODULES)
828
    ADD_SUBDIRECTORY(Modules/EMSegment)
829
  ENDIF()
830 831
ENDIF()

832
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
833
# Qt Loadable Modules
jcfr's avatar
jcfr committed
834 835
#-----------------------------------------------------------------------------

836
IF(Slicer_USE_QT AND Slicer_BUILD_QTLOADABLEMODULES)
jcfr's avatar
jcfr committed
837
  ADD_SUBDIRECTORY(QTModules)
838
ENDIF()
839

840
#-----------------------------------------------------------------------------
jcfr's avatar
jcfr committed
841 842 843 844
# Applications - Added after Modules to capture the TractTracing in the correct ordering.
#-----------------------------------------------------------------------------

ADD_SUBDIRECTORY(Applications)
845

846 847
#-----------------------------------------------------------------------------
# Testing
jcfr's avatar
jcfr committed
848 849
#-----------------------------------------------------------------------------

jcfr's avatar
jcfr committed
850
IF(BUILD_TESTING)
jcfr's avatar
jcfr committed
851
  ADD_SUBDIRECTORY(Testing)
852
ENDIF()
pieper's avatar
pieper committed
853

854
# Install testing data
andy's avatar
andy committed
855

jcfr's avatar
jcfr committed
856
INSTALL(DIRECTORY
857
  Testing
858
  DESTINATION ${Slicer_INSTALL_SHARE_DIR} COMPONENT Development
859 860 861 862 863
  PATTERN ".svn" EXCLUDE
  PATTERN "CMakeLists.txt" EXCLUDE
  )

#-----------------------------------------------------------------------------
864
# Launcher for slicer
jcfr's avatar
jcfr committed
865
#-----------------------------------------------------------------------------
866

867 868
# let's build the launcher for Kww, KwwAndQt and also QtOnly slicer ...
ADD_SUBDIRECTORY(Utilities/Launcher)
869

870 871
# Compute Slicer_QT_PLUGIN_PATH used to configure launch.tcl.in
SET(Slicer_QT_PLUGIN_PATH "")
872
IF(Slicer_USE_QT)
873 874
  SET(designer_launcher_project_name SlicerQT)
  GET_TARGET_PROPERTY(output_directory ${designer_launcher_project_name} LIBRARY_OUTPUT_DIRECTORY)
875
  SET(Slicer_QT_PLUGIN_PATH ${output_directory})
876 877 878 879 880 881

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

    FOREACH(qtlib ${QTLIBLIST})
882
      IF(QT_${qtlib}_LIBRARY_RELEASE AND APPLE)
883
          GET_FILENAME_COMPONENT(QT_FRAMEWORK_NAME_tmp ${QT_${qtlib}_LIBRARY_RELEASE} NAME)
884
          SET(Slicer_QT_FRAMEWORK_DIRS "lib/Qt/${QT_FRAMEWORK_NAME_tmp}/Versions/4:${Slicer_QT_FRAMEWORK_DIRS}")
885
      ENDIF()
886 887
    ENDFOREACH()
  ENDIF()