cmake_minimum_required (VERSION 3.19)

project("_PLUGIN_LOW_")

set(PUGS_PREFIX_PATH "" CACHE STRING "pugs intall dir")

string(COMPARE EQUAL "${PUGS_PREFIX_PATH}" "" pugs_prefix_undefined)

if (pugs_prefix_undefined)
  message(FATAL_ERROR "PUGS_PREFIX_PATH must be defined")
endif()

# CMake utils
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

# Forbids in-source builds
include(CheckNotInSources)

# use PkgConfig to find packages
find_package(PkgConfig REQUIRED)
find_package(Pugs REQUIRED)

list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/Kokkos")
include(KokkosConfig)

set(HDF5_PREFER_PARALLEL TRUE)
list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/HighFive")
include(HighFiveConfig)

list(APPEND CMAKE_MODULE_PATH "${PUGS_PREFIX_PATH}/lib/cmake/pugs")
include(PugsTargets)
include(PugsCompileFlags)

#------------------------------------------------------

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PUGS_CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_STANDARD "${PUGS_CMAKE_CXX_STANDARD}")

# -----------------------------------------------------
# dynamic libraries

set(CMAKE_POSITION_INDEPENDENT_CODE ON)
link_libraries("-rdynamic")
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

#------------------------------------------------------

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

#------------------------------------------------------

set(_PLUGIN_UP__SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(_PLUGIN_UP__BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")

#------------------------------------------------------
# use pugs compilation settings

set(CMAKE_BUILD_TYPE "${PUGS_CMAKE_BUILD_TYPE}" CACHE STRING "" FORCE)
set(CMAKE_CXX_COMPILER "${PUGS_CMAKE_CXX_COMPILER}" CACHE STRING "" FORCE)
set(CMAKE_C_COMPILER "${PUGS_CMAKE_C_COMPILER}" CACHE STRING "" FORCE)

mark_as_advanced(CMAKE_BUILD_TYPE CMAKE_CXX_COMPILER CMAKE_C_COMPILER)

#------------------------------------------------------
# default build shared libraries
set(BUILD_SHARED_LIBS ON CACHE STRING "" FORCE)

#------------------------------------------------------

# Checks if compiler version is compatible with Pugs sources
set(GNU_CXX_MIN_VERSION "10.0.0")
set(CLANG_CXX_MIN_VERSION "11.0.0")

#------------------------------------------------------

include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include")
include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/kokkos")
include_directories(SYSTEM "${PUGS_PREFIX_PATH}/include/tao/")
include_directories(SYSTEM "${MPI_CXX_INCLUDE_DIRS}")

get_target_property(_prop Pugs::PugsAlgebra INTERFACE_INCLUDE_DIRECTORIES)
set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")
get_target_property(_prop Pugs::PugsUtils INTERFACE_INCLUDE_DIRECTORIES)
set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")
get_target_property(_prop Pugs::pugs INTERFACE_INCLUDE_DIRECTORIES)
set(PUGS_INC_DIR "${PUGS_INC_DIR};${_prop}")

include_directories(SYSTEM ${PUGS_INC_DIR})
link_directories(${PUGS_PREFIX_PATH}/lib)

#------------------------------------------------------

if(${PUGS_HAS_MPI})
  set(MPIEXEC_OPTION_FLAGS --oversubscribe)
  if (NOT "$ENV{GITLAB_CI}" STREQUAL "")
    set(MPIEXEC_OPTION_FLAGS ${MPIEXEC_OPTION_FLAGS} --allow-run-as-root)
  endif()
  set(MPIEXEC_NUMPROC 3)
  set(MPIEXEC_PATH_FLAG --path)
  set(MPI_LAUNCHER ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_NUMPROC} ${MPIEXEC_OPTION_FLAGS})
endif()

add_custom_target(all_unit_tests
  DEPENDS unit_tests mpi_unit_tests
)

add_custom_target(check
  DEPENDS test
  )

add_custom_target(test
  DEPENDS run_all_unit_tests
  )

add_custom_target(run_all_unit_tests
  DEPENDS run_mpi_unit_tests
  )

if(PUGS_HAS_MPI)
  set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [using ${MPIEXEC_NUMPROC} procs]")
else()
  set(RUN_MPI_UNIT_TESTS_COMMENT "Running mpi_unit_tests [sequentially]")
endif()

add_custom_target(run_mpi_unit_tests
  COMMAND ${MPI_LAUNCHER} "${_PLUGIN_UP__BINARY_DIR}/mpi_unit_tests" --allow-running-no-tests
  WORKING_DIRECTORY ${_PLUGIN_UP__BINARY_DIR}
  DEPENDS run_unit_tests
  COMMENT ${RUN_MPI_UNIT_TESTS_COMMENT}
  )

add_custom_target(run_unit_tests
  COMMAND "${_PLUGIN_UP__BINARY_DIR}/unit_tests" --allow-running-no-tests
  DEPENDS all_unit_tests
  COMMENT "Running unit_tests"
  )

#------------------------------------------------------

add_library(_PLUGIN_NAME_
  _PLUGIN_NAME_Module.cpp
  # add cpp sources files here
)

#------------------------------------------------------

add_subdirectory(tests)

#------------------------------------------------------

install(TARGETS _PLUGIN_NAME_)