cmake_minimum_required(VERSION 3.12...3.19)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake ${CMAKE_MODULE_PATH})

include(Version)

project(
  SIONlib
  VERSION ${SION_VERSION}
  LANGUAGES C
)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
include(CMakeDependentOption)
include(FeatureSummary)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
  include(CTest)
endif()

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED TRUE)
set(CMAKE_C_EXTENSIONS FALSE)

# Install time rpath settings
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" CACHE STRING "RPATH entries to explicitly include at build time")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON CACHE BOOL "Auto-detect RPATH entries to include")

# Build static libraries by default
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries")

# Build position independent code by default
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Build position independent code")

# Build release version by default (enable optimizations)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
endif()

set(find_package_ignore SIONlib)
macro(find_package)
  if(NOT "${ARGV0}" IN_LIST find_package_ignore)
    _find_package(${ARGV})
  endif()
endmacro()

option(SIONlib_DEBUG "Print debug trace messages" OFF)
add_feature_info("Debugging" SIONlib_DEBUG "print trace messages for debugging")
option(SIONlib_MPI "MPI parallel interface" ON)
add_feature_info("MPI interface" SIONlib_MPI "use SIONlib from MPI parallel applications")
option(SIONlib_OMP "OpenMP parallel interface" ON)
add_feature_info("OpenMP interface" SIONlib_OMP "use SIONlib from OpenMP parallel applications")
option(SIONlib_OMPI "MPI + OpenMP parallel interface" ON)
add_feature_info("Hybrid interface" SIONlib_OMPI "use SIONlib from MPI+OpenMP hybrid parallel applications")
cmake_dependent_option(SIONlib_PARUTILS "Parallel utilities (i.e. the partest benchmark)" ON "SIONlib_MPI OR SIONlib_OMP;SIONlib_MPI OR SIONlib_OMPI" OFF)
add_feature_info("Parallel utilities" SIONlib_PARUTILS "benchmark I/O performance using SIONlib and others")
option(SIONlib_HINTS_GPFS "Provide hints about file system usage to GPFS" OFF)
add_feature_info("GPFS hints" SIONlib_HINTS_GPFS "provide hints about file system usage to GPFS")
option(SIONlib_SIONfwd "I/O forwarding with SIONfwd" OFF)
add_feature_info("SIONfwd" SIONlib_SIONfwd "use SIONfwd for I/O forwarding")
option(SIONlib_IME_NATIVE "DDN Infinite Memory Engine back-end" OFF)
add_feature_info("IME" SIONlib_IME_NATIVE "use the IME native client library")

set(SIONlib_BUILD_TESTING OFF CACHE BOOL "Build SIONlib tests suite, even if SIONlib is a subproject")

set(LOCKING_VARIANTS "user" "fallback")
set(LOCKING_SUFFIX_user "")
set(LOCKING_SUFFIX_fallback "_mt")

add_subdirectory(src)
if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR SIONlib_BUILD_TESTING) AND BUILD_TESTING)
  add_subdirectory(test)
endif()

write_basic_package_version_file(
  "SIONlibConfigVersion.cmake"
  VERSION ${SIONlib_VERSION}
  COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
  "cmake/SIONlibConfig.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/SIONlibConfig.cmake"
  INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SIONlib"
)
install(
  FILES
    "${CMAKE_CURRENT_BINARY_DIR}/SIONlibConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/SIONlibConfigVersion.cmake"
    "cmake/FindIMENative.cmake"
    "cmake/FindGPFS.cmake"
  DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/SIONlib"
)

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
  feature_summary(WHAT ALL)
endif()
