################################################################################
## Basic Setup
cmake_minimum_required (VERSION 3.9)
project(NTPoly VERSION 3.1.0 DESCRIPTION 
	"A parallel library for computing the functions of sparse matrices")
enable_language(Fortran)

################################################################################
## Packages
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake)
if (NOT CMAKE_TOOLCHAIN_FILE)
  message(WARNING "Building without a toolchain file. "
          "If this does not work, please see the example toolchain files in "
          "the Targets directory and set the parameters that match your "
          "system.")
  find_package(MPI REQUIRED)
  find_package(BLAS)
  find_package(LAPACK)
endif()
find_package(SWIG 3.0)
find_package(EigenExa)
if (EigenExa_FOUND)
  add_definitions("-DEIGENEXA")
  set(EigenSolver_LIBRARIES ${EigenExa_LIBRARIES})
  set(EigenSolver_INCLUDE_DIRS ${EigenExa_INCLUDE_DIRS})
endif()

################################################################################
## Options
option(FORTRAN_ONLY "Build only the Fortran bindings." OFF)
option(NOSWIG "Don't build the swig bindings." OFF)
option(USE_MPIH "Use mpi.h for systems that don't have the mpi module" OFF)
option(NOIALLGATHER
  "A (slower) alternative communication strategy if iallgather not implemented"
  OFF)

## Process these options
if (NOT SWIG_FOUND OR FORTRAN_ONLY)
  set(NOSWIG TRUE)
endif()

################################################################################
## Testing
if (NOT NOSWIG)
  enable_testing()
else()
  message(WARNING
          "Swig disabled. No python bindings or testing will be generated.")
endif()

################################################################################
## Output Locations
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/
        DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/scratch)

################################################################################
## Compiler Flags
if (CMAKE_TOOLCHAIN_FILE)
  set(CMAKE_Fortran_FLAGS_DEBUG ${F_TOOLCHAINFLAGS_DEBUG})
  set(CMAKE_CXX_FLAGS_DEBUG ${CXX_TOOLCHAINFLAGS_DEBUG})
  set(CMAKE_Fortran_FLAGS_RELEASE ${F_TOOLCHAINFLAGS_RELEASE})
  set(CMAKE_CXX_FLAGS_RELEASE ${CXX_TOOLCHAINFLAGS_RELEASE})
else()
  find_package(OpenMP)
  set(CMAKE_Fortran_FLAGS_RELEASE
    "${CMAKE_Fortran_FLAGS_RELEASE} ${OpenMP_Fortran_FLAGS}")
endif()

if (NOT CMAKE_BUILD_TYPE)
  set(CMAKE_Fortran_FLAGS ${CMAKE_Fortran_FLAGS_RELEASE})
  set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_RELEASE})
endif()

################################################################################
## Check MPI Features
if (USE_MPIH OR NOT ${MPI_Fortran_HAVE_F90_MODULE})
  add_definitions(-DUSE_MPIH)
endif()

if (NOIALLGATHER)
  add_definitions(-DNOIALLGATHER)
  message(STATUS "IAllgather replacement activated.")
  message(STATUS "Note that this may reduce parallel performance.")
endif()

################################################################################
## Get at the source files
subdirs(Documentation)
subdirs(Source)

if (NOT NOSWIG)
  subdirs(UnitTests)
endif()

################################################################################
## CMake Packaging
set(CPACK_PACKAGE_VENDOR "RIKEN R-CCS")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_IGNORE_FILES /.git /Build)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.md")
include(CPack)