HPCW 3.0
Loading...
Searching...
No Matches
netcdf.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 Niclas Schroeter
4# All rights reserved.
5#
6# SPDX-License-Identifier: Apache-2.0
7
8set_property(GLOBAL PROPERTY netcdf_help_string "Enable netcdf project")
9set_property(GLOBAL PROPERTY netcdf_can_use_system TRUE)
10set_property(GLOBAL PROPERTY netcdf_depends hdf5)
11
12if(DEFINED netcdf_configure_args)
13 message( FATAL_ERROR
14 "NetCDF recipe in HPCW has been updated to use CMake instead of configure script."
15 "Hence, \${netcdf_cmake_args} is used instead of \${netcdf_configure_args}."
16 "We have detected that you are still using \${netcdf_configure_args}, which now triggers this error."
17 "Please update your scripts and/or toolchains to update the build flags accordingly and define \${netcdf_cmake_args}.")
18endif()
19set(netcdf_cmake_args "" CACHE STRING "Custom CMake arguments for NetCDF")
20set(netcdf_build_args "" CACHE STRING "Custom Make arguments for NetCDF")
21
22if(netcdf_enabled)
23 if(USE_SYSTEM_netcdf)
24 message(STATUS "NETCDF: enabled (system installed)")
25 enable_language(Fortran)
26 find_package(
27 NetCDF
28 COMPONENTS C;Fortran
29 REQUIRED)
30
31 message(STATUS "NETCDF_DIR: ${NETCDF_DIR}")
32 message(STATUS "NETCDFF_DIR: ${NETCDFF_DIR}")
33 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" ${NETCDF_DIR}/include)
34 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
35 "${NETCDF_DIR}/lib")
36 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
37 "${NETCDF_DIR}/lib")
38 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
39
40 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" ${NETCDFF_DIR}/include)
41 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
42 "${NETCDFF_DIR}/lib")
43 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
44 "${NETCDFF_DIR}/lib")
45 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDFF_DIR}/bin")
46
47 else()
48
49 if(NOT TARGET netcdf::C)
50 message(STATUS "NETCDF: enabled (internally built)")
51
52 set(netcdf_depends_ep hdf5::hdf5_hl)
53 if(mpi_enabled)
54 list(APPEND netcdf_depends_ep MPI::MPI_C)
55 endif()
56
57 if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
58 if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15)
59 string(APPEND NETCDF_C_FLAGS "-std=gnu17")
60 endif()
61 endif()
62
63 ExternalProject_Data_Add(
64 netcdf-c
65 ${netcdf-c_revision}
66 DEPENDS ${netcdf_depends_ep}
67 PATCH_COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <SOURCE_DIR> ||
68 true
69
70 CMAKE_ARGS ${cmake_params}
71 -Wno-dev
72 -DCMAKE_INSTALL_LIBDIR:FILEPATH=lib
73 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
74 -DCMAKE_BUILD_TYPE:STRING=Release
75 -DBUILD_SHARED_LIBS:BOOL=ON
76 -DBUILD_STATIC_LIBS:BOOL=ON
77 -DNETCDF_ENABLE_DOXYGEN=OFF
78 -DNETCDF_ENABLE_TESTS=OFF
79 -DNETCDF_ENABLE_PARALLEL_TESTS=OFF
80 -DNETCDF_ENABLE_LARGE_FILE_SUPPORT=ON
81 -DNETCDF_ENABLE_FILTER_BZ2=OFF
82 -DNETCDF_ENABLE_HDF5=ON # as stated in the NetCDF CMakeList.txt : "NETCDF_ENABLE_NETCDF4 is deprecated; please use NETCDF_ENABLE_HDF5"
83 ${default_cmake_args}
84 ${netcdf_cmake_args}
85 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${netcdf_build_args}
86 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
87 )
88
89 ExternalProject_Get_Property(netcdf-c INSTALL_DIR)
90 set(NETCDF_DIR ${INSTALL_DIR})
91 message(STATUS "NETCDF_DIR: ${NETCDF_DIR}")
92 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${NETCDF_DIR}/include")
93 set_if_not_present(ENV{CPATH} "$ENV{CPATH}"
94 "${NETCDF_DIR}/include/shared")
95 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
96 "${NETCDF_DIR}/lib")
97 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
98 "${NETCDF_DIR}/lib")
99 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
100
101 add_library(netcdf::C INTERFACE IMPORTED)
102 set_property(
103 TARGET netcdf::C PROPERTY INTERFACE_LINK_LIBRARIES
104 ${NETCDF_DIR}/lib/libnetcdf.a hdf5::hdf5_hl)
105 set_property(TARGET netcdf::C PROPERTY INTERFACE_INCLUDE_DIRECTORIES
106 "${NETCDF_DIR}/include")
107 add_dependencies(netcdf::C netcdf-c)
108 enable_language(Fortran)
109 string(APPEND NETCDF_FORTRAN_FLAGS "-fPIC")
110 if(CMAKE_Fortran_COMPILER_ID STREQUAL "Cray")
111 string(APPEND NETCDF_FORTRAN_FLAGS " -ef")
112 endif()
113 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
114 if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 11)
115 string(APPEND NETCDF_FORTRAN_FLAGS " -fallow-argument-mismatch")
116 endif()
117 endif()
118
119 ExternalProject_Data_Add(
120 netcdf-fortran
121 DEPENDS netcdf-c ${netcdf-fortran_revision}
122
123 CMAKE_ARGS ${cmake_params}
124 -Wno-dev
125 -DCMAKE_INSTALL_LIBDIR:FILEPATH=lib
126 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
127 -DCMAKE_BUILD_TYPE:STRING=Release
128 -DBUILD_SHARED_LIBS:BOOL=ON
129 -DBUILD_STATIC_LIBS:BOOL=ON
130 -DNETCDF_ENABLE_DOXYGEN=OFF
131 -DNETCDF_ENABLE_LARGE_FILE_SUPPORT=ON
132 -DCMAKE_Fortran_FLAGS='${NETCDF_FORTRAN_FLAGS}'
133 ${default_cmake_args}
134 ${netcdf_cmake_args}
135 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${netcdf_build_args}
136 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
137 )
138
139 ExternalProject_Get_Property(netcdf-fortran INSTALL_DIR)
140 set(NETCDFF_DIR ${INSTALL_DIR})
141 message(STATUS "NETCDFF_DIR: ${NETCDFF_DIR}")
142 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${NETCDFF_DIR}/include")
143 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
144 "${NETCDFF_DIR}/lib")
145 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
146 "${NETCDFF_DIR}/lib")
147 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDFF_DIR}/bin")
148
149 add_library(netcdf::Fortran INTERFACE IMPORTED)
150 set_property(
151 TARGET netcdf::Fortran
152 PROPERTY INTERFACE_LINK_LIBRARIES ${NETCDFF_DIR}/lib/libnetcdff.a
153 netcdf::C)
154 set_property(TARGET netcdf::Fortran PROPERTY INTERFACE_INCLUDE_DIRECTORIES
155 "${NETCDFF_DIR}/include")
156 add_dependencies(netcdf::Fortran netcdf-fortran)
157 endif()
158 endif()
159endif()