# Copyright (c) 2014-2016 John Biddiscombe
#
# SPDX-License-Identifier: BSL-1.0
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

# Configuring options
include(HPX_SetupLibfabric)

if (HPX_WITH_PARCELPORT_LIBFABRIC)
  #------------------------------------------------------------------------------
  # Define the ParcelPort registration macro
  #------------------------------------------------------------------------------
  # make these variables cache ones so that the macro definition picks them up correctly
  # it is executed from a different source dir, so vars lose their scope

  set(_parcelport_CXX_srcs
    "${PROJECT_SOURCE_DIR}/plugins/parcelport/libfabric/parcelport_libfabric.cpp"
    "${PROJECT_SOURCE_DIR}/plugins/parcelport/libfabric/receiver.cpp"
    "${PROJECT_SOURCE_DIR}/plugins/parcelport/libfabric/rma_receiver.cpp"
    "${PROJECT_SOURCE_DIR}/plugins/parcelport/libfabric/sender.cpp"
    CACHE INTERNAL "" FORCE)

  set(_hpxc_CXX_srcs          "" CACHE INTERNAL "" FORCE)
  set(_libfabric_C_srcs       "" CACHE INTERNAL "" FORCE)

  if(NOT HPX_PARCELPORT_LIBFABRIC_WITH_HPXC)
    set(_libfabric_libraries hpx::libfabric hpx::pmi)
  else()
    add_library(hpx::gni INTERFACE IMPORTED)
    set_property(TARGET hpx::gni PROPERTY
      INTERFACE_INCLUDE_DIRECTORIES ${LIBFABRIC_INCLUDE_DIR})
    set_property(TARGET hpx::gni PROPERTY
      INTERFACE_LINK_LIBRARIES ${GNI_LIB})
    set(_deps hpx::gni hpx::pmi)

    set(_libfabric_C_srcs
      ${libfabric_SRCS}
      ${libfabric_util_SRCS}
      ${libfabric_gni_SRCS}
      )

    set(_hpxc_CXX_srcs ${_parcelport_CXX_srcs}
      "${PROJECT_SOURCE_DIR}/plugins/parcelport/libfabric/hpxc/src/threads/thread.cpp")

    set(_parcelport_CXX_srcs ${_parcelport_CXX_srcs} ${_hpxc_CXX_srcs})

    set(_libfabric_include_dirs
      ${CMAKE_CURRENT_SOURCE_DIR}
      ${CMAKE_CURRENT_SOURCE_DIR}/hpxc
      ${CMAKE_CURRENT_SOURCE_DIR}/libfabric
      ${CMAKE_CURRENT_SOURCE_DIR}/libfabric/prov/gni
      ${CMAKE_CURRENT_SOURCE_DIR}/libfabric/prov/gni/include
      ${CMAKE_CURRENT_SOURCE_DIR}/libfabric/include
      ${GNI_INCLUDE}
      )
  endif()

  hpx_debug("add_parcelport_libfabric_module")

  include(HPX_AddParcelport)
  add_parcelport(libfabric
    STATIC
    SOURCES
        ${_parcelport_CXX_srcs}
        ${_libfabric_C_srcs}
    # do we need to declare any headers?
    #HEADERS
    # FIXME : Could this be private
    DEPENDENCIES
      ${_libfabric_libraries}
      hpx_config
      hpx_allocator_support
      hpx_assertion
      hpx_cache
      hpx_concurrency
      hpx_coroutines
      hpx_errors
      hpx_execution
      hpx_hardware
      hpx_memory
      hpx_plugin
      hpx_program_options
      hpx_serialization
      hpx_threadmanager
      hpx_timing
      hpx_topology
    INCLUDE_DIRS
      ${_libfabric_include_dirs}
      ${PROJECT_SOURCE_DIR}
      ${PROJECT_BINARY_DIR}
    FOLDER
      "Core/Plugins/Parcelport/libfabric")

  if(HPX_PARCELPORT_LIBFABRIC_WITH_HPXC)
    set_source_files_properties(
      ${_libfabric_C_srcs}
      PROPERTIES
        COMPILE_FLAGS
            "-include \"hpxc/hpxc/pthread_compatibility.h\" \
            -include \"libfabric/config.h\"                 \
            -Wsign-compare -Wunused-parameter"
        LANGUAGE C)

    set_source_files_properties(
      ${_parcelport_CXX_srcs}
      PROPERTIES
        COMPILE_FLAGS "-include \"libfabric/config.h\" -Wno-missing-field-initializers"
        LANGUAGE CXX)
  else()
    set_source_files_properties(
      ${_parcelport_CXX_srcs}
      PROPERTIES
        COMPILE_FLAGS "-Wno-missing-field-initializers"
        LANGUAGE CXX)
  endif()

endif()
