# Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
# 2015, 2016, 2017, 2018
# University Corporation for Atmospheric Research/Unidata.

# See netcdf-c/COPYRIGHT file for more info.
SET(liblib_LIBS dispatch netcdf3)

#####
# Add target objects/modules based on options.
#####

IF(USE_NETCDF4)
  SET(liblib_LIBS ${liblib_LIBS} netcdf4)
ENDIF()
IF(USE_HDF5)
  SET(liblib_LIBS ${liblib_LIBS} netcdfhdf5)
ENDIF()

IF(USE_PNETCDF)
  SET(liblib_LIBS ${liblib_LIBS} netcdfp)
ENDIF()

IF(USE_HDF4)
  SET(liblib_LIBS ${liblib_LIBS} netcdfhdf4)
ENDIF()

IF(ENABLE_DAP2)
  SET(liblib_LIBS ${liblib_LIBS} oc2 dap2)
ENDIF()

IF(ENABLE_DAP4)
  SET(liblib_LIBS ${liblib_LIBS} dap4)
ENDIF()

IF(ENABLE_NCZARR)
  SET(liblib_LIBS ${liblib_LIBS} nczarr)
ENDIF()

FOREACH(LIBS ${liblib_LIBS})
  SET(LARGS ${LARGS} $<TARGET_OBJECTS:${LIBS}>)
ENDFOREACH()

ADD_LIBRARY(netcdf nc_initialize.c ${LARGS} )

IF(MPI_C_INCLUDE_PATH)
    target_include_directories(netcdf PUBLIC ${MPI_C_INCLUDE_PATH})
ENDIF(MPI_C_INCLUDE_PATH)

IF(MOD_NETCDF_NAME)
  SET_TARGET_PROPERTIES(netcdf PROPERTIES LIBRARY_OUTPUT_NAME ${NETCDF_LIB_NAME})
  SET_TARGET_PROPERTIES(netcdf PROPERTIES ARCHIVE_OUTPUT_NAME ${NETCDF_LIB_NAME})
  SET_TARGET_PROPERTIES(netcdf PROPERTIES RUNTIME_OUTPUT_NAME ${NETCDF_LIB_NAME})
ENDIF()

# Make sure that netcdf.dll path does not include the build configuration
IF(MSVC)
  SET_TARGET_PROPERTIES(netcdf PROPERTIES
	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
	RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_BINARY_DIR}
	RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_BINARY_DIR})
ENDIF()

#####
# Add dependencies required for linking.
#####

SET(TLL_LIBS "")

SET(TLL_LIBS ${TLL_LIBS} ${HAVE_LIBM} ${ZLIB_LIBRARY})

# Add extra dependencies specified via NC_EXTRA_DEPS
SET(TLL_LIBS ${TLL_LIBS} ${EXTRA_DEPS})

IF(HAVE_LIBDL)
  SET(TLL_LIBS ${LIBDL} ${TLL_LIBS})
ENDIF()

IF(USE_HDF5)
  IF(NOT MSVC)
    # Some version of cmake define HDF5_hdf5_LIBRARY instead of
    # HDF5_LIBRARY. Same with HDF5_HL_LIBRARIES
    IF(HDF5_hdf5_LIBRARY AND NOT HDF5_C_LIBRARIES)
      SET(HDF5_C_LIBRARIES ${HDF5_hdf5_LIBRARY})
    ENDIF()
    IF(HDF5_hdf5_hl_LIBRARY AND NOT HDF5_HL_LIBRARIES)
      SET(HDF5_HL_LIBRARIES ${HDF5_hdf5_hl_LIBRARY})
    ENDIF()
    # The order of the libraries is important here for static
    # builds:
    # Make sure that HDF5_C_LIBRARY appears *after*
    # HDF5_HL_LIBRARY.
    SET(TLL_LIBS ${HDF5_HL_LIBRARIES} ${HDF5_C_LIBRARIES} ${TLL_LIBS} ${SZIP_LIBRARY})
  ELSE() # Windows CMake defines HDF5_LIBRARIES.
    SET(TLL_LIBS ${HDF5_LIBRARIES} ${TLL_LIBS} ${SZIP_LIBRARY})
  ENDIF()
ENDIF()

IF(FOUND_CURL)
  SET(TLL_LIBS ${TLL_LIBS} ${CURL_LIBRARY})
ENDIF()

IF(USE_HDF4)
  SET(TLL_LIBS ${HDF4_MFHDF_LIB} ${HDF4_DF_LIB} ${TLL_LIBS})
ENDIF()

IF(ENABLE_PNETCDF AND PNETCDF)
  SET(TLL_LIBS ${TLL_LIBS} ${PNETCDF})
ENDIF()

IF(ENABLE_NCZARR_ZIP)
  SET(TLL_LIBS ${TLL_LIBS} ${Zip_LIBRARIES})
ENDIF()

IF(ENABLE_S3_SDK)
  TARGET_LINK_DIRECTORIES(netcdf PUBLIC ${AWSSDK_LIB_DIR})
  TARGET_LINK_LIBRARIES(netcdf ${AWSSDK_LINK_LIBRARIES})
ENDIF()

IF(TLL_LIBS)
  LIST(REMOVE_DUPLICATES TLL_LIBS)
ENDIF()

TARGET_LINK_LIBRARIES(netcdf ${TLL_LIBS})

SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${TLL_LIBS})
IF(MSVC)
  SET_TARGET_PROPERTIES(netcdf PROPERTIES
    LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
    )
ENDIF()

IF(NOT MSVC)
  IF(BUILD_SHARED_LIBS)
    SET_TARGET_PROPERTIES(netcdf PROPERTIES LINK_FLAGS -shared)
  ENDIF()
ENDIF()

IF(ENABLE_SHARED_LIBRARY_VERSION)
  SET_TARGET_PROPERTIES(netcdf PROPERTIES
    VERSION ${netCDF_LIB_VERSION}
    SOVERSION ${netCDF_SO_VERSION}
    )
ENDIF(ENABLE_SHARED_LIBRARY_VERSION)

###
# The INCLUDES directive was introduced in 2.8.12.
# However, 2.8.11 is still the default on some
# popular linux distributions. See
# https://github.com/Unidata/netcdf-c/issues/135
# for more information.
###
IF(${CMAKE_VERSION} VERSION_LESS 2.8.12)
  INSTALL(
    TARGETS netcdf EXPORT netCDFTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    )
ELSE()
    INSTALL(
    TARGETS netcdf EXPORT netCDFTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    )
ENDIF()

SET(ALL_TLL_LIBS ${TLL_LIBS} PARENT_SCOPE)
SET(NC_LIBS ${NC_LIBS} PARENT_SCOPE)

FILE(GLOB CUR_EXTRA_DIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
SET(CUR_EXTRA_DIST ${CUR_EXTRA_DIST} CMakeLists.txt Makefile.am)
ADD_EXTRA_DIST("${CUR_EXTRA_DIST}")