Skip to content

Commit 09e0e04

Browse files
authored
Merge pull request #2095 from Unidata/condaforge-hdf5-version-check.wif
Revamping the HDF5_VERSION logic.
2 parents f4349ef + 9e6b6bc commit 09e0e04

File tree

2 files changed

+90
-26
lines changed

2 files changed

+90
-26
lines changed

CMakeLists.txt

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#Minimum required CMake Version
1010
cmake_minimum_required(VERSION 3.6.1)
1111

12-
#Project Name
12+
#Project Name
1313
project(netCDF LANGUAGES C CXX)
1414
set(PACKAGE "netCDF" CACHE STRING "")
1515

@@ -606,11 +606,20 @@ ENDIF(ENABLE_STRICT_NULL_BYTE_HEADER_PADDING)
606606
##
607607
SET(USE_HDF5 ${ENABLE_HDF5})
608608
IF(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)

ncdap_test/CMakeLists.txt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ IF(ENABLE_TESTS)
3535
IF(BUILD_UTILITIES)
3636
add_sh_test(ncdap tst_ncdap3)
3737
add_sh_test(ncdap testpathcvt)
38-
SET_TESTS_PROPERTIES(ncdap_tst_ncdap3 ncdap_testpathcvt PROPERTIES RUN_SERIAL TRUE)
39-
ENDIF()
38+
IF(HAVE_BASH)
39+
SET_TESTS_PROPERTIES(ncdap_tst_ncdap3 PROPERTIES RUN_SERIAL TRUE)
40+
SET_TESTS_PROPERTIES(ncdap_testpathcvt PROPERTIES RUN_SERIAL TRUE)
41+
ENDIF(HAVE_BASH)
42+
43+
44+
ENDIF()
4045

4146
IF(NOT MSVC)
4247
add_bin_env_test(ncdap t_dap3a)
@@ -49,6 +54,9 @@ ENDIF()
4954
IF(BUILD_UTILITIES)
5055
add_sh_test(ncdap tst_ber)
5156
add_sh_test(ncdap tst_remote3)
57+
IF(HAVE_BASH)
58+
SET_TESTS_PROPERTIES(ncdap_tst_remote3 PROPERTIES RUN_SERIAL TRUE)
59+
ENDIF(HAVE_BASH)
5260
add_sh_test(ncdap tst_zero_len_var)
5361
add_sh_test(ncdap tst_encode)
5462
# not yet add_sh_test(ncdap tst_hyrax)
@@ -59,7 +67,7 @@ ENDIF()
5967
SET_TESTS_PROPERTIES(ncdap_tst_longremote3 ncdap_test_manyurls PROPERTIES RUN_SERIAL TRUE)
6068
ENDIF(ENABLE_DAP_LONG_TESTS)
6169

62-
SET_TESTS_PROPERTIES(ncdap_tst_remote3 PROPERTIES RUN_SERIAL TRUE)
70+
6371

6472
ENDIF(BUILD_UTILITIES)
6573

0 commit comments

Comments
 (0)