project(ITKHDF5)
set(ITKHDF5_THIRD_PARTY 1)

# Reset BUILD_SHARED_LIBS to ITK_BUILD_SHARED_LIBS
# that keeps track of the initial state of the root
# project BUILD_SHARED_LIBS option (which could be
# modified before reaching this point)
set(BUILD_SHARED_LIBS ${ITK_BUILD_SHARED_LIBS})

if (BUILD_SHARED_LIBS)
   add_definitions(-DH5_BUILT_AS_DYNAMIC_LIB=1)
   set(ONLY_SHARED_LIBS ON CACHE INTERNAL "Only build shared")
else()
   set(ONLY_SHARED_LIBS OFF CACHE INTERNAL "Only build static")
endif()
if(CMAKE_LINKER MATCHES "link.exe$")
  # Suppress undefined public symbols warning
  set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
endif()

if(ITK_USE_SYSTEM_HDF5)

  if(HDF5_DIR)
    set(_HDF5_DIR_CODE "set(HDF5_DIR \"${HDF5_DIR}\")")
  endif()
  if(HDF5_NO_MODULE)
    set(_HDF5_NO_MODULE_ARG "NO_MODULE")
  endif()

  # When ITK's config is loaded, load HDF5 too.
  set(ITKHDF5_EXPORT_CODE_INSTALL "
${_HDF5_DIR_CODE}
find_package(HDF5 ${_HDF5_NO_MODULE_ARG} REQUIRED COMPONENTS CXX C)
")
    set(ITKHDF5_EXPORT_CODE_BUILD "
if(NOT ITK_BINARY_DIR)
  ${_HDF5_DIR_CODE}
  find_package(HDF5 ${_HDF5_NO_MODULE_ARG} REQUIRED COMPONENTS CXX C)
endif()
")

  if(BUILD_SHARED_LIBS)
    if (TARGET hdf5-shared)
      set(ITKHDF5_LIBRARIES hdf5_cpp-shared hdf5-shared)
    elseif(TARGET hdf5::hdf5-shared)
      set(ITKHDF5_LIBRARIES hdf5::hdf5_cpp-shared hdf5::hdf5-shared)
    elseif(TARGET hdf5::hdf5)
      set(ITKHDF5_LIBRARIES hdf5::hdf5_cpp hdf5::hdf5)
    else()
      set(ITKHDF5_LIBRARIES ${HDF5_C_SHARED_LIBRARY} ${HDF5_CXX_SHARED_LIBRARY} ${HDF5_CXX_LIBRARY_NAMES} ${HDF5_LIBRARIES})
    endif()
  else()
    if (TARGET hdf5-static)
      set(ITKHDF5_LIBRARIES hdf5_cpp-static hdf5-static)
    elseif(TARGET hdf5::hdf5-static)
      set(ITKHDF5_LIBRARIES hdf5::hdf5_cpp-static hdf5::hdf5-static)
    elseif(TARGET hdf5::hdf5)
      set(ITKHDF5_LIBRARIES hdf5::hdf5_cpp hdf5::hdf5)
    else()
      set(ITKHDF5_LIBRARIES ${HDF5_C_STATIC_LIBRARY} ${HDF5_CXX_STATIC_LIBRARY} ${HDF5_CXX_LIBRARY_NAMES} ${HDF5_LIBRARIES})
    endif()
  endif()

  set(ITKHDF5_INCLUDE_DIRS
    ${ITKHDF5_BINARY_DIR}/src # itk_hdf5.h and itk_H5Cpp.h
  )
  set(ITKHDF5_SYSTEM_INCLUDE_DIRS
    ${HDF5_INCLUDE_DIR}
    ${HDF5_INCLUDE_DIR_CPP}
    ${HDF5_INCLUDE_DIRS}
    ${HDF5_INCLUDE_DIR_CPP}
    )

  set(ITKHDF5_NO_SRC 1)
else()
  set(ITKHDF5_INCLUDE_DIRS
    ${ITKHDF5_SOURCE_DIR}/src
    ${ITKHDF5_BINARY_DIR}/src
    )
  if(BUILD_SHARED_LIBS)
    set(ITKHDF5_LIBRARIES hdf5_cpp-shared hdf5-shared)
  else()
    set(ITKHDF5_LIBRARIES hdf5_cpp-static hdf5-static)
  endif()
endif()

configure_file(src/itk_hdf5.h.in src/itk_hdf5.h)
configure_file(src/itk_H5Cpp.h.in src/itk_H5Cpp.h)
list(APPEND ITK_LIBRARY_PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS FALSE)
itk_module_impl()

install(FILES ${ITKHDF5_BINARY_DIR}/src/itk_hdf5.h
              ${ITKHDF5_BINARY_DIR}/src/itk_H5Cpp.h
  DESTINATION ${ITKHDF5_INSTALL_INCLUDE_DIR}
  COMPONENT Development
  )
