Skip to content
Snippets Groups Projects
CMakeLists.txt 10.9 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)
    
    if(MSVC)
      add_definitions(-D_CRT_SECURE_NO_WARNINGS)
      add_definitions(-D_SCL_SECURE_NO_WARNINGS)
    endif()
    
    
    #-----------------------------------------------------------------------------
    
    #-----------------------------------------------------------------------------
    
    option(${PROJECT_NAME}_SUPERBUILD "Build ${PROJECT_NAME} and the projects it depends on." ON)
    
    if(${PROJECT_NAME}_SUPERBUILD)
    
      #-----------------------------------------------------------------------------
      # 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." ON)
    
      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
      endif()
    
      imstk_define_dependency(Assimp)
    
      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)
    
      if(BUILD_TESTING)
        imstk_define_dependency(GoogleTest)
    
        #-----------------------------------------------------------------------------
        # Allow CTest to cover Innerbuild
        #-----------------------------------------------------------------------------
        configure_file(
          "${CMAKE_CURRENT_LIST_DIR}/CMake/Utilities/imstkCTestAddInnerbuild.cmake.in"
          "${CMAKE_CURRENT_BINARY_DIR}/imstkCTestAddInnerbuild.cmake"
          @ONLY
        )
        set_directory_properties(PROPERTIES TEST_INCLUDE_FILE
          "${CMAKE_CURRENT_BINARY_DIR}/imstkCTestAddInnerbuild.cmake"
        )
      endif()
    
      #-----------------------------------------------------------------------------
      # Solve project dependencies
      #-----------------------------------------------------------------------------
    
      # 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)
    
    endif()
    
    #-----------------------------------------------------------------------------
    
    # INNERBUILD
    #-----------------------------------------------------------------------------
    #-----------------------------------------------------------------------------
    # Find external dependencies
    
    #-----------------------------------------------------------------------------
    
    # Uncrustify
    
    find_program(Uncrustify_EXECUTABLE uncrustify)
    
    include(SetupUncrustifyConfig)
    
    if(Uncrustify_EXECUTABLE)
      # Add target to run uncrustify
      add_custom_target(uncrustifyRun
        COMMAND ${Uncrustify_EXECUTABLE}
          -c ${CMAKE_CURRENT_LIST_DIR}/Utilities/Uncrustify/iMSTKUncrustify.cfg
          -F ${CMAKE_CURRENT_BINARY_DIR}/Uncrustify.list
          --no-backup
        COMMENT "Run uncrustify - overwrites source files"
        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
        )
    
      if(BUILD_TESTING)
        # Add test to check style using uncrustify
        add_test(NAME uncrustifyCheck
          COMMAND ${Uncrustify_EXECUTABLE}
          -c ${CMAKE_CURRENT_LIST_DIR}/Utilities/Uncrustify/iMSTKUncrustify.cfg
          -F ${CMAKE_CURRENT_BINARY_DIR}/Uncrustify.list
          --check
          COMMENT "Run uncrustify in check mode"
          WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
          )
      endif(BUILD_TESTING)
    
      # Write list of files on which to run uncrustify.
      # Explicitly write a zero byte file when no source files are specified.
      # Otherwise, configure_file() creates a file with a single blank line, and
      # uncrustify interprets the blank line as a file name.
      file(GLOB_RECURSE UNCRUSTIFY_SOURCE_FILES *.h *.cpp)
      set(_uncrustify_list_in ${CMAKE_CURRENT_LIST_DIR}/Utilities/Uncrustify/uncrustify.list.in)
      set(_uncrustify_list_out ${CMAKE_CURRENT_BINARY_DIR}/uncrustify.list)
      if(UNCRUSTIFY_SOURCE_FILES)
        list(SORT UNCRUSTIFY_SOURCE_FILES)
        string(REPLACE ";" "\n" UNCRUSTIFY_SOURCE_FILES "${UNCRUSTIFY_SOURCE_FILES}")
        configure_file("${_uncrustify_list_in}" "${_uncrustify_list_out}" @ONLY)
      else()
        file(WRITE "${_uncrustify_list_out}")
      endif()
    else(Uncrustify_EXECUTABLE)
      message(WARNING "uncrustify not found! Cannot run code-style test.")
    endif(Uncrustify_EXECUTABLE)
    
    # Assimp
    find_package( Assimp REQUIRED )
    include_directories( ${Assimp_INCLUDE_DIRS} )
    
    
    # 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 )
    
    # Google Test
    if(BUILD_TESTING)
      find_package( GoogleTest REQUIRED )
      include_directories(${GoogleTest_INCLUDE_DIRS})
      find_package( GoogleMock REQUIRED )
      include_directories(${GoogleMock_INCLUDE_DIRS})
    endif()
    
    
    # External data
    if(BUILD_TESTING OR BUILD_EXAMPLES )
      include(imstkExternalData)
    endif()
    
    
    #--------------------------------------------------------------------------
    
    # 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)
    
    add_subdirectory(Base/Materials)
    
    #--------------------------------------------------------------------------
    # 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)
    
    Alexis Girault's avatar
    Alexis Girault committed
    
    #--------------------------------------------------------------------------
    # Innerbuild dummy test
    #--------------------------------------------------------------------------
    add_test(
      NAME imstkDummyTest
      COMMAND ${CMAKE_COMMAND} -E echo "Success"
    )