if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/sion_version.h")
  include(GenerateVersionHeader)
  generate_version_header(sion_version.h.in sion_version.h)
  set(VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/sion_version.h")
else()
  set(VERSION_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sion_version.h")
endif()

set(_SION_SIONFWD ${SIONlib_SIONfwd})
set(_SION_IME_NATIVE ${SIONlib_IME_NATIVE})
configure_file(
  sion_config.h.in
  sion_config.h
)

# Lock library
set(SION_LIBNAME_LOCK_NONE sion_lock_user)
add_library(lock_user
  sion_lock.c
)
target_include_directories(lock_user
  PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
set_target_properties(lock_user PROPERTIES
  OUTPUT_NAME ${SION_LIBNAME_LOCK_NONE}
)
add_library(SIONlib::lock_user ALIAS lock_user)
list(APPEND LOCK_TARGETS lock_user)

find_package(Threads REQUIRED)
set(SION_LIBNAME_LOCK_PTHREADS sion_lock_fallback)
add_library(lock_fallback
  sion_lock.c
)
target_compile_definitions(lock_fallback
  PRIVATE
  SION_USE_PTHREADS
  SION_PTHREADS
)
target_include_directories(lock_fallback
  PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_link_libraries(lock_fallback
  PRIVATE
  Threads::Threads
)
set_target_properties(lock_fallback PROPERTIES
  OUTPUT_NAME ${SION_LIBNAME_LOCK_PTHREADS}
)
add_library(SIONlib::lock_fallback ALIAS lock_fallback)
list(APPEND LOCK_TARGETS lock_fallback)

# Common library
if(SIONlib_SIONfwd)
  find_package(SIONfwd 1.0.0 REQUIRED)
endif()
if(SIONlib_IME_NATIVE)
  find_package(IMENative REQUIRED)
endif(SIONlib_IME_NATIVE)
if(SIONlib_HINTS_GPFS)
  find_package(GPFS REQUIRED)
endif()

foreach(LOCKING IN LISTS LOCKING_VARIANTS)
  set(TARGET_NAME common${LOCKING_SUFFIX_${LOCKING}})
  add_library(${TARGET_NAME}
    sion_buddy_common.c
    sion_buffer.c
    sion_common.c
    sion_convert.c
    sion_debug.c
    sion_dup.c
    sion_error_handler.c
    sion_fd.c
    sion_file.c
    sion_filedesc.c
    sion_flags.c
    sion_hints.c
    sion_hints_gpfs.c
    sion_internal.c
    sion_internal_collstat.c
    sion_internal_seek.c
    sion_internal_positioning.c
    sion_internal_startptr.c
    sion_keyvalue.c
    sion_keyvalue_inline.c
    sion_keyvalue_keymngr.c
    sion_keyvalue_table.c
    sion_metadata.c
    sion_printts.c
  )
  target_link_libraries(${TARGET_NAME}
    PUBLIC
    SIONlib::lock_${LOCKING}
    PRIVATE
    $<$<BOOL:${SIONlib_SIONfwd}>:SIONfwd::client>
    $<$<BOOL:${SIONlib_IME_NATIVE}>:IMENative::client>
    $<$<BOOL:${SIONlib_HINTS_GPFS}>:GPFS::GPFS>
  )
  target_include_directories(${TARGET_NAME}
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../parlib>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )
  target_compile_definitions(${TARGET_NAME}
    PUBLIC
    $<$<OR:$<CONFIG:Debug>,$<BOOL:${SIONlib_DEBUG}>>:SION_DEBUG>
    PRIVATE
    $<$<BOOL:${SIONlib_HINTS_GPFS}>:SION_HINTS_GPFS>
  )
  set(SION_LIBNAME_COMMON sion_${TARGET_NAME})
  set_target_properties(${TARGET_NAME} PROPERTIES
    OUTPUT_NAME ${SION_LIBNAME_COMMON}
  )
  add_library(SIONlib::${TARGET_NAME} ALIAS ${TARGET_NAME})
  list(APPEND COMMON_TARGETS ${TARGET_NAME})
endforeach()

set_property(TARGET common
  PROPERTY PUBLIC_HEADER
  "${CMAKE_CURRENT_SOURCE_DIR}/sion.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_common.h"
  "${CMAKE_CURRENT_BINARY_DIR}/sion_config.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_const.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_datatypes.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_debug.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_enums.h"
  "${CMAKE_CURRENT_SOURCE_DIR}/sion_printts.h"
  "${VERSION_HEADER}"
  #SION_LIBVERSION_REP_H "${CMAKE_CURRENT_SOURCE_DIR}/sion_libversion_rep.h"
)

# Serial library
foreach(LOCKING IN LISTS LOCKING_VARIANTS)
  set(TARGET_NAME serial${LOCKING_SUFFIX_${LOCKING}})
  add_library(${TARGET_NAME}
    sion_serial.c
  )
  target_include_directories(${TARGET_NAME}
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  )
  set(SION_LIBNAME_SERIAL sion_${TARGET_NAME})
  set_target_properties(${TARGET_NAME} PROPERTIES
    OUTPUT_NAME ${SION_LIBNAME_SERIAL}
  )
  target_link_libraries(${TARGET_NAME}
    PUBLIC
    SIONlib::common${LOCKING_SUFFIX_${LOCKING}}
  )
  add_library(SIONlib::${TARGET_NAME} ALIAS ${TARGET_NAME})
  list(APPEND SERIAL_TARGETS ${TARGET_NAME})
endforeach()

set_property(TARGET serial
  PROPERTY PUBLIC_HEADER
  ${CMAKE_CURRENT_SOURCE_DIR}/sion_serial.h
)

install(TARGETS
  ${LOCK_TARGETS}
  ${COMMON_TARGETS}
  ${SERIAL_TARGETS}
  EXPORT SIONlibSerialTargets
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT SIONlibSerialTargets
  FILE SIONlibSerialTargets.cmake
  NAMESPACE SIONlib::
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/SIONlib
)
