HPCW 3.0
Loading...
Searching...
No Matches
netcdf.cmake
Go to the documentation of this file.
1# Copyright (c) 2020 - 2025 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 -DNETCDF_ENABLE_DOXYGEN=OFF
77 -DNETCDF_ENABLE_TESTS=OFF
78 -DNETCDF_ENABLE_PARALLEL_TESTS=OFF
79 -DNETCDF_ENABLE_LARGE_FILE_SUPPORT=ON
80 -DNETCDF_ENABLE_FILTER_BZ2=OFF
81 -DNETCDF_ENABLE_HDF5=ON # as stated in the NetCDF CMakeList.txt : "NETCDF_ENABLE_NETCDF4 is deprecated; please use NETCDF_ENABLE_HDF5"
82 ${default_cmake_args}
83 ${netcdf_cmake_args}
84 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${netcdf_build_args}
85 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
86 )
87
88 ExternalProject_Get_Property(netcdf-c INSTALL_DIR)
89 set(NETCDF_DIR ${INSTALL_DIR})
90 message(STATUS "NETCDF_DIR: ${NETCDF_DIR}")
91 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${NETCDF_DIR}/include")
92 set_if_not_present(ENV{CPATH} "$ENV{CPATH}"
93 "${NETCDF_DIR}/include/shared")
94 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
95 "${NETCDF_DIR}/lib")
96 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
97 "${NETCDF_DIR}/lib")
98 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
99
100 add_library(netcdf::C INTERFACE IMPORTED)
101 set_property(
102 TARGET netcdf::C PROPERTY INTERFACE_LINK_LIBRARIES
103 ${NETCDF_DIR}/lib/libnetcdf.so hdf5::hdf5_hl)
104 set_property(TARGET netcdf::C PROPERTY INTERFACE_INCLUDE_DIRECTORIES
105 "${NETCDF_DIR}/include")
106 add_dependencies(netcdf::C netcdf-c)
107 enable_language(Fortran)
108 string(APPEND NETCDF_FORTRAN_FLAGS "-fPIC")
109 if(CMAKE_Fortran_COMPILER_ID STREQUAL "Cray")
110 string(APPEND NETCDF_FORTRAN_FLAGS " -ef")
111 endif()
112 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
113 if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 11)
114 string(APPEND NETCDF_FORTRAN_FLAGS " -fallow-argument-mismatch")
115 endif()
116 endif()
117
118 ExternalProject_Data_Add(
119 netcdf-fortran
120 DEPENDS netcdf-c ${netcdf-fortran_revision}
121
122 CMAKE_ARGS ${cmake_params}
123 -Wno-dev
124 -DCMAKE_INSTALL_LIBDIR:FILEPATH=lib
125 -DCMAKE_INSTALL_PREFIX:FILEPATH=<INSTALL_DIR>
126 -DCMAKE_BUILD_TYPE:STRING=Release
127 -DBUILD_SHARED_LIBS:BOOL=ON
128 -DNETCDF_ENABLE_DOXYGEN=OFF
129 -DNETCDF_ENABLE_LARGE_FILE_SUPPORT=ON
130 -DCMAKE_Fortran_FLAGS='${NETCDF_FORTRAN_FLAGS}'
131 ${default_cmake_args}
132 ${netcdf_cmake_args}
133 BUILD_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${netcdf_build_args}
134 INSTALL_COMMAND ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} PREFIX=<INSTALL_DIR> install
135 )
136
137 ExternalProject_Get_Property(netcdf-fortran INSTALL_DIR)
138 set(NETCDFF_DIR ${INSTALL_DIR})
139 message(STATUS "NETCDFF_DIR: ${NETCDFF_DIR}")
140 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${NETCDFF_DIR}/include")
141 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
142 "${NETCDFF_DIR}/lib")
143 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
144 "${NETCDFF_DIR}/lib")
145 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDFF_DIR}/bin")
146
147 add_library(netcdf::Fortran INTERFACE IMPORTED)
148 set_property(
149 TARGET netcdf::Fortran
150 PROPERTY INTERFACE_LINK_LIBRARIES ${NETCDFF_DIR}/lib/libnetcdff.so
151 netcdf::C)
152 set_property(TARGET netcdf::Fortran PROPERTY INTERFACE_INCLUDE_DIRECTORIES
153 "${NETCDFF_DIR}/include")
154 add_dependencies(netcdf::Fortran netcdf-fortran)
155 endif()
156 endif()
157endif()