CMakeLists.txt 15.9 KB
Newer Older
1
project(Slicer3)
2
3
4
5
6

cmake_minimum_required(VERSION 2.6)
if(COMMAND cmake_policy)
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
7
mark_as_advanced(CMAKE_BACKWARDS_COMPATIBILITY)
8

9
#-----------------------------------------------------------------------------
10
#
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set(Slicer3_INSTALL_BIN_DIR "bin")
set(Slicer3_INSTALL_LIB_DIR "lib/Slicer3")
set(Slicer3_INSTALL_INCLUDE_DIR "include/Slicer3")
set(Slicer3_INSTALL_SHARE_DIR "share/Slicer3")
set(Slicer3_INSTALL_ITKFACTORIES_DIR "${Slicer3_INSTALL_LIB_DIR}/ITKFactories")

set(Slicer3_INSTALL_PLUGINS_BIN_DIR "${Slicer3_INSTALL_LIB_DIR}/Plugins")
set(Slicer3_INSTALL_PLUGINS_LIB_DIR "${Slicer3_INSTALL_LIB_DIR}/Plugins")
set(Slicer3_INSTALL_PLUGINS_INCLUDE_DIR "${Slicer3_INSTALL_INCLUDE_DIR}/Plugins")
set(Slicer3_INSTALL_PLUGINS_SHARE_DIR "${Slicer3_INSTALL_SHARE_DIR}/Plugins")
set(Slicer3_INSTALL_PLUGINS_CACHE_DIR "${Slicer3_INSTALL_LIB_DIR}/PluginsCache")

set(Slicer3_INSTALL_MODULES_BIN_DIR "${Slicer3_INSTALL_LIB_DIR}/Modules")
set(Slicer3_INSTALL_MODULES_LIB_DIR "${Slicer3_INSTALL_LIB_DIR}/Modules")
set(Slicer3_INSTALL_MODULES_INCLUDE_DIR "${Slicer3_INSTALL_INCLUDE_DIR}/Modules")
set(Slicer3_INSTALL_MODULES_SHARE_DIR "${Slicer3_INSTALL_SHARE_DIR}/Modules")

set(Slicer3_HOME "${Slicer3_BINARY_DIR}")

#-----------------------------------------------------------------------------
31
32
# Disable the warnings that DevStudio 2005 emits wrt to sprintf, strcpu, etc.
#
33
34
35
if(CMAKE_COMPILER_2005)
  add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
endif(CMAKE_COMPILER_2005)
36

37
# include a test for endianness (used to be done by default)
barre's avatar
barre committed
38

39
40
41
42
include(${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
test_big_endian(CMAKE_WORDS_BIGENDIAN)

#-----------------------------------------------------------------------------
43
44
45
46
# avoid linker bug in Mac OS 10.5
# see:
# http://wiki.finkproject.org/index.php/Fink:Packaging:Preparing_for_10.5#OpenGL_Bug
#
47
48
49
50
if(APPLE)
  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")
endif(APPLE)
51

52
53
#-----------------------------------------------------------------------------
# Slicer version number.
54
#
55
set(Slicer3_VERSION_MAJOR "3")
56
set(Slicer3_VERSION_MINOR "5")
57
58
59
60
61
if(NOT Slicer3_VERSION_PATCH)
  set(Slicer3_VERSION_PATCH "0")
endif(NOT Slicer3_VERSION_PATCH)
set(Slicer3_VERSION "${Slicer3_VERSION_MAJOR}.${Slicer3_VERSION_MINOR}")
set(Slicer3_VERSION_FULL "${Slicer3_VERSION}.${Slicer3_VERSION_PATCH}")
62

63
64
#-----------------------------------------------------------------------------
# Build shared lib by default
65
#
66
67
option(BUILD_SHARED_LIBS "Build Slicer3 with shared libraries." ON)

68
69
70
71
72
73
74
75
76
77
78
#-----------------------------------------------------------------------------
# Append the library version information to the library target properties.
#
OPTION(Slicer3_WITH_LIBRARY_VERSION "Build with library version information" OFF)
IF(Slicer3_WITH_LIBRARY_VERSION)
  SET(Slicer3_LIBRARY_PROPERTIES ${Slicer3_LIBRARY_PROPERTIES}
    VERSION ${Slicer3_VERSION_FULL}
    SOVERSION ${Slicer3_VERSION}
  )
ENDIF(Slicer3_WITH_LIBRARY_VERSION)

79
80
#-----------------------------------------------------------------------------
# Slicer3 macros
pieper's avatar
pieper committed
81
#
82
83
84
85
86
set(Slicer3_CMAKE_DIR "${Slicer3_SOURCE_DIR}/CMake" CACHE INTERNAL "")
add_subdirectory(CMake)
# 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}" ${CMAKE_MODULE_PATH} "${Slicer3_CMAKE_DIR}")
pieper's avatar
pieper committed
87

88
include("${Slicer3_CMAKE_DIR}/Slicer3PersistenceMacros.cmake")
hliu's avatar
hliu committed
89

90
91
92
## QT
INCLUDE(${Slicer3_CMAKE_DIR}/Slicer3FindQT.cmake)

93
94
#-----------------------------------------------------------------------------
# Top level slicer3 configurations
95
#
96
97
98
99
100
# If CMake >= 2.6.0
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

101
102
103

# Do NOT force into the cache, as plugins need to override locally and scoping
# becomes an issue.
104
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/ 
105
#  CACHE PATH "Single output directory for building all libraries." FORCE)
106
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/ 
107
108
109
110
#  CACHE PATH "Single output directory for building all executables." FORCE)

#-----------------------------------------------------------------------------
# Slicer include and libraries subdirectory
111
#
112
113
114
slicer3_set_persistent_property(Slicer3_Libs_LIBRARIES "")
slicer3_set_persistent_property(Slicer3_Base_LIBRARIES "")
slicer3_set_persistent_property(Slicer3_Modules_LIBRARIES "")
115

116
117
118
slicer3_set_persistent_property(Slicer3_Libs_INCLUDE_DIRS "")
slicer3_set_persistent_property(Slicer3_Base_INCLUDE_DIRS "")
slicer3_set_persistent_property(Slicer3_Modules_INCLUDE_DIRS "")
pieper's avatar
pieper committed
119

120
#-----------------------------------------------------------------------------
pieper's avatar
pieper committed
121
# Add the testing directories
122
#
123
124
125
126
127
128
129
130
option(BUILD_TESTING "Test the project" ON)
set(Slicer3_BUILD_TESTING ${BUILD_TESTING})
set(LAUNCH_EXE ${Slicer3_BINARY_DIR}/Slicer3 --launch)
if(Slicer3_BUILD_TESTING)
  enable_testing()
  include(CTest)
  mark_as_advanced(TCL_TCLSH DART_ROOT)
endif(Slicer3_BUILD_TESTING)
hliu's avatar
hliu committed
131

132
#-----------------------------------------------------------------------------
133
134
135
136
137
# Libs
# - ITK
# - KWWidgets (pulls in VTK)
#

138
139
140
141
142
143
144
# 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.

set(SKIP_KWWidgets_BUILD_SETTINGS_FILE 1)
set(SKIP_VTK_BUILD_SETTINGS_FILE 1)
set(SKIP_ITK_BUILD_SETTINGS_FILE 1)
145
set(SKIP_Teem_BUILD_SETTINGS_FILE 1)
146
 
147
## Python
148
149
option(Slicer3_USE_PYTHON "Integrate a python interpreter into Slicer." OFF)
if(Slicer3_USE_PYTHON)
150
  find_package(PythonLibs)
151
endif(Slicer3_USE_PYTHON)
152

153
## ITK
154
155
156
157
158
find_package(ITK REQUIRED)
if(NOT ITK_FOUND)
  message(FATAL_ERROR "Need ITK to build")
endif(NOT ITK_FOUND)
include(${ITK_USE_FILE})
159
160

## KWWidgets
161
162
163
164
165
find_package(KWWidgets REQUIRED)
if(NOT KWWidgets_FOUND)
  message(FATAL_ERROR "Need KWWidgets to build")
endif(NOT KWWidgets_FOUND)
include(${KWWidgets_USE_FILE})
166

alexy's avatar
alexy committed
167
## Qt
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#
# Call macro defined in ${PROJECT_SOURCE_DIR}/CMake/Slicer3FindQT.cmake
#
SLICER3_SETUP_QT()

#SET(DESIRED_QT_VERSION 4)
# OPTION(Slicer3_USE_QT 
#   "Use Qt as an extra GUI library"
#   OFF)
# IF(Slicer3_USE_QT)
#   ## QT
#   IF(VTK_USE_QVTK)
#     #This find package should NOT be needed.
#     FIND_PACKAGE(Qt4)
#     IF(QT4_FOUND)
#       SET(QT_USE_QTNETWORK ON)
#       INCLUDE(${QT_USE_FILE})
#       SET(Slicer3_USE_QT ON)
#       ADD_DEFINITIONS(-DSlicer3_USE_QT)
#     ELSE(QT4_FOUND)
#       MESSAGE("Qt4 was not found on your system. You probably need to set the QT_QMAKE_EXECUTABLE variable")
#     ENDIF(QT4_FOUND)
#   ELSE(VTK_USE_QVTK)
#      MESSAGE("VTK was not configured to use QT, no QT-based code will be compiled in Slicer")
#      SET(Slicer3_USE_QT OFF)
#   ENDIF(VTK_USE_QVTK)
# ENDIF(Slicer3_USE_QT)
alexy's avatar
alexy committed
195

196
## Teem
197
198
199
200
201
find_package(Teem REQUIRED)
if(NOT Teem_FOUND)
  message(FATAL_ERROR "Need Teem to build")
endif(NOT Teem_FOUND)
include(${Teem_USE_FILE})
202

203
204
205
206
207
208
## SlicerLibCurl
find_package(SLICERLIBCURL REQUIRED)
if(SLICERLIBCURL_FOUND)
  include(${SLICERLIBCURL_USE_FILE})
endif(SLICERLIBCURL_FOUND)
 
209
210
211
## BatchMake
option(Slicer3_USE_BatchMake "Build Slicer3 with BatchMake support." OFF)
if(Slicer3_USE_BatchMake)
212
213
  find_package(BatchMake REQUIRED)
  include(${BatchMake_USE_FILE})
214
endif(Slicer3_USE_BatchMake)
215

216
217
## MIDAS
option(Slicer3_USE_MIDAS "Build Slicer3 with MIDAS support." OFF)
218

219
220
221
222
223
224
## OpenIGTLink (Built in Slicer3-lib)
option(Slicer3_USE_OPENIGTLINK "Build Slicer3 with OpenIGTLink support." OFF)
if(Slicer3_USE_OPENIGTLINK)
  find_package(OpenIGTLink REQUIRED)
  include(${OpenIGTLink_USE_FILE})
endif(Slicer3_USE_OPENIGTLINK)
hliu's avatar
hliu committed
225

226
227
228
229
230
231
232
233
234
235
236
237
238
#-----------------------------------------------------------------------------
# Need some Tcl/Tk info

include("${VTK_CMAKE_DIR}/vtkTclTkMacros.cmake")
VTK_GET_TCL_TK_VERSION(TCL_TK_MAJOR_VERSION TCL_TK_MINOR_VERSION)
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}")

include("${KWWidgets_CMAKE_DIR}/KWWidgetsTclTkMacros.cmake")
incr_tcl_get_version(INCR_TCL_MAJOR_VERSION INCR_TCL_MINOR_VERSION)
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}")

239
#-----------------------------------------------------------------------------
barre's avatar
barre committed
240
241
242
# 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.
243
#
244
include("${KWWidgets_CMAKE_DIR}/KWWidgetsPathsMacros.cmake")
245
set(extra_dirs
246
  "${Teem_DIR}/bin"
247
248
249
250
251
252
  "${BatchMake_DIR}/bin"
  "${Slicer3_HOME}/${Slicer3_INSTALL_PLUGINS_BIN_DIR}"
  "${Slicer3_HOME}/${Slicer3_INSTALL_PLUGINS_LIB_DIR}"
  "${Slicer3_HOME}/${Slicer3_INSTALL_MODULES_BIN_DIR}"
  "${Slicer3_HOME}/${Slicer3_INSTALL_MODULES_LIB_DIR}"
  )
253
kwwidgets_generate_setup_paths_scripts(
254
  "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" "Slicer3SetupPaths"
255
256
  "${extra_dirs}"
)
barre's avatar
barre committed
257

258
#-----------------------------------------------------------------------------
barre's avatar
barre committed
259
260
261
262
263
# 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}" "")
264
#
265
266
267
268
if(NOT VTK_CMAKE_DIR)
  set(VTK_CMAKE_DIR "${VTK_SOURCE_DIR}/CMake")
endif(NOT VTK_CMAKE_DIR)
include("${VTK_CMAKE_DIR}/vtkWrapTcl.cmake")
269

270
271
#-----------------------------------------------------------------------------
# Check versions of VTK to track CVS HEAD
272
#
273
274
275
276
277
278
279
find_package(VTK REQUIRED)
if(EXISTS ${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
  include(${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
else(EXISTS ${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
  #MESSAGE("Using local version of VTKVersionMacros for compatibility.")
  include(${Slicer3_SOURCE_DIR}/Scripts/VTKVersionMacros.cmake)
endif(EXISTS ${VTK_CMAKE_DIR}/VTKVersionMacros.cmake)
280

281
282
283
284
vtk_get_source_revision_and_date(VTKsource_revision VTKsource_date)
if(VTKsource_revision LESS 1.2196)
  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.")
endif(VTKsource_revision LESS 1.2196) 
285

286
287
#-----------------------------------------------------------------------------
# These packages may exist within the Slicer3 source tree
lorensen's avatar
lorensen committed
288
#
289
290
291
292
293
294
set(GenerateCLP_DIR ${Slicer3_BINARY_DIR}/Libs/GenerateCLP)
set(GenerateLM_DIR ${Slicer3_BINARY_DIR}/Libs/GenerateLM)
set(ModuleDescriptionParser_DIR ${Slicer3_BINARY_DIR}/Libs/ModuleDescriptionParser)
set(LoadableModule_DIR ${Slicer3_BINARY_DIR}/Libs/LoadableModule)
set(vtkITK_DIR ${Slicer3_BINARY_DIR}/Libs/vtkITK)
set(TCLAP_DIR ${Slicer3_BINARY_DIR}/Libs/tclap)
295

296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
# --------------------------------------------------------------------------
# Configure and install headers

include_directories("${CMAKE_CURRENT_BINARY_DIR}")

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/vtkSlicerConfigure.h.in 
  ${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerConfigure.h
  )

install(FILES 
  "${CMAKE_CURRENT_BINARY_DIR}/vtkSlicerConfigure.h"
  DESTINATION ${Slicer3_INSTALL_INCLUDE_DIR} COMPONENT Development
  )

#-----------------------------------------------------------------------------
pieper's avatar
pieper committed
312
313
# Subdirectories
#
314
315
add_subdirectory(Libs)
add_subdirectory(Base)
316
add_subdirectory(Resources)
317

318
#-----------------------------------------------------------------------------
319
# At this point, let's not have the applications and modules guess which
320
321
# include paths or libraries they need, but use Slicer3_*_LIBRARIES and
# Slicer3_*_INCLUDE_DIRS instead. As far as modules are concerned, both
322
323
324
325
326
# variables are actually set automatically by the import script when building
# against a Slicer3 build or installed tree. When in-source, we need to
# 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).
327
328
329
#
slicer3_get_persistent_property(Slicer3_Libs_LIBRARIES Slicer3_Libs_LIBRARIES)
slicer3_get_persistent_property(Slicer3_Base_LIBRARIES Slicer3_Base_LIBRARIES)
330

331
332
slicer3_get_persistent_property(Slicer3_Libs_INCLUDE_DIRS Slicer3_Libs_INCLUDE_DIRS)
slicer3_get_persistent_property(Slicer3_Base_INCLUDE_DIRS Slicer3_Base_INCLUDE_DIRS)
pieper's avatar
pieper committed
333

334
335
336
337
338
#-----------------------------------------------------------------------------
# Modules and CLI
#
option(Slicer3_BUILD_CLI "Build Slicer3 CLI Plugins" ON)
option(Slicer3_BUILD_MODULES "Build Slicer3 Modules" ON)
339

barre's avatar
barre committed
340
341
342
include("${Slicer3_CMAKE_DIR}/Slicer3PluginsMacros.cmake")
include("${Slicer3_CMAKE_DIR}/Slicer3ModulesMacros.cmake")

343
if(Slicer3_BUILD_MODULES)
344
  add_subdirectory(Modules)
345
346
347
348
349
350
351
else(Slicer3_BUILD_MODULES)
  # if Slicer3_BUILD_CLI is ON, we still need at least the CommandLineModule
  # so that we can have CLI, without all the other modules
  if(Slicer3_BUILD_CLI)
    add_subdirectory(Modules/CommandLineModule)
  endif(Slicer3_BUILD_CLI)
endif(Slicer3_BUILD_MODULES)
pieper's avatar
pieper committed
352

353
354
355
356
#-----------------------------------------------------------------------------
# Applications need to be built after Modules to capture the TractTracing in
# the correct ordering.
#
357
add_subdirectory(Applications)
358

359
360
361
#-----------------------------------------------------------------------------
# Testing
#
362
363
364
if(Slicer3_BUILD_TESTING)
  add_subdirectory(Testing)
endif(Slicer3_BUILD_TESTING)
pieper's avatar
pieper committed
365

366
# Install testing data
andy's avatar
andy committed
367

368
369
370
371
372
373
374
375
install(DIRECTORY
  Testing
  DESTINATION ${Slicer3_INSTALL_SHARE_DIR} COMPONENT Development
  PATTERN ".svn" EXCLUDE
  PATTERN "CMakeLists.txt" EXCLUDE
  )

#-----------------------------------------------------------------------------
376
# Launcher for slicer
377
#
378
add_subdirectory(Utilities/Launcher)
379

380
381
382
383
384
385
386
387
388
389
configure_file(
  ${Slicer3_SOURCE_DIR}/launch.tcl.in
  "${Slicer3_BINARY_DIR}/${Slicer3_INSTALL_LIB_DIR}/launch.tcl"
  )
install(
  FILES "${Slicer3_BINARY_DIR}/${Slicer3_INSTALL_LIB_DIR}/launch.tcl"
  DESTINATION ${Slicer3_INSTALL_LIB_DIR}
  )

#-----------------------------------------------------------------------------
390
# Package slicer
391
#
392
add_subdirectory(Utilities/Package)
andy's avatar
andy committed
393

394
#-----------------------------------------------------------------------------
395
# Documentation
396
#
397
398
399
400
option(BUILD_DOCUMENTATION "Build Slicer3 Documentation" OFF)
if(BUILD_DOCUMENTATION)
  add_subdirectory(Utilities/Doxygen)
endif(BUILD_DOCUMENTATION)
andy's avatar
andy committed
401

402
# setup file for setting custom ctest vars
403
configure_file(${Slicer3_SOURCE_DIR}/CTestCustom.cmake.in
404
  ${Slicer3_BINARY_DIR}/CTestCustom.cmake @ONLY)
405

406
#-----------------------------------------------------------------------------
407
408
# Set up for building against a Slicer3 build tree and a Slicer3 installation 
#
409
410
include(${Slicer3_SOURCE_DIR}/GenerateSlicer3Config.cmake)

411
412
413
configure_file(${Slicer3_SOURCE_DIR}/CTestConfig.cmake
  ${Slicer3_BINARY_DIR}/${Slicer3_INSTALL_LIB_DIR}/CTestConfig.cmake COPYONLY IMMEDIATE)

414
415
416
configure_file(${Slicer3_SOURCE_DIR}/UseSlicer3.cmake.in
  ${Slicer3_BINARY_DIR}/UseSlicer3.cmake COPYONLY IMMEDIATE)

417
418
419
420
421
configure_file(${Slicer3_SOURCE_DIR}/CMake/RemoveTemporaryFiles.cmake.in
  ${Slicer3_BINARY_DIR}/CMake/RemoveTemporaryFiles.cmake @ONLY IMMEDIATE)
configure_file(${Slicer3_SOURCE_DIR}/CMake/Slicer3SampleBuildTest.cmake.in
  ${Slicer3_BINARY_DIR}/CMake/Slicer3SampleBuildTest.cmake @ONLY)

422
423
install(FILES
  #   ${Slicer3_BINARY_DIR}/Slicer3BuildSettings.cmake
424
  ${Slicer3_SOURCE_DIR}/CTestConfig.cmake
425
426
  ${Slicer3_BINARY_DIR}/UseSlicer3.cmake
  ${Slicer3_BINARY_DIR}/Utilities/Slicer3Config.cmake
hayes's avatar
hayes committed
427
  ${Slicer3_BINARY_DIR}/lib/Slicer3/Slicer3Version.txt
428
  DESTINATION ${Slicer3_INSTALL_LIB_DIR}
429
430
  COMPONENT Development
  )