Skip to content

Commit be0dd06

Browse files
committed
harmonize HDF5 build with h5fortran
1 parent 3bea067 commit be0dd06

9 files changed

Lines changed: 270 additions & 159 deletions

File tree

CMakeLists.txt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.21...3.30)
1+
cmake_minimum_required(VERSION 3.21...4.2)
22

33
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
44
message(FATAL_ERROR "please use out-of-source build
@@ -28,7 +28,7 @@ endif()
2828
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
2929

3030
# --- avoid Anaconda libraries
31-
if(DEFINED ENV{CONDA_PREFIX})
31+
if(DEFINED ENV{CONDA_PREFIX} AND h5fortran_IGNORE_CONDA_LIBRARIES)
3232
list(APPEND CMAKE_IGNORE_PREFIX_PATH $ENV{CONDA_PREFIX})
3333
list(APPEND CMAKE_IGNORE_PATH $ENV{CONDA_PREFIX}/bin)
3434
# need CMAKE_IGNORE_PATH for CMake < 3.23
@@ -44,7 +44,7 @@ if(hdf5_parallel)
4444
include(cmake/check_mpi.cmake)
4545
check_mpi_version()
4646

47-
if(find_hdf5)
47+
if(h5fortran_find)
4848
find_package(HDF5 COMPONENTS Fortran parallel)
4949
endif()
5050

@@ -58,7 +58,7 @@ if(hdf5_parallel)
5858
include(cmake/hdf5.cmake)
5959
endif()
6060
else()
61-
if(find_hdf5)
61+
if(h5fortran_find)
6262
find_package(HDF5 COMPONENTS Fortran)
6363
endif()
6464
if(NOT HDF5_FOUND)
@@ -67,6 +67,13 @@ else()
6767
set(hdf5_parallel_compression ".false.")
6868
endif()
6969

70+
if(WIN32 AND CMAKE_Fortran_COMPILER_ID MATCHES "^Intel")
71+
if(HDF5_VERSION MATCHES "(1\.14\.[2-6]|2\.0\.0)")
72+
message(STATUS "HDF5: applying workaround for HDF5 bug #3663 with Intel oneAPI on Windows")
73+
target_link_libraries(HDF5::HDF5 INTERFACE shlwapi)
74+
endif()
75+
endif()
76+
7077
# --- h5fortran library
7178

7279
configure_file(src/hdf5_config.f90.in hdf5_config.f90 @ONLY)

cmake/ExtProj.cmake

Lines changed: 0 additions & 72 deletions
This file was deleted.

cmake/FindHDF5.cmake

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,19 @@ if(hdf5_have_zlib)
182182
NAMES szip sz
183183
NAMES_PER_DIR
184184
HINTS ${SZIP_ROOT} ${ZLIB_ROOT}
185+
PATH_SUFFIXES lib lib64
185186
DOC "SZIP API"
186187
)
187188

188189
find_path(SZIP_INCLUDE_DIR
189190
NAMES szlib.h
190191
HINTS ${SZIP_ROOT} ${ZLIB_ROOT}
192+
PATH_SUFFIXES include
191193
DOC "SZIP header"
192194
)
193195

194-
if(NOT SZIP_LIBRARY AND SZIP_INCLUDE_DIR)
196+
if(NOT (SZIP_LIBRARY AND SZIP_INCLUDE_DIR))
197+
message(VERBOSE "FindHDF5: SZIP not found, but HDF5 indicates it was built with SZIP. This may cause build errors.")
195198
return()
196199
endif()
197200

@@ -303,6 +306,14 @@ if(HDF5_ROOT)
303306
HINTS ${HDF5_C_INCLUDE_DIR} ${HDF5_ROOT}
304307
DOC "HDF5 Fortran module path"
305308
)
309+
310+
find_path(HDF5_Fortran_HL_INCLUDE_DIR
311+
NAMES h5lt.mod
312+
NO_DEFAULT_PATH
313+
HINTS ${HDF5_Fortran_INCLUDE_DIR}
314+
DOC "HDF5 Fortran HL module path"
315+
PATH_SUFFIXES ${hdf5_msuf_hl}
316+
)
306317
else()
307318
if(HDF5_parallel_FOUND)
308319
# HDF5-MPI system library presents a unique challenge, as when non-MPI HDF5 is
@@ -312,19 +323,29 @@ else()
312323
# search in a for loop and do a link check.
313324
if(NOT HDF5_Fortran_INCLUDE_DIR)
314325
foreach(i IN LISTS HDF5_C_INCLUDE_DIR hdf5_inc_dirs)
326+
315327
find_path(HDF5_Fortran_INCLUDE_DIR
316328
NAMES hdf5.mod
317329
NO_DEFAULT_PATH
318330
HINTS ${i}
319331
DOC "HDF5 Fortran module path"
320332
)
321-
message(VERBOSE "FindHDF5: trying hdf5.mod in ${i} - got: ${HDF5_Fortran_INCLUDE_DIR}")
322-
if(HDF5_Fortran_INCLUDE_DIR)
333+
334+
find_path(HDF5_Fortran_HL_INCLUDE_DIR
335+
NAMES h5lt.mod
336+
NO_DEFAULT_PATH
337+
HINTS ${HDF5_Fortran_INCLUDE_DIR}
338+
DOC "HDF5 Fortran HL module path"
339+
PATH_SUFFIXES ${hdf5_msuf_hl}
340+
)
341+
message(VERBOSE "FindHDF5: trying hdf5.mod in ${i} - got: ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_Fortran_HL_INCLUDE_DIR}")
342+
if(HDF5_Fortran_INCLUDE_DIR AND HDF5_Fortran_HL_INCLUDE_DIR)
323343
check_fortran_links()
324344
if(HDF5_Fortran_links)
325345
break()
326346
else()
327347
unset(HDF5_Fortran_INCLUDE_DIR CACHE)
348+
unset(HDF5_Fortran_HL_INCLUDE_DIR CACHE)
328349
unset(HDF5_Fortran_links CACHE)
329350
endif()
330351
endif()
@@ -340,6 +361,14 @@ else()
340361
PATH_SUFFIXES ${hdf5_msuf}
341362
DOC "HDF5 Fortran module path"
342363
)
364+
365+
find_path(HDF5_Fortran_HL_INCLUDE_DIR
366+
NAMES h5lt.mod
367+
NO_DEFAULT_PATH
368+
HINTS ${HDF5_Fortran_INCLUDE_DIR}
369+
DOC "HDF5 Fortran HL module path"
370+
PATH_SUFFIXES ${hdf5_msuf_hl}
371+
)
343372
endif()
344373
else()
345374
find_path(HDF5_Fortran_INCLUDE_DIR
@@ -349,6 +378,14 @@ else()
349378
PATH_SUFFIXES ${hdf5_msuf}
350379
DOC "HDF5 Fortran module path"
351380
)
381+
382+
find_path(HDF5_Fortran_HL_INCLUDE_DIR
383+
NAMES h5lt.mod
384+
NO_DEFAULT_PATH
385+
HINTS ${HDF5_Fortran_INCLUDE_DIR}
386+
DOC "HDF5 Fortran HL module path"
387+
PATH_SUFFIXES ${hdf5_msuf_hl}
388+
)
352389
endif()
353390
endif()
354391

@@ -715,7 +752,7 @@ endfunction(check_c_links)
715752
function(check_fortran_links)
716753

717754
list(PREPEND CMAKE_REQUIRED_LIBRARIES ${HDF5_Fortran_LIBRARIES} ${HDF5_C_LIBRARIES})
718-
set(CMAKE_REQUIRED_INCLUDES ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
755+
set(CMAKE_REQUIRED_INCLUDES ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_Fortran_HL_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
719756

720757
if(HDF5_parallel_FOUND)
721758
find_mpi()
@@ -823,9 +860,11 @@ endif()
823860
if(BUILD_SHARED_LIBS)
824861
set(hdf5_isuf shared include)
825862
set(hdf5_msuf shared include)
863+
set(hdf5_msuf_hl mod/shared)
826864
else()
827865
set(hdf5_isuf static include)
828866
set(hdf5_msuf static include)
867+
set(hdf5_msuf_hl mod/static)
829868
endif()
830869

831870
# Ubuntu
@@ -901,29 +940,41 @@ HANDLE_COMPONENTS
901940
)
902941

903942
if(HDF5_FOUND)
904-
set(HDF5_INCLUDE_DIRS ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
943+
set(HDF5_INCLUDE_DIRS ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_Fortran_HL_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
905944
set(HDF5_LIBRARIES ${HDF5_Fortran_LIBRARIES} ${HDF5_CXX_LIBRARIES} ${HDF5_C_LIBRARIES})
906945

907946
if(NOT TARGET HDF5::HDF5)
908947
add_library(HDF5::HDF5 INTERFACE IMPORTED)
909948
set_property(TARGET HDF5::HDF5 PROPERTY INTERFACE_LINK_LIBRARIES "${HDF5_LIBRARIES}")
910949
set_property(TARGET HDF5::HDF5 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${HDF5_INCLUDE_DIRS}")
911950

912-
target_include_directories(HDF5::HDF5 INTERFACE
913-
$<$<BOOL:${hdf5_have_szip}>:${SZIP_INCLUDE_DIR}>
914-
)
951+
if(hdf5_have_szip)
952+
if(IS_DIRECTORY "${SZIP_INCLUDE_DIR}")
953+
target_include_directories(HDF5::HDF5 INTERFACE ${SZIP_INCLUDE_DIR})
954+
else()
955+
message(STATUS "FindHDF5: SZIP_INCLUDE_DIR ${SZIP_INCLUDE_DIR} is not a directory.")
956+
endif()
957+
endif()
958+
959+
target_link_libraries(HDF5::HDF5 INTERFACE $<$<BOOL:${hdf5_have_zlib}>:ZLIB::ZLIB>)
960+
961+
if(hdf5_have_szip)
962+
if(EXISTS "${SZIP_LIBRARY}")
963+
target_link_libraries(HDF5::HDF5 INTERFACE ${SZIP_LIBRARY})
964+
else()
965+
message(STATUS "FindHDF5: SZIP_LIBRARY ${SZIP_LIBRARY} is not a file.")
966+
endif()
967+
endif()
968+
915969
target_link_libraries(HDF5::HDF5 INTERFACE
916-
$<$<BOOL:${hdf5_have_zlib}>:ZLIB::ZLIB>
917-
$<$<BOOL:${hdf5_have_szip}>:${SZIP_LIBRARY}>
918970
${CMAKE_THREAD_LIBS_INIT}
919971
${CMAKE_DL_LIBS}
920972
$<$<BOOL:${UNIX}>:m>
921973
)
922-
923974
endif()
924975
endif(HDF5_FOUND)
925976

926977
mark_as_advanced(HDF5_Fortran_LIBRARY HDF5_Fortran_HL_LIBRARY
927978
HDF5_C_LIBRARY HDF5_C_HL_LIBRARY
928979
HDF5_CXX_LIBRARY HDF5_CXX_HL_LIBRARY
929-
HDF5_C_INCLUDE_DIR HDF5_CXX_INCLUDE_DIR HDF5_Fortran_INCLUDE_DIR)
980+
HDF5_C_INCLUDE_DIR HDF5_CXX_INCLUDE_DIR HDF5_Fortran_INCLUDE_DIR HDF5_Fortran_HL_INCLUDE_DIR)

cmake/check_mpi.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ try_run(mpi_run_code mpi_build_code
3030
${CMAKE_CURRENT_BINARY_DIR}/find_mpi/build
3131
${CMAKE_CURRENT_BINARY_DIR}/find_mpi/get_mpi_version.c
3232
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:PATH=${MPI_C_INCLUDE_DIRS}"
33-
# must have quotes as include_dirs is a list
3433
# LINK_OPTIONS ${MPI_C_LINK_FLAGS} # breaks CentOS GCC with -Wl,-rpath
3534
LINK_LIBRARIES ${MPI_C_LIBRARIES}
3635
RUN_OUTPUT_VARIABLE MPI_VERSION_STRING
3736
COMPILE_OUTPUT_VARIABLE mpi_vers_build_out
3837
)
38+
# CMAKE_FLAGS must have quotes to handles CMake list
3939

4040
if(NOT mpi_build_code)
4141
message(CHECK_FAIL "MPI_VERSION test failed to build:

cmake/compilers.cmake

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1+
include(CheckSourceCompiles)
2+
3+
# --- not all platforms have ieee_arithmetic e.g. aarch64 GCC
4+
check_source_compiles(Fortran
5+
"program a
6+
use, intrinsic :: ieee_arithmetic, only : ieee_quiet_nan, ieee_value
7+
real :: NaN
8+
NaN = ieee_value(0., ieee_quiet_nan)
9+
end program"
10+
HAVE_IEEE_ARITH
11+
)
12+
113
# --- C compile flags
214
if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU|^Intel")
315
add_compile_options(
416
"$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug>>:-Wextra>"
5-
"$<$<COMPILE_LANGUAGE:C>:-Wall;-Werror=implicit-function-declaration>"
17+
"$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug,RelWithDebInfo>>:-Wall>"
18+
"$<$<COMPILE_LANGUAGE:C>:-Werror=implicit-function-declaration>"
619
)
720
elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
821
add_compile_options("$<$<COMPILE_LANGUAGE:C>:/W3>")
@@ -20,7 +33,7 @@ endif()
2033
if(CMAKE_Fortran_COMPILER_ID MATCHES "^Intel")
2134

2235
add_compile_options(
23-
"$<$<COMPILE_LANGUAGE:Fortran>:-warn>"
36+
"$<$<AND:$<COMPILE_LANGUAGE:Fortran>,$<CONFIG:Debug,RelWithDebInfo>>:-warn>"
2437
"$<$<AND:$<COMPILE_LANGUAGE:Fortran>,$<CONFIG:Debug>>:-traceback;-check;-debug>"
2538
)
2639

@@ -33,22 +46,23 @@ endif()
3346
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
3447

3548
add_compile_options(
36-
"$<$<COMPILE_LANGUAGE:Fortran>:-Wall;-fimplicit-none;-Wno-maybe-uninitialized>"
49+
"$<$<AND:$<COMPILE_LANGUAGE:Fortran>,$<CONFIG:Debug,RelWithDebInfo>>:-Wall>"
50+
"$<$<COMPILE_LANGUAGE:Fortran>:-fimplicit-none;-Wno-maybe-uninitialized>"
3751
"$<$<AND:$<COMPILE_LANGUAGE:Fortran>,$<CONFIG:Debug>>:-Wextra;-fcheck=all;-Werror=array-bounds>"
3852
"$<$<AND:$<COMPILE_LANGUAGE:Fortran>,$<CONFIG:Release>>:-fno-backtrace>"
3953
)
4054

4155
endif()
4256

4357
# --- code coverage
44-
if(coverage)
58+
if(h5fortran_coverage)
4559
include(${CMAKE_CURRENT_LIST_DIR}/Modules/CodeCoverage.cmake)
4660
append_coverage_compiler_flags()
4761
set(COVERAGE_EXCLUDES ${PROJECT_SOURCE_DIR}/test)
4862
endif()
4963

5064
# --- clang-tidy
51-
if(tidy)
65+
if(h5fortran_tidy AND h5fortran_IS_TOP_LEVEL)
5266
find_program(CLANG_TIDY_EXE NAMES "clang-tidy" REQUIRED)
5367
set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_EXE})
5468
set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXE})

0 commit comments

Comments
 (0)