configure_file(
  config.h.in
  config.h
)
add_custom_command(
  OUTPUT requests.cpp requests.h requests.inc
  DEPENDS generate_requests.py REQUESTS
  COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_requests.py
                               ${CMAKE_CURRENT_SOURCE_DIR}/REQUESTS
                               "source"
  COMMENT "Generating request source codes"
)
set(SOURCE_FILES
  data_types.cpp
  env_controls.cpp
  error_print.cpp
  main_class.cpp
  mcl.cpp
  requests.cpp
  transfer_logger.cpp
  api_fortran/initialize_wrapper.cpp
  endpoint.cpp
  transport/mpi_port_transport.cpp
  transport/mpi_mpmd_transport.cpp
  transport/stub_transport.cpp
)
set(HEADER_FILES
  mcl.h
  ${CMAKE_CURRENT_BINARY_DIR}/config.h
  ${CMAKE_CURRENT_BINARY_DIR}/requests.h
)
add_library(mcl ${SOURCE_FILES})
set_target_properties(
  mcl
  PROPERTIES
  POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
  VERSION ${PROJECT_VERSION}
  SOVERSION ${PROJECT_VERSION}
)
target_include_directories(
  mcl
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/transport>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/MiMiC>
  PUBLIC
    ${MPI_CXX_INCLUDE_DIRS}
)
target_link_libraries(
  mcl
  INTERFACE
    MPI::MPI_CXX
    stdc++fs
)
install(
  TARGETS mcl
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/MiMiC
  EXPORT MCLTargets
  COMPONENT CXX
)
install(
  FILES ${HEADER_FILES}
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MiMiC
  COMPONENT CXX
)
if(BUILD_FORTRAN_API)
  set(FORTRAN_SOURCE_FILES
    api_fortran/mcl.F90
    api_fortran/c_bindings.F90
  )
  set(FORTRAN_INCLUDE_FILES
    requests.inc
  )
  set(FORTRAN_MODULE_FILES
    ${CMAKE_Fortran_MODULE_DIRECTORY}/mcl.mod
  )
  add_library(mclf
    ${FORTRAN_SOURCE_FILES}
    ${FORTRAN_INCLUDE_FILES}
  )
  set_target_properties(
    mclf
    PROPERTIES
    POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
    VERSION ${PROJECT_VERSION}
    SOVERSION ${PROJECT_VERSION}
  )
  target_include_directories(
    mclf
    PUBLIC
      $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
      $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/MiMiC>
    PUBLIC
      ${MPI_Fortran_INCLUDE_DIRS}
  )
  install(
    TARGETS mclf
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/MiMiC
    EXPORT MCLTargets
    COMPONENT Fortran
  )
  install(
    FILES ${FORTRAN_MODULE_FILES}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MiMiC
    COMPONENT Fortran
  )
endif()
include(CMakePackageConfigHelpers)
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/MiMiC)
configure_package_config_file(
  ${CMAKE_SOURCE_DIR}/cmake/MCLConfig.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/MCLConfig.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MiMiC
  PATH_VARS INCLUDE_INSTALL_DIR
)
write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/MCLConfigVersion.cmake
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY SameMajorVersion
)
install(
  FILES
  ${CMAKE_CURRENT_BINARY_DIR}/MCLConfig.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/MCLConfigVersion.cmake
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MiMiC
  COMPONENT CXX
)
install(
  EXPORT MCLTargets
  FILE MCLTargets.cmake
  NAMESPACE MCL::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MiMiC
)
export(
  EXPORT MCLTargets
  FILE ${CMAKE_BINARY_DIR}/cmake/MCLTargets.cmake
  NAMESPACE MCL::
)

