# ------------------- Source files --------------------

add_library(
  PugsUtils
  BuildInfo.cpp
  BacktraceManager.cpp
  CommunicatorManager.cpp
  ConsoleManager.cpp
  Demangle.cpp
  Exceptions.cpp
  ExecutionStatManager.cpp
  FPEManager.cpp
  GlobalVariableManager.cpp
  Messenger.cpp
  Partitioner.cpp
  PETScWrapper.cpp
  PugsUtils.cpp
  RandomEngine.cpp
  ReproducibleSumManager.cpp
  RevisionInfo.cpp
  SignalManager.cpp
  SLEPcWrapper.cpp
  Socket.cpp)

if(${MPI_FOUND})
  target_include_directories(PugsUtils PRIVATE ${PARMETIS_INCLUDE_DIR})
  target_include_directories(PugsUtils PRIVATE ${METIS_INCLUDE_DIR})
endif()

target_link_libraries(
  PugsUtils
  ${PETSC_LIBRARIES}
  ${SLEPC_LIBRARIES}
  ${HIGHFIVE_TARGET}
)

# --------------- get git revision info ---------------

# Generates revision header file
add_custom_target(
  PugsGitRevison
  ALL
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
)

set_source_files_properties(
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
  PROPERTIES
  GENERATED TRUE
  HEADER_FILE_ONLY TRUE
  )

# --------- check git revision info at build ----------

add_custom_command(TARGET PugsGitRevison
  COMMAND ${CMAKE_COMMAND} -E remove -f
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
  COMMENT ""
  )

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
  PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
  COMMENT ""
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
  VERBATIM
  )

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision
  PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -DPUGS_VERSION=${PUGS_VERSION} -DPUGS_SOURCE_DIR=${PUGS_SOURCE_DIR} -P ${PUGS_SOURCE_DIR}/cmake/GetPugsGitRevision.cmake
  COMMENT "Check pugs git status"
  VERBATIM
  )

# ----------------- get version info ------------------

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pugs_version.hpp.in"
  "${CMAKE_CURRENT_BINARY_DIR}/pugs_version.hpp"
  @ONLY)


list(
  APPEND
  SOURCES
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_git_revision.hpp
  ${CMAKE_CURRENT_BINARY_DIR}/pugs_version.hpp
  ${PUGS_BINARY_DIR}/pugs_config.hpp
  )

# Additional dependencies
add_dependencies(
  PugsUtils
  PugsGitRevison)

# ---------------- Checks for includes ----------------

# Checks for FPE
include(CheckIncludeFile)
check_include_file(fenv.h PUGS_HAS_FENV_H)

# Checks for host system name
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
  set(SYSTEM_IS_LINUX 1)
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
  set(SYSTEM_IS_DARWIN 1)
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
  set(SYSTEM_IS_WINDOWS 1)
else()
  message(WARNMSG "Your system is ${CMAKE_HOST_SYSTEM_NAME} which may not be managed!")
endif()

# Generates pugs_config.hpp
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pugs_config.hpp.in"
  "${CMAKE_CURRENT_BINARY_DIR}/pugs_config.hpp"
  @ONLY)

# Generates pugs_build_info.hpp
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pugs_build_info.hpp.in"
  "${CMAKE_CURRENT_BINARY_DIR}/pugs_build_info.hpp"
  @ONLY)