99#Minimum required CMake Version
1010cmake_minimum_required (VERSION 3.6.1 )
1111
12- #Project Name
12+ #Project Name
1313project (netCDF LANGUAGES C CXX )
1414set (PACKAGE "netCDF" CACHE STRING "" )
1515
@@ -606,11 +606,20 @@ ENDIF(ENABLE_STRICT_NULL_BYTE_HEADER_PADDING)
606606##
607607SET (USE_HDF5 ${ENABLE_HDF5} )
608608IF (USE_HDF5)
609+
610+ ##
611+ # Assert HDF5 version meets minimum required version.
612+ ##
613+ SET (HDF5_VERSION_REQUIRED 1.8.10)
614+
615+
609616 ##
610617 # Accommodate developers who have hdf5 libraries and
611618 # headers on their system, but do not have a the hdf
612619 # .cmake files. If this is the case, they should
613620 # specify HDF5_HL_LIBRARY, HDF5_LIBRARY, HDF5_INCLUDE_DIR manually.
621+ #
622+ # This script will attempt to determine the version of the HDF5 library programatically.
614623 ##
615624 IF (HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
616625 SET (HDF5_LIBRARIES ${HDF5_C_LIBRARY} ${HDF5_HL_LIBRARY} )
@@ -624,10 +633,27 @@ IF(USE_HDF5)
624633 file (READ "${HDF5_INCLUDE_DIR} /H5pubconf.h" _hdf5_version_lines
625634 REGEX "#define[ \t ]+H5_VERSION" )
626635 string (REGEX REPLACE ".*H5_VERSION .*\"\( .*\)\" .*" "\\ 1" _hdf5_version "${_hdf5_version_lines} " )
627- set (HDF5_VERSION "${_hdf5_version} " )
636+ set (HDF5_VERSION "${_hdf5_version} " CACHE STRING "" )
628637 unset (_hdf5_version)
629638 unset (_hdf5_version_lines)
630639 endif ()
640+ MESSAGE (STATUS "Found HDF5 libraries version ${HDF5_VERSION} " )
641+ ###
642+ # If HDF5_VERSION is still empty, we have a problem.
643+ # Error out.
644+ ###
645+ IF ("${HDF5_VERSION} " STREQUAL "" )
646+ MESSAGE (FATAL_ERR "Unable to determine HDF5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED} . Please ensure that libhdf5 is installed and accessible." )
647+ ENDIF ()
648+
649+ ###
650+ # Now that we know HDF5_VERSION isn't empty, we can check for minimum required version,
651+ # and toggle various options.
652+ ###
653+ IF (${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED} )
654+ MESSAGE (FATAL_ERROR "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED} . Found ${HDF5_VERSION} ." )
655+ ENDIF ()
656+
631657 ELSE (HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR ) # We are seeking out HDF5 with Find Package.
632658 ###
633659 # For now we assume that if we are building netcdf
@@ -665,25 +691,49 @@ IF(USE_HDF5)
665691 # HDF5 variables we need to munge.
666692 ##
667693
668- ##
669- # Assert HDF5 version meets minimum required version.
670- ##
671- SET (HDF5_VERSION_REQUIRED 1.8.10)
672-
694+ # Some versions of HDF5 set HDF5_VERSION_STRING instead of HDF5_VERSION
673695 IF (HDF5_VERSION_STRING AND NOT HDF5_VERSION)
674696 SET (HDF5_VERSION ${HDF5_VERSION_STRING} )
675697 ENDIF ()
698+
699+
700+ ###
701+ # If HDF5_VERSION is undefined, attempt to determine it programatically.
702+ ###
676703 IF ("${HDF5_VERSION} " STREQUAL "" )
677- MESSAGE (STATUS "Unable to determine hdf5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED} " )
678- ELSE ()
679- IF (${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED} )
680- MESSAGE (FATAL_ERROR
681- "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED} . Found ${HDF5_VERSION} ." )
682- ELSE ()
704+ MESSAGE (STATUS "HDF5_VERSION not detected. Attempting to determine programatically." )
705+ IF (EXISTS "${HDF5_INCLUDE_DIR} /H5pubconf.h" )
706+ file (READ "${HDF5_INCLUDE_DIR} /H5pubconf.h" _hdf5_version_lines
707+ REGEX "#define[ \t ]+H5_VERSION" )
708+ string (REGEX REPLACE ".*H5_VERSION .*\"\( .*\)\" .*" "\\ 1" _hdf5_version "${_hdf5_version_lines} " )
709+ set (HDF5_VERSION "${_hdf5_version} " CACHE STRING "" )
710+ unset (_hdf5_version)
711+ unset (_hdf5_version_lines)
683712 MESSAGE (STATUS "Found HDF5 libraries version ${HDF5_VERSION} " )
684713 ENDIF ()
714+ ELSE ()
715+ SET (HDF5_VERSION ${HDF5_VERSION} CACHE STRING "" )
685716 ENDIF ()
686717
718+ ###
719+ # If HDF5_VERSION is still empty, we have a problem.
720+ # Error out.
721+ ###
722+ IF ("${HDF5_VERSION} " STREQUAL "" )
723+ MESSAGE (FATAL_ERR "Unable to determine HDF5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED} . Please ensure that libhdf5 is installed and accessible." )
724+ ENDIF ()
725+
726+ ###
727+ # Now that we know HDF5_VERSION isn't empty, we can check for minimum required version,
728+ # and toggle various options.
729+ ###
730+
731+ IF (${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED} )
732+ MESSAGE (FATAL_ERROR "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED} . Found ${HDF5_VERSION} ." )
733+ ENDIF ()
734+
735+
736+
687737 ##
688738 # Include the HDF5 include directory.
689739 ##
@@ -718,6 +768,10 @@ IF(USE_HDF5)
718768 ENDIF (${HDF5_VERSION} VERSION_GREATER "1.8.15" )
719769
720770 ELSE (MSVC )
771+ ####
772+ # Environmental variables in Windows when using MSVC
773+ # are a hot mess between versions.
774+ ####
721775
722776 IF (HDF5_hdf5_LIBRARY AND NOT HDF5_C_LIBRARY)
723777 SET (HDF5_C_LIBRARY ${HDF5_hdf5_LIBRARY} )
@@ -764,6 +818,18 @@ IF(USE_HDF5)
764818 MESSAGE (STATUS "HDF5 has szip." )
765819 ENDIF ()
766820
821+ ####
822+ # Check to see if HDF5 library is 1.10.6 or greater.
823+ # Used to control path name conversion
824+ ####
825+ IF (${HDF5_VERSION} VERSION_GREATER "1.10.5" )
826+ SET (HDF5_UTF8_PATHS ON )
827+ ELSE ()
828+ SET (HDF5_UTF8_PATHS OFF )
829+ ENDIF ()
830+
831+ MESSAGE ("-- HDF5_UTF8_PATHS (HDF5 version 1.10.6+): ${HDF5_UTF8_PATHS} " )
832+
767833 # Find out if HDF5 was built with parallel support.
768834 # Do that by checking for the targets H5Pget_fapl_mpiposx and
769835 # H5Pget_fapl_mpio in ${HDF5_LIB}.
@@ -816,16 +882,6 @@ IF(USE_HDF5)
816882 SET (HAS_PAR_FILTERS no CACHE STRING "" )
817883 ENDIF ()
818884
819- # Check to see if HDF5 library is 1.10.6 or greater.
820- # Used to control path name conversion
821- IF (${HDF5_VERSION} VERSION_GREATER "1.10.5" )
822- SET (HDF5_UTF8_PATHS ON )
823- ELSE ()
824- SET (HDF5_UTF8_PATHS OFF )
825- ENDIF ()
826-
827- MESSAGE ("-- Checking for HDF5 version 1.10.6 or later: ${HDF5_UTF8_PATHS} " )
828-
829885 FIND_PATH (HAVE_HDF5_H hdf5.h PATHS ${HDF5_INCLUDE_DIR} NO_DEFAULT_PATH )
830886 FIND_PATH (HAVE_HDF5_H hdf5.h )
831887 IF (NOT HAVE_HDF5_H)
0 commit comments