Skip to content

Commit 261a440

Browse files
committed
FindHDF5: correct HDF5-MPI
1 parent db00a5b commit 261a440

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

cmake/FindHDF5.cmake

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,20 @@ set(${outvar} ${_v} PARENT_SCOPE)
9494

9595
endfunction(pop_flag)
9696

97+
macro(find_mpi)
98+
# non-cache set by FindMPI are not visible outside function -- need macro just to see within that function
99+
set(mpi_comp C)
100+
if(Fortran IN_LIST HDF5_FIND_COMPONENTS)
101+
list(APPEND mpi_comp Fortran)
102+
endif()
103+
if(HDF5_FIND_REQUIRED)
104+
find_package(MPI COMPONENTS ${mpi_comp} REQUIRED)
105+
else()
106+
find_package(MPI COMPONENTS ${mpi_comp})
107+
endif()
108+
109+
endmacro(find_mpi)
110+
97111

98112
macro(detect_config)
99113

@@ -121,8 +135,8 @@ check_symbol_exists(H5_HAVE_PARALLEL ${h5_conf} HDF5_HAVE_PARALLEL)
121135
set(HDF5_parallel_FOUND false)
122136

123137
if(HDF5_HAVE_PARALLEL)
138+
find_mpi()
124139
if(NOT MPI_FOUND)
125-
message(WARNING "user CMakeLists.txt must do find_package(MPI) if using parallel HDF5")
126140
return()
127141
endif()
128142

@@ -638,10 +652,11 @@ endfunction(hdf5_c_wrap)
638652

639653
function(check_c_links)
640654

641-
list(INSERT CMAKE_REQUIRED_LIBRARIES 0 ${HDF5_C_LIBRARIES})
655+
list(PREPEND CMAKE_REQUIRED_LIBRARIES ${HDF5_C_LIBRARIES})
642656
set(CMAKE_REQUIRED_INCLUDES ${HDF5_C_INCLUDE_DIR})
643657

644658
if(HDF5_parallel_FOUND)
659+
find_mpi()
645660

646661
list(APPEND CMAKE_REQUIRED_INCLUDES ${MPI_C_INCLUDE_DIRS})
647662
list(APPEND CMAKE_REQUIRED_LIBRARIES ${MPI_C_LIBRARIES})
@@ -687,10 +702,11 @@ endfunction(check_c_links)
687702

688703
function(check_fortran_links)
689704

690-
list(INSERT CMAKE_REQUIRED_LIBRARIES 0 ${HDF5_Fortran_LIBRARIES} ${HDF5_C_LIBRARIES})
705+
list(PREPEND CMAKE_REQUIRED_LIBRARIES ${HDF5_Fortran_LIBRARIES} ${HDF5_C_LIBRARIES})
691706
set(CMAKE_REQUIRED_INCLUDES ${HDF5_Fortran_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
692707

693708
if(HDF5_parallel_FOUND)
709+
find_mpi()
694710

695711
list(APPEND CMAKE_REQUIRED_INCLUDES ${MPI_Fortran_INCLUDE_DIRS})
696712
list(APPEND CMAKE_REQUIRED_LIBRARIES ${MPI_Fortran_LIBRARIES})
@@ -727,6 +743,15 @@ endfunction(check_fortran_links)
727743

728744
function(check_hdf5_link)
729745

746+
# HDF5 bug #3663 for HDF5 1.14.2, 1.14.3, ...?
747+
# https://github.com/HDFGroup/hdf5/issues/3663
748+
if(WIN32 AND CMAKE_Fortran_COMPILER_ID MATCHES "^Intel")
749+
if(HDF5_VERSION MATCHES "1.14.[2-3]")
750+
message(VERBOSE "FindHDF5: applying workaround for HDF5 bug #3663 with Intel oneAPI on Windows")
751+
list(APPEND CMAKE_REQUIRED_LIBRARIES shlwapi)
752+
endif()
753+
endif()
754+
730755
if(NOT HDF5_C_FOUND)
731756
return()
732757
endif()
@@ -774,10 +799,10 @@ endif()
774799

775800
set(hdf5_lsuf lib hdf5/lib) # need explicit "lib" for self-built HDF5
776801
if(NOT HDF5_ROOT)
777-
list(INSERT hdf5_lsuf 0 hdf5/openmpi hdf5/mpich) # Ubuntu
778-
list(INSERT hdf5_lsuf 0 openmpi/lib mpich/lib) # CentOS
802+
list(PREPEND hdf5_lsuf hdf5/openmpi hdf5/mpich) # Ubuntu
803+
list(PREPEND hdf5_lsuf openmpi/lib mpich/lib) # CentOS
779804
if(NOT parallel IN_LIST HDF5_FIND_COMPONENTS)
780-
list(INSERT hdf5_lsuf 0 hdf5/serial) # Ubuntu
805+
list(PREPEND hdf5_lsuf hdf5/serial) # Ubuntu
781806
endif()
782807
endif()
783808

@@ -792,13 +817,13 @@ else()
792817
endif()
793818

794819
# Ubuntu
795-
list(INSERT hdf5_isuf 0 hdf5/openmpi hdf5/mpich)
796-
list(INSERT hdf5_msuf 0 hdf5/openmpi hdf5/mpich)
820+
list(PREPEND hdf5_isuf hdf5/openmpi hdf5/mpich)
821+
list(PREPEND hdf5_msuf hdf5/openmpi hdf5/mpich)
797822

798823
if(NOT parallel IN_LIST HDF5_FIND_COMPONENTS)
799824
# Ubuntu
800-
list(INSERT hdf5_isuf 0 hdf5/serial)
801-
list(INSERT hdf5_msuf 0 hdf5/serial)
825+
list(PREPEND hdf5_isuf hdf5/serial)
826+
list(PREPEND hdf5_msuf hdf5/serial)
802827
endif()
803828

804829
if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64|AMD64)")
@@ -810,7 +835,7 @@ endif()
810835
if(NOT HDF5_ROOT AND CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
811836
# CentOS paths
812837
if(parallel IN_LIST HDF5_FIND_COMPONENTS)
813-
list(INSERT hdf5_msuf 0 gfortran/modules/openmpi gfortran/modules/mpich)
838+
list(PREPEND hdf5_msuf gfortran/modules/openmpi gfortran/modules/mpich)
814839
else()
815840
list(APPEND hdf5_msuf gfortran/modules)
816841
endif()

scripts/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ if(hdf5_parallel)
2222
set(MPI_ROOT $ENV{MPI_ROOT})
2323
endif()
2424

25+
set(MPI_DETERMINE_LIBRARY_VERSION true)
26+
find_package(MPI COMPONENTS C REQUIRED)
27+
message(STATUS "MPI_C: ${MPI_C_LIBRARY_VERSION_STRING}")
28+
2529
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND MPI_ROOT)
2630
set(ld_path $ENV{LD_LIBRARY_PATH})
2731
cmake_path(CONVERT "${ld_path}" TO_CMAKE_PATH_LIST ld_path NORMALIZE)
2832
cmake_path(CONVERT "${MPI_ROOT}" TO_CMAKE_PATH_LIST MPI_ROOT NORMALIZE)
2933

30-
find_package(MPI COMPONENTS C REQUIRED)
31-
3234
include(${PROJECT_SOURCE_DIR}/../cmake/check_mpi.cmake)
3335
check_mpi_version()
3436

0 commit comments

Comments
 (0)