Skip to content
Snippets Groups Projects
CMakeLists.txt 7.59 KiB
Newer Older
  • Learn to ignore specific revisions
  • cmake_minimum_required(VERSION 3.2)
    
    project(iMSTK VERSION 0.0.1 LANGUAGES C CXX)
    
    #-----------------------------------------------------------------------------
    # CTest/Dashboards
    #-----------------------------------------------------------------------------
    include(CTest)
    
    
    #-----------------------------------------------------------------------------
    # Update CMake module path & cmake dir
    #-----------------------------------------------------------------------------
    set(CMAKE_MODULE_PATH
        ${CMAKE_CURRENT_SOURCE_DIR}/CMake
    
        ${CMAKE_CURRENT_SOURCE_DIR}/CMake/Utilities
    
        ${CMAKE_MODULE_PATH}
        )
    set(${PROJECT_NAME}_CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
    
    #-----------------------------------------------------------------------------
    # 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()
    
    #-----------------------------------------------------------------------------
    # Project build directories
    #-----------------------------------------------------------------------------
    
    if(NOT DEFINED ${PROJECT_NAME}_BIN_DIR)
      set(${PROJECT_NAME}_BIN_DIR "bin")
    endif()
    if(NOT DEFINED ${PROJECT_NAME}_LIB_DIR)
      set(${PROJECT_NAME}_LIB_DIR "lib")
    endif()
    if(NOT DEFINED ${PROJECT_NAME}_INCLUDE_DIR)
      set(${PROJECT_NAME}_INCLUDE_DIR "include")
    endif()
    if(NOT DEFINED ${PROJECT_NAME}_SHARE_DIR)
      set(${PROJECT_NAME}_SHARE_DIR "share")
    endif()
    
    
    #-----------------------------------------------------------------------------
    # Project install directories
    #-----------------------------------------------------------------------------
    if(APPLE)
    
      set(${PROJECT_NAME}_INSTALL_ROOT "${${PROJECT_NAME}_MAIN_PROJECT_APPLICATION_NAME}.app/Contents") # Set to create Bundle
    
      set(${PROJECT_NAME}_INSTALL_ROOT ".")
    
    endif()
    
    set(${PROJECT_NAME}_INSTALL_BIN_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/${${PROJECT_NAME}_BIN_DIR}/${PROJECT_NAME}-${${PROJECT_NAME}_VERSION}")
    set(${PROJECT_NAME}_INSTALL_LIB_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/${${PROJECT_NAME}_LIB_DIR}/${PROJECT_NAME}-${${PROJECT_NAME}_VERSION}")
    set(${PROJECT_NAME}_INSTALL_INCLUDE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/${${PROJECT_NAME}_INCLUDE_DIR}/${PROJECT_NAME}-${${PROJECT_NAME}_VERSION}")
    set(${PROJECT_NAME}_INSTALL_SHARE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/${${PROJECT_NAME}_SHARE_DIR}/${PROJECT_NAME}-${${PROJECT_NAME}_VERSION}")
    
    
    #-----------------------------------------------------------------------------
    # C++11 Support
    #-----------------------------------------------------------------------------
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    
    #-----------------------------------------------------------------------------
    
    # Define External dependencies
    
    #-----------------------------------------------------------------------------
    
    macro(imstk_define_dependency extProj)
      list(APPEND ${PROJECT_NAME}_DEPENDENCIES ${extProj})
      option(USE_SYSTEM_${extProj} "Exclude ${extProj} from superbuild and use an existing build." OFF)
      mark_as_advanced(USE_SYSTEM_${extProj})
    endmacro()
    
    option(${PROJECT_NAME}_USE_Uncrustify "Use Uncrustify as a code style beautifier." OFF)
    if(${PROJECT_NAME}_USE_Uncrustify)
      imstk_define_dependency(Uncrustify)
    endif()
    
    
    if(WIN32)
      imstk_define_dependency(PThreads)
    
      imstk_define_dependency(Libusb) #for VRPN
      imstk_define_dependency(FTD2XX) #for LibNiFalcon
    
    imstk_define_dependency(g3log)
    imstk_define_dependency(Eigen)
    
    imstk_define_dependency(SCCD)
    
    imstk_define_dependency(VegaFEM)
    imstk_define_dependency(VTK)
    
    imstk_define_dependency(VRPN)
    
    imstk_define_dependency(LibNiFalcon)
    
    #-----------------------------------------------------------------------------
    
    #-----------------------------------------------------------------------------
    option(${PROJECT_NAME}_SUPERBUILD "Build ${PROJECT_NAME} and the projects it depends on." ON)
    
    if(${PROJECT_NAME}_SUPERBUILD)
    
      # Call CMakeLists.txt in CMake/External which will solve the dependencies
      # and add the External projects, including this one: this top-level
      # CMakeLists.txt will be called back with SUPERBUILD=OFF, to execute
      # the rest of the code below (INNERBUILD), which explains the `return`
      add_subdirectory(CMake/External)
      return()
    
    endif()
    
    #-----------------------------------------------------------------------------
    
    # INNERBUILD
    #-----------------------------------------------------------------------------
    #-----------------------------------------------------------------------------
    # Find external dependencies
    
    #-----------------------------------------------------------------------------
    
    # Uncrustify
    
    find_program(Uncrustify_EXECUTABLE Uncrustify)
    
    include(SetupUncrustifyConfig)
    
    
    # g3log
    find_package( g3log REQUIRED )
    
    include_directories( ${g3log_INCLUDE_DIR} )
    
    # Eigen
    find_package( Eigen 3.1.2 REQUIRED )
    include_directories( ${Eigen_INCLUDE_DIR} )
    
    
    # SCCD
    find_package( SCCD REQUIRED )
    include_directories( ${SCCD_INCLUDE_DIR} )
    
    
    find_package( VegaFEM REQUIRED CONFIG )
    
    # VTK
    
    find_package( VTK REQUIRED CONFIG )
    
    include( ${VTK_USE_FILE} )
    
    # VRPN
    find_package( VRPN REQUIRED )
    include_directories( ${VRPN_INCLUDE_DIRS} )
    
    add_definitions( -DVRPN_USE_LIBNIFALCON )
    if(${PROJECT_NAME}_USE_OMNI)
    
      add_definitions( -DiMSTK_USE_OPENHAPTICS )
    
      add_definitions( -DVRPN_USE_PHANTOM_SERVER )
    
    else()
      remove_definitions( -DiMSTK_USE_OPENHAPTICS )
      remove_definitions( -DVRPN_USE_PHANTOM_SERVER )
    
    #--------------------------------------------------------------------------
    
    # Add Source code subdirectories
    
    #--------------------------------------------------------------------------
    add_subdirectory(Base/Core)
    
    add_subdirectory(Base/Geometry)
    
    add_subdirectory(Base/Devices)
    
    add_subdirectory(Base/Rendering)
    
    add_subdirectory(Base/Solvers)
    
    add_subdirectory(Base/DynamicalModels)
    
    add_subdirectory(Base/TimeIntegrators)
    
    add_subdirectory(Base/SceneElements)
    add_subdirectory(Base/Collision)
    add_subdirectory(Base/Scene)
    add_subdirectory(Base/SimulationManager)
    
    tuanthienbk's avatar
    tuanthienbk committed
    add_subdirectory(Base/Constraint)
    
    #--------------------------------------------------------------------------
    # Export Targets
    #--------------------------------------------------------------------------
    
    string(TOLOWER "${PROJECT_NAME}" PROJECT_NAMESPACE)
    set(PROJECT_NAMESPACE "${PROJECT_NAMESPACE}::")
    
    
    include(CMakePackageConfigHelpers)
    write_basic_package_version_file(
      "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
      VERSION ${Upstream_VERSION}
      COMPATIBILITY AnyNewerVersion
      )
    
    export(EXPORT ${PROJECT_NAME}_TARGETS
      FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake
      NAMESPACE ${PROJECT_NAMESPACE}
    
    configure_file(${PROJECT_NAME}Config.cmake.in
      "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
      @ONLY
      )
    
    install(EXPORT ${PROJECT_NAME}_TARGETS
    
      FILE
        ${PROJECT_NAME}Targets.cmake
      NAMESPACE
        ${PROJECT_NAMESPACE}
      DESTINATION
        ${${PROJECT_NAME}_INSTALL_SHARE_DIR}
      )
    install(
      FILES
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
      DESTINATION
        ${${PROJECT_NAME}_INSTALL_SHARE_DIR}
      COMPONENT
        Devel
    
    
    #--------------------------------------------------------------------------
    # Add Examples subdirectories
    #--------------------------------------------------------------------------
    
    Hong Li's avatar
    Hong Li committed
    add_subdirectory(Examples)