Skip to content

Commit

Permalink
Merge pull request #2762 from ZedThree/cmake-better-fix-hdf5-check
Browse files Browse the repository at this point in the history
CMake: Find HDF5 header we can safely include for other checks
  • Loading branch information
WardF authored Jan 18, 2024
2 parents f349087 + a8f8f1f commit 359a015
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 18 deletions.
55 changes: 55 additions & 0 deletions cmake/check_hdf5.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Work out which HDF5 config header we can safely include
#
# We'd like to just use H5public.h, but if HDF5 was built against MPI, this
# might require us to have found MPI already. The next best file is H5pubconf.h,
# which actually has all the feature macros we want to check, but some
# distributions rename this for multiarch, so we've got to check some different
# names.
#
# HDF5_INCLUDE_DIR should already be set before calling this
function(check_hdf5_feature_header)
if (_H5_FEATURE_HEADER)
return()
endif()

include(CheckIncludeFile)

set(CMAKE_REQUIRED_INCLUDES ${HDF5_INCLUDE_DIR})

message(STATUS "Checking for HDF5 config header")
foreach(_h5_header "H5public.h" "H5pubconf.h" "H5pubconf-64.h" "H5pubconf-32.h")
check_include_file(${_h5_header} _can_include_h5_header)

if (_can_include_h5_header)
message(STATUS "Using ${_h5_header} to check for feature macros")
set(_H5_FEATURE_HEADER ${_h5_header} CACHE INTERNAL "")
return()
endif()
endforeach()

message(FATAL_ERROR "Could not include any HDF5 config headers")
endfunction()


# Check for an HDF5 feature macro named FEATURE and store the result in VAR
#
# This just wraps `check_c_source_compiles` but ensures we use the correct header
function(check_hdf5_feature VAR FEATURE)
if (NOT _H5_FEATURE_HEADER)
check_hdf5_feature_header()
endif()

include(CheckCSourceCompiles)
set(CMAKE_REQUIRED_INCLUDES ${HDF5_INCLUDE_DIR})

message(STATUS "Checking for ${FEATURE}")
check_c_source_compiles("
#include <${_H5_FEATURE_HEADER}>
#if !${FEATURE}
#error
#endif
int main() {}"
_has_${FEATURE})

set(${VAR} ${_has_${FEATURE}} PARENT_SCOPE)
endfunction()
27 changes: 9 additions & 18 deletions cmake/dependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -302,18 +302,14 @@ if(USE_HDF5)
include_directories(${HAVE_HDF5_H})
endif(NOT HAVE_HDF5_H)

set (CMAKE_REQUIRED_INCLUDES ${HDF5_INCLUDE_DIR})
include(cmake/check_hdf5.cmake)

# 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 <H5pubconf.h>
#if !H5_HAVE_ZLIB_H
#error
#endif
int main() {
int x = 1;}" HAVE_HDF5_ZLIB)

check_hdf5_feature(HAVE_HDF5_ZLIB H5_HAVE_ZLIB_H)
if(NOT HAVE_HDF5_ZLIB)
message(FATAL_ERROR "HDF5 was built without zlib. Rebuild HDF5 with zlib.")
else()
Expand All @@ -330,16 +326,10 @@ if(USE_HDF5)
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 <H5pubconf.h>
#if !H5_HAVE_FILTER_SZIP
#error
#endif
int main() {
int x = 1;}" USE_HDF5_SZIP)
if(USE_HDF5_SZIP)
set(HAVE_H5Z_SZIP yes )
endif()

# Check to see if H5Z_SZIP exists in HDF5_Libraries. If so, we must use szip library.
check_hdf5_feature(HAVE_H5Z_SZIP H5_HAVE_FILTER_SZIP)


####
# Check to see if HDF5 library is 1.10.6 or greater.
Expand Down Expand Up @@ -647,6 +637,7 @@ endif()
################################
# Doxygen
################################

if(ENABLE_DOXYGEN)
find_package(Doxygen REQUIRED)
endif()
Expand All @@ -656,4 +647,4 @@ endif()
################################
if (NETCDF_PACKAGE)
find_program(NC_DPKG NAMES dpkg)
endif()
endif()

0 comments on commit 359a015

Please sign in to comment.