cmake_minimum_required(VERSION 3.7)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS False)
set(CMAKE_CXX_FLAGS "--std=c++11")# Ensures CUDA understands this on all platforms

if(NOT CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  message(STATUS "Setting install dir inside build dir ${CMAKE_BINARY_DIR} ")
  set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install location" FORCE)
else()
  message(STATUS "Using preset install directory ${CMAKE_INSTALL_PREFIX}")
endif()

set(CMAKE_DEBUG_POSTFIX "d")

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

project(LBM VERSION 1.0.0 LANGUAGES C CXX)
option(${PROJECT_NAME}_VTK_EXTENSION "Include VTK support methods into the library." ON)
option(${PROJECT_NAME}_ITK_EXTENSION "Include ITK support methods into the library." ON)
#-----------------------------------------------------------------------------
# Project install directories
#-----------------------------------------------------------------------------
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Install location" FORCE)
endif()
set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
if(APPLE)
  set(${PROJECT_NAME}_INSTALL_ROOT "${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_MAIN_PROJECT_APPLICATION_NAME}.app/Contents") # Set to create Bundle
else()
  set(${PROJECT_NAME}_INSTALL_ROOT "${CMAKE_INSTALL_PREFIX}")
endif()
set(${PROJECT_NAME}_INSTALL_BIN_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/bin")
set(${PROJECT_NAME}_INSTALL_LIB_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/lib")
set(${PROJECT_NAME}_INSTALL_INCLUDE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}/include/LBM-${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}")
set(${PROJECT_NAME}_INSTALL_SHARE_DIR "${${PROJECT_NAME}_INSTALL_ROOT}")
set(${PROJECT_NAME}_INSTALL_CMAKE_DIR "${${PROJECT_NAME}_INSTALL_LIB_DIR}/cmake/LBM-${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}")
# Let's go ahead and make these directories
file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_BIN_DIR})
file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_LIB_DIR})
file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_SHARE_DIR})
file(MAKE_DIRECTORY ${${PROJECT_NAME}_INSTALL_CMAKE_DIR})

#-----------------------------------------------------------------------------
# Update CMake module path & cmake dir
#-----------------------------------------------------------------------------
set(CMAKE_MODULE_PATH
    ${CMAKE_CURRENT_SOURCE_DIR}/CMake
    ${CMAKE_CURRENT_SOURCE_DIR}/CMake/Utilities
    ${CMAKE_INSTALL_PREFIX}
    ${CMAKE_INSTALL_PREFIX}/lib/cmake # Many packages install their cmake to lib
    )
set(${PROJECT_NAME}_CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CMake)

#-----------------------------------------------------------------------------
# SUPERBUILD
#-----------------------------------------------------------------------------
option(${PROJECT_NAME}_SUPERBUILD "Build ${PROJECT_NAME} and the projects it depends on." ON)

if(${PROJECT_NAME}_SUPERBUILD)

  #-----------------------------------------------------------------------------
  # Define External dependencies
  #-----------------------------------------------------------------------------
  macro(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()
  
  find_package(CUDA REQUIRED)
  define_dependency(Eigen3)
  if(WIN32)
    # *nix systems have this already
    define_dependency(Dirent)
  endif()
  
  #define_dependency(protobuf)
  if(LBM_VTK_EXTENSION)
    define_dependency(VTK)
  endif()
  if(LBM_ITK_EXTENSION)
    define_dependency(ITK)
  endif()
  
  if(${PROJECT_NAME}_DEPENDENCIES)
    #-----------------------------------------------------------------------------
    # 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)
    return()
  else()
    message(STATUS "No dependencies, skipping superbuild")
  endif()
endif()

#-----------------------------------------------------------------------------
#                               INNERBUILD
#-----------------------------------------------------------------------------
include(Find)# Our find macros
include(AddLibrary)# Extras to do when creating a library
include(AddExecutable)# Extras to do when creating an executable
#-----------------------------------------------------------------------------
# Find external dependencies
#-----------------------------------------------------------------------------

find_package(CUDA REQUIRED)
find_package(Eigen3 REQUIRED)
if(WIN32)
  # *nix systems have this already
  find_package(Dirent REQUIRED)
endif()

if(LBM_ITK_EXTENSION)
  find_package(ITK REQUIRED)
  include( ${ITK_USE_FILE} )
endif()

if(LBM_VTK_EXTENSION)
  find_package(VTK CONFIG)
  if (VTK_VERSION VERSION_LESS "8.90")
    # Modules are linked via `vtkCommonCore`
    # VTK_DEFINITIONS has autoinit information
    find_package(VTK REQUIRED)
    include(${VTK_USE_FILE})
  else()
    message(FATAL_ERROR "VTK 8.9 and greater is not supported yet")
  endif()
endif()

add_subdirectory(src)
add_subdirectory(driver)


#--------------------------------------------------------------------------
# Add setup script for *nix systems
#--------------------------------------------------------------------------
if(NOT WIN32)
  # Create setup shell script to create an environment for running examples
  set(LIBRARY_PATH_VAR "LD_LIBRARY_PATH")
  if( APPLE )
    set(LIBRARY_PATH_VAR "DYLD_FALLBACK_LIBRARY_PATH")
  endif()
  configure_file(
    ${CMAKE_SOURCE_DIR}/CMake/setup_LBM.sh.in
    ${CMAKE_INSTALL_PREFIX}/setup_LBM.sh
    @ONLY
    )
endif()

configure_file(${CMAKE_SOURCE_DIR}/bin/run.config.in "${${PROJECT_NAME}_INSTALL_BIN_DIR}/run.config" @ONLY)
configure_file(${CMAKE_SOURCE_DIR}/CMake/LBMConfig.cmake.in "${${PROJECT_NAME}_INSTALL_CMAKE_DIR}/LBMConfig.cmake" @ONLY)

