CMAKE_MINIMUM_REQUIRED(VERSION 3.13.4...3.27.4)

project(MpiHandleShim C CXX)

find_package(MPI REQUIRED)

set(WRAP ${MpiHandleShim_SOURCE_DIR}/external/wrap/wrap.py)
include(${MpiHandleShim_SOURCE_DIR}/external/wrap/WrapConfig.cmake)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

SET(CMAKE_MODULE_PATH
    "${MpiHandleShim_SOURCE_DIR}/external/CMake-MPIhelper/cmake"
    ${CMAKE_MODULE_PATH}
    )

include(CheckMPIFunctionExists)
include(CheckMPISymbolExists)
include(CheckMPISymbolIsRvalue)
include(CheckMPITypeExists)

macro (check_mpi_function_exists_pp function)
    STRING(TOUPPER "HAVE_${function}" havevariable)
    check_mpi_symbol_is_rvalue(${function} ${havevariable})
endmacro (check_mpi_function_exists_pp)
macro (check_mpi_type_exists_pp type)
    STRING(TOUPPER "HAVE_${type}" havevariable)
    check_mpi_type_exists(${type} ${havevariable})
endmacro (check_mpi_type_exists_pp)

check_mpi_type_exists_pp(MPI_Session)
check_mpi_type_exists_pp(MPI_Count)
check_mpi_function_exists_pp(MPI_Barrier_init)

if(HAVE_MPI_SESSION)
    add_definitions(-DHAVE_SESSION)
endif()
if(HAVE_MPI_COUNT)
    add_definitions(-DHAVE_COUNT)
endif()

include_directories(${MpiHandleShim_SOURCE_DIR} ${MPI_C_INCLUDE_PATH} ${MPI_CXX_INCLUDE_PATH})

set(MpiHandleShim_SOURCES
    completion-wrappers.cpp
    man-wrappers.cpp
    tracking.cpp
    gen-nb-wrappers-patched.cpp
    gen-wrappers.cpp
)

set(WRAP_FLAGS -s -n)
add_wrapped_file(gen-nb-wrappers.cpp gen-nb-wrappers.w)
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/gen-nb-wrappers-patched.cpp
  COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/patch-persistent.sh ${CMAKE_CURRENT_BINARY_DIR}/gen-nb-wrappers.cpp ${CMAKE_CURRENT_BINARY_DIR}/gen-nb-wrappers-patched.cpp
  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/gen-nb-wrappers.cpp
  VERBATIM)
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/gen-nb-wrappers-patched.cpp PROPERTIES GENERATED TRUE)
add_wrapped_file(gen-wrappers.cpp gen-wrappers.w)

add_library(MpiHandleShim SHARED ${MpiHandleShim_SOURCES})
target_link_libraries(MpiHandleShim ${MPI_C_LIBRARIES})

#add_library(MpiHandleShim_static STATIC ${MpiHandleShim_SOURCES})
#target_link_libraries(MpiHandleShim_static ${MPI_C_LIBRARIES})

#add_subdirectory(tests)

install(TARGETS MpiHandleShim 
	#MpiHandleShim_static 
	DESTINATION lib)
