#CmakeLists for dlfind source code

set(CMAKE_Fortran_PREPROCESS ON)

# Source codes. The standalone driver and drawing helper are not part of the
# library interface; both define entry points that conflict with dl-find.f90.
set(CURRENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB ALL_SOURCE LIST_DIRECTORIES false RELATIVE ${CURRENT_DIR} "*.f90")
list(REMOVE_ITEM ALL_SOURCE
  "main.f90"
  "draw.f90"
  "dlf_mpi.f90"
  "dlf_serial.f90"
)

if(ENABLE_MPI)
  add_library(dlf "${ALL_SOURCE}" dlf_mpi.f90)
else()
  add_library(dlf "${ALL_SOURCE}" dlf_serial.f90)
endif()

if(DLFIND_INTEGER_BYTES STREQUAL "8")
  if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU|Flang|LLVMFlang")
    target_compile_options(dlf PRIVATE -fdefault-integer-8)
  elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
    target_compile_options(dlf PRIVATE -i8)
  else()
    message(FATAL_ERROR
      "DLFIND_INTEGER_BYTES=8 was requested, but no integer-8 flag is known "
      "for Fortran compiler '${CMAKE_Fortran_COMPILER_ID}'.")
  endif()
elseif(NOT DLFIND_INTEGER_BYTES STREQUAL "4")
  message(FATAL_ERROR "DLFIND_INTEGER_BYTES must be 4 or 8.")
endif()

set_target_properties(dlf PROPERTIES
  Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

set(DLFIND_MODULE_FILES
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_allocate.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_bspline.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_checkpoint.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_conint.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_constants.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_convergence.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_dimer.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_formstep_module.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_global.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_hessian.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_linesearch.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_microiter.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_neb.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_parameter_module.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_qts.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_scalestep_module.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_sort_module.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_stat.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_store.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_task_module.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlf_time.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlfhdlc_constraint.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlfhdlc_hdlclib.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlfhdlc_matrixlib.mod
  ${CMAKE_CURRENT_BINARY_DIR}/dlfhdlc_primitive.mod
  ${CMAKE_CURRENT_BINARY_DIR}/lbfgs_module.mod
  PARENT_SCOPE
)
