diff --git a/netcdf-c.cmake b/netcdf-c.cmake
index c9cab7b..fa2c492 100644
--- a/netcdf-c.cmake
+++ b/netcdf-c.cmake
@@ -4,6 +4,7 @@ set(CTEST_SITE "$ENV{COMPUTERNAME}")
set(VER "$ENV{NETCDF_VER}")
set(HDF5_VER "$ENV{HDF5_VER}")
+set(ZLIB_VER "$ENV{ZLIB_VER}")
set(CTEST_SOURCE_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}/lib/src/netcdf-c-${VER}")
set(CTEST_BINARY_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}/lib/build/netcdf-c-${VER}/${CONF_DIR}")
@@ -20,6 +21,11 @@ if (WIN32)
# set(HDF5_LIB "${CTEST_SCRIPT_DIRECTORY}/lib/install/hdf5-${HDF5_VER}/${CONF_DIR}/lib/hdf5.lib")
# set(HDF5_HL_LIB "${CTEST_SCRIPT_DIRECTORY}/lib/install/hdf5-${HDF5_VER}/${CONF_DIR}/lib/hdf5_hl.lib")
# endif()
+ if("${CONF_DIR}" STREQUAL "debug")
+ set(ZLIB_LIB "${CTEST_SCRIPT_DIRECTORY}/lib/install/zlib-${ZLIB_VER}/lib/zlibd.lib")
+ else()
+ set(ZLIB_LIB "${CTEST_SCRIPT_DIRECTORY}/lib/install/zlib-${ZLIB_VER}/lib/zlib.lib")
+ endif()
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
if("${CONF_DIR}" STREQUAL "debug")
set(ZLIB_LIB "${CTEST_SCRIPT_DIRECTORY}/lib/install/hdf5-${HDF5_VER}/${CONF_DIR}/lib/libz_debug.so.1.2")
@@ -60,6 +66,7 @@ set(BUILD_OPTIONS
-DCMAKE_INSTALL_PREFIX:PATH=${CTEST_SCRIPT_DIRECTORY}/lib/install/netcdf-c-${VER}/${CONF_DIR}
-DENABLE_DAP:BOOL=OFF
-DENABLE_TESTS:BOOL=OFF
+ -DENABLE_BYTERANGE:BOOL=OFF
## -DHDF5_LIB:PATH=${HDF5_LIB}
## -DHDF5_HL_LIB:PATH=${HDF5_HL_LIB}
## -DHDF5_INCLUDE_DIR:PATH=${HDF5_INCLUDE_DIR}
@@ -71,6 +78,8 @@ set(BUILD_OPTIONS
## -DMSVC12_REDIST_DIR:PATH=C:/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 12.0/VC/redist
## -DCMAKE_LIBRARY_PATH:PATH=${CTEST_SCRIPT_DIRECTORY}/lib/install/hdf5-${HDF5_VER}/${CONF_DIR}/lib
-DHDF5_DIR:PATH=${CTEST_SCRIPT_DIRECTORY}/lib/install/hdf5-${HDF5_VER}/share/cmake/hdf5
+ -DZLIB_LIBRARY:PATH=${ZLIB_LIB}
+ -DZLIB_INCLUDE_DIR:PATH=${CTEST_SCRIPT_DIRECTORY}/lib/install/zlib-${ZLIB_VER}/include
)
CTEST_START("Experimental")
diff --git a/netcdf-c.targets b/netcdf-c.targets
index 17e4d9b..f3a4503 100644
--- a/netcdf-c.targets
+++ b/netcdf-c.targets
@@ -40,6 +40,9 @@
+
+
+
diff --git a/patches/netcdf-c-4.7.4/CMakeLists.txt b/patches/netcdf-c-4.7.4/CMakeLists.txt
new file mode 100644
index 0000000..0350a4e
--- /dev/null
+++ b/patches/netcdf-c-4.7.4/CMakeLists.txt
@@ -0,0 +1,2108 @@
+## This is a CMake file, part of Unidata's netCDF package.
+# Copyright 2012-2018, see the COPYRIGHT file for more information.
+#
+
+##################################
+# Set Project Properties
+##################################
+
+#Minimum required CMake Version
+cmake_minimum_required(VERSION 3.6.1)
+
+#Project Name
+project(netCDF C)
+set(PACKAGE "netCDF" CACHE STRING "")
+
+#####
+# Version Info:
+#
+# Release Version
+# Library Version
+# SO Version
+#
+# SO Version is computed from library version. See:
+# http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
+#####
+
+SET(NC_VERSION_MAJOR 4)
+SET(NC_VERSION_MINOR 7)
+SET(NC_VERSION_PATCH 4)
+SET(NC_VERSION_NOTE "")
+SET(netCDF_VERSION ${NC_VERSION_MAJOR}.${NC_VERSION_MINOR}.${NC_VERSION_PATCH}${NC_VERSION_NOTE})
+SET(VERSION ${netCDF_VERSION})
+SET(NC_VERSION ${netCDF_VERSION})
+SET(netCDF_LIB_VERSION 18)
+SET(netCDF_SO_VERSION 18)
+SET(PACKAGE_VERSION ${VERSION})
+
+# Version of the dispatch table, in case we change it.
+SET(NC_DISPATCH_VERSION 1)
+
+# Get system configuration, Use it to determine osname, os release, cpu. These
+# will be used when committing to CDash.
+find_program(UNAME NAMES uname)
+IF(UNAME)
+ macro(getuname name flag)
+ exec_program("${UNAME}" ARGS "${flag}" OUTPUT_VARIABLE "${name}")
+ endmacro(getuname)
+ getuname(osname -s)
+ getuname(osrel -r)
+ getuname(cpu -m)
+ set(TMP_BUILDNAME "${osname}-${osrel}-${cpu}")
+ENDIF()
+
+###
+# Allow for some customization of the buildname.
+# This will make it easier to identify different builds,
+# based on values passed from command line/shell scripts.
+#
+# For ctest scripts, we can use CTEST_BUILD_NAME.
+###
+
+SET(BUILDNAME_PREFIX "" CACHE STRING "")
+SET(BUILDNAME_SUFFIX "" CACHE STRING "")
+
+IF(BUILDNAME_PREFIX)
+ SET(TMP_BUILDNAME "${BUILDNAME_PREFIX}-${TMP_BUILDNAME}")
+ENDIF()
+
+IF(BUILDNAME_SUFFIX)
+ SET(TMP_BUILDNAME "${TMP_BUILDNAME}-${BUILDNAME_SUFFIX}")
+ENDIF()
+
+IF(NOT BUILDNAME)
+ SET(BUILDNAME "${TMP_BUILDNAME}" CACHE STRING "Build name variable for CDash")
+ENDIF()
+###
+# End BUILDNAME customization.
+###
+
+# For CMAKE_INSTALL_LIBDIR
+INCLUDE(GNUInstallDirs)
+
+IF(MSVC)
+ SET(GLOBAL PROPERTY USE_FOLDERS ON)
+ENDIF()
+
+#Add custom CMake Module
+SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/"
+ CACHE INTERNAL "Location of our custom CMake modules.")
+
+# auto-configure style checks, other CMake modules.
+INCLUDE(CheckLibraryExists)
+INCLUDE(CheckIncludeFile)
+INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckTypeSize)
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckCXXSourceCompiles)
+INCLUDE(CheckCSourceCompiles)
+INCLUDE(TestBigEndian)
+INCLUDE(CheckSymbolExists)
+INCLUDE(GetPrerequisites)
+
+INCLUDE(CheckCCompilerFlag)
+FIND_PACKAGE(PkgConfig QUIET)
+
+# A check to see if the system is big endian
+TEST_BIG_ENDIAN(BIGENDIAN)
+IF(${BIGENDIAN})
+ SET(WORDS_BIGENDIAN "1")
+ENDIF(${BIGENDIAN})
+
+# A macro to check if a C linker supports a particular flag.
+MACRO(CHECK_C_LINKER_FLAG M_FLAG M_RESULT)
+ SET(T_REQ_FLAG "${CMAKE_REQUIRED_FLAGS}")
+ SET(CMAKE_REQUIRED_FLAGS "${M_FLAG}")
+ CHECK_C_SOURCE_COMPILES("int main() {return 0;}" ${M_RESULT})
+ SET(CMAKE_REQUIRED_FLAGS "${T_REQ_FLAG}")
+ENDMACRO()
+
+# Enable 'dist and distcheck'.
+# File adapted from http://ensc.de/cmake/FindMakeDist.cmake
+FIND_PACKAGE(MakeDist)
+# End 'enable dist and distcheck'
+
+# Set the build type.
+IF(NOT CMAKE_BUILD_TYPE)
+ SET(CMAKE_BUILD_TYPE DEBUG CACHE STRING "Choose the type of build, options are: None, Debug, Release."
+ FORCE)
+ENDIF()
+
+# Set build type uppercase
+STRING(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
+
+# Determine the configure date.
+
+IF(DEFINED ENV{SOURCE_DATE_EPOCH})
+ EXECUTE_PROCESS(
+ COMMAND "date" "-u" "-d" "@$ENV{SOURCE_DATE_EPOCH}"
+ OUTPUT_VARIABLE CONFIG_DATE
+ )
+ELSE()
+ EXECUTE_PROCESS(
+ COMMAND date
+ OUTPUT_VARIABLE CONFIG_DATE
+ )
+ENDIF()
+IF(CONFIG_DATE)
+ string(STRIP ${CONFIG_DATE} CONFIG_DATE)
+ENDIF()
+##
+# Allow for extra dependencies.
+##
+
+SET(EXTRA_DEPS "")
+
+################################
+# End Project Properties
+################################
+
+
+################################
+# Set CTest Properties
+################################
+
+
+
+ENABLE_TESTING()
+INCLUDE(CTest)
+
+# Copy the CTest customization file into binary directory, as required.
+FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+# Set Memory test program for non-MSVC based builds.
+# Assume valgrind for now.
+IF(NOT MSVC)
+ SET(CTEST_MEMORYCHECK_COMMAND valgrind CACHE STRING "")
+ENDIF()
+
+# Set variable to define the build type.
+INCLUDE(GenerateExportHeader)
+
+################################
+# End CTest Properties
+################################
+
+
+################################
+# Compiler and Linker Configuration
+################################
+
+##
+# Default building shared libraries.
+# BUILD_SHARED_LIBS is provided by/used by
+# CMake directly.
+##
+OPTION(BUILD_SHARED_LIBS "Configure netCDF as a shared library." ON)
+IF(BUILD_SHARED_LIBS)
+ SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
+ENDIF()
+
+OPTION(NC_FIND_SHARED_LIBS "Find dynamically-built versions of dependent libraries" ${BUILD_SHARED_LIBS})
+
+##
+# We've had a request to allow for non-versioned shared libraries.
+# This seems reasonable enough to accommodate. See
+# https://github.com/Unidata/netcdf-c/issues/228 for more info.
+##
+OPTION(ENABLE_SHARED_LIBRARY_VERSION "Encode the library SO version in the file name of the generated library file." ON)
+
+# Set some default linux gcc & apple compiler options for
+# debug builds.
+IF(CMAKE_COMPILER_IS_GNUCC OR APPLE)
+ OPTION(ENABLE_COVERAGE_TESTS "Enable compiler flags needed to perform coverage tests." OFF)
+ OPTION(ENABLE_CONVERSION_WARNINGS "Enable warnings for implicit conversion from 64 to 32-bit datatypes." ON)
+ OPTION(ENABLE_LARGE_FILE_TESTS "Enable large file tests." OFF)
+
+ # Debugging flags
+ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall")
+
+ # Check to see if -Wl,--no-undefined is supported.
+ CHECK_C_LINKER_FLAG("-Wl,--no-undefined" LIBTOOL_HAS_NO_UNDEFINED)
+
+ IF(LIBTOOL_HAS_NO_UNDEFINED)
+ SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--no-undefined")
+ ENDIF()
+ SET(CMAKE_REQUIRED_FLAGS "${TMP_CMAKE_REQUIRED_FLAGS}")
+
+ # Coverage tests need to have optimization turned off.
+ IF(ENABLE_COVERAGE_TESTS)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
+ MESSAGE(STATUS "Coverage Tests: On.")
+ ENDIF()
+
+ # Warnings for 64-to-32 bit conversions.
+ IF(ENABLE_CONVERSION_WARNINGS)
+ CHECK_C_COMPILER_FLAG(-Wconversion CC_HAS_WCONVERSION)
+ CHECK_C_COMPILER_FLAG(-Wshorten-64-to-32 CC_HAS_SHORTEN_64_32)
+
+ IF(CC_HAS_SHORTEN_64_32)
+ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wshorten-64-to-32")
+ ENDIF()
+ IF(CC_HAS_WCONVERSION)
+ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wconversion")
+ ENDIF()
+
+ ENDIF(ENABLE_CONVERSION_WARNINGS)
+
+ENDIF(CMAKE_COMPILER_IS_GNUCC OR APPLE)
+
+# End default linux gcc & apple compiler options.
+
+ADD_DEFINITIONS()
+
+# Suppress CRT Warnings.
+# Only necessary for Windows
+IF(MSVC)
+ ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+ENDIF()
+
+#####
+# System inspection checks
+#####
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/oc2)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libsrc)
+SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/libsrc)
+
+################################
+# End Compiler Configuration
+################################
+
+
+
+##
+# Configuration for post-install RPath
+# Adapted from http://www.cmake.org/Wiki/CMake_RPATH_handling
+##
+IF(NOT MSVC AND BUILD_SHARED_LIBS)
+ # use, i.e. don't skip the full RPATH for the build tree
+ SET(CMAKE_SKIP_BUILD_RPATH FALSE)
+
+ # when building, don't use the install RPATH already
+ # (but later on when installing)
+ SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+
+ if(APPLE)
+ set(CMAKE_MACOSX_RPATH ON)
+ endif(APPLE)
+
+ # add the automatically determined parts of the RPATH
+ # which point to directories outside the build tree to the install RPATH
+ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+ # the RPATH to be used when installing,
+ # but only if it's not a system directory
+ LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir)
+ IF("${isSystemDir}" STREQUAL "-1")
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
+ ENDIF("${isSystemDir}" STREQUAL "-1")
+
+ENDIF()
+
+##
+# End configuration for post-install RPath
+##
+
+################################
+# Option checks
+################################
+
+# HDF5 cache variables.
+SET(DEFAULT_CHUNK_SIZE 16777216 CACHE STRING "Default Chunk Cache Size.")
+SET(DEFAULT_CHUNKS_IN_CACHE 10 CACHE STRING "Default number of chunks in cache.")
+SET(CHUNK_CACHE_SIZE 16777216 CACHE STRING "Default Chunk Cache Size.")
+SET(CHUNK_CACHE_NELEMS 4133 CACHE STRING "Default maximum number of elements in cache.")
+SET(CHUNK_CACHE_PREEMPTION 0.75 CACHE STRING "Default file chunk cache preemption policy for HDf5 files(a number between 0 and 1, inclusive.")
+SET(MAX_DEFAULT_CACHE_SIZE 67108864 CACHE STRING "Default maximum cache size.")
+SET(NETCDF_LIB_NAME "" CACHE STRING "Default name of the netcdf library.")
+SET(TEMP_LARGE "." CACHE STRING "Where to put large temp files if large file tests are run.")
+SET(NCPROPERTIES_EXTRA "" CACHE STRING "Specify extra pairs for _NCProperties.")
+
+IF(NOT NETCDF_LIB_NAME STREQUAL "")
+ SET(MOD_NETCDF_NAME ON)
+ENDIF()
+
+# Set the appropriate compiler/architecture for universal OSX binaries.
+IF(${CMAKE_SYSTEM_NAME} EQUAL "Darwin")
+ SET(CMAKE_OSX_ARCHITECTURES i386;x86_64)
+ENDIF(${CMAKE_SYSTEM_NAME} EQUAL "Darwin")
+
+# Macro for replacing '/MD' with '/MT'.
+# Used only on Windows, /MD tells VS to use the shared
+# CRT libs, MT tells VS to use the static CRT libs.
+#
+# Taken From:
+# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
+#
+MACRO(specify_static_crt_flag)
+ SET(vars
+ CMAKE_C_FLAGS
+ CMAKE_C_FLAGS_DEBUG
+ CMAKE_C_FLAGS_RELEASE
+ CMAKE_C_FLAGS_MINSIZEREL
+ CMAKE_C_FLAGS_RELWITHDEBINFO
+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG
+ CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL
+ CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+
+ FOREACH(flag_var ${vars})
+ IF(${flag_var} MATCHES "/MD")
+ STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+ ENDIF()
+ ENDFOREACH()
+
+ FOREACH(flag_var ${vars})
+ MESSAGE(STATUS " '${flag_var}': ${${flag_var}}")
+ ENDFOREACH()
+ MESSAGE(STATUS "")
+ENDMACRO()
+
+# Option to use Static Runtimes in MSVC
+IF(MSVC)
+ OPTION(NC_USE_STATIC_CRT "Use static CRT Libraries ('\\MT')." OFF)
+ IF(NC_USE_STATIC_CRT)
+ SET(USE_STATIC_CRT ON)
+ specify_static_crt_flag()
+ ENDIF()
+ENDIF()
+
+# Option to build netCDF Version 2
+OPTION (ENABLE_V2_API "Build netCDF Version 2." ON)
+SET(BUILD_V2 ${ENABLE_V2_API})
+IF(NOT ENABLE_V2_API)
+ SET(NO_NETCDF_2 ON)
+ELSE(NOT ENABLE_V2_API)
+ SET(USE_NETCDF_2 TRUE)
+ENDIF(NOT ENABLE_V2_API)
+
+# Option to build utilities
+OPTION(BUILD_UTILITIES "Build ncgen, ncgen3, ncdump." ON)
+
+# Option to use MMAP
+OPTION(ENABLE_MMAP "Use MMAP." ON)
+
+# Option to use examples.
+OPTION(ENABLE_EXAMPLES "Build Examples" ON)
+
+# Option to automatically build netcdf-fortran.
+IF(NOT MSVC)
+ OPTION(ENABLE_REMOTE_FORTRAN_BOOTSTRAP "Download and build netcdf-fortran automatically (EXPERIMENTAL)." OFF)
+ IF(ENABLE_REMOTE_FORTRAN_BOOTSTRAP)
+ SET(BUILD_FORTRAN ON)
+ ENDIF()
+ IF(BUILD_FORTRAN)
+ CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/postinstall.sh.in"
+ "${CMAKE_BINARY_DIR}/postinstall.sh"
+ @ONLY)
+
+ ADD_CUSTOM_TARGET(build-netcdf-fortran
+ COMMAND sh -c "${CMAKE_BINARY_DIR}/postinstall.sh -t cmake -a build"
+ DEPENDS netcdf
+ )
+
+ ADD_CUSTOM_TARGET(install-netcdf-fortran
+ COMMAND sh -c "${CMAKE_BINARY_DIR}/postinstall.sh -t cmake -a install"
+ DEPENDS build-netcdf-fortran
+ )
+
+ ENDIF(BUILD_FORTRAN)
+ENDIF()
+
+
+###
+# Allow the user to specify libraries
+# to link against, similar to automakes 'LIBS' variable.
+###
+SET(NC_EXTRA_DEPS "" CACHE STRING "Additional libraries to link against.")
+IF(NC_EXTRA_DEPS)
+ STRING(REPLACE " " ";" DEPS_LIST ${NC_EXTRA_DEPS})
+ FOREACH(_DEP ${DEPS_LIST})
+ STRING(REGEX REPLACE "^-l" "" _LIB ${_DEP})
+ FIND_LIBRARY("${_LIB}_DEP" NAMES "${_LIB}" "lib${_LIB}")
+ MESSAGE(${${_LIB}_DEP})
+ IF("${${_LIB}_DEP}" STREQUAL "${_LIB}_DEP-NOTFOUND")
+ MESSAGE(FATAL_ERROR "Error finding ${_LIB}.")
+ ELSE()
+ MESSAGE(STATUS "Found ${_LIB}: ${${_LIB}_DEP}")
+ ENDIF()
+ SET(EXTRA_DEPS ${EXTRA_DEPS} "${${_LIB}_DEP}")
+ ENDFOREACH()
+ MESSAGE("Extra deps: ${EXTRA_DEPS}")
+ LIST(REMOVE_DUPLICATES EXTRA_DEPS)
+ SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${EXTRA_DEPS})
+ENDIF()
+###
+# End user-specified dependent libraries.
+###
+
+# Option to use HDF4
+OPTION(ENABLE_HDF4 "Build netCDF-4 with HDF4 read capability(HDF4, HDF5 and Zlib required)." OFF)
+IF(ENABLE_HDF4)
+ SET(USE_HDF4 ON)
+ # Check for include files, libraries.
+
+ FIND_PATH(MFHDF_H_INCLUDE_DIR mfhdf.h)
+ IF(NOT MFHDF_H_INCLUDE_DIR)
+ MESSAGE(FATAL_ERROR "HDF4 Support specified, cannot find file mfhdf.h")
+ ELSE()
+ INCLUDE_DIRECTORIES(${MFHDF_H_INCLUDE_DIR})
+ ENDIF()
+
+ FIND_LIBRARY(HDF4_DF_LIB NAMES df libdf hdf)
+ IF(NOT HDF4_DF_LIB)
+ MESSAGE(FATAL_ERROR "Can't find or link to the hdf4 df library.")
+ ENDIF()
+
+ FIND_LIBRARY(HDF4_MFHDF_LIB NAMES mfhdf libmfhdf)
+ IF(NOT HDF4_MFHDF_LIB)
+ MESSAGE(FATAL_ERROR "Can't find or link to the hdf4 mfhdf library.")
+ ENDIF()
+
+ SET(HAVE_LIBMFHDF TRUE)
+
+ SET(HDF4_LIBRARIES ${HDF4_DF_LIB} ${HDF4_MFHDF_LIB})
+ # End include files, libraries.
+ MESSAGE(STATUS "HDF4 libraries: ${HDF4_DF_LIB}, ${HDF4_MFHDF_LIB}")
+
+ MESSAGE(STATUS "Seeking HDF4 jpeg dependency.")
+
+ # Look for the jpeglib.h header file.
+ FIND_PATH(JPEGLIB_H_INCLUDE_DIR jpeglib.h)
+ IF(NOT JPEGLIB_H_INCLUDE_DIR)
+ MESSAGE(FATAL_ERROR "HDF4 Support enabled but cannot find jpeglib.h")
+ ELSE()
+ SET(HAVE_JPEGLIB_H ON CACHE BOOL "")
+ SET(HAVE_LIBJPEG TRUE)
+ INCLUDE_DIRECTORIES(${JPEGLIB_H_INCLUDE_DIR})
+ ENDIF()
+
+ FIND_LIBRARY(JPEG_LIB NAMES jpeg libjpeg)
+ IF(NOT JPEG_LIB)
+ MESSAGE(FATAL_ERROR "HDF4 Support enabled but cannot find libjpeg")
+ ENDIF()
+ SET(HDF4_LIBRARIES ${JPEG_LIB} ${HDF4_LIBRARIES})
+ MESSAGE(STATUS "Found JPEG libraries: ${JPEG_LIB}")
+
+ # Option to enable HDF4 file tests.
+ OPTION(ENABLE_HDF4_FILE_TESTS "Run HDF4 file tests. This fetches sample HDF4 files from the Unidata ftp site to test with (requires curl)." ON)
+ IF(ENABLE_HDF4_FILE_TESTS)
+ FIND_PROGRAM(PROG_CURL NAMES curl)
+ IF(PROG_CURL)
+ SET(USE_HDF4_FILE_TESTS ON)
+ ELSE()
+ MESSAGE(STATUS "Unable to locate 'curl'. Disabling hdf4 file tests.")
+ SET(USE_HDF4_FILE_TESTS OFF)
+ ENDIF()
+ ENDIF()
+ENDIF()
+
+# Option to Build DLL
+IF(WIN32)
+ OPTION(ENABLE_DLL "Build a Windows DLL." ${BUILD_SHARED_LIBS})
+ IF(ENABLE_DLL)
+ SET(BUILD_DLL ON CACHE BOOL "")
+ ADD_DEFINITIONS(-DDLL_NETCDF)
+ ADD_DEFINITIONS(-DDLL_EXPORT)
+ ADD_DEFINITIONS(-DUTF8PROC_DLLEXPORT)
+ ENDIF()
+ENDIF()
+# Did the user specify a default minimum blocksize for posixio?
+SET(NCIO_MINBLOCKSIZE 256 CACHE STRING "Minimum I/O Blocksize for netCDF classic and 64-bit offset format files.")
+
+# Build netCDF4
+OPTION(ENABLE_NETCDF_4 "Enable netCDF-4" ON)
+IF(ENABLE_NETCDF_4)
+ SET(USE_NETCDF4 ON CACHE BOOL "")
+ SET(ENABLE_NETCDF_4 ON CACHE BOOL "")
+ SET(ENABLE_NETCDF4 ON CACHE BOOL "")
+ELSE()
+ SET(USE_HDF4_FILE_TESTS OFF)
+ SET(USE_HDF4 OFF)
+ SET(ENABLE_HDF4_FILE_TESTS OFF)
+ SET(ENABLE_HDF4 OFF)
+ENDIF()
+
+# Option Logging, only valid for netcdf4.
+OPTION(ENABLE_LOGGING "Enable Logging." OFF)
+IF(NOT ENABLE_NETCDF_4)
+SET(ENABLE_LOGGING OFF)
+ENDIF()
+IF(ENABLE_LOGGING)
+ ADD_DEFINITIONS(-DLOGGING)
+ ADD_DEFINITIONS(-DENABLE_SET_LOG_LEVEL)
+ SET(LOGGING ON)
+ SET(ENABLE_SET_LOG_LEVEL ON)
+ENDIF()
+OPTION(ENABLE_SET_LOG_LEVEL_FUNC "Enable definition of nc_set_log_level()." ON)
+IF(ENABLE_NETCDF_4 AND NOT ENABLE_LOGGING AND ENABLE_SET_LOG_LEVEL_FUNC)
+ ADD_DEFINITIONS(-DENABLE_SET_LOG_LEVEL)
+ SET(ENABLE_SET_LOG_LEVEL ON)
+ENDIF()
+
+# Option to allow for strict null file padding.
+# See https://github.com/Unidata/netcdf-c/issues/657 for more information
+OPTION(ENABLE_STRICT_NULL_BYTE_HEADER_PADDING "Enable strict null byte header padding." OFF)
+
+IF(ENABLE_STRICT_NULL_BYTE_HEADER_PADDING)
+ SET(USE_STRICT_NULL_BYTE_HEADER_PADDING ON CACHE BOOL "")
+ENDIF(ENABLE_STRICT_NULL_BYTE_HEADER_PADDING)
+
+# Option for building RPC
+OPTION(ENABLE_RPC "Enable RPC Client and Server." OFF)
+IF(ENABLE_RPC)
+ SET(BUILD_RPC ON CACHE BOOL "")
+ENDIF()
+
+##
+# Option to Enable HDF5
+#
+# The HDF5 cmake variables differ between platform (linux/osx and Windows),
+# as well as between HDF5 versions. As a result, this section is a bit convoluted.
+#
+# Note that the behavior seems much more stable across HDF5 versions under linux,
+# so we do not have to do as much version-based tweaking.
+#
+# At the end of it, we should have the following defined:
+#
+# * HDF5_C_LIBRARY
+# * HDF5_HL_LIBRARY
+# * HDF5_LIBRARIES
+# * HDF5_INCLUDE_DIR
+# *
+##
+OPTION(USE_HDF5 "Use HDF5." ${ENABLE_NETCDF_4})
+IF(USE_HDF5 OR ENABLE_NETCDF_4)
+ SET(USE_HDF5 ON)
+ SET(USE_NETCDF4 ON)
+ ##
+ # Accommodate developers who have hdf5 libraries and
+ # headers on their system, but do not have a the hdf
+ # .cmake files. If this is the case, they should
+ # specify HDF5_HL_LIBRARY, HDF5_LIBRARY, HDF5_INCLUDE_DIR manually.
+ ##
+ IF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
+ SET(HDF5_LIBRARIES ${HDF5_C_LIBRARY} ${HDF5_HL_LIBRARY})
+ SET(HDF5_C_LIBRARIES ${HDF5_C_LIBRARY})
+ SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_LIBRARY})
+ SET(HDF5_HL_LIBRARIES ${HDF5_HL_LIBRARY})
+ INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
+ MESSAGE(STATUS "Using HDF5 C Library: ${HDF5_C_LIBRARY}")
+ MESSAGE(STATUS "Using HDF5 HL LIbrary: ${HDF5_HL_LIBRARY}")
+ ELSE(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR) # We are seeking out HDF5 with Find Package.
+ ###
+ # For now we assume that if we are building netcdf
+ # as a shared library, we will use hdf5 as a shared
+ # library. If we are building netcdf statically,
+ # we will use a static library. This can be toggled
+ # by explicitly modifying NC_FIND_SHARED_LIBS.
+ ##
+ IF(NC_FIND_SHARED_LIBS)
+ SET(NC_HDF5_LINK_TYPE "shared")
+ SET(NC_HDF5_LINK_TYPE_UPPER "SHARED")
+ ADD_DEFINITIONS(-DH5_BUILT_AS_DYNAMIC_LIB)
+ ELSE(NC_FIND_SHARED_LIBS)
+ SET(NC_HDF5_LINK_TYPE "static")
+ SET(NC_HDF5_LINK_TYPE_UPPER "STATIC")
+ ADD_DEFINITIONS(-DH5_BUILT_AS_STATIC_LIB)
+ ENDIF(NC_FIND_SHARED_LIBS)
+
+ #####
+ # First, find the C and HL libraries.
+ #
+ # This has been updated to reflect what is in the hdf5
+ # examples, even though the previous version of what we
+ # had worked.
+ #####
+ IF(MSVC)
+ SET(SEARCH_PACKAGE_NAME ${HDF5_PACKAGE_NAME})
+ FIND_PACKAGE(HDF5 NAMES ${SEARCH_PACKAGE_NAME} COMPONENTS C HL CONFIG REQUIRED ${NC_HDF5_LINK_TYPE})
+ ELSE(MSVC)
+ FIND_PACKAGE(HDF5 COMPONENTS C HL REQUIRED)
+ ENDIF(MSVC)
+
+ ##
+ # Next, check the HDF5 version. This will inform which
+ # HDF5 variables we need to munge.
+ ##
+
+ ##
+ # Assert HDF5 version meets minimum required version.
+ ##
+ SET(HDF5_VERSION_REQUIRED 1.8.10)
+ SET(HDF5_PAR_FILTER_VERSION 1.10.3)
+
+ IF(HDF5_VERSION_STRING AND NOT HDF5_VERSION)
+ SET(HDF5_VERSION ${HDF5_VERSION_STRING})
+ ENDIF()
+
+ IF("${HDF5_VERSION}" STREQUAL "")
+ MESSAGE(STATUS "Unable to determine hdf5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED}")
+ ELSE()
+ IF(${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED})
+ MESSAGE(FATAL_ERROR
+ "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED}. Found ${HDF5_VERSION}.")
+ ELSE()
+ MESSAGE(STATUS "Found HDF5 libraries version ${HDF5_VERSION}")
+ ENDIF()
+ ENDIF()
+
+ # Determine whether parallel filter operation is supported.
+ IF(${HDF5_VERSION} VERSION_LESS ${HDF5_PAR_FILTER_VERSION})
+ SET(HDF5_HAS_PAR_FILTERS, "no")
+ ELSE()
+ SET(HDF5_HAS_PAR_FILTERS, "yes")
+ ENDIF()
+
+ ##
+ # Include the HDF5 include directory.
+ ##
+ IF(HDF5_INCLUDE_DIRS AND NOT HDF5_INCLUDE_DIR)
+ SET(HDF5_INCLUDE_DIR ${HDF5_INCLUDE_DIRS})
+ ENDIF()
+ MESSAGE(STATUS "Using HDF5 include dir: ${HDF5_INCLUDE_DIR}")
+ INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
+
+ ###
+ # This is the block where we figure out what the appropriate
+ # variables are, and we ensure that we end up with
+ # HDF5_C_LIBRARY, HDF5_HL_LIBRARY and HDF5_LIBRARIES.
+ ###
+ IF(MSVC)
+ ##
+ # HDF5 1.8.15 defined HDF5_LIBRARIES.
+ ##
+ IF(${HDF5_VERSION} VERSION_LESS "1.8.16")
+ SET(HDF5_C_LIBRARY hdf5)
+ SET(HDF5_C_LIBRARY_hdf5 hdf5)
+ ENDIF(${HDF5_VERSION} VERSION_LESS "1.8.16")
+
+ IF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
+ IF(NOT HDF5_LIBRARIES AND HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY AND HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY)
+ SET(HDF5_C_LIBRARY ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+ SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+ SET(HDF5_HL_LIBRARY ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+
+ SET(HDF5_LIBRARIES ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY} ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
+ ENDIF()
+ ENDIF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
+
+ ELSE(MSVC)
+
+ # Depending on the install, either HDF5_hdf_library or
+ # HDF5_C_LIBRARIES may be defined. We must check for either.
+ IF(HDF5_C_LIBRARIES AND NOT HDF5_hdf5_LIBRARY)
+ SET(HDF5_hdf5_LIBRARY ${HDF5_C_LIBRARIES})
+ ENDIF()
+
+ ENDIF(MSVC)
+ IF(NOT HDF5_C_LIBRARY)
+ SET(HDF5_C_LIBRARY hdf5)
+ ENDIF()
+ ENDIF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
+
+ FIND_PACKAGE(Threads)
+
+ # There is a missing case in the above code so default it
+ IF(NOT HDF5_C_LIBRARY_HDF5 OR "${HDF5_C_LIBRARY_hdf5}" STREQUAL "" )
+ SET(HDF5_C_LIBRARY_hdf5 "${HDF5_C_LIBRARY}")
+ ENDIF()
+
+ # Find out if HDF5 was built with parallel support.
+ # Do that by checking for the targets H5Pget_fapl_mpiposx and
+ # H5Pget_fapl_mpio in ${HDF5_LIB}.
+
+ # H5Pset_fapl_mpiposix and H5Pget_fapl_mpiposix have been removed since HDF5 1.8.12.
+ # Use H5Pset_fapl_mpio and H5Pget_fapl_mpio, instead.
+ # CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpiposix "" HDF5_IS_PARALLEL_MPIPOSIX)
+
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpio "" HDF5_IS_PARALLEL_MPIO)
+ IF(HDF5_IS_PARALLEL_MPIO)
+ SET(HDF5_PARALLEL ON)
+ ELSE()
+ SET(HDF5_PARALLEL OFF)
+ ENDIF()
+
+ #Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_all_coll_metadata_ops "" HDF5_HAS_COLL_METADATA_OPS)
+
+ #Check to see if H5Z_SZIP exists in HDF5_Libraries. If so, we must use szip.
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Z_SZIP "" USE_SZIP)
+ IF(USE_SZIP)
+ FIND_LIBRARY(SZIP NAMES szip sz)
+ IF(SZIP)
+ SET(HAVE_H5Z_SZIP 1)
+ SET(SZIP_LIBRARY ${SZIP})
+ SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${SZIP})
+ MESSAGE(STATUS "HDF5 has szip.")
+ ELSE()
+ MESSAGE(FATAL_ERROR "HDF5 Requires SZIP, but cannot find libszip or libsz.")
+ ENDIF()
+ ENDIF()
+
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_libver_bounds "" HAVE_H5PSET_LIBVER_BOUNDS)
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5free_memory "" HAVE_H5FREE_MEMORY)
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5allocate_memory "" HAVE_H5ALLOCATE_MEMORY)
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5resize_memory "" HAVE_H5RESIZE_MEMORY)
+
+ IF(HDF5_PARALLEL)
+ SET(HDF5_CC h5pcc)
+ ELSE()
+ SET(HDF5_CC h5cc)
+ ENDIF()
+
+ # Check to see if this is hdf5-1.10.3 or later.
+ CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Dread_chunk "" HDF5_SUPPORTS_PAR_FILTERS)
+
+ SET(H5_USE_16_API 1)
+ OPTION(NC_ENABLE_HDF_16_API "Enable HDF5 1.6.x Compatibility(Required)" ON)
+ IF(NOT NC_ENABLE_HDF_16_API)
+ SET(H5_USE_16_API 0)
+ ENDIF()
+
+ FIND_PATH(HAVE_HDF5_H hdf5.h PATHS ${HDF5_INCLUDE_DIR} NO_DEFAULT_PATH)
+ FIND_PATH(HAVE_HDF5_H hdf5.h)
+ IF(NOT HAVE_HDF5_H)
+ MESSAGE(FATAL_ERROR "Compiling a test with hdf5 failed. Either hdf5.h cannot be found, or the log messages should be checked for another reason.")
+ ELSE(NOT HAVE_HDF5_H)
+ INCLUDE_DIRECTORIES(${HAVE_HDF5_H})
+ ENDIF(NOT HAVE_HDF5_H)
+
+ # Check to ensure that HDF5 was built with zlib.
+ set (CMAKE_REQUIRED_INCLUDES ${HAVE_HDF5_H})
+ CHECK_C_SOURCE_COMPILES("#include
+ #if !H5_HAVE_ZLIB_H
+ #error
+ #endif
+ int main() {
+ int x = 1;}" HAVE_HDF5_ZLIB)
+ IF(NOT HAVE_HDF5_ZLIB)
+ MESSAGE(FATAL_ERROR "HDF5 was built without zlib. Rebuild HDF5 with zlib.")
+ ENDIF()
+
+ #option to include HDF5 High Level header file (hdf5_hl.h) in case we are not doing a make install
+ INCLUDE_DIRECTORIES(${HDF5_HL_INCLUDE_DIR})
+
+
+ENDIF(USE_HDF5 OR ENABLE_NETCDF_4)
+
+# See if we have libcurl
+FIND_PACKAGE(CURL)
+ADD_DEFINITIONS(-DCURL_STATICLIB=1)
+INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS})
+
+# Check to see if CURLOPT_USERNAME is defined.
+# It is present starting version 7.19.1.
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLOPT_USERNAME;}" HAVE_CURLOPT_USERNAME)
+
+# Check to see if CURLOPT_PASSWORD is defined.
+# It is present starting version 7.19.1.
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLOPT_PASSWORD;}" HAVE_CURLOPT_PASSWORD)
+
+# Check to see if CURLOPT_KEYPASSWD is defined.
+# It is present starting version 7.16.4.
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLOPT_KEYPASSWD;}" HAVE_CURLOPT_KEYPASSWD)
+
+# Check to see if CURLINFO_RESPONSE_CODE is defined.
+# It showed up in curl 7.10.7.
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLINFO_RESPONSE_CODE;}" HAVE_CURLINFO_RESPONSE_CODE)
+
+# Check to see if CURLINFO_HTTP_CONNECTCODE is defined.
+# It showed up in curl 7.10.7.
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLINFO_HTTP_CONNECTCODE;}" HAVE_CURLINFO_HTTP_CONNECTCODE)
+
+# Check to see if CURLOPT_BUFFERSIZE is defined.
+# It is present starting version 7.59
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLOPT_BUFFERSIZE;}" HAVE_CURLOPT_BUFFERSIZE)
+
+# Check to see if CURLOPT_TCP_KEEPALIVE is defined.
+# It is present starting version 7.25
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = CURLOPT_TCP_KEEPALIVE;}" HAVE_CURLOPT_KEEPALIVE)
+
+# Option to Build DAP2+DAP4 Clients
+OPTION(ENABLE_DAP "Enable DAP2 and DAP4 Client." ON)
+IF(ENABLE_DAP)
+ SET(USE_DAP ON CACHE BOOL "")
+ SET(ENABLE_DAP2 ON CACHE BOOL "")
+
+ IF(ENABLE_NETCDF_4)
+ SET(ENABLE_DAP4 ON CACHE BOOL "")
+ ELSE(ENABLE_NETCDF_4)
+ SET(ENABLE_DAP4 OFF CACHE BOOL "")
+ ENDIF(ENABLE_NETCDF_4)
+
+ELSE()
+ SET(ENABLE_DAP2 OFF)
+ SET(ENABLE_DAP4 OFF)
+ENDIF()
+
+# Option to support byte-range reading of remote datasets
+OPTION(ENABLE_BYTERANGE "Enable byte-range access to remote datasets.." OFF)
+
+IF(NOT CURL_LIBRARY)
+ IF(ENABLE_BYTERANGE)
+ MESSAGE(FATAL_ERROR "Byte-range support specified, CURL libraries are not found.")
+ ENDIF()
+
+ IF(ENABLE_DAP2 OR ENABLE_DAP4)
+ MESSAGE(FATAL_ERROR "DAP support specified, CURL libraries are not found.")
+ ENDIF()
+ENDIF()
+
+# Check for the math library so it can be explicitly linked.
+IF(NOT WIN32)
+ FIND_LIBRARY(HAVE_LIBM NAMES math m libm)
+ MESSAGE(STATUS "Found Math library: ${HAVE_LIBM}")
+ IF(NOT HAVE_LIBM)
+ MESSAGE(FATAL_ERROR "Unable to find the math library.")
+ ENDIF()
+ENDIF()
+
+# Option to Enable DAP long tests, remote tests.
+OPTION(ENABLE_DAP_LONG_TESTS "Enable DAP long tests." OFF)
+OPTION(ENABLE_DAP_REMOTE_TESTS "Enable DAP remote tests." ON)
+SET(REMOTETESTSERVERS "remotetest.unidata.ucar.edu" CACHE STRING "test servers to use for remote test")
+
+# Enable some developer-only tests
+OPTION(ENABLE_EXTRA_TESTS "Enable Extra tests. Some may not work because of known issues. Developers only." OFF)
+IF(ENABLE_EXTRA_TESTS)
+ SET(EXTRA_TESTS ON)
+ENDIF()
+
+# Option to use bundled XGetopt in place of getopt(). This is mostly useful
+# for MSVC builds. If not building utilities, getopt() isn't required at all.
+IF(MSVC)
+ OPTION(ENABLE_XGETOPT "Enable bundled XGetOpt instead of external getopt()." ON)
+ IF(ENABLE_XGETOPT)
+ SET(USE_X_GETOPT ON CACHE BOOL "")
+ ENDIF()
+ENDIF()
+
+SET(MATH "")
+IF(NOT WIN32)
+
+ # STDIO instead of posixio.
+ OPTION(ENABLE_STDIO "If true, use stdio instead of posixio (ex. on the Cray)" OFF)
+ IF(ENABLE_STDIO)
+ SET(USE_STDIO ON CACHE BOOL "")
+ ENDIF()
+
+ # FFIO insteaad of PosixIO
+ OPTION(ENABLE_FFIO "If true, use ffio instead of posixio" OFF)
+ IF(ENABLE_FFIO)
+ SET(USE_FFIO ON CACHE BOOL "")
+ ENDIF()
+ENDIF()
+
+##
+# Enable Tests
+##
+OPTION(ENABLE_TESTS "Enable basic tests, run with 'make test'." ON)
+IF(ENABLE_TESTS)
+ SET(BUILD_TESTSETS ON CACHE BOOL "")
+
+ # Options for CTest-based tests, dashboards.
+ SET(NC_CTEST_PROJECT_NAME "netcdf-c" CACHE STRING "Project Name for CTest-based testing purposes.")
+ SET(NC_CTEST_DROP_SITE "cdash.unidata.ucar.edu:443" CACHE STRING "Dashboard location for CTest-based testing purposes.")
+ SET(NC_CTEST_DROP_LOC_PREFIX "" CACHE STRING "Prefix for Dashboard location on remote server when using CTest-based testing.")
+ SET(SUBMIT_URL "https://cdash.unidata.ucar.edu:443")
+ FIND_PROGRAM(HOSTNAME_CMD NAMES hostname)
+ IF(NOT MSVC)
+ SET(HOSTNAME_ARG "-s")
+ ENDIF()
+ IF(HOSTNAME_CMD)
+ EXEC_PROGRAM(${HOSTNAME_CMD} ARGS "${HOSTNAME_ARG}" OUTPUT_VARIABLE HOSTNAME)
+ SET(NC_CTEST_SITE "${HOSTNAME}" CACHE STRING "Hostname of test machine.")
+ ENDIF()
+
+ IF(NC_CTEST_SITE)
+ SET(SITE "${NC_CTEST_SITE}" CACHE STRING "")
+ ENDIF()
+
+ ###
+ # This option dictates whether or not to turn on
+ # tests which are known to fail. This is not the
+ # same thing as an 'expected failure'. Rather, these
+ # are tests that will need to be fixed eventually.
+ #
+ # By placing them here, we can occasionally turn this
+ # flag on and see if any known failures have been
+ # fixed in the course of code improvement/other bug
+ # fixes.
+ #
+ # To use this, simply add as a fencepost around tests
+ # which are known to fail.
+ ###
+
+ OPTION(ENABLE_FAILING_TESTS "Run tests which are known to fail, check to see if any have been fixed." OFF)
+
+ ###
+ # Option to turn on unit testing. See
+ # https://github.com/Unidata/netcdf-c/pull/1472 for more
+ # information. Currently (August 21, 2019): Will not work with
+ # Visual Studio. The unit tests are for internal netCDF functions,
+ # so we don't want to make them external, which would be required to
+ # run on Windows.
+ ###
+ IF(NOT MSVC)
+ OPTION(ENABLE_UNIT_TESTS "Run Unit Tests." ON)
+ ENDIF(NOT MSVC)
+ ###
+ # End known-failures.
+ ###
+ MARK_AS_ADVANCED(ENABLE_FAILING_TESTS)
+ENDIF()
+
+###
+# Option to enable extreme numbers during testing.
+###
+OPTION(ENABLE_EXTREME_NUMBERS "Enable extreme numbers during testing, such as MAX_INT-1" ON)
+IF(ENABLE_EXTREME_NUMBERS)
+ SET(USE_EXTREME_NUMBERS ON)
+ENDIF()
+
+# Enable Large file tests
+IF(ENABLE_LARGE_FILE_TESTS)
+ SET(LARGE_FILE_TESTS ON)
+ENDIF()
+
+OPTION(ENABLE_METADATA_PERF_TESTS "Enable test of metadata performance." OFF)
+IF(ENABLE_METADATA_PERF_TESTS)
+ SET(ENABLE_METADATA_PERF ON)
+ENDIF()
+
+# Location for large file tests.
+SET(TEMP_LARGE "." CACHE STRING "Location to store large file tests.")
+
+OPTION(ENABLE_FSYNC "Enable experimental fsync code." OFF)
+IF(ENABLE_FSYNC)
+ SET(USE_FSYNC ON)
+ENDIF()
+
+# Temporary
+OPTION (ENABLE_JNA "Enable jna bug fix code." OFF)
+IF(ENABLE_JNA)
+ SET(JNA ON)
+ENDIF()
+
+# Linux specific large file support flags.
+# Modelled after check in CMakeLists.txt for hdf5.
+OPTION(ENABLE_LARGE_FILE_SUPPORT "Enable large file support." ON)
+IF(ENABLE_LARGE_FILE_SUPPORT)
+ IF(MSVC)
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ ELSE()
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64")
+ ENDIF()
+ENDIF()
+
+OPTION(ENABLE_EXAMPLE_TESTS "Run extra example tests. Requires GNU Sed. Ignored if netCDF-4 is not Enabled" OFF)
+IF(NOT ENABLE_NETCDF_4 AND ENABLE_EXAMPLE_TESTS)
+ SET(ENABLE_EXAMPLE_TESTS OFF)
+ENDIF()
+
+# Enable Parallel IO with netCDF-4/HDF5 files using HDF5 parallel I/O.
+SET(STATUS_PARALLEL "OFF")
+OPTION(ENABLE_PARALLEL4 "Build netCDF-4 with parallel IO" "${HDF5_PARALLEL}")
+IF(ENABLE_PARALLEL4 AND ENABLE_NETCDF_4)
+ IF(NOT HDF5_PARALLEL)
+ SET(USE_PARALLEL OFF CACHE BOOL "")
+ MESSAGE(STATUS "Cannot find HDF5 library built with parallel support. Disabling parallel build.")
+ ELSE()
+ FIND_PACKAGE(MPI REQUIRED)
+ SET(HDF5_PARALLEL ON CACHE BOOL "")
+ SET(USE_PARALLEL ON CACHE BOOL "")
+ SET(USE_PARALLEL4 ON CACHE BOOL "")
+ SET(STATUS_PARALLEL "ON")
+ configure_file("${netCDF_SOURCE_DIR}/nc_test4/run_par_test.sh.in"
+ "${netCDF_BINARY_DIR}/tmp/run_par_test.sh" @ONLY NEWLINE_STYLE LF)
+ FILE(COPY "${netCDF_BINARY_DIR}/tmp/run_par_test.sh"
+ DESTINATION ${netCDF_BINARY_DIR}/nc_test4
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+ configure_file("${netCDF_SOURCE_DIR}/h5_test/run_par_tests.sh.in"
+ "${netCDF_BINARY_DIR}/tmp/run_par_tests.sh" @ONLY NEWLINE_STYLE LF)
+ FILE(COPY "${netCDF_BINARY_DIR}/tmp/run_par_tests.sh"
+ DESTINATION ${netCDF_BINARY_DIR}/h5_test
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+ ENDIF()
+ENDIF()
+
+# Options to enable parallel IO for classic formats with PnetCDF library.
+SET(STATUS_PNETCDF "OFF")
+OPTION(ENABLE_PNETCDF "Build with parallel I/O for CDF-1, 2, and 5 files using PnetCDF." OFF)
+
+IF(ENABLE_PNETCDF)
+ # Check for ncmpi_create in libpnetcdf, define USE_PNETCDF
+ # Does the user want to turn on PnetCDF read ability?
+ SET(USE_PNETCDF ON CACHE BOOL "")
+ FIND_LIBRARY(PNETCDF NAMES pnetcdf)
+ FIND_PATH(PNETCDF_INCLUDE_DIR pnetcdf.h)
+ IF(NOT PNETCDF)
+ MESSAGE(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.")
+ SET(USE_PNETCDF OFF CACHE BOOL "")
+ ELSE(NOT PNETCDF)
+ SET(USE_PARALLEL ON CACHE BOOL "")
+
+ # Check PnetCDF version. Must be >= 1.6.0
+ set(pnetcdf_h "${PNETCDF_INCLUDE_DIR}/pnetcdf.h" )
+ message(STATUS "PnetCDF include file ${pnetcdf_h} will be searched for version")
+ file(STRINGS "${pnetcdf_h}" pnetcdf_major_string REGEX "^#define PNETCDF_VERSION_MAJOR")
+ string(REGEX REPLACE "[^0-9]" "" pnetcdf_major "${pnetcdf_major_string}")
+ file(STRINGS "${pnetcdf_h}" pnetcdf_minor_string REGEX "^#define PNETCDF_VERSION_MINOR")
+ string(REGEX REPLACE "[^0-9]" "" pnetcdf_minor "${pnetcdf_minor_string}")
+ file(STRINGS "${pnetcdf_h}" pnetcdf_sub_string REGEX "^#define PNETCDF_VERSION_SUB")
+ string(REGEX REPLACE "[^0-9]" "" pnetcdf_sub "${pnetcdf_sub_string}")
+ set(pnetcdf_version "${pnetcdf_major}.${pnetcdf_minor}.${pnetcdf_sub}")
+ message(STATUS "Found PnetCDF version ${pnetcdf_version}")
+
+ if(${pnetcdf_version} VERSION_GREATER "1.6.0")
+ SET(STATUS_PNETCDF "ON")
+ INCLUDE_DIRECTORIES(${PNETCDF_INCLUDE_DIR})
+ SET(HAVE_LIBPNETCDF ON)
+ # PnetCDF => parallel
+ SET(STATUS_PARALLEL ON)
+ SET(USE_PARALLEL ON)
+ MESSAGE(STATUS "Using PnetCDF Library: ${PNETCDF}")
+ ELSE()
+ MESSAGE(WARNING "ENABLE_PNETCDF requires version 1.6.1 or later; found version ${pnetcdf_version}. PnetCDF is disabled")
+ ENDIF()
+ ENDIF(NOT PNETCDF)
+ENDIF()
+
+# Options to enable use of fill values for elements causing NC_ERANGE
+SET(ENABLE_ERANGE_FILL AUTO CACHE STRING "AUTO")
+OPTION(ENABLE_ERANGE_FILL "Enable use of fill value when out-of-range type conversion causes NC_ERANGE error." OFF)
+IF(ENABLE_ERANGE_FILL) # enable or auto
+ STRING(TOUPPER ${ENABLE_ERANGE_FILL} ENABLE_ERANGE_FILL)
+ IF(ENABLE_ERANGE_FILL AND NOT ENABLE_ERANGE_FILL STREQUAL "AUTO")
+ # explicitly enabled
+ SET(ENABLE_ERANGE_FILL ON)
+ ELSE()
+ IF(NOT ENABLE_ERANGE_FILL STREQUAL "AUTO")
+ SET(ENABLE_ERANGE_FILL OFF)
+ ENDIF()
+ ENDIF()
+ENDIF(ENABLE_ERANGE_FILL)
+# Now ENABLE_ERANGE_FILL is either AUTO, ON, or OFF
+
+# More relaxed coordinate check is now mandatory for all builds.
+SET(ENABLE_ZERO_LENGTH_COORD_BOUND ON)
+
+# check and conform with PnetCDF settings on ERANGE_FILL and RELAX_COORD_BOUND
+IF(STATUS_PNETCDF)
+ file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL")
+ string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}")
+ IF("x${erange_fill_pnetcdf}" STREQUAL "x1")
+ SET(erange_fill_pnetcdf "ON")
+ ELSE()
+ SET(erange_fill_pnetcdf "OFF")
+ ENDIF()
+ IF(ENABLE_ERANGE_FILL STREQUAL "AUTO") # not set on command line
+ SET(ENABLE_ERANGE_FILL "${erange_fill_pnetcdf}")
+ ELSE()
+ # user explicitly set this option on command line
+ IF(NOT ENABLE_ERANGE_FILL STREQUAL "${erange_fill_pnetcdf}")
+ IF(ENABLE_ERANGE_FILL)
+ MESSAGE(FATAL_ERROR "Enabling erange-fill conflicts with PnetCDF setting")
+ ELSE()
+ MESSAGE(FATAL_ERROR "Disabling erange-fill conflicts with PnetCDF setting")
+ ENDIF()
+ ENDIF()
+ ENDIF()
+
+ file(STRINGS "${pnetcdf_h}" relax_coord_bound_pnetcdf REGEX "^#define PNETCDF_RELAX_COORD_BOUND")
+ string(REGEX REPLACE "[^0-9]" "" relax_coord_bound "${relax_coord_bound_pnetcdf}")
+ IF("x${relax_coord_bound}" STREQUAL "x1")
+ SET(relax_coord_bound_pnetcdf "ON")
+ ELSE()
+ SET(relax_coord_bound_pnetcdf "OFF")
+ ENDIF()
+ # pnetcdf must have relaxed coord bounds to build with netCDF-4
+ IF(NOT ENABLE_ZERO_LENGTH_COORD_BOUND STREQUAL "${relax_coord_bound_pnetcdf}")
+ MESSAGE(FATAL_ERROR "Pnetcdf must be built with relax-coord-bound enabled")
+ ENDIF()
+ENDIF()
+
+IF(ENABLE_ERANGE_FILL)
+ MESSAGE(STATUS "Enabling use of fill value when NC_ERANGE")
+ SET(M4FLAGS "-DERANGE_FILL" CACHE STRING "")
+ENDIF()
+
+IF(ENABLE_ZERO_LENGTH_COORD_BOUND)
+ MESSAGE(STATUS "Enabling a more relaxed check for NC_EINVALCOORDS")
+ ADD_DEFINITIONS(-DRELAX_COORD_BOUND)
+ENDIF()
+
+# Enable Parallel Tests.
+OPTION(ENABLE_PARALLEL_TESTS "Enable Parallel IO Tests. Requires HDF5/NetCDF4 with parallel I/O Support." ${USE_PARALLEL})
+IF(ENABLE_PARALLEL_TESTS AND USE_PARALLEL)
+ SET(TEST_PARALLEL ON CACHE BOOL "")
+ IF(USE_NETCDF4)
+ SET(TEST_PARALLEL4 ON CACHE BOOL "")
+ ENDIF()
+ENDIF()
+
+IF (ENABLE_PARALLEL_TESTS AND NOT USE_PARALLEL)
+ MESSAGE(FATAL_ERROR "Parallel tests requested, but no parallel HDF5 installation detected.")
+ENDIF()
+
+# Enable special filter test; experimental when using cmake.
+OPTION(ENABLE_FILTER_TESTING "Enable filter testing. Ignored if shared libraries or netCDF4 are not enabled" ${ENABLE_NETCDF_4})
+IF(ENABLE_FILTER_TESTING AND NOT ENABLE_NETCDF_4)
+ MESSAGE(WARNING "ENABLE_FILTER_TESTING requires netCDF-4. Disabling.")
+ SET(ENABLE_FILTER_TESTING OFF)
+ENDIF()
+IF(NOT BUILD_SHARED_LIBS)
+ MESSAGE(WARNING "ENABLE_FILTER_TESTING requires shared libraries. Disabling.")
+ SET(ENABLE_FILTER_TESTING OFF)
+ENDIF()
+
+# Determine whether or not to generate documentation.
+OPTION(ENABLE_DOXYGEN "Enable generation of doxygen-based documentation." OFF)
+IF(ENABLE_DOXYGEN)
+ FIND_PACKAGE(Doxygen REQUIRED)
+ # Offer the option to build internal documentation.
+ OPTION(ENABLE_INTERNAL_DOCS "Build internal documentation. This is of interest to developers only." OFF)
+ IF(ENABLE_INTERNAL_DOCS)
+ SET(BUILD_INTERNAL_DOCS YES CACHE STRING "")
+ ELSE()
+ SET(BUILD_INTERNAL_DOCS NO CACHE STRING "")
+ ENDIF()
+
+ ###
+ #
+ # If we are building release documentation, we need to set some
+ # variables that will be used in the Doxygen.in template.
+ ###
+ OPTION(ENABLE_DOXYGEN_BUILD_RELEASE_DOCS "Build release documentation. This is of interest only to the netCDF developers." OFF)
+ IF(ENABLE_DOXYGEN_BUILD_RELEASE_DOCS)
+ SET(DOXYGEN_CSS_FILE "${CMAKE_SOURCE_DIR}/docs/release.css" CACHE STRING "")
+ SET(DOXYGEN_HEADER_FILE "${CMAKE_SOURCE_DIR}/docs/release_header.html" CACHE STRING "")
+ SET(DOXYGEN_SEARCHENGINE "NO" CACHE STRING "")
+ SET(ENABLE_DOXYGEN_SERVER_BASED_SEARCH NO CACHE STRING "")
+ ELSE()
+ SET(DOXYGEN_CSS_FILE "" CACHE STRING "")
+ SET(DOXYGEN_HEADER_FILE "" CACHE STRING "")
+ SET(DOXYGEN_SEARCHENGINE "YES" CACHE STRING "")
+
+ # If not using release document configuration,
+ # provide an option for server-based search.
+ OPTION(ENABLE_DOXYGEN_SERVER_SIDE_SEARCH "Configure Doxygen with server-based search." OFF)
+ IF(ENABLE_DOXYGEN_SERVER_SIDE_SEARCH)
+ SET(DOXYGEN_SERVER_BASED_SEARCH "YES" CACHE STRING "")
+ ELSE()
+ SET(DOXYGEN_SERVER_BASED_SEARCH "NO" CACHE STRING "")
+ ENDIF(ENABLE_DOXYGEN_SERVER_SIDE_SEARCH)
+
+
+ ENDIF(ENABLE_DOXYGEN_BUILD_RELEASE_DOCS)
+ # Option to turn on the TODO list in the doxygen-generated documentation.
+ OPTION(DOXYGEN_ENABLE_TASKS "Turn on test, todo, bug lists in documentation. This is of interest to developers only." OFF)
+ IF(DOXYGEN_ENABLE_TASKS)
+ SET(SHOW_DOXYGEN_TAG_LIST YES CACHE STRING "")
+ ELSE(DOXYGEN_ENABLE_TASKS)
+ SET(SHOW_DOXYGEN_TODO_LIST NO CACHE STRING "")
+ ENDIF(DOXYGEN_ENABLE_TASKS)
+
+ OPTION(ENABLE_DOXYGEN_PDF_OUTPUT "[EXPERIMENTAL] Turn on PDF output for Doxygen-generated documentation." OFF)
+
+ IF(ENABLE_DOXYGEN_PDF_OUTPUT)
+ SET(NC_ENABLE_DOXYGEN_PDF_OUTPUT "YES" CACHE STRING "")
+ ELSE()
+ SET(NC_ENABLE_DOXYGEN_PDF_OUTPUT "NO" CACHE STRING "")
+ ENDIF()
+
+ FIND_PROGRAM(NC_DOT NAMES dot)
+ # Specify whether or not 'dot' was found on the system path.
+ IF(NC_DOT)
+ SET(HAVE_DOT YES CACHE STRING "")
+ ELSE(NC_DOT)
+ SET(HAVE_DOT NO CACHE STRING "")
+ ENDIF(NC_DOT)
+ENDIF()
+
+# Always enable DISKLESS
+OPTION(ENABLE_DISKLESS "Enable in-memory files" ON)
+
+
+# By default, MSVC has a stack size of 1000000.
+# Allow a user to override this.
+IF(MSVC)
+ SET(NC_MSVC_STACK_SIZE 40000000 CACHE STRING "Default stack size for MSVC-based projects.")
+ # By default, CMake sets the stack to 1000000.
+ # Remove this limitation.
+ # See here for more details:
+ # http://www.cmake.org/pipermail/cmake/2009-April/028710.html
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:${NC_MSVC_STACK_SIZE}")
+ SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /STACK:${NC_MSVC_STACK_SIZE}")
+ SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /STACK:${NC_MSVC_STACK_SIZE}")
+ENDIF()
+
+# Set some of the options as advanced.
+MARK_AS_ADVANCED(ENABLE_INTERNAL_DOCS VALGRIND_TESTS ENABLE_COVERAGE_TESTS )
+MARK_AS_ADVANCED(ENABLE_DAP_REMOTE_TESTS ENABLE_DAP_LONG_TESTS USE_REMOTE_CDASH)
+MARK_AS_ADVANCED(ENABLE_DOXYGEN_BUILD_RELEASE_DOCS DOXYGEN_ENABLE_TASKS ENABLE_DOXYGEN_SERVER_SIDE_SEARCH)
+MARK_AS_ADVANCED(ENABLE_SHARED_LIBRARY_VERSION)
+
+################################
+# Option checks
+################################
+
+# Library include checks
+CHECK_INCLUDE_FILE("math.h" HAVE_MATH_H)
+CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
+# Solve a compatibility issue in ncgen/, which checks
+# for NO_UNISTD_H
+IF(NOT HAVE_UNISTD_H)
+ SET(YY_NO_UNISTD_H TRUE)
+ENDIF()
+
+CHECK_INCLUDE_FILE("alloca.h" HAVE_ALLOCA_H)
+CHECK_INCLUDE_FILE("malloc.h" HAVE_MALLOC_H)
+CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
+CHECK_INCLUDE_FILE("getopt.h" HAVE_GETOPT_H)
+CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H)
+CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
+CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H)
+IF(MSVC)
+CHECK_INCLUDE_FILE("io.h" HAVE_IO_H)
+ENDIF(MSVC)
+CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
+CHECK_INCLUDE_FILE("stdarg.h" HAVE_STDARG_H)
+CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
+CHECK_INCLUDE_FILE("signal.h" HAVE_SIGNAL_H)
+CHECK_INCLUDE_FILE("sys/param.h" HAVE_SYS_PARAM_H)
+CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H)
+CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILE("sys/mman.h" HAVE_SYS_MMAN_H)
+CHECK_INCLUDE_FILE("sys/resource.h" HAVE_SYS_RESOURCE_H)
+CHECK_INCLUDE_FILE("fcntl.h" HAVE_FCNTL_H)
+CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILE("pstdint.h" HAVE_PSTDINT_H)
+CHECK_INCLUDE_FILE("endian.h" HAVE_ENDIAN_H)
+CHECK_INCLUDE_FILE("BaseTsd.h" HAVE_BASETSD_H)
+CHECK_INCLUDE_FILE("stddef.h" HAVE_STDDEF_H)
+CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
+CHECK_INCLUDE_FILE("winsock2.h" HAVE_WINSOCK2_H)
+CHECK_INCLUDE_FILE("ftw.h" HAVE_FTW_H)
+CHECK_INCLUDE_FILE("libgen.h" HAVE_LIBGEN_H)
+
+# Symbol Exists
+CHECK_SYMBOL_EXISTS(isfinite "math.h" HAVE_DECL_ISFINITE)
+CHECK_SYMBOL_EXISTS(isnan "math.h" HAVE_DECL_ISNAN)
+CHECK_SYMBOL_EXISTS(isinf "math.h" HAVE_DECL_ISINF)
+CHECK_SYMBOL_EXISTS(st_blksize "sys/stat.h" HAVE_STRUCT_STAT_ST_BLKSIZE)
+CHECK_SYMBOL_EXISTS(alloca "alloca.h" HAVE_ALLOCA)
+CHECK_SYMBOL_EXISTS(snprintf "stdio.h" HAVE_SNPRINTF)
+
+# Type checks
+# Aliases for automake consistency
+SET(SIZEOF_VOIDSTAR ${CMAKE_SIZEOF_VOID_P})
+SET(SIZEOF_VOIDP ${SIZEOF_VOIDSTAR})
+CHECK_TYPE_SIZE("char" SIZEOF_CHAR)
+CHECK_TYPE_SIZE("double" SIZEOF_DOUBLE)
+CHECK_TYPE_SIZE("float" SIZEOF_FLOAT)
+CHECK_TYPE_SIZE("int" SIZEOF_INT)
+CHECK_TYPE_SIZE("uint" SIZEOF_UINT)
+IF(SIZEOF_UINT)
+ SET(HAVE_UINT TRUE)
+ENDIF(SIZEOF_UINT)
+
+CHECK_TYPE_SIZE("schar" SIZEOF_SCHAR)
+IF(SIZEOF_SCHAR)
+ SET(HAVE_SCHAR TRUE)
+ENDIF(SIZEOF_SCHAR)
+
+CHECK_TYPE_SIZE("long" SIZEOF_LONG)
+CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
+IF(SIZEOF_LONG_LONG)
+ SET(HAVE_LONG_LONG_INT TRUE)
+ENDIF(SIZEOF_LONG_LONG)
+
+CHECK_TYPE_SIZE("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG)
+
+CHECK_TYPE_SIZE("off_t" SIZEOF_OFF_T)
+CHECK_TYPE_SIZE("off64_t" SIZEOF_OFF64_T)
+CHECK_TYPE_SIZE("short" SIZEOF_SHORT)
+CHECK_TYPE_SIZE("ushort" SIZEOF_USHORT)
+IF(SIZEOF_USHORT)
+ SET(HAVE_USHORT TRUE)
+ENDIF(SIZEOF_USHORT)
+
+CHECK_TYPE_SIZE("_Bool" SIZEOF__BOOL)
+
+CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T)
+
+# Check whether to turn on or off CDF5 support.
+SET(ENABLE_CDF5 AUTO CACHE STRING "AUTO")
+OPTION(ENABLE_CDF5 "Enable CDF5 support" ON)
+IF(SIZEOF_SIZE_T EQUAL 4)
+ IF(ENABLE_CDF5) # enable or auto
+ STRING(TOUPPER ${ENABLE_CDF5} ENABLE_CDF5)
+ IF(ENABLE_CDF5 AND NOT ENABLE_CDF5 STREQUAL "AUTO") # explicitly enabled
+ MESSAGE(FATAL_ERROR "Unable to support CDF5 feature because size_t is less than 8 bytes")
+ ENDIF(ENABLE_CDF5 AND NOT ENABLE_CDF5 STREQUAL "AUTO")
+ SET(ENABLE_CDF5 OFF) # cannot support CDF5
+ SET(USE_CDF5 OFF CACHE BOOL "") # cannot support CDF5
+ ENDIF(ENABLE_CDF5)
+ELSE(SIZEOF_SIZE_T EQUAL 4)
+ IF(ENABLE_CDF5) # explicitly set by user or not set
+ SET(USE_CDF5 ON CACHE BOOL "")
+ ELSE(ENABLE_CDF5) # explicitly disabled by user
+ SET(USE_CDF5 OFF CACHE BOOL "")
+ ENDIF(ENABLE_CDF5)
+ENDIF(SIZEOF_SIZE_T EQUAL 4)
+
+CHECK_TYPE_SIZE("ssize_t" SIZEOF_SSIZE_T)
+IF(SIZEOF_SSIZE_T)
+ SET(HAVE_SSIZE_T TRUE)
+ENDIF(SIZEOF_SSIZE_T)
+CHECK_TYPE_SIZE("ptrdiff_t" SIZEOF_PTRDIFF_T)
+IF(SIZEOF_PTRDIFF_T)
+ SET(HAVE_PTRDIFF_T TRUE)
+ENDIF(SIZEOF_PTRDIFF_T)
+CHECK_TYPE_SIZE("uintptr_t" SIZEOF_UINTPTR_T)
+IF(SIZEOF_UINTPTR_T)
+ SET(HAVE_UINTPTR_T TRUE)
+ENDIF(SIZEOF_UINTPTR_T)
+
+# __int64 is used on Windows for large file support.
+CHECK_TYPE_SIZE("__int64" SIZEOF___INT_64)
+CHECK_TYPE_SIZE("int64_t" SIZEOF_INT64_T)
+CHECK_TYPE_SIZE("uint64_t" SIZEOF_UINT64_T)
+CHECK_TYPE_SIZE("unsigned char" SIZEOF_UCHAR)
+CHECK_TYPE_SIZE("unsigned short int" SIZEOF_UNSIGNED_SHORT_INT)
+CHECK_TYPE_SIZE("unsigned int" SIZEOF_UNSIGNED_INT)
+CHECK_TYPE_SIZE("long long" SIZEOF_LONGLONG)
+CHECK_TYPE_SIZE("unsigned long long" SIZEOF_ULONGLONG)
+
+# On windows systems, we redefine off_t as __int64
+# to enable LFS. This is true on 32 and 64 bit system.s
+# We must redefine SIZEOF_OFF_T to match.
+IF(MSVC AND SIZEOF___INT_64)
+ SET(SIZEOF_OFF_T ${SIZEOF___INT_64})
+ENDIF()
+
+# Check for various functions.
+CHECK_FUNCTION_EXISTS(fsync HAVE_FSYNC)
+CHECK_FUNCTION_EXISTS(strlcat HAVE_STRLCAT)
+CHECK_FUNCTION_EXISTS(strdup HAVE_STRDUP)
+CHECK_FUNCTION_EXISTS(strndup HAVE_STRNDUP)
+CHECK_FUNCTION_EXISTS(strtoll HAVE_STRTOLL)
+CHECK_FUNCTION_EXISTS(strtoull HAVE_STRTOULL)
+CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
+CHECK_FUNCTION_EXISTS(mktemp HAVE_MKTEMP)
+CHECK_FUNCTION_EXISTS(random HAVE_RANDOM)
+CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
+CHECK_FUNCTION_EXISTS(MPI_Comm_f2c HAVE_MPI_COMM_F2C)
+CHECK_FUNCTION_EXISTS(MPI_Info_f2c HAVE_MPI_INFO_F2C)
+CHECK_FUNCTION_EXISTS(memmove HAVE_MEMMOVE)
+CHECK_FUNCTION_EXISTS(getpagesize HAVE_GETPAGESIZE)
+CHECK_FUNCTION_EXISTS(sysconf HAVE_SYSCONF)
+CHECK_FUNCTION_EXISTS(getrlimit HAVE_GETRLIMIT)
+CHECK_FUNCTION_EXISTS(_filelengthi64 HAVE_FILE_LENGTH_I64)
+CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP)
+CHECK_FUNCTION_EXISTS(mremap HAVE_MREMAP)
+CHECK_FUNCTION_EXISTS(fileno HAVE_FILENO)
+
+# Check to see if MAP_ANONYMOUS is defined.
+IF(MSVC)
+MESSAGE(WARNING "mmap not supported under visual studio: disabling MMAP support.")
+SET(ENABLE_MMAP OFF)
+ELSE()
+CHECK_C_SOURCE_COMPILES("
+#include
+int main() {int x = MAP_ANONYMOUS;}" HAVE_MAPANON)
+IF(NOT HAVE_MMAP OR NOT HAVE_MAPANON)
+ MESSAGE(WARNING "mmap or MAP_ANONYMOUS not found: disabling MMAP support.")
+ SET(ENABLE_MMAP OFF)
+ENDIF()
+ENDIF()
+
+IF(ENABLE_MMAP)
+ # Aliases
+ SET(BUILD_MMAP ON)
+ SET(USE_MMAP ON)
+ENDIF(ENABLE_MMAP)
+
+#CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
+#####
+# End system inspection checks.
+#####
+
+################################
+# Define Utility Macros
+################################
+
+# Macro to append files to the EXTRA_DIST files.
+# Note: can only be used in subdirectories because of the use of PARENT_SCOPE
+SET(EXTRA_DIST "")
+MACRO(ADD_EXTRA_DIST files)
+ FOREACH(F ${files})
+ SET(EXTRA_DIST ${EXTRA_DIST} ${CMAKE_CURRENT_SOURCE_DIR}/${F})
+ SET(EXTRA_DIST ${EXTRA_DIST} PARENT_SCOPE)
+ ENDFOREACH()
+ENDMACRO()
+
+# A basic script used to convert m4 files
+FIND_PROGRAM(NC_M4 NAMES m4 m4.exe)
+IF(NC_M4)
+ MESSAGE(STATUS "Found m4: ${NC_M4}")
+ SET(HAVE_M4 TRUE)
+ELSE()
+ MESSAGE(STATUS "m4 not found.")
+ENDIF()
+
+MACRO(GEN_m4 filename)
+
+ IF(HAVE_M4)
+
+ # If m4 is available, remove generated file if it exists.
+ IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c)
+ FILE(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c)
+ ENDIF()
+
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
+ COMMAND ${NC_M4}
+ ARGS ${M4FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.m4 > ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c
+ VERBATIM
+ )
+ENDIF(HAVE_M4)
+ENDMACRO(GEN_m4)
+
+# Binary tests, but ones which depend on value of 'TEMP_LARGE' being defined.
+MACRO(add_bin_env_temp_large_test prefix F)
+ ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+ TARGET_LINK_LIBRARIES(${prefix}_${F} netcdf)
+ IF(MSVC)
+ SET_TARGET_PROPERTIES(${prefix}_${F}
+ PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+ )
+ ENDIF()
+
+ ADD_TEST(${prefix}_${F} bash "-c" "TEMP_LARGE=${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}_${F}")
+ IF(MSVC)
+ SET_PROPERTY(TARGET ${prefix}_${F} PROPERTY FOLDER "tests")
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO
+ ${CMAKE_CURRENT_BINARY_DIR})
+ ENDIF()
+ENDMACRO()
+
+
+# Tests which are binary, but depend on a particular environmental variable.
+MACRO(add_bin_env_test prefix F)
+ ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+ TARGET_LINK_LIBRARIES(${prefix}_${F} netcdf)
+ IF(MSVC)
+ SET_TARGET_PROPERTIES(${prefix}_${F}
+ PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+ )
+ ENDIF()
+
+ ADD_TEST(${prefix}_${F} bash "-c" "TOPSRCDIR=${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}_${F}")
+ IF(MSVC)
+ SET_PROPERTY(TARGET ${prefix}_${F} PROPERTY FOLDER "tests")
+ ENDIF()
+ENDMACRO()
+
+# Build a binary used by a script, but don't make a test out of it.
+MACRO(build_bin_test F)
+ ADD_EXECUTABLE(${F} ${F}.c)
+ TARGET_LINK_LIBRARIES(${F} netcdf ${ALL_TLL_LIBS})
+ IF(MSVC)
+ SET_TARGET_PROPERTIES(${F}
+ PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+ )
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+ ${CMAKE_CURRENT_BINARY_DIR})
+ ENDIF()
+ENDMACRO()
+
+# Binary tests which are used by a script looking for a specific name.
+MACRO(add_bin_test_no_prefix F)
+ build_bin_test(${F})
+ ADD_TEST(${F} ${EXECUTABLE_OUTPUT_PATH}/${F})
+ IF(MSVC)
+ SET_PROPERTY(TEST ${F} PROPERTY FOLDER "tests/")
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+ ${CMAKE_CURRENT_BINARY_DIR})
+ ENDIF()
+ENDMACRO()
+
+# Binary tests which are used by a script looking for a specific name.
+MACRO(build_bin_test_no_prefix F)
+ build_bin_test(${F})
+ IF(MSVC)
+ #SET_PROPERTY(TEST ${F} PROPERTY FOLDER "tests/")
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+ ${CMAKE_CURRENT_BINARY_DIR})
+ ENDIF()
+ENDMACRO()
+
+MACRO(add_bin_test prefix F)
+ ADD_EXECUTABLE(${prefix}_${F} ${F}.c)
+ TARGET_LINK_LIBRARIES(${prefix}_${F}
+ ${ALL_TLL_LIBS}
+ netcdf
+ )
+ IF(MSVC)
+ SET_TARGET_PROPERTIES(${prefix}_${F}
+ PROPERTIES LINK_FLAGS_DEBUG " /NODEFAULTLIB:MSVCRT"
+ )
+ ENDIF()
+ ADD_TEST(${prefix}_${F}
+ ${EXECUTABLE_OUTPUT_PATH}/${prefix}_${F}
+ )
+ IF(MSVC)
+ SET_PROPERTY(TEST ${prefix}_${F} PROPERTY FOLDER "tests/")
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG
+ ${CMAKE_CURRENT_BINARY_DIR})
+ SET_TARGET_PROPERTIES(${prefix}_${F} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE
+ ${CMAKE_CURRENT_BINARY_DIR})
+ ENDIF()
+ENDMACRO()
+
+# A cmake script to print out information at the end of the configuration step.
+MACRO(print_conf_summary)
+ MESSAGE("")
+ MESSAGE("")
+ MESSAGE("Configuration Summary:")
+ MESSAGE("")
+ MESSAGE(STATUS "Building Shared Libraries: ${BUILD_SHARED_LIBS}")
+ MESSAGE(STATUS "Building netCDF-4: ${ENABLE_NETCDF_4}")
+ MESSAGE(STATUS "Building DAP2 Support: ${ENABLE_DAP2}")
+ MESSAGE(STATUS "Building DAP4 Support: ${ENABLE_DAP4}")
+ MESSAGE(STATUS "Building Byte-range Support: ${ENABLE_BYTERANGE}")
+ MESSAGE(STATUS "Building Utilities: ${BUILD_UTILITIES}")
+ IF(CMAKE_PREFIX_PATH)
+ MESSAGE(STATUS "CMake Prefix Path: ${CMAKE_PREFIX_PATH}")
+ ENDIF()
+ MESSAGE("")
+
+ IF(${STATUS_PNETCDF} OR ${STATUS_PARALLEL})
+ MESSAGE("Building Parallel NetCDF")
+ MESSAGE(STATUS "Using PnetCDF: ${STATUS_PNETCDF}")
+ MESSAGE(STATUS "Using Parallel IO: ${STATUS_PARALLEL}")
+ MESSAGE("")
+ ENDIF()
+
+ MESSAGE("Tests Enabled: ${ENABLE_TESTS}")
+ IF(ENABLE_TESTS)
+ MESSAGE(STATUS "DAP Remote Tests: ${ENABLE_DAP_REMOTE_TESTS}")
+ MESSAGE(STATUS "Extra Tests: ${ENABLE_EXTRA_TESTS}")
+ MESSAGE(STATUS "Coverage Tests: ${ENABLE_COVERAGE_TESTS}")
+ MESSAGE(STATUS "Parallel Tests: ${ENABLE_PARALLEL_TESTS}")
+ MESSAGE(STATUS "Large File Tests: ${ENABLE_LARGE_FILE_TESTS}")
+ MESSAGE(STATUS "Extreme Numbers: ${ENABLE_EXTREME_NUMBERS}")
+ MESSAGE(STATUS "Unit Tests: ${ENABLE_UNIT_TESTS}")
+ ENDIF()
+
+ MESSAGE("")
+ MESSAGE("Compiler:")
+ MESSAGE("")
+ MESSAGE(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
+ MESSAGE(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
+ MESSAGE(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
+ IF("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
+ MESSAGE(STATUS "CMAKE_C_FLAGS_DEBUG: ${CMAKE_C_FLAGS_DEBUG}")
+ ENDIF()
+ IF("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
+ MESSAGE(STATUS "CMAKE_C_FLAGS_RELEASE: ${CMAKE_C_FLAGS_RELEASE}")
+ ENDIF()
+
+ MESSAGE(STATUS "Linking against: ${ALL_TLL_LIBS}")
+
+ MESSAGE("")
+ENDMACRO()
+##
+# Shell script Macro
+##
+# Determine if 'bash' is on the system.
+##
+
+OPTION(ENABLE_BASH_SCRIPT_TESTING "Detection is typically automatic, but this option can be used to force enable/disable bash-script based tests." ON)
+
+IF(ENABLE_BASH_SCRIPT_TESTING)
+ FIND_PROGRAM(HAVE_BASH bash)
+ IF(HAVE_BASH)
+ STRING(COMPARE EQUAL "${HAVE_BASH}" "C:/Windows/System32/bash.exe" IS_BASH_EXE)
+ IF(NOT IS_BASH_EXE)
+ MESSAGE(STATUS "Found bash: ${HAVE_BASH}")
+ ELSE()
+ MESSAGE(STATUS "Ignoring ${HAVE_BASH}")
+ SET(HAVE_BASH "")
+ ENDIF()
+ ELSE()
+ MESSAGE(STATUS "Bash shell not found; disabling shell script tests.")
+ ENDIF()
+ELSE(ENABLE_BASH_SCRIPT_TESTING)
+ SET(HAVE_BASH "")
+ENDIF(ENABLE_BASH_SCRIPT_TESTING)
+
+MACRO(add_sh_test prefix F)
+ IF(HAVE_BASH)
+ ADD_TEST(${prefix}_${F} bash "-c" "export srcdir=${CMAKE_CURRENT_SOURCE_DIR};export TOPSRCDIR=${CMAKE_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}/${F}.sh")
+ ENDIF()
+ENDMACRO()
+
+
+
+# A function used to create autotools-style 'yes/no' definitions.
+# If a variable is set, it 'yes' is returned. Otherwise, 'no' is
+# returned.
+#
+# Also creates a version of the ret_val prepended with 'NC',
+# when feature is true, which is used to generate netcdf_meta.h.
+FUNCTION(is_enabled feature ret_val)
+ IF(${feature})
+ SET(${ret_val} "yes" PARENT_SCOPE)
+ SET("NC_${ret_val}" 1 PARENT_SCOPE)
+ ELSE()
+ SET(${ret_val} "no" PARENT_SCOPE)
+ SET("NC_${ret_val}" 0 PARENT_SCOPE)
+ ENDIF(${feature})
+ENDFUNCTION()
+
+# A function used to create autotools-style 'yes/no' definitions.
+# If a variable is set, it 'yes' is returned. Otherwise, 'no' is
+# returned.
+#
+# Also creates a version of the ret_val prepended with 'NC',
+# when feature is true, which is used to generate netcdf_meta.h.
+FUNCTION(is_disabled feature ret_val)
+ IF(${feature})
+ SET(${ret_val} "no" PARENT_SCOPE)
+ ELSE()
+ SET(${ret_val} "yes" PARENT_SCOPE)
+ SET("NC_${ret_val}" 1 PARENT_SCOPE)
+ ENDIF(${feature})
+ENDFUNCTION()
+
+################################
+# End Macro Definitions
+################################
+
+# Create config.h file.
+configure_file("${netCDF_SOURCE_DIR}/config.h.cmake.in"
+ "${netCDF_BINARY_DIR}/config.h")
+ADD_DEFINITIONS(-DHAVE_CONFIG_H)
+INCLUDE_DIRECTORIES(BEFORE ${netCDF_BINARY_DIR})
+# End autotools-style checs for config.h
+
+#####
+# Set core names of the libraries.
+#####
+SET(netCDF_LIB_CORENAME "netcdf")
+
+#####
+# Set the true names of all the libraries, if customized by external project
+#####
+# Recurse into other subdirectories.
+add_subdirectory("include")
+add_subdirectory(libdispatch)
+add_subdirectory(libsrc)
+
+IF(USE_PNETCDF)
+ add_subdirectory(libsrcp)
+ENDIF(USE_PNETCDF)
+
+IF(USE_HDF5)
+ add_subdirectory(libsrc4)
+ add_subdirectory(libhdf5)
+ENDIF(USE_HDF5)
+
+IF(USE_HDF4)
+ add_subdirectory(libhdf4)
+ add_subdirectory(hdf4_test)
+ENDIF(USE_HDF4)
+
+IF(ENABLE_DAP2)
+ ADD_SUBDIRECTORY(oc2)
+ ADD_SUBDIRECTORY(libdap2)
+ENDIF()
+
+IF(ENABLE_DAP4)
+ ADD_SUBDIRECTORY(libdap4)
+ENDIF()
+
+add_subdirectory(liblib)
+
+IF(ENABLE_FILTER_TESTING)
+ add_subdirectory(plugins)
+ENDIF()
+
+# For tests and utilities, we are no longer
+# exporting symbols but rather importing them.
+IF(BUILD_DLL)
+ REMOVE_DEFINITIONS(-DDLL_EXPORT)
+ENDIF()
+
+# Enable Utilities.
+IF(BUILD_UTILITIES)
+ INCLUDE_DIRECTORIES(ncdump)
+ ADD_SUBDIRECTORY(ncgen)
+ ADD_SUBDIRECTORY(ncgen3)
+ ADD_SUBDIRECTORY(ncdump)
+ENDIF()
+
+# Enable tests
+IF(ENABLE_TESTS)
+ IF(ENABLE_V2_API)
+ ADD_SUBDIRECTORY(nctest)
+ ENDIF()
+ ADD_SUBDIRECTORY(nc_test)
+ IF(USE_NETCDF4)
+ INCLUDE_DIRECTORIES(h5_test)
+ ADD_SUBDIRECTORY(nc_test4)
+ IF(BUILD_BENCHMARKS)
+ ADD_SUBDIRECTORY(nc_perf)
+ ENDIF()
+ ADD_SUBDIRECTORY(h5_test)
+ ENDIF()
+ IF(ENABLE_DAP2)
+ ADD_SUBDIRECTORY(ncdap_test)
+ ENDIF()
+ IF(ENABLE_DAP4)
+ ADD_SUBDIRECTORY(dap4_test)
+ ENDIF()
+ IF(ENABLE_EXAMPLES)
+ ADD_SUBDIRECTORY(examples)
+ ENDIF()
+ IF(ENABLE_UNIT_TESTS)
+ ADD_SUBDIRECTORY(unit_test)
+ ENDIF(ENABLE_UNIT_TESTS)
+ENDIF()
+
+# Code to generate an export header
+#GENERATE_EXPORT_HEADER(netcdf
+# BASE_NAME netcdf
+# EXPORT_MACRO_NAME netcdf_EXPORT
+# EXPORT_FILE_NAME netcdf_Export.h
+# STATIC_DEFINE netcdf_BUILT_AS_STATIC
+#)
+
+#####
+# Build doxygen documentation, if need be.
+#####
+ADD_SUBDIRECTORY(docs)
+
+##
+# Brute force, grab all of the dlls from the dependency directory,
+# install them in the binary dir. Grab all of the .libs, put them
+# in the libdir.
+##
+IF(MSVC)
+ FILE(GLOB COPY_FILES ${CMAKE_PREFIX_PATH}/lib/*.lib)
+ INSTALL(FILES ${COPY_FILES}
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT dependencies)
+
+ FILE(GLOB COPY_FILES ${CMAKE_PREFIX_PATH}/bin/*.dll)
+ STRING(REGEX REPLACE "msv[.*].dll" "" COPY_FILES "${COPY_FILES}")
+ INSTALL(FILES ${COPY_FILES}
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT dependencies)
+
+ENDIF()
+
+# Subdirectory CMakeLists.txt files should specify their own
+# 'install' files.
+# Including 'CPack' kicks everything off.
+INCLUDE(InstallRequiredSystemLibraries)
+CONFIGURE_FILE(
+ ${CMAKE_CURRENT_SOURCE_DIR}/FixBundle.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/FixBundle.cmake
+ @ONLY
+ )
+
+###
+# Create pkgconfig files.
+###
+
+IF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
+ SET(CMAKE_INSTALL_LIBDIR lib)
+ENDIF(NOT DEFINED CMAKE_INSTALL_LIBDIR)
+
+# Set
+SET(prefix ${CMAKE_INSTALL_PREFIX})
+SET(exec_prefix ${CMAKE_INSTALL_PREFIX})
+SET(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
+SET(includedir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR})
+SET(CC ${CMAKE_C_COMPILER})
+
+# Process all dependency libraries and create a string
+# used when parsing netcdf.pc.in
+
+SET(NC_LIBS "")
+
+FOREACH(_LIB ${ALL_TLL_LIBS})
+ GET_FILENAME_COMPONENT(_LIB_NAME ${_LIB} NAME_WE)
+ STRING(REGEX REPLACE "^lib" "" _NAME ${_LIB_NAME})
+ LIST(APPEND NC_LIBS "-l${_NAME}")
+ GET_FILENAME_COMPONENT(_LIB_DIR ${_LIB} PATH)
+ LIST(APPEND LINKFLAGS "-L${_LIB_DIR}")
+ENDFOREACH()
+
+#SET(NC_LIBS "-lnetcdf ${NC_LIBS}")
+IF(NC_LIBS)
+ STRING(REPLACE ";" " " NC_LIBS "${NC_LIBS}")
+ STRING(REPLACE "-lhdf5::hdf5-shared" "-lhdf5" NC_LIBS ${NC_LIBS})
+ STRING(REPLACE "-lhdf5::hdf5_hl-shared" "-lhdf5_hl" NC_LIBS ${NC_LIBS})
+ STRING(REPLACE "-lhdf5::hdf5-static" "-lhdf5" NC_LIBS ${NC_LIBS})
+ STRING(REPLACE "-lhdf5::hdf5_hl-static" "-lhdf5_hl" NC_LIBS ${NC_LIBS})
+ENDIF()
+
+STRING(REPLACE ";" " " LINKFLAGS "${LINKFLAGS}")
+
+LIST(REMOVE_DUPLICATES NC_LIBS)
+LIST(REMOVE_DUPLICATES LINKFLAGS)
+
+SET(LIBS ${NC_LIBS})
+SET(NC_LIBS "-lnetcdf")
+
+configure_file(
+ ${netCDF_SOURCE_DIR}/netcdf.pc.in
+ ${netCDF_BINARY_DIR}/netcdf.pc @ONLY)
+
+
+IF(NOT IS_DIRECTORY ${netCDF_BINARY_DIR}/tmp)
+ FILE(MAKE_DIRECTORY ${netCDF_BINARY_DIR}/tmp)
+ENDIF()
+
+configure_file("${netCDF_SOURCE_DIR}/nc-config.cmake.in"
+ "${netCDF_BINARY_DIR}/tmp/nc-config" @ONLY
+ NEWLINE_STYLE LF)
+FILE(COPY "${netCDF_BINARY_DIR}/tmp/nc-config"
+ DESTINATION ${netCDF_BINARY_DIR}/
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+
+INSTALL(FILES ${netCDF_BINARY_DIR}/netcdf.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
+ COMPONENT utilities)
+
+INSTALL(PROGRAMS ${netCDF_BINARY_DIR}/nc-config
+ DESTINATION ${CMAKE_INSTALL_BINDIR}
+ COMPONENT utilities)
+
+###
+# End pkgconfig, nc-config file creation.
+###
+
+##
+# Print the configuration summary
+##
+print_conf_summary()
+
+# Enable Makedist files.
+ADD_MAKEDIST()
+ENABLE_MAKEDIST(README.md COPYRIGHT RELEASE_NOTES.md INSTALL INSTALL.cmake test_prog.c lib_flags.am cmake CMakeLists.txt COMPILE.cmake.txt config.h.cmake.in cmake_uninstall.cmake.in netcdf-config-version.cmake.in netcdf-config.cmake.in FixBundle.cmake.in nc-config.cmake.in configure configure.ac install-sh config.h.in config.sub CTestConfig.cmake.in)
+
+#####
+# Configure and print the libnetcdf.settings file.
+#####
+
+# Set variables to mirror those used by autoconf.
+# This way we don't need to maintain two separate template
+# files.
+SET(host_cpu "${cpu}")
+SET(host_vendor "${osname}")
+SET(host_os "${osrel}")
+SET(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
+SET(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}")
+
+SET(CC_VERSION "${CMAKE_C_COMPILER}")
+
+# Build *FLAGS for libnetcdf.settings.
+SET(CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}")
+SET(CPPFLAGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${CMAKE_BUILD_TYPE}}")
+SET(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}")
+
+is_disabled(BUILD_SHARED_LIBS enable_static)
+is_enabled(BUILD_SHARED_LIBS enable_shared)
+
+is_enabled(ENABLE_V2_API HAS_NC2)
+is_enabled(ENABLE_NETCDF_4 HAS_NC4)
+is_enabled(ENABLE_HDF4 HAS_HDF4)
+is_enabled(ENABLE_NETCDF_4 HAS_HDF5)
+is_enabled(USE_SZIP HAS_SZLIB)
+is_enabled(USE_SZIP HAS_SZLIB_WRITE)
+is_enabled(STATUS_PNETCDF HAS_PNETCDF)
+is_enabled(STATUS_PARALLEL HAS_PARALLEL)
+is_enabled(ENABLE_PARALLEL4 HAS_PARALLEL4)
+is_enabled(ENABLE_DAP HAS_DAP)
+is_enabled(ENABLE_DAP HAS_DAP2)
+is_enabled(ENABLE_DAP4 HAS_DAP4)
+is_enabled(ENABLE_BYTERANGE HAS_BYTERANGE)
+is_enabled(ENABLE_DISKLESS HAS_DISKLESS)
+is_enabled(USE_MMAP HAS_MMAP)
+is_enabled(JNA HAS_JNA)
+is_enabled(ENABLE_ZERO_LENGTH_COORD_BOUND RELAX_COORD_BOUND)
+is_enabled(USE_CDF5 HAS_CDF5)
+is_enabled(ENABLE_ERANGE_FILL HAS_ERANGE_FILL)
+is_enabled(HDF5_HAS_PAR_FILTERS HAS_PAR_FILTERS)
+is_enabled(HAVE_H5Z_SZIP HAS_SZLIB)
+
+# Generate file from template.
+CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/libnetcdf.settings.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/libnetcdf.settings"
+ @ONLY)
+
+# Read in settings file, print out.
+# Avoid using system-specific calls so that this
+# might also work on Windows.
+FILE(READ "${CMAKE_CURRENT_BINARY_DIR}/libnetcdf.settings"
+ LIBNETCDF_SETTINGS)
+MESSAGE(${LIBNETCDF_SETTINGS})
+
+# Install libnetcdf.settings file into same location
+# as the libraries.
+INSTALL(FILES "${netCDF_BINARY_DIR}/libnetcdf.settings"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+ COMPONENT libraries)
+
+#####
+# End libnetcdf.settings section.
+#####
+
+#####
+# Create 'netcdf_meta.h' include file.
+#####
+configure_file(
+ ${netCDF_SOURCE_DIR}/include/netcdf_meta.h.in
+ ${netCDF_SOURCE_DIR}/include/netcdf_meta.h @ONLY)
+
+FILE(COPY ${netCDF_SOURCE_DIR}/include/netcdf_meta.h
+ DESTINATION ${netCDF_BINARY_DIR}/include/)
+
+#####
+# Build test_common.sh
+#####
+SET(EXTRA_DIST ${EXTRA_DIST} ${CMAKE_CURRENT_SOURCE_DIR}/test_common.in)
+SET(TOPSRCDIR "${CMAKE_CURRENT_SOURCE_DIR}")
+SET(TOPBUILDDIR "${CMAKE_CURRENT_BINARY_DIR}")
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test_common.in ${CMAKE_CURRENT_BINARY_DIR}/test_common.sh @ONLY NEWLINE_STYLE LF)
+
+
+#####
+# Build nc_test4/findplugin.sh
+#####
+SET(ISCMAKE "1")
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/nc_test4/findplugin.in ${CMAKE_CURRENT_BINARY_DIR}/nc_test4/findplugin.sh @ONLY NEWLINE_STYLE LF)
+
+IF(ENABLE_EXAMPLES)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/nc_test4/findplugin.in ${CMAKE_CURRENT_BINARY_DIR}/examples/C/findplugin.sh @ONLY NEWLINE_STYLE LF)
+ENDIF()
+
+#####
+# Build ncdap_test|dap4_test/findtestserver[4].c
+#####
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/findtestserver.c.in ${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/findtestserver.c @ONLY NEWLINE_STYLE LF)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/findtestserver.c.in ${CMAKE_CURRENT_SOURCE_DIR}/dap4_test/findtestserver4.c @ONLY NEWLINE_STYLE LF)
+
+#####
+# Build dap4_test/pingurl4.c
+#####
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/pingurl.c ${CMAKE_CURRENT_SOURCE_DIR}/dap4_test/pingurl4.c @ONLY NEWLINE_STYLE LF)
+
+####
+# Export files
+####
+
+# Create CMake package configuration files. With these, other packages using
+# cmake should be able to find netcdf using find_package and find_library.
+# The EXPORT call is paired with one in liblib.
+set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/netCDF)
+
+install(EXPORT netCDFTargets
+ DESTINATION ${ConfigPackageLocation}
+ COMPONENT headers
+ NAMESPACE netCDF::
+ )
+
+include(CMakePackageConfigHelpers)
+CONFIGURE_PACKAGE_CONFIG_FILE(
+ "${CMAKE_CURRENT_SOURCE_DIR}/netCDFConfig.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/netCDFConfig.cmake"
+ INSTALL_DESTINATION "${ConfigPackageLocation}"
+ NO_CHECK_REQUIRED_COMPONENTS_MACRO
+ PATH_VARS
+ CMAKE_INSTALL_PREFIX
+ CMAKE_INSTALL_INCLUDEDIR
+ CMAKE_INSTALL_LIBDIR
+ )
+
+INSTALL(
+ FILES "${CMAKE_CURRENT_BINARY_DIR}/netCDFConfig.cmake"
+ DESTINATION "${ConfigPackageLocation}"
+ COMPONENT headers
+ )
+
+add_library(netCDF::netcdf ALIAS netcdf)
+target_include_directories(netcdf
+ PUBLIC
+ $
+ $
+)
+
+# Create export configuration
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/netCDF/netCDFConfigVersion.cmake"
+ VERSION ${netCDF_VERSION}
+ COMPATIBILITY SameMajorVersion
+ )
+
+install(
+ FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/netCDF/netCDFConfigVersion.cmake"
+ DESTINATION ${ConfigPackageLocation}
+ COMPONENT headers
+ )
+
+####
+# End export files
+####
+
+
+
+# CPack inclusion must come last.
+# INCLUDE(CPack)
+INCLUDE(CMakeInstallation.cmake)
diff --git a/versions.cmd b/versions.cmd
index a63d58c..944931f 100644
--- a/versions.cmd
+++ b/versions.cmd
@@ -32,7 +32,7 @@ set ZLIB_VER=1.3.1
set BOOST_UVER=%BOOST_VER:.=_%
set EXPAT_UVER=%EXPAT_VER:.=_%
set OPENSSL_UVER=%OPENSSL_VER:.=_%
-if NOT defined BUILD_TOOLS set BUILD_TOOLS="OFF"
+if NOT defined BUILD_TOOLS set BUILD_TOOLS=OFF
:: nmake cannot create environment variables
if NOT defined GENERATOR set GENERATOR="Visual Studio 16 2019"