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 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}
113 ${hdf5_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
116 )
117
118 ExternalProject_Get_Property(hdf5 INSTALL_DIR)
119 set(HDF5_DIR ${INSTALL_DIR})
120
121 ExternalProject_Get_Property(hdf5 BINARY_DIR)
122 set(HDF5_BIN_DIR ${BINARY_DIR})
123
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}"
127 "${HDF5_DIR}/lib")
128 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
129 "${HDF5_DIR}/lib")
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")
133
134 add_library(hdf5::hdf5 STATIC IMPORTED)
135 set_target_properties(
136 hdf5::hdf5
137 PROPERTIES
138 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
139 INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
140 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5.a"
141 LINK_LIBRARIES
142 "m;dl;${INSTALL_DIR}/lib/libhdf5.a;curl;SZIP::SZIP;ZLIB::ZLIB")
143 add_dependencies(hdf5::hdf5 hdf5)
144
145 add_library(hdf5::hdf5_hl STATIC IMPORTED)
146 set_target_properties(
147 hdf5::hdf5_hl
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)
152
153 add_library(hdf5::hdf5_fortran STATIC IMPORTED)
154 set_target_properties(
155 hdf5::hdf5_fortran
156 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INSTALL_DIR}/include"
157 IMPORTED_LOCATION "${INSTALL_DIR}/lib/libhdf5_fortran.a"
158 LINK_LIBRARIES
159 "${INSTALL_DIR}/lib/libhdf5_fortran.a;hdf5::hdf5")
160 add_dependencies(hdf5::hdf5_fortran hdf5)
161 endif()
162 endif()
163
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")
170 else()
171 set(HDF5_HL_Fortran_LIB_NAME "hdf5hl_fortran")
172 endif()
173
174endif()