cmake_minimum_required (VERSION 3.10)
project (H4H5_LIB_SRC C)

#
# Copyright by The HDF Group.
# All rights reserved.
#
# This file is part of H4H5TOOLS. The full H4H5TOOLS copyright notice,
# including terms governing use, modification, and redistribution, is
# contained in the COPYING file, which can be found at the root of the
# source code distribution tree. The copyright notice can also be found
# at https://www.hdfgroup.org/licenses.  If you do not have access to
# either file, you may request a copy from help@hdfgroup.org.
#

configure_file (${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5vers.h.in ${H4H5_LIB_SRC_BINARY_DIR}/h4toh5vers.h @ONLY)

#-----------------------------------------------------------------------------
# Setup Sources
#-----------------------------------------------------------------------------
set (H4H5_LIB_SRC_CSRCS
    ${H4H5_LIB_SRC_SOURCE_DIR}/H4TOH5I.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5anno.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5pal.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5sds.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5util.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5vdata.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5vgroup.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5image.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5main.c
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5eos.c
)

set (H4H5_PUBLIC_HEADERS
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5.h
    ${H4H5_LIB_SRC_SOURCE_DIR}/H4TOH5api_adpt.h
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5vector.h
    ${H4H5_LIB_SRC_SOURCE_DIR}/h4toh5apicompatible.h
    ${H4H5_LIB_SRC_BINARY_DIR}/h4toh5vers.h
)

if (NOT ONLY_SHARED_LIBS)
  add_library (${H4H5_SRC_LIB_TARGET} STATIC ${H4H5_LIB_SRC_CSRCS} ${H4H5_PUBLIC_HEADERS})
  target_include_directories(${H4H5_SRC_LIB_TARGET}
      PRIVATE "${HDF4_INCLUDE_DIRS};${HDF5_INCLUDE_DIRS};${H4H5_SRC_DIR};${H4H5_BINARY_DIR};${H4H5_LIB_SRC_BINARY_DIR};${H4H5_LIB_SRC_SOURCE_DIR}"
      INTERFACE "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
  )
  TARGET_C_PROPERTIES (${H4H5_SRC_LIB_TARGET} STATIC)
  target_compile_definitions(${H4H5_SRC_LIB_TARGET}
      PUBLIC "$<$<BOOL:${H5_USE_16_API_DEFAULT}>:H5_USE_16_API>;$<$<BOOL:${H5_USE_HDFEOS2}>:HAVE_LIBHDFEOS>"
  )
  target_link_libraries (${H4H5_SRC_LIB_TARGET}
      PRIVATE $<$<PLATFORM_ID:Windows>:ws2_32.lib>
      PUBLIC ${LINK_LIBS}
  )
  set_global_variable (H4H5_LIBRARIES_TO_EXPORT "${H4H5_LIBRARIES_TO_EXPORT};${H4H5_SRC_LIB_TARGET}")
  H4H5_SET_LIB_OPTIONS (${H4H5_SRC_LIB_TARGET} ${H4H5_SRC_LIB_NAME} STATIC)
  set_target_properties (${H4H5_SRC_LIB_TARGET} PROPERTIES
      FOLDER libraries
      INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
  )
  set (install_targets ${H4H5_SRC_LIB_TARGET})

  if (HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
    if (HDF4_FOUND AND HDF4_USE_EXTERNAL)
      add_dependencies (${H4H5_SRC_LIB_TARGET} HDF4)
    endif ()
    if (HDF5_FOUND AND HDF5_USE_EXTERNAL)
      add_dependencies (${H4H5_SRC_LIB_TARGET} HDF5)
    endif ()
  endif ()
endif ()

if (BUILD_SHARED_LIBS)
  add_library (${H4H5_SRC_LIBSH_TARGET} SHARED ${H4H5_LIB_SRC_CSRCS} ${H4H5_PUBLIC_HEADERS})
  target_include_directories(${H4H5_SRC_LIBSH_TARGET}
      PRIVATE "${HDF4_INCLUDE_DIRS};${HDF5_INCLUDE_DIRS};${H4H5_SRC_DIR};${H4H5_BINARY_DIR};${H4H5_LIB_SRC_BINARY_DIR};${H4H5_LIB_SRC_SOURCE_DIR}"
      INTERFACE "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
  )
  TARGET_C_PROPERTIES (${H4H5_SRC_LIBSH_TARGET} SHARED)
  target_compile_definitions(${H4H5_SRC_LIBSH_TARGET}
      PUBLIC "H4H5_BUILT_AS_DYNAMIC_LIB;$<$<BOOL:${H5_USE_16_API_DEFAULT}>:H5_USE_16_API>;$<$<BOOL:${H5_USE_HDFEOS2}>:HAVE_LIBHDFEOS>"
  )
  if (H4H5_USE_STATIC_LIBRARIES)
    target_link_libraries (${H4H5_SRC_LIBSH_TARGET}
        PRIVATE $<$<PLATFORM_ID:Windows>:ws2_32.lib>
        PUBLIC ${LINK_LIBS}
    )
  else ()
    target_link_libraries (${H4H5_SRC_LIBSH_TARGET}
        PRIVATE $<$<PLATFORM_ID:Windows>:ws2_32.lib>
        PUBLIC ${LINK_SHLIBS}
    )
  endif ()
  set_global_variable (H4H5_LIBRARIES_TO_EXPORT "${H4H5_LIBRARIES_TO_EXPORT};${H4H5_SRC_LIBSH_TARGET}")
  H4H5_SET_LIB_OPTIONS (${H4H5_SRC_LIBSH_TARGET} ${H4H5_SRC_LIB_NAME} SHARED)
  set_target_properties (${H4H5_SRC_LIBSH_TARGET} PROPERTIES
      FOLDER libraries
      COMPILE_DEFINITIONS "H4H5_BUILT_AS_DYNAMIC_LIB"
      INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
      INTERFACE_COMPILE_DEFINITIONS H4H5_BUILT_AS_DYNAMIC_LIB=1
  )
  set (install_targets ${install_targets} ${H4H5_SRC_LIBSH_TARGET})

  if (HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ")
    if (HDF4_FOUND AND HDF4_USE_EXTERNAL)
      add_dependencies (${H4H5_SRC_LIBSH_TARGET} HDF4)
   endif ()
    if (HDF5_FOUND AND HDF5_USE_EXTERNAL)
      add_dependencies (${H4H5_SRC_LIBSH_TARGET} HDF5)
    endif ()
  endif ()
endif ()

#-----------------------------------------------------------------------------
# Add file(s) to CMake Install
#-----------------------------------------------------------------------------
if (NOT H4H5_INSTALL_NO_DEVELOPMENT)
  install (
      FILES
          ${H4H5_PUBLIC_HEADERS}
      DESTINATION
          ${H4H5_INSTALL_INCLUDE_DIR}
      COMPONENT
          headers
  )
endif ()

#-----------------------------------------------------------------------------
# Add Target(s) to CMake Install for import into other projects
#-----------------------------------------------------------------------------
if (H4H5_EXPORTED_TARGETS)
  if (BUILD_SHARED_LIBS)
    INSTALL_TARGET_PDB (${H4H5_SRC_LIBSH_TARGET} ${H4H5_INSTALL_BIN_DIR} libraries)
  endif ()
  if (NOT ONLY_SHARED_LIBS)
    INSTALL_TARGET_PDB (${H4H5_SRC_LIB_TARGET} ${H4H5_INSTALL_LIB_DIR} libraries)
  endif ()

  install (
      TARGETS
          ${install_targets}
      EXPORT
          ${H4H5_EXPORTED_TARGETS}
      LIBRARY DESTINATION ${H4H5_INSTALL_LIB_DIR} COMPONENT libraries
      ARCHIVE DESTINATION ${H4H5_INSTALL_LIB_DIR} COMPONENT libraries
      RUNTIME DESTINATION ${H4H5_INSTALL_BIN_DIR} COMPONENT libraries
      FRAMEWORK DESTINATION ${HDF4_INSTALL_FWRK_DIR} COMPONENT libraries
      INCLUDES DESTINATION include
  )
endif ()
