mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-27 08:49:16 +08:00
f00d03284a
The remote test server is up again. So re-enable. Also do some test cleanup.
2513 lines
81 KiB
CMake
2513 lines
81 KiB
CMake
## 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 LANGUAGES C CXX)
|
|
set(PACKAGE "netCDF" CACHE STRING "")
|
|
|
|
# Use libraries specified in CMAKE_REQUIRED_LIBRARIES for check include macros
|
|
cmake_policy(SET CMP0075 NEW)
|
|
|
|
#####
|
|
# 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 8)
|
|
SET(NC_VERSION_PATCH 2)
|
|
SET(NC_VERSION_NOTE "-development")
|
|
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 19)
|
|
SET(netCDF_SO_VERSION 19)
|
|
SET(PACKAGE_VERSION ${VERSION})
|
|
|
|
# Version of the dispatch table. This must match the value in
|
|
# configure.ac.
|
|
SET(NC_DISPATCH_VERSION 4)
|
|
|
|
# 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_BINARY_DIR}/include)
|
|
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(CHUNK_CACHE_SIZE_NCZARR 4194304 CACHE STRING "Default NCZarr Chunk Cache Size.")
|
|
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.
|
|
###
|
|
|
|
################################
|
|
# Format Option checks
|
|
################################
|
|
|
|
# We need to now treat enable-netcdf4 and enable-hdf5 as separate,
|
|
# but for back compatability, we need to treat enable-netcdf4
|
|
# as equivalent to enable-hdf5.
|
|
# We detect this using these rules:
|
|
# 1. if ENABLE_HDF5 is off then disable hdf5
|
|
# 2. if ENABLE_NETCDF4 is off then disable hdf5
|
|
# 3. else enable hdf5
|
|
OPTION(ENABLE_NETCDF_4 "Use HDF5." ON)
|
|
OPTION(ENABLE_NETCDF4 "Use HDF5." ON)
|
|
OPTION(ENABLE_HDF5 "Use HDF5." ON)
|
|
IF(NOT ENABLE_HDF5 OR NOT ENABLE_NETCDF4 OR NOT ENABLE_NETCDF_4)
|
|
SET(ENABLE_HDF5 OFF CACHE BOOL "Use HDF5" FORCE)
|
|
ENDIF()
|
|
OPTION(ENABLE_HDF4 "Build netCDF-4 with HDF4 read capability(HDF4, HDF5 and Zlib required)." OFF)
|
|
OPTION(ENABLE_DAP "Enable DAP2 and DAP4 Client." ON)
|
|
OPTION(ENABLE_NCZARR "Enable NCZarr Client." ON)
|
|
OPTION(ENABLE_PNETCDF "Build with parallel I/O for CDF-1, 2, and 5 files using PnetCDF." OFF)
|
|
SET(ENABLE_CDF5 AUTO CACHE STRING "AUTO")
|
|
OPTION(ENABLE_CDF5 "Enable CDF5 support" ON)
|
|
|
|
# Netcdf-4 support (i.e. libsrc4) is required by more than just HDF5 (e.g. NCZarr)
|
|
# So depending on what above formats are enabled, enable netcdf-4
|
|
if(ENABLE_HDF5 OR ENABLE_HDF4 OR ENABLE_NCZARR)
|
|
SET(ENABLE_NETCDF_4 ON CACHE BOOL "Enable netCDF-4 API" FORCE)
|
|
SET(ENABLE_NETCDF4 ON CACHE BOOL "Enable netCDF4 Alias" FORCE)
|
|
endif()
|
|
|
|
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)
|
|
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.")
|
|
|
|
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()
|
|
|
|
# This has multiversion capability
|
|
SET(ENABLE_MULTIFILTERS yes CACHE BOOL "")
|
|
|
|
# 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
|
|
# *
|
|
##
|
|
SET(USE_HDF5 ${ENABLE_HDF5})
|
|
IF(USE_HDF5)
|
|
|
|
##
|
|
# Assert HDF5 version meets minimum required version.
|
|
##
|
|
SET(HDF5_VERSION_REQUIRED 1.8.10)
|
|
|
|
|
|
##
|
|
# 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.
|
|
#
|
|
# This script will attempt to determine the version of the HDF5 library programatically.
|
|
##
|
|
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}")
|
|
if (EXISTS "${HDF5_INCLUDE_DIR}/H5pubconf.h")
|
|
file(READ "${HDF5_INCLUDE_DIR}/H5pubconf.h" _hdf5_version_lines
|
|
REGEX "#define[ \t]+H5_VERSION")
|
|
string(REGEX REPLACE ".*H5_VERSION .*\"\(.*\)\".*" "\\1" _hdf5_version "${_hdf5_version_lines}")
|
|
set(HDF5_VERSION "${_hdf5_version}" CACHE STRING "")
|
|
unset(_hdf5_version)
|
|
unset(_hdf5_version_lines)
|
|
endif ()
|
|
MESSAGE(STATUS "Found HDF5 libraries version ${HDF5_VERSION}")
|
|
###
|
|
# If HDF5_VERSION is still empty, we have a problem.
|
|
# Error out.
|
|
###
|
|
IF("${HDF5_VERSION}" STREQUAL "")
|
|
MESSAGE(FATAL_ERR "Unable to determine HDF5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED}. Please ensure that libhdf5 is installed and accessible.")
|
|
ENDIF()
|
|
|
|
###
|
|
# Now that we know HDF5_VERSION isn't empty, we can check for minimum required version,
|
|
# and toggle various options.
|
|
###
|
|
IF(${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED})
|
|
MESSAGE(FATAL_ERROR "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED}. Found ${HDF5_VERSION}.")
|
|
ENDIF()
|
|
|
|
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.
|
|
##
|
|
|
|
# Some versions of HDF5 set HDF5_VERSION_STRING instead of HDF5_VERSION
|
|
IF(HDF5_VERSION_STRING AND NOT HDF5_VERSION)
|
|
SET(HDF5_VERSION ${HDF5_VERSION_STRING})
|
|
ENDIF()
|
|
|
|
|
|
###
|
|
# If HDF5_VERSION is undefined, attempt to determine it programatically.
|
|
###
|
|
IF("${HDF5_VERSION}" STREQUAL "")
|
|
MESSAGE(STATUS "HDF5_VERSION not detected. Attempting to determine programatically.")
|
|
IF (EXISTS "${HDF5_INCLUDE_DIR}/H5pubconf.h")
|
|
file(READ "${HDF5_INCLUDE_DIR}/H5pubconf.h" _hdf5_version_lines
|
|
REGEX "#define[ \t]+H5_VERSION")
|
|
string(REGEX REPLACE ".*H5_VERSION .*\"\(.*\)\".*" "\\1" _hdf5_version "${_hdf5_version_lines}")
|
|
set(HDF5_VERSION "${_hdf5_version}" CACHE STRING "")
|
|
unset(_hdf5_version)
|
|
unset(_hdf5_version_lines)
|
|
MESSAGE(STATUS "Found HDF5 libraries version ${HDF5_VERSION}")
|
|
ENDIF()
|
|
ELSE()
|
|
SET(HDF5_VERSION ${HDF5_VERSION} CACHE STRING "")
|
|
ENDIF()
|
|
|
|
###
|
|
# If HDF5_VERSION is still empty, we have a problem.
|
|
# Error out.
|
|
###
|
|
IF("${HDF5_VERSION}" STREQUAL "")
|
|
MESSAGE(FATAL_ERR "Unable to determine HDF5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED}. Please ensure that libhdf5 is installed and accessible.")
|
|
ENDIF()
|
|
|
|
###
|
|
# Now that we know HDF5_VERSION isn't empty, we can check for minimum required version,
|
|
# and toggle various options.
|
|
###
|
|
|
|
IF(${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED})
|
|
MESSAGE(FATAL_ERROR "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED}. Found ${HDF5_VERSION}.")
|
|
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)
|
|
####
|
|
# Environmental variables in Windows when using MSVC
|
|
# are a hot mess between versions.
|
|
####
|
|
|
|
##
|
|
# 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()
|
|
|
|
# Some versions of FIND_PACKAGE set HDF5_C_LIBRARIES, but not HDF5_C_LIBRARY
|
|
# We use HDF5_C_LIBRARY below, so need to make sure it is set.
|
|
IF(HDF5_C_LIBRARIES AND NOT HDF5_C_LIBRARY)
|
|
SET(HDF5_C_LIBRARY ${HDF5_C_LIBRARIES})
|
|
ENDIF()
|
|
|
|
# Same issue as above...
|
|
IF(HDF5_HL_LIBRARIES AND NOT HDF5_HL_LIBRARY)
|
|
SET(HDF5_HL_LIBRARY ${HDF5_HL_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_PATH(HAVE_HDF5_H hdf5.h PATHS ${HDF5_INCLUDE_DIR} NO_DEFAULT_PATH)
|
|
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)
|
|
|
|
set (CMAKE_REQUIRED_INCLUDES ${HDF5_INCLUDE_DIR})
|
|
|
|
# Check to ensure that HDF5 was built with zlib.
|
|
# This needs to be near the beginning since we
|
|
# need to know whether to add "-lz" to the symbol
|
|
# tests below.
|
|
CHECK_C_SOURCE_COMPILES("#include <H5public.h>
|
|
#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.")
|
|
ELSE()
|
|
# If user has specified the `ZLIB_LIBRARY`, use it; otherwise try to find...
|
|
IF(NOT ZLIB_LIBRARY)
|
|
find_package(ZLIB)
|
|
IF(ZLIB_FOUND)
|
|
SET(ZLIB_LIBRARY ${ZLIB_LIBRARIES})
|
|
ELSE()
|
|
MESSAGE(FATAL_ERROR "HDF5 Requires ZLIB, but cannot find libz.")
|
|
ENDIF()
|
|
ENDIF()
|
|
SET(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARY} ${CMAKE_REQUIRED_LIBRARIES})
|
|
MESSAGE(STATUS "HDF5 has zlib.")
|
|
ENDIF()
|
|
|
|
#Check to see if H5Z_SZIP exists in HDF5_Libraries. If so, we must use szip library.
|
|
CHECK_C_SOURCE_COMPILES("#include <H5public.h>
|
|
#if !H5_HAVE_FILTER_SZIP
|
|
#error
|
|
#endif
|
|
int main() {
|
|
int x = 1;}" USE_SZIP)
|
|
IF(USE_SZIP)
|
|
# If user has specified the `SZIP_LIBRARY`, use it; otherwise try to find...
|
|
IF(NOT SZIP_LIBRARY)
|
|
FIND_LIBRARY(SZIP PATH NAMES szip sz)
|
|
SET(SZIP_LIBRARY ${SZIP})
|
|
IF(NOT SZIP)
|
|
MESSAGE(FATAL_ERROR "HDF5 Requires SZIP, but cannot find libszip or libsz.")
|
|
ENDIF()
|
|
ENDIF()
|
|
SET(HAVE_H5Z_SZIP 1)
|
|
SET(CMAKE_REQUIRED_LIBRARIES ${SZIP_LIBRARY} ${CMAKE_REQUIRED_LIBRARIES})
|
|
MESSAGE(STATUS "HDF5 has szip.")
|
|
ENDIF()
|
|
|
|
####
|
|
# Check to see if HDF5 library is 1.10.6 or greater.
|
|
# Used to control path name conversion
|
|
####
|
|
IF(${HDF5_VERSION} VERSION_GREATER "1.10.5")
|
|
SET(HDF5_UTF8_PATHS ON)
|
|
ELSE()
|
|
SET(HDF5_UTF8_PATHS OFF)
|
|
ENDIF()
|
|
|
|
MESSAGE("-- HDF5_UTF8_PATHS (HDF5 version 1.10.6+): ${HDF5_UTF8_PATHS}")
|
|
|
|
# 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_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 H5Dread_chunk is available
|
|
CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Dread_chunk "" HAS_READCHUNKS)
|
|
|
|
# Check to see if H5Pset_fapl_ros3 is available
|
|
CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_fapl_ros3 "" HAS_HDF5_ROS3)
|
|
|
|
# Check to see if this is hdf5-1.10.3 or later.
|
|
IF(HAS_READCHUNKS)
|
|
SET(HDF5_SUPPORTS_PAR_FILTERS ON)
|
|
SET(ENABLE_NCDUMPCHUNKS ON)
|
|
ENDIF()
|
|
|
|
# Record if ROS3 Driver is available
|
|
IF(HAS_HDF5_ROS3)
|
|
SET(ENABLE_HDF5_ROS3 ON)
|
|
ENDIF()
|
|
|
|
IF (HDF5_SUPPORTS_PAR_FILTERS)
|
|
SET(HDF5_HAS_PAR_FILTERS TRUE CACHE BOOL "")
|
|
SET(HAS_PAR_FILTERS yes CACHE STRING "")
|
|
ELSE()
|
|
SET(HDF5_HAS_PAR_FILTERS FALSE CACHE BOOL "")
|
|
SET(HAS_PAR_FILTERS no CACHE STRING "")
|
|
ENDIF()
|
|
|
|
FIND_PATH(HAVE_HDF5_H hdf5.h PATHS ${HDF5_INCLUDE_DIR} NO_DEFAULT_PATH)
|
|
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)
|
|
|
|
#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)
|
|
|
|
# See if we have libcurl
|
|
FIND_PACKAGE(CURL)
|
|
ADD_DEFINITIONS(-DCURL_STATICLIB=1)
|
|
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS})
|
|
|
|
# Define a test flag for have curl library
|
|
IF(CURL_LIBRARIES OR CURL_LIBRARY)
|
|
SET(FOUND_CURL TRUE)
|
|
ELSE()
|
|
SET(FOUND_CURL FALSE)
|
|
ENDIF()
|
|
|
|
set (CMAKE_REQUIRED_INCLUDES ${CURL_INCLUDE_DIRS})
|
|
# Check to see if we have libcurl 7.66 or later
|
|
CHECK_C_SOURCE_COMPILES("
|
|
#include <curl/curl.h>
|
|
int main() {
|
|
#if LIBCURL_VERSION_NUM < 0x074200
|
|
choke me;
|
|
#endif
|
|
}" HAVE_LIBCURL_766)
|
|
|
|
IF (HAVE_LIBCURL_766)
|
|
# If libcurl version is >= 7.66, then can skip tests
|
|
# for these symbols which were added in an earlier version
|
|
set(HAVE_CURLOPT_USERNAME TRUE)
|
|
set(HAVE_CURLOPT_PASSWORD TRUE)
|
|
set(HAVE_CURLOPT_KEYPASSWD TRUE)
|
|
set(HAVE_CURLINFO_RESPONSE_CODE TRUE)
|
|
set(HAVE_CURLINFO_HTTP_CONNECTCODE TRUE)
|
|
set(HAVE_CURLOPT_BUFFERSIZE TRUE)
|
|
set(HAVE_CURLOPT_KEEPALIVE TRUE)
|
|
ELSE()
|
|
# Check to see if CURLOPT_USERNAME is defined.
|
|
# It is present starting version 7.19.1.
|
|
CHECK_C_SOURCE_COMPILES("
|
|
#include <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
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 <curl/curl.h>
|
|
int main() {int x = CURLOPT_TCP_KEEPALIVE;}" HAVE_CURLOPT_KEEPALIVE)
|
|
ENDIF()
|
|
|
|
IF(ENABLE_DAP)
|
|
SET(USE_DAP ON CACHE BOOL "")
|
|
SET(ENABLE_DAP2 ON CACHE BOOL "")
|
|
|
|
IF(ENABLE_HDF5)
|
|
SET(ENABLE_DAP4 ON CACHE BOOL "")
|
|
ENDIF(ENABLE_HDF5)
|
|
|
|
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)
|
|
|
|
# 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_REMOTE_TESTS "Enable DAP remote tests." ON)
|
|
|
|
OPTION(ENABLE_DAP_LONG_TESTS "Enable DAP long tests." OFF)
|
|
SET(REMOTETESTSERVERS "remotetest.unidata.ucar.edu" CACHE STRING "test servers to use for remote test")
|
|
|
|
# See if we have zlib
|
|
FIND_PACKAGE(ZLIB)
|
|
|
|
# Define a test flag for have zlib library
|
|
IF(ZLIB_FOUND)
|
|
INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS})
|
|
SET(ENABLE_ZLIB TRUE)
|
|
ELSE()
|
|
SET(ENABLE_ZLIB FALSE)
|
|
ENDIF()
|
|
|
|
# See if we have libblosc
|
|
IF(!MSVC)
|
|
FIND_PACKAGE(Blosc)
|
|
ENDIF()
|
|
# Define a test flag for have blosc library
|
|
IF(Blosc_FOUND)
|
|
INCLUDE_DIRECTORIES(${Blosc_INCLUDE_DIRS})
|
|
SET(ENABLE_BLOSC TRUE)
|
|
ELSE()
|
|
SET(ENABLE_BLOSC FALSE)
|
|
ENDIF()
|
|
|
|
# See if we have libszip
|
|
IF(!MSVC)
|
|
#FIND_PACKAGE(SZIP)
|
|
#FIND_LIBRARY(SZIP PATH NAMES szip sz)
|
|
SET(SZIP_LIBRARY ${SZIP})
|
|
ENDIF()
|
|
# Define a test flag for have szip library
|
|
IF(SZIP_FOUND)
|
|
INCLUDE_DIRECTORIES(${SZIP_INCLUDE_DIRS})
|
|
SET(ENABLE_SZIP TRUE)
|
|
ELSE()
|
|
SET(ENABLE_SZIP FALSE)
|
|
ENDIF()
|
|
|
|
# See if we have libzip
|
|
FIND_PACKAGE(Zip)
|
|
|
|
# Define a test flag for have zip library
|
|
IF(Zip_FOUND)
|
|
INCLUDE_DIRECTORIES(${Zip_INCLUDE_DIRS})
|
|
SET(ENABLE_NCZARR_ZIP TRUE)
|
|
ELSE()
|
|
SET(ENABLE_NCZARR_ZIP FALSE)
|
|
ENDIF()
|
|
|
|
# libdl is always available; built-in in Windows and OSX
|
|
SET(ENABLE_PLUGINS TRUE)
|
|
IF(NOT WIN32)
|
|
IF(HAVE_DLFCN_H)
|
|
INCLUDE_DIRECTORIES("dlfcn.h")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
# 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 or some tests,
|
|
# 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 "")
|
|
# Copy XGetopt.c to everywhere it is needed. Avoids
|
|
# inconsistent code
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/ncgen3/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/ncgen/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/ncdump/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/libsrc/XGetopt.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/ncdap_test/)
|
|
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()
|
|
|
|
# Options to Extend NCZarr support
|
|
OPTION(ENABLE_NCZARR_S3 "Enable NCZarr S3 support." OFF)
|
|
OPTION(ENABLE_NCZARR_S3_TESTS "Enable NCZarr S3 tests." OFF)
|
|
|
|
IF(ENABLE_NCZARR_S3_TESTS AND NOT ENABLE_NCZARR_S3)
|
|
message(FATAL_ERROR "NCZarr S3 support is disabled; please specify option -DENABLE_NCZARR_S3_TESTS=no")
|
|
SET(ENABLE_NCZARR_S3_TESTS OFF CACHE BOOL "NCARR S3 TESTS" FORCE)
|
|
ENDIF()
|
|
|
|
# See if aws-s3-sdk is available
|
|
# But only if enabled
|
|
IF(ENABLE_NCZARR_S3)
|
|
find_package(AWSSDK REQUIRED COMPONENTS s3;core)
|
|
IF(AWSSDK_FOUND)
|
|
SET(service s3;core)
|
|
AWSSDK_DETERMINE_LIBS_TO_LINK(service AWS_LINK_LIBRARIES)
|
|
SET(ENABLE_S3_SDK ON CACHE BOOL "S3 SDK" FORCE)
|
|
ELSE()
|
|
SET(ENABLE_S3_SDK OFF CACHE BOOL "S3 SDK" FORCE)
|
|
ENDIF()
|
|
ELSE(ENABLE_NCZARR_S3)
|
|
# Unconditionally disable
|
|
SET(ENABLE_S3_SDK OFF CACHE BOOL "S3 SDK" FORCE)
|
|
ENDIF(ENABLE_NCZARR_S3)
|
|
|
|
IF(NOT ENABLE_S3_SDK)
|
|
IF(ENABLE_NCZARR_S3 OR ENABLE_NCZARR_S3_TESTS)
|
|
message(FATAL_ERROR "S3 support library not found; please specify option DENABLE_NCZARR_S3=NO")
|
|
SET(ENABLE_NCZARR_S3 OFF CACHE BOOL "NCZARR S3 support" FORCE)
|
|
SET(ENABLE_NCZARR_S3_TESTS OFF CACHE BOOL "S3 tests" FORCE)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
IF(ENABLE_NCZARR_S3_TESTS)
|
|
message(WARNING "**** DO NOT ENABLE_NCZARR_S3_TESTS UNLESS YOU HAVE ACCESS TO THE UNIDATA S3 BUCKET! ***")
|
|
ENDIF()
|
|
|
|
# Start disabling if curl not found
|
|
IF(NOT FOUND_CURL)
|
|
IF(ENABLE_BYTERANGE)
|
|
MESSAGE(FATAL_ERROR "Byte-range support specified, CURL libraries are not found.")
|
|
ENDIF()
|
|
|
|
IF(ENABLE_DAP2 OR ENABLE_DAP4)
|
|
MESSAGE(WARNING "CURL libraries are not found; DAP support disabled")
|
|
SET(ENABLE_DAP2 OFF CACHE BOOL "Use DAP2" FORCE)
|
|
SET(ENABLE_DAP4 OFF CACHE BOOL "Use DAP4" FORCE)
|
|
ENDIF()
|
|
|
|
IF(ENABLE_HDF5_ROS3)
|
|
MESSAGE(WARNING "CURL libraries are not found; ROS3 support disabled.")
|
|
SET(ENABLE_HDF5_ROS3 OFF CACHE BOOL "Use ROS3" FORCE)
|
|
ENDIF()
|
|
|
|
IF(ENABLE_NCZARR_S3)
|
|
MESSAGE(FATAL_ERROR "NCZarr S3 support specified, CURL libraries are not found.")
|
|
ENDIF()
|
|
ENDIF(NOT FOUND_CURL)
|
|
|
|
|
|
OPTION(ENABLE_LIBXML2 "Link against libxml2 if it is available, use the packaged ezxml parser otherwise." ON)
|
|
SET(XMLPARSER "ezxml (bundled)")
|
|
# see if we have libxml2
|
|
|
|
IF(ENABLE_LIBXML2)
|
|
find_package(LibXml2)
|
|
IF(LibXml2_FOUND)
|
|
SET(HAVE_LIBXML2 TRUE)
|
|
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIRS})
|
|
SET(XMLPARSER "libxml2")
|
|
ELSE()
|
|
SET(HAVE_LIBXML2 FALSE)
|
|
ENDIF()
|
|
ENDIF(ENABLE_LIBXML2)
|
|
|
|
IF(NOT ENABLE_BYTERANGE AND ENABLE_HDF5_ROS3)
|
|
MESSAGE(WARNING "ROS3 support requires ENABLE_BYTERANGE=TRUE; disabling ROS3 support")
|
|
SET(ENABLE_HDF5_ROS3 OFF CACHE BOOL "ROS3 support" FORCE)
|
|
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)
|
|
|
|
# There is a special class of tests that currently fail because of memory leaks.
|
|
# As with failing tests, they can be enabled to work on them
|
|
OPTION(ENABLE_UNFIXED_MEMORY_LEAKS "Run tests with unfixed memory leaks" OFF)
|
|
|
|
###
|
|
# Option to turn on unit testing. See
|
|
# https://github.com/Unidata/netcdf-c/pull/1472 for more information.
|
|
###
|
|
OPTION(ENABLE_UNIT_TESTS "Run Unit Tests." OFF)
|
|
|
|
###
|
|
# 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 HDF5 is not Enabled" OFF)
|
|
IF(NOT ENABLE_HDF5 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_HDF5)
|
|
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")
|
|
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." "${HDF5_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" yes)
|
|
|
|
IF(ENABLE_FILTER_TESTING)
|
|
if(NOT ENABLE_HDF5 AND NOT ENABLE_NCZARR)
|
|
MESSAGE(WARNING "ENABLE_FILTER_TESTING requires HDF5 and/or NCZarr. Disabling.")
|
|
SET(ENABLE_FILTER_TESTING OFF CACHE BOOL "Enable Filter Testing" FORCE)
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
IF(NOT BUILD_SHARED_LIBS)
|
|
MESSAGE(WARNING "ENABLE_FILTER_TESTING requires shared libraries. Disabling.")
|
|
SET(ENABLE_FILTER_TESTING OFF)
|
|
ENDIF()
|
|
|
|
SET(ENABLE_CLIENTSIDE_FILTERS OFF)
|
|
|
|
# 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)
|
|
|
|
# Always enable quantization.
|
|
OPTION(ENABLE_QUANTIZE "Enable variable quantization" 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)
|
|
CHECK_INCLUDE_FILE("execinfo.h" HAVE_EXECINFO_H)
|
|
CHECK_INCLUDE_FILE("dirent.h" HAVE_DIRENT_H)
|
|
CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H)
|
|
CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_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.
|
|
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" SIZEOF_UINT64)
|
|
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)
|
|
|
|
CHECK_TYPE_SIZE("uint64_t" SIZEOF_UINT64_T)
|
|
IF(SIZEOF_UINT64_T)
|
|
SET(HAVE_UINT64_T TRUE)
|
|
ENDIF(SIZEOF_UINT64_T)
|
|
|
|
# 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_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
|
|
CHECK_SYMBOL_EXISTS("struct timespec" "time.h" HAVE_STRUCT_TIMESPEC)
|
|
CHECK_FUNCTION_EXISTS(atexit HAVE_ATEXIT)
|
|
|
|
# Control invoking nc_finalize at exit
|
|
OPTION(ENABLE_ATEXIT_FINALIZE "Invoke nc_finalize at exit." ON)
|
|
IF(NOT HAVE_ATEXIT)
|
|
IF(ENABLE_ATEXIT_FINALIZE AND NOT HAVE_ATEXIT)
|
|
SET(ENABLE_ATEXIT_FINALIZE OFF CACHE BOOL "Enable ATEXIT" FORCE)
|
|
MESSAGE(WARNING "ENABLE_ATEXIT_FINALIZE set but atexit() function not defined")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
# 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 <sys/mman.h>
|
|
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.")
|
|
SET(HAVE_M4 FALSE)
|
|
ENDIF()
|
|
|
|
MACRO(GEN_m4 filename)
|
|
|
|
set(dest "${CMAKE_CURRENT_SOURCE_DIR}/${filename}.c")
|
|
|
|
# If m4 isn't present, and the generated file doesn't exist,
|
|
# it cannot be generated and an error should be thrown.
|
|
IF(NOT HAVE_M4)
|
|
IF(NOT EXISTS ${dest})
|
|
MESSAGE(FATAL_ERROR "m4 is required to generate ${dest}. Please install m4 so that it is on the PATH and try again.")
|
|
ENDIF()
|
|
ENDIF(NOT HAVE_M4)
|
|
|
|
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 ${dest}
|
|
COMMAND ${NC_M4}
|
|
ARGS ${M4FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${filename}.m4 > ${dest}
|
|
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)
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${F}.c")
|
|
ADD_EXECUTABLE(${F} "${CMAKE_CURRENT_SOURCE_DIR}/${F}.c" ${ARGN})
|
|
else()
|
|
# File should have been copied to the binary directory
|
|
ADD_EXECUTABLE(${F} "${CMAKE_CURRENT_BINARY_DIR}/${F}.c" ${ARGN})
|
|
endif()
|
|
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} ${ARGN})
|
|
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 ${ARGN})
|
|
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 ${F}.sh ${ARGN}")
|
|
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(${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_NETCDF4)
|
|
add_subdirectory(libsrc4)
|
|
ENDIF()
|
|
|
|
IF(USE_HDF5)
|
|
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)
|
|
ADD_SUBDIRECTORY(libncxml)
|
|
ENDIF()
|
|
|
|
IF(ENABLE_PLUGINS)
|
|
ADD_SUBDIRECTORY(libncpoco)
|
|
ENDIF()
|
|
|
|
IF(ENABLE_NCZARR)
|
|
ADD_SUBDIRECTORY(libnczarr)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/unit_test/timer_utils.h
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/unit_test/timer_utils.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/nc_test4/test_filter.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/nc_test4/test_filter_misc.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/nc_test4/test_filter_repeat.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/nc_test4/test_filter_order.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
FILE(COPY ${netCDF_SOURCE_DIR}/nc_test4/tst_multifilter.c
|
|
DESTINATION ${netCDF_BINARY_DIR}/nczarr_test/)
|
|
ENDIF()
|
|
|
|
add_subdirectory(liblib)
|
|
|
|
IF(ENABLE_PLUGINS)
|
|
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_HDF5)
|
|
INCLUDE_DIRECTORIES(h5_test)
|
|
ADD_SUBDIRECTORY(nc_test4)
|
|
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)
|
|
IF(ENABLE_NCZARR)
|
|
ADD_SUBDIRECTORY(nczarr_test)
|
|
ENDIF()
|
|
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(USE_HDF5 HAS_HDF5)
|
|
is_enabled(USE_SZIP HAS_SZIP)
|
|
is_enabled(USE_SZIP HAS_SZIP_WRITE)
|
|
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_DAP2 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(HAVE_H5Z_SZIP HAS_SZLIB)
|
|
is_enabled(HDF5_HAS_PAR_FILTERS HAS_PAR_FILTERS)
|
|
is_enabled(ENABLE_NCZARR HAS_NCZARR)
|
|
is_enabled(ENABLE_NCZARR_S3_TESTS DO_NCZARR_S3_TESTS)
|
|
is_enabled(ENABLE_MULTIFILTERS HAS_MULTIFILTERS)
|
|
is_enabled(ENABLE_NCZARR_ZIP DO_NCZARR_ZIP_TESTS)
|
|
is_enabled(ENABLE_QUANTIZE HAS_QUANTIZE)
|
|
is_enabled(ENABLE_LOGGING HAS_LOGGING)
|
|
is_enabled(ENABLE_FILTER_TESTING DO_FILTER_TESTS)
|
|
is_enabled(ENABLE_BLOSC HAS_BLOSC)
|
|
|
|
# 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(STATUS ${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_BINARY_DIR}/include/netcdf_meta.h @ONLY)
|
|
|
|
#####
|
|
# Create 'netcdf_dispatch.h' include file.
|
|
#####
|
|
configure_file(
|
|
${netCDF_SOURCE_DIR}/include/netcdf_dispatch.h.in
|
|
${netCDF_BINARY_DIR}/include/netcdf_dispatch.h @ONLY NEWLINE_STYLE LF)
|
|
|
|
# Used in the `configure_file` calls below
|
|
SET(ISCMAKE "1")
|
|
IF(MSVC)
|
|
SET(ISMSVC "1")
|
|
ENDIF()
|
|
|
|
####
|
|
# 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}")
|
|
SET(ISMSVC "${MSVC}")
|
|
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
|
|
#####
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/nc_test4/findplugin.in ${CMAKE_CURRENT_BINARY_DIR}/nc_test4/findplugin.sh @ONLY NEWLINE_STYLE LF)
|
|
|
|
IF(ENABLE_NCZARR)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/nc_test4/findplugin.in ${CMAKE_CURRENT_BINARY_DIR}/nczarr_test/findplugin.sh @ONLY NEWLINE_STYLE LF)
|
|
ENDIF()
|
|
|
|
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()
|
|
|
|
IF(ENABLE_TESTS)
|
|
#####
|
|
# Build ncdap_test|dap4_test/findtestserver[4].c
|
|
#####
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/findtestserver.c.in ${CMAKE_CURRENT_BINARY_DIR}/ncdap_test/findtestserver.c @ONLY NEWLINE_STYLE LF)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ncdap_test/findtestserver.c.in ${CMAKE_CURRENT_BINARY_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_BINARY_DIR}/dap4_test/pingurl4.c @ONLY NEWLINE_STYLE LF)
|
|
ENDIF()
|
|
|
|
add_subdirectory(fuzz)
|
|
|
|
####
|
|
# 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
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
|
|
# 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)
|