HPCW 3.0
Loading...
Searching...
No Matches
hdf5.cmake
Go to the documentation of this file.
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
5# All rights reserved.
6#
7# SPDX-License-Identifier: Apache-2.0
8
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)
12
13
14if(DEFINED hdf5_configure_args)
15 message( FATAL_ERROR
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}.")
20endif()
21set(hdf5_cmake_args "" CACHE STRING "Custom CMake arguments for HDF5")
22set(hdf5_build_args "" CACHE STRING "Custom Make arguments for HDF5")
23
24if(hdf5_enabled)
25 if(USE_SYSTEM_hdf5)
26 message(STATUS "HDF5: enabled (system installed)")
27 enable_language(Fortran)
28 set(HDF5_FIND_DEBUG ON)
29 find_package(
30 HDF5
31 COMPONENTS C Fortran HL
32 REQUIRED)
33
34 if(NOT HDF5_C_LIBRARY)
35 list(GET HDF5_C_LIBRARIES 0 HDF5_C_LIBRARY)
36 endif()
37 if(NOT TARGET hdf5::hdf5)
38 add_library(hdf5::hdf5 UNKNOWN IMPORTED)
39 set_target_properties(
40 hdf5::hdf5
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
45 # dependency found
46 )
47 endif()
48
49 if(NOT HDF5_Fortran_LIBRARY)
50 list(GET HDF5_Fortran_LIBRARIES 0 HDF5_Fortran_LIBRARY)
51 endif()
52 if(NOT TARGET hdf5::hdf5_fortran)
53 add_library(hdf5::hdf5_fortran UNKNOWN IMPORTED)
54 set_target_properties(
55 hdf5::hdf5_fortran
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}")
60 endif()
61
62 if(NOT HDF5_C_HL_LIBRARY)
63 list(GET HDF5_C_HL_LIBRARIES 0 HDF5_C_HL_LIBRARY)
64 endif()
65 if(NOT TARGET hdf5::hdf5_hl)
66 add_library(hdf5::hdf5_hl UNKNOWN IMPORTED)
67 set_target_properties(
68 hdf5::hdf5_hl
69 PROPERTIES IMPORTED_LOCATION "${HDF5_C_HL_LIBRARY}"
70 LINK_LIBRARIES "${HDF5_C_HL_LIBRARIES};hdf5::hdf5")
71 endif()
72
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}"
82 "${HDF5_DIR}/lib")
83 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${HDF5_DIR}/bin")
84
85 else()
86
87 if(NOT TARGET hdf5)
88 message(STATUS "HDF5: enabled (internally built)")
89 if(mpi_enabled)
90 set(hdf5_depends_ep MPI::MPI_C MPI::MPI_Fortran)
91 endif()
92 if(NOT USE_SYSTEM_zlib)
93 set(hdf5_depends_ep zlib)
94 endif()
95
96 ExternalProject_Data_Add(
97 hdf5
98 ${hdf5_revision}
99 DEPENDS szip ${hdf5_depends_ep}
100
101 # See https://github.com/ecmwf-ifs/ecrad/issues/16
102 # See https://github.com/HDFGroup/hdf5/issues/3831
103 # Patch comes from here https://github.com/HDFGroup/hdf5/commit/e0d095ebf020706ec7d7c82e6674b18f1a0a2d5b
104 # But removed the RELEASE.txt changes
105 PATCH_COMMAND ${Patch_EXECUTABLE} -p1 -i
106 ${CMAKE_SOURCE_DIR}/projects/hdf5_sigfpe.patch
107
108 CMAKE_ARGS ${cmake_params}
109 -DCMAKE_INSTALL_LIBDIR:FILEPATH=lib
110 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
111 -DCMAKE_BUILD_TYPE:STRING=Release
112 -DBUILD_SHARED_LIBS:BOOL=ON
113 -DBUILD_STATIC_LIBS:BOOL=ON
114 -DHDF5_ENABLE_ZLIB_SUPPORT=ON
115 -DHDF5_ENABLE_SZIP_SUPPORT=ON
116 -DHDF5_BUILD_FORTRAN=ON
117 -DHDF5_ENABLE_PARALLEL=${mpi_enabled}
118 -DHDF5_BUILD_HL_LIB=ON
119 -DBUILD_TESTING=OFF
120 -DHDF5_BUILD_EXAMPLES=OFF
121 ${default_cmake_args}
122 ${hdf5_cmake_args}
123 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${hdf5_build_args}
124 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
125 )
126
127 ExternalProject_Get_Property(hdf5 INSTALL_DIR)
128 set(HDF5_DIR ${INSTALL_DIR})
129
130 ExternalProject_Get_Property(hdf5 BINARY_DIR)
131 set(HDF5_BIN_DIR ${BINARY_DIR})
132
133 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include")
134 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${HDF5_DIR}/include/shared")
135 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
136 "${HDF5_DIR}/lib")
137 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
138 "${HDF5_DIR}/lib")
139 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${HDF5_DIR}/bin")
140 set_if_not_present(ENV{C_INCLUDE_PATH} "$ENV{C_INCLUDE_PATH}" "${HDF5_DIR}/include")
141 set_if_not_present(ENV{CPLUS_INCLUDE_PATH} "$ENV{CPLUS_INCLUDE_PATH}" "${HDF5_DIR}/include")
142
143 add_library(hdf5::hdf5 STATIC IMPORTED)
144 set_target_properties(
145 hdf5::hdf5
146 PROPERTIES
147 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
148 INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
149 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
150 LINK_LIBRARIES
151 "m;dl;${INSTALL_DIR}/lib/libhdf5.a;curl;SZIP::SZIP;ZLIB::ZLIB")
152 add_dependencies(hdf5::hdf5 hdf5)
153
154 add_library(hdf5::hdf5_hl STATIC IMPORTED)
155 set_target_properties(
156 hdf5::hdf5_hl
157 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
158 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5_hl.a"
159 LINK_LIBRARIES "${INSTALL_DIR}/lib/libhdf5_hl.a;hdf5::hdf5")
160 add_dependencies(hdf5::hdf5_hl hdf5)
161
162 add_library(hdf5::hdf5_fortran STATIC IMPORTED)
163 set_target_properties(
164 hdf5::hdf5_fortran
165 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
166 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5_fortran.a"
167 LINK_LIBRARIES
168 "${INSTALL_DIR}/lib/libhdf5_fortran.a;hdf5::hdf5")
169 add_dependencies(hdf5::hdf5_fortran hdf5)
170 endif()
171 endif()
172
173 # From https://gitlab.kitware.com/cmake/cmake/-/issues/21199 HDF5 1.10.6
174 # (released Dec 2019) appears to have changed the naming convention for a
175 # Fortran library to be consistent with the other languages. old:
176 # hdf5hl_fortran. new: hdf5_hl_fortran.
177 if(HDF5_VERSION VERSION_GREATER_EQUAL "1.10.6")
178 set(HDF5_HL_Fortran_LIB_NAME "hdf5_hl_fortran")
179 else()
180 set(HDF5_HL_Fortran_LIB_NAME "hdf5hl_fortran")
181 endif()
182
183endif()