1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 - 2025 Antoine Morvan
3# Copyright (c) 2024 - 2025 Niclas Schroeter
4# Copyright (c) 2024 Daniel Beltran-Mora
7# SPDX-License-Identifier: Apache-2.0
9set_property(GLOBAL PROPERTY hdf5_can_use_system TRUE)
10set_property(GLOBAL PROPERTY hdf5_depends szip zlib)
11set_property(GLOBAL PROPERTY hdf5_depends_optional mpi)
14if(DEFINED hdf5_configure_args)
16 "HDF5 recipe in HPCW has been updated to use CMake instead of configure script."
17 "Hence, \${hdf5_cmake_args} is used instead of \${hdf5_configure_args}."
18 "We have detected that you are still using \${hdf5_configure_args}, which now triggers this error."
19 "Please update your scripts and/or toolchains to update the build flags accordingly and define \${hdf5_cmake_args}.")
21set(hdf5_cmake_args "" CACHE STRING "Custom CMake arguments for HDF5")
22set(hdf5_build_args "" CACHE STRING "Custom Make arguments for HDF5")
26 message(STATUS "HDF5: enabled (system installed)")
27 enable_language(Fortran)
28 set(HDF5_FIND_DEBUG ON)
31 COMPONENTS C Fortran HL
34 if(NOT HDF5_C_LIBRARY)
35 list(GET HDF5_C_LIBRARIES 0 HDF5_C_LIBRARY)
37 if(NOT TARGET hdf5::hdf5)
38 add_library(hdf5::hdf5 UNKNOWN IMPORTED)
39 set_target_properties(
41 PROPERTIES IMPORTED_LOCATION "${HDF5_C_LIBRARY}"
42 COMPILE_DEFINITIONS "${HDF5_C_DEFINITIONS}"
43 INTERFACE_INCLUDE_DIRECTORIES "${HDF5_C_INCLUDE_DIRS}"
44 LINK_LIBRARIES "${HDF5_C_LIBRARIES};curl" # FIXME missing
49 if(NOT HDF5_Fortran_LIBRARY)
50 list(GET HDF5_Fortran_LIBRARIES 0 HDF5_Fortran_LIBRARY)
52 if(NOT TARGET hdf5::hdf5_fortran)
53 add_library(hdf5::hdf5_fortran UNKNOWN IMPORTED)
54 set_target_properties(
56 PROPERTIES IMPORTED_LOCATION "${HDF5_Fortran_LIBRARY}"
57 COMPILE_DEFINITIONS "${HDF5_Fortran_DEFINITIONS}"
58 INTERFACE_INCLUDE_DIRECTORIES "${HDF5_Fortran_INCLUDE_DIRS}"
59 LINK_LIBRARIES "${HDF5_Fortran_LIBRARIES}")
62 if(NOT HDF5_C_HL_LIBRARY)
63 list(GET HDF5_C_HL_LIBRARIES 0 HDF5_C_HL_LIBRARY)
65 if(NOT TARGET hdf5::hdf5_hl)
66 add_library(hdf5::hdf5_hl UNKNOWN IMPORTED)
67 set_target_properties(
69 PROPERTIES IMPORTED_LOCATION "${HDF5_C_HL_LIBRARY}"
70 LINK_LIBRARIES "${HDF5_C_HL_LIBRARIES};hdf5::hdf5")
73 # HDF5_C_HL_LIBRARIES:
74 # /scratch_lustre_DDN7k/bguibertd/s/install-intel18/hdf5/lib/libhdf5_hl.so
75 get_filename_component(HDF5_DIR "${HDF5_C_LIBRARY}" DIRECTORY)
76 get_filename_component(HDF5_DIR "${HDF5_DIR}" DIRECTORY)
77 message(STATUS "-> HDF5_DIR: ${HDF5_DIR}")
78 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include")
79 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include/shared")
80 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}" "${HDF5_DIR}/lib")
81 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
83 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${HDF5_DIR}/bin")
88 message(STATUS "HDF5: enabled (internally built)")
90 set(hdf5_depends_ep MPI::MPI_C MPI::MPI_Fortran)
92 if(NOT USE_SYSTEM_zlib)
93 set(hdf5_depends_ep zlib)
96 ExternalProject_Data_Add(
99 DEPENDS szip ${hdf5_depends_ep}
101 CMAKE_ARGS ${cmake_params}
102 -DCMAKE_INSTALL_LIBDIR:FILEPATH=lib
103 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
104 -DCMAKE_BUILD_TYPE:STRING=Release
105 -DBUILD_SHARED_LIBS:BOOL=ON
106 -DBUILD_STATIC_LIBS:BOOL=ON
107 -DHDF5_ENABLE_ZLIB_SUPPORT=ON
108 -DHDF5_ENABLE_SZIP_SUPPORT=ON
109 -DHDF5_BUILD_FORTRAN=ON
110 -DHDF5_ENABLE_PARALLEL=${mpi_enabled}
111 -DHDF5_BUILD_HL_LIB=ON
112 ${default_cmake_args}
114 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${hdf5_build_args}
115 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
118 ExternalProject_Get_Property(hdf5 INSTALL_DIR)
119 set(HDF5_DIR ${INSTALL_DIR})
121 ExternalProject_Get_Property(hdf5 BINARY_DIR)
122 set(HDF5_BIN_DIR ${BINARY_DIR})
124 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include")
125 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include/shared")
126 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
128 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
130 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${HDF5_DIR}/bin")
131 set_if_not_present(ENV{C_INCLUDE_PATH} "$ENV{C_INCLUDE_PATH}" "${HDF5_DIR}/include")
132 set_if_not_present(ENV{CPLUS_INCLUDE_PATH} "$ENV{CPLUS_INCLUDE_PATH}" "${HDF5_DIR}/include")
134 add_library(hdf5::hdf5 STATIC IMPORTED)
135 set_target_properties(
138 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
139 INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
140 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
142 "m;dl;${INSTALL_DIR}/lib/libhdf5.a;curl;SZIP::SZIP;ZLIB::ZLIB")
143 add_dependencies(hdf5::hdf5 hdf5)
145 add_library(hdf5::hdf5_hl STATIC IMPORTED)
146 set_target_properties(
148 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
149 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5_hl.a"
150 LINK_LIBRARIES "${INSTALL_DIR}/lib/libhdf5_hl.a;hdf5::hdf5")
151 add_dependencies(hdf5::hdf5_hl hdf5)
153 add_library(hdf5::hdf5_fortran STATIC IMPORTED)
154 set_target_properties(
156 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
157 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5_fortran.a"
159 "${INSTALL_DIR}/lib/libhdf5_fortran.a;hdf5::hdf5")
160 add_dependencies(hdf5::hdf5_fortran hdf5)
164 # From https://gitlab.kitware.com/cmake/cmake/-/issues/21199 HDF5 1.10.6
165 # (released Dec 2019) appears to have changed the naming convention for a
166 # Fortran library to be consistent with the other languages. old:
167 # hdf5hl_fortran. new: hdf5_hl_fortran.
168 if(HDF5_VERSION VERSION_GREATER_EQUAL "1.10.6")
169 set(HDF5_HL_Fortran_LIB_NAME "hdf5_hl_fortran")
171 set(HDF5_HL_Fortran_LIB_NAME "hdf5hl_fortran")