#----------------------------------------------------------------------------- set(verbose FALSE) #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- enable_language(C) enable_language(CXX) #----------------------------------------------------------------------------- enable_testing() include(CTest) #----------------------------------------------------------------------------- include(${CMAKE_CURRENT_SOURCE_DIR}/Common.cmake) #----------------------------------------------------------------------------- # Git protocol #----------------------------------------------------------------------------- # As of March 15 2022, Github requires https set(git_protocol "https") find_package(Git REQUIRED) #----------------------------------------------------------------------------- # QT #----------------------------------------------------------------------------- # Required in order to build VTK if ${LOCAL_PROJECT_NAME}_USE_QT is set. if(${LOCAL_PROJECT_NAME}_USE_QT) find_package(Qt4 REQUIRED) endif() #----------------------------------------------------------------------------- # Enable and setup External project global properties #----------------------------------------------------------------------------- include(ExternalProject) include(SlicerMacroEmptyExternalProject) include(SlicerMacroCheckExternalProjectDependency) # Compute -G arg for configuring external projects with the same CMake generator: if(CMAKE_EXTRA_GENERATOR) set(gen "${CMAKE_EXTRA_GENERATOR} - ${CMAKE_GENERATOR}") else() set(gen "${CMAKE_GENERATOR}") endif() # With CMake 2.8.9 or later, the UPDATE_COMMAND is required for updates to occur. # For earlier versions, we nullify the update state to prevent updates and # undesirable rebuild. option(FORCE_EXTERNAL_BUILDS "Force rebuilding of external project (if they are updated)" OFF) if(CMAKE_VERSION VERSION_LESS 2.8.9 OR NOT FORCE_EXTERNAL_BUILDS) set(cmakeversion_external_update UPDATE_COMMAND) set(cmakeversion_external_update_value "" ) else() set(cmakeversion_external_update LOG_UPDATE ) set(cmakeversion_external_update_value 1) endif() #----------------------------------------------------------------------------- # 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 "9") message(FATAL_ERROR "Only Mac OSX >= 10.5 are supported !") endif() endif() #----------------------------------------------------------------------------- # Superbuild option(s) #----------------------------------------------------------------------------- option(BUILD_STYLE_UTILS "Build uncrustify, cppcheck, & KWStyle" OFF) CMAKE_DEPENDENT_OPTION( USE_SYSTEM_Uncrustify "Use system Uncrustify program" OFF "BUILD_STYLE_UTILS" OFF ) CMAKE_DEPENDENT_OPTION( USE_SYSTEM_KWStyle "Use system KWStyle program" OFF "BUILD_STYLE_UTILS" OFF ) CMAKE_DEPENDENT_OPTION( USE_SYSTEM_Cppcheck "Use system Cppcheck program" OFF "BUILD_STYLE_UTILS" OFF ) option(ITK_BUILD_MINC_SUPPORT "Build support for MINC2" ON) set(EXTERNAL_PROJECT_BUILD_TYPE "Release" CACHE STRING "Default build type for support libraries") option(USE_SYSTEM_ITK "Build using an externally defined version of ITK" OFF) option(USE_SYSTEM_SlicerExecutionModel "Build using an externally defined version of SlicerExecutionModel" OFF) option(USE_VTK "Build tools that depend on VTK" OFF) CMAKE_DEPENDENT_OPTION( USE_SYSTEM_VTK "Build using an externally defined version of VTK" OFF "USE_VTK" OFF ) option(BUILD_ALL_ANTS_APPS "Build all ANTs apps" ON) option(RUN_SHORT_TESTS "Run the quick unit tests." ON ) option(RUN_LONG_TESTS "Run the time consuming tests. i.e. real world registrations" ON ) option(OLD_BASELINE_TESTS "Use reported metrics from old tests" OFF ) option(ANTS_INSTALL_LIBS_ONLY "Do not install binaries" OFF) mark_as_advanced(ANTS_INSTALL_LIBS_ONLY) #------------------------------------------------------------------------------ # ${LOCAL_PROJECT_NAME} dependency list #------------------------------------------------------------------------------ set(ITK_EXTERNAL_NAME ITKv${ITK_VERSION_MAJOR}) if(USE_VTK) list(APPEND ${LOCAL_PROJECT_NAME}_DEPENDENCIES VTK ) endif() list(APPEND ${LOCAL_PROJECT_NAME}_DEPENDENCIES ${ITK_EXTERNAL_NAME} ) if(BUILD_STYLE_UTILS) list(APPEND ${LOCAL_PROJECT_NAME}_DEPENDENCIES Cppcheck KWStyle Uncrustify) endif() #----------------------------------------------------------------------------- # Define Superbuild global variables #----------------------------------------------------------------------------- # This variable will contain the list of CMake variable specific to each external project # that should passed to ${CMAKE_PROJECT_NAME}. # The item of this list should have the following form: : # where '' is an external project variable and TYPE is either BOOL, STRING, PATH or FILEPATH. # TODO Variable appended to this list will be automatically exported in ${LOCAL_PROJECT_NAME}Config.cmake, # prefix '${LOCAL_PROJECT_NAME}_' will be prepended if it applies. set(${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS) # The macro '_expand_external_project_vars' can be used to expand the list of . set(${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS) # List of CMake args to configure BRAINS set(${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES) # List of CMake variable names # SuperBuild_ANTS_C[XX]_OPTIMIZATION_FLAGS is defined when Common.cmake is included above, and will # be set to default values. Export this variable to the ANTs-build config by adding it to the list # of SUPERBUILD_EP_ARGS set(${LOCAL_PROJECT_NAME}_C_OPTIMIZATION_FLAGS ${${CMAKE_PROJECT_NAME}_C_OPTIMIZATION_FLAGS}) set(${LOCAL_PROJECT_NAME}_CXX_OPTIMIZATION_FLAGS ${${CMAKE_PROJECT_NAME}_CXX_OPTIMIZATION_FLAGS}) # These are not explicitly added to the external project variable list, but they exist in the scope # of External_ITKv5.cmake. From there they are added to the ITK cmake call. Adding them to # ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS doesn't seem to work, so instead use these directly as is # done for ITK_BULD_MINC_SUPPORT set(ITK_C_OPTIMIZATION_FLAGS "${${CMAKE_PROJECT_NAME}_C_OPTIMIZATION_FLAGS}") set(ITK_CXX_OPTIMIZATION_FLAGS "${${CMAKE_PROJECT_NAME}_CXX_OPTIMIZATION_FLAGS}") # Convenient macro allowing to expand the list of EP_VAR listed in ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS # The expanded arguments will be appended to the list ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS # Similarly the name of the EP_VARs will be appended to the list ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES. macro(_expand_external_project_vars) set(${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS "") set(${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES "") foreach(arg ${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS}) string(REPLACE ":" ";" varname_and_vartype ${arg}) set(target_info_list ${target_info_list}) list(GET varname_and_vartype 0 _varname) list(GET varname_and_vartype 1 _vartype) list(APPEND ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS -D${_varname}:${_vartype}=${${_varname}}) list(APPEND ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES ${_varname}) endforeach() endmacro() #----------------------------------------------------------------------------- # Common external projects CMake variables #----------------------------------------------------------------------------- list(APPEND ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS USE_VTK:BOOL CMAKE_BUILD_TYPE:PATH MAKECOMMAND:STRING CMAKE_SKIP_RPATH:BOOL CMAKE_BUILD_TYPE:STRING BUILD_SHARED_LIBS:BOOL CMAKE_CXX_COMPILER:PATH CMAKE_CXX_FLAGS_RELEASE:STRING CMAKE_CXX_FLAGS_DEBUG:STRING CMAKE_CXX_FLAGS:STRING CMAKE_C_COMPILER:PATH CMAKE_C_FLAGS_RELEASE:STRING CMAKE_C_FLAGS_DEBUG:STRING CMAKE_C_FLAGS:STRING CMAKE_SHARED_LINKER_FLAGS:STRING CMAKE_EXE_LINKER_FLAGS:STRING CMAKE_MODULE_LINKER_FLAGS:STRING CMAKE_GENERATOR:STRING CMAKE_EXTRA_GENERATOR:STRING CMAKE_INSTALL_LIBDIR:STRING CMAKE_INSTALL_PREFIX:PATH CMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH CMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH CMAKE_BUNDLE_OUTPUT_DIRECTORY:PATH CTEST_NEW_FORMAT:BOOL MEMORYCHECK_COMMAND_OPTIONS:STRING MEMORYCHECK_COMMAND:PATH CMAKE_SHARED_LINKER_FLAGS:STRING CMAKE_EXE_LINKER_FLAGS:STRING CMAKE_MODULE_LINKER_FLAGS:STRING SITE:STRING BUILDNAME:STRING CMAKE_SH:BOOL C_LAUNCHER:STRING CXX_LAUNCHER:STRING CUDA_LAUNCHER:STRING CMAKE_XCODE_ATTRIBUTE_CC:STRING CMAKE_XCODE_ATTRIBUTE_CXX:STRING CMAKE_XCODE_ATTRIBUTE_LD:STRING CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS:STRING CMAKE_C_COMPILER_LAUNCHER:STRING CMAKE_CXX_COMPILER_LAUNCHER:STRING CMAKE_CUDA_COMPILER_LAUNCHER:STRING USE_SYSTEM_ITK:BOOL USE_SYSTEM_VTK:BOOL ) _expand_external_project_vars() set(COMMON_EXTERNAL_PROJECT_ARGS ${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS}) set(extProjName ${LOCAL_PROJECT_NAME}) set(proj ${LOCAL_PROJECT_NAME}) SlicerMacroCheckExternalProjectDependency(${proj}) #----------------------------------------------------------------------------- # Set CMake OSX variable to pass down the external project #----------------------------------------------------------------------------- set(CMAKE_OSX_EXTERNAL_PROJECT_ARGS) if(APPLE) list(APPEND CMAKE_OSX_EXTERNAL_PROJECT_ARGS -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}) endif() #----------------------------------------------------------------------------- # Add external project CMake args #----------------------------------------------------------------------------- if(USE_VTK) list(APPEND ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS USE_VTK:BOOL VTK_DIR:PATH ) endif() list(APPEND ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARS BUILD_EXAMPLES:BOOL BUILD_TESTING:BOOL ITK_VERSION_MAJOR:STRING ITK_DIR:PATH BUILD_ALL_ANTS_APPS:BOOL RUN_SHORT_TESTS:BOOL RUN_LONG_TESTS:BOOL OLD_BASELINE_TESTS:BOOL ANTS_INSTALL_LIBS_ONLY:BOOL # PAC - ANTS and ITK both include ITKSetStandardCompilerFlags.cmake, which will set optimization flags unless # built with PROJECT_C[XX]_OPTIMIZATION_FLAGS, eg ANTS needs to be built with -DANTS_C_OPTIMIZATION_FLAGS and # -DANTS_CXX_OPTIMIZATION_FLAGS ${LOCAL_PROJECT_NAME}_C_OPTIMIZATION_FLAGS:STRING ${LOCAL_PROJECT_NAME}_CXX_OPTIMIZATION_FLAGS:STRING ${LOCAL_PROJECT_NAME}_CLI_LIBRARY_OUTPUT_DIRECTORY:PATH ${LOCAL_PROJECT_NAME}_CLI_ARCHIVE_OUTPUT_DIRECTORY:PATH ${LOCAL_PROJECT_NAME}_CLI_RUNTIME_OUTPUT_DIRECTORY:PATH ${LOCAL_PROJECT_NAME}_CLI_INSTALL_LIBRARY_DESTINATION:PATH ${LOCAL_PROJECT_NAME}_CLI_INSTALL_ARCHIVE_DESTINATION:PATH ${LOCAL_PROJECT_NAME}_CLI_INSTALL_RUNTIME_DESTINATION:PATH INSTALL_RUNTIME_DESTINATION:STRING INSTALL_LIBRARY_DESTINATION:STRING INSTALL_ARCHIVE_DESTINATION:STRING ) _expand_external_project_vars() set(COMMON_EXTERNAL_PROJECT_ARGS ${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS}) if(verbose) message("Inner external project args:") foreach(arg ${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_ARGS}) message(" ${arg}") endforeach() endif() string(REPLACE ";" "^" ${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES "${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES}") if(verbose) message("Inner external project argnames:") foreach(argname ${${CMAKE_PROJECT_NAME}_SUPERBUILD_EP_VARNAMES}) message(" ${argname}") endforeach() endif() #------------------------------------------------------------------------------ # Configure and build #------------------------------------------------------------------------------ set(proj ${LOCAL_PROJECT_NAME}) ExternalProject_Add(${proj} DEPENDS ${${LOCAL_PROJECT_NAME}_DEPENDENCIES} DOWNLOAD_COMMAND "" SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} BINARY_DIR ${LOCAL_PROJECT_NAME}-build CMAKE_GENERATOR ${gen} CMAKE_ARGS --no-warn-unused-cli # HACK Only expected variables should be passed down. ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS} ${COMMON_EXTERNAL_PROJECT_ARGS} -D${LOCAL_PROJECT_NAME}_SUPERBUILD:BOOL=OFF -DCMAKE_GENERATOR_PLATFORM:STRING=${CMAKE_GENERATOR_PLATFORM} INSTALL_COMMAND "" ) ## Force rebuilding of the main subproject every time building from super structure ExternalProject_Add_Step(${proj} forcebuild COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BUILD_DIR}/${proj}-prefix/src/${proj}-stamp/${proj}-build DEPENDEES configure DEPENDERS build ALWAYS 1 )