From f601a71d39db8ea8e01b9fc94cb0de53cb7ca581 Mon Sep 17 00:00:00 2001 From: Bradley Lowekamp Date: Thu, 13 Jun 2013 07:52:22 -0400 Subject: [PATCH] adding option for SimpleITK as a shared library Propagating SimpleITK_DIR into Slicer config. Adding SimpleITK lib path to runtime library path for build. Adding SimpleITK to be installed as a cmake project. Adding CMake variable Slicer_USE_SimpleITK_SHARED to turn on SimpleITK as a shared library. --- CMake/SlicerBlockCTKAppLauncherSettings.cmake | 6 ++++++ CMake/SlicerBlockInstallCMakeProjects.cmake | 8 ++++++++ CMake/SlicerConfig.cmake.in | 6 ++++++ CMake/SlicerGenerateSlicerConfig.cmake | 3 +++ CMakeLists.txt | 16 ++++++++++++++++ SuperBuild.cmake | 7 +++++++ SuperBuild/External_SimpleITK.cmake | 5 ++++- 7 files changed, 50 insertions(+), 1 deletion(-) diff --git a/CMake/SlicerBlockCTKAppLauncherSettings.cmake b/CMake/SlicerBlockCTKAppLauncherSettings.cmake index 97491087f..b6ef664ed 100644 --- a/CMake/SlicerBlockCTKAppLauncherSettings.cmake +++ b/CMake/SlicerBlockCTKAppLauncherSettings.cmake @@ -158,6 +158,12 @@ if(Slicer_USE_NUMPY) ) endif() +if(Slicer_USE_SimpleITK) + list(APPEND SLICER_LIBRARY_PATHS_BUILD + ${SimpleITK_DIR}/${LIB_SUBDIR}/ + ) +endif() + #----------------------------------------------------------------------------- # PATHS #----------------------------------------------------------------------------- diff --git a/CMake/SlicerBlockInstallCMakeProjects.cmake b/CMake/SlicerBlockInstallCMakeProjects.cmake index 322d6c2f6..e47d8ad56 100644 --- a/CMake/SlicerBlockInstallCMakeProjects.cmake +++ b/CMake/SlicerBlockInstallCMakeProjects.cmake @@ -21,6 +21,14 @@ set(CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${ITK_DIR};ITK endif() endif() +# ------------------------------------------------------------------------- +# Install SimpleITK +# +#------------------------------------------------------------------------- +if(NOT "${SimpleITK_DIR}" STREQUAL "" AND EXISTS "${SimpleITK_DIR}/CMakeCache.txt" AND ${Slicer_USE_SimpleITK_SHARED}) + set(CPACK_INSTALL_CMAKE_PROJECTS "${CPACK_INSTALL_CMAKE_PROJECTS};${SimpleITK_DIR};SimpleITK;Unspecified;/") +endif() + # ------------------------------------------------------------------------- # Install SlicerExecutionModel # ------------------------------------------------------------------------- diff --git a/CMake/SlicerConfig.cmake.in b/CMake/SlicerConfig.cmake.in index 4d71355b3..633f52752 100644 --- a/CMake/SlicerConfig.cmake.in +++ b/CMake/SlicerConfig.cmake.in @@ -109,6 +109,7 @@ set(Slicer_USE_OpenIGTLink "@Slicer_USE_OpenIGTLink@") set(Slicer_USE_PYTHONQT "@Slicer_USE_PYTHONQT@") set(Slicer_USE_PYTHONQT_WITH_TCL "@Slicer_USE_PYTHONQT_WITH_TCL@") set(Slicer_USE_QtTesting "@Slicer_USE_QtTesting@") +set(Slicer_USE_SimpleITK "@Slicer_USE_SimpleITK@") set(Slicer_BUILD_CLI_SUPPORT "@Slicer_BUILD_CLI_SUPPORT@") set(Slicer_BUILD_DICOM_SUPPORT "@Slicer_BUILD_DICOM_SUPPORT@") set(Slicer_BUILD_DIFFUSION_SUPPORT "@Slicer_BUILD_DIFFUSION_SUPPORT@") @@ -355,6 +356,11 @@ slicer_config_set_ep( "@ITK_DIR_CONFIG@" CACHE PATH "Path to ITK build or install directory" FORCE) +slicer_config_set_ep( + SimpleITK_DIR + "@SimpleITK_DIR_CONFIG@" + CACHE PATH "Path to SimpleITK build or install directory" FORCE) + slicer_config_set_ep( OpenIGTLink_DIR "@OpenIGTLink_DIR_CONFIG@" diff --git a/CMake/SlicerGenerateSlicerConfig.cmake b/CMake/SlicerGenerateSlicerConfig.cmake index cc3e9511a..0def0b8ff 100644 --- a/CMake/SlicerGenerateSlicerConfig.cmake +++ b/CMake/SlicerGenerateSlicerConfig.cmake @@ -73,6 +73,9 @@ if(Slicer_USE_QtTesting) set(QtTesting_DIR_CONFIG ${QtTesting_DIR}) endif() set(ITK_DIR_CONFIG ${ITK_DIR}) +if(Slicer_USE_SimpleITK) + set(SimpleITK_DIR_CONFIG ${SimpleITK_DIR}) +endif() if(Slicer_BUILD_EXTENSIONMANAGER_SUPPORT) set(qRestAPI_DIR_CONFIG ${qRestAPI_DIR}) endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e76b26e2..30746d87a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,6 +241,22 @@ endif() CMAKE_DEPENDENT_OPTION(Slicer_USE_SimpleITK "Build Slicer with SimpleITK support" OFF "USE_ITKv4" OFF) +# +# SimpleITK has large internal libraries, which take an extremely long +# time to link on windows when they are static. Creating shared +# SimpleITK internal libraries can reduce linking time. Also the size +# of the debug libraries are monstrous. Using shared libraries for +# debug, reduce disc requirements, and can improve linking +# times. However, these shared libraries take longer to load than the +# monolithic target from static libraries. +# +set( Slicer_USE_SimpleITK_SHARED_DEFAULT OFF) +string(TOUPPER "${CMAKE_BUILD_TYPE}" _CMAKE_BUILD_TYPE) +if(MSVC OR _CMAKE_BUILD_TYPE MATCHES "DEBUG") + set(Slicer_USE_SimpleITK_SHARED_DEFAULT ON) +endif() +CMAKE_DEPENDENT_OPTION(Slicer_USE_SimpleITK_SHARED "Build SimpleITK with shared libraries. Reduces linking time, increases run-time load time." ${Slicer_USE_SimpleITK_SHARED_DEFAULT} "Slicer_USE_SimpleITK" OFF ) + #----------------------------------------------------------------------------- # The following option has been added for conveniency so that "extension-like" # module can be enabled/disabled at the superbuild level. diff --git a/SuperBuild.cmake b/SuperBuild.cmake index e3664fc15..6c8e209db 100644 --- a/SuperBuild.cmake +++ b/SuperBuild.cmake @@ -194,6 +194,7 @@ foreach(ep_cmake_arg Slicer_USE_NUMPY Slicer_USE_QtTesting Slicer_USE_SimpleITK + Slicer_USE_SimpleITK_SHARED Slicer_BUILD_BRAINSTOOLS Slicer_BUILD_EMSegment Slicer_BUILD_MultiVolumeExplorer @@ -238,6 +239,12 @@ if(Slicer_USE_PYTHONQT_WITH_TCL) endif() endif() +if(Slicer_USE_SimpleITK) + list(APPEND EXTERNAL_PROJECT_OPTIONAL_ARGS + -DSimpleITK_DIR:PATH=${SimpleITK_DIR} + ) +endif() + if(Slicer_BUILD_QTLOADABLEMODULES) # Provide a mechanism to disable one or more loadable modules. list(APPEND EXTERNAL_PROJECT_OPTIONAL_ARGS -DSlicer_QTLOADABLEMODULES_DISABLED:STRING=${Slicer_QTLOADABLEMODULES_DISABLED}) diff --git a/SuperBuild/External_SimpleITK.cmake b/SuperBuild/External_SimpleITK.cmake index cc4d2dc6c..13dc87139 100644 --- a/SuperBuild/External_SimpleITK.cmake +++ b/SuperBuild/External_SimpleITK.cmake @@ -70,7 +70,9 @@ ExternalProject_add(SimpleITK -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} # SimpleITK does not work with shared libs turned on - -DBUILD_SHARED_LIBS:BOOL=OFF + -DBUILD_SHARED_LIBS:BOOL=${Slicer_USE_SimpleITK_SHARED} + -DSimpleITK_INSTALL_ARCHIVE_DIR:PATH=${Slicer_INSTALL_LIB_DIR} + -DSimpleITK_INSTALL_LIBRARY_DIR:PATH=${Slicer_INSTALL_LIB_DIR} -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR} -DITK_DIR:PATH=${ITK_DIR} -DBUILD_EXAMPLES:BOOL=OFF @@ -90,3 +92,4 @@ ExternalProject_add(SimpleITK # DEPENDS ${SimpleITK_DEPENDENCIES} ) +set(SimpleITK_DIR ${CMAKE_BINARY_DIR}/SimpleITK-build) -- GitLab