1# Copyright (c) 2020 - 2025 David Guibert
2# Copyright (c) 2024 - 2025 Antoine Morvan
3# Copyright (c) 2024 Niclas Schroeter
6# SPDX-License-Identifier: Apache-2.0
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)
12if(DEFINED netcdf_configure_args)
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}.")
19set(netcdf_cmake_args "" CACHE STRING "Custom CMake arguments for NetCDF")
20set(netcdf_build_args "" CACHE STRING "Custom Make arguments for NetCDF")
24 message(STATUS "NETCDF: enabled (system installed)")
25 enable_language(Fortran)
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}"
36 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
38 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
40 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" ${NETCDFF_DIR}/include)
41 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}"
43 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
45 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDFF_DIR}/bin")
49 if(NOT TARGET netcdf::C)
50 message(STATUS "NETCDF: enabled (internally built)")
52 set(netcdf_depends_ep hdf5::hdf5_hl)
54 list(APPEND netcdf_depends_ep MPI::MPI_C)
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")
63 ExternalProject_Data_Add(
66 DEPENDS ${netcdf_depends_ep}
67 PATCH_COMMAND ${CMAKE_SOURCE_DIR}/bin/patchShebangs <SOURCE_DIR> ||
70 CMAKE_ARGS ${cmake_params}
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"
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
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}"
96 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
98 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
100 add_library(netcdf::C INTERFACE IMPORTED)
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")
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")
118 ExternalProject_Data_Add(
120 DEPENDS netcdf-c ${netcdf-fortran_revision}
122 CMAKE_ARGS ${cmake_params}
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}
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
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")
147 add_library(netcdf::Fortran INTERFACE IMPORTED)
149 TARGET netcdf::Fortran
150 PROPERTY INTERFACE_LINK_LIBRARIES ${NETCDFF_DIR}/lib/libnetcdff.so
152 set_property(TARGET netcdf::Fortran PROPERTY INTERFACE_INCLUDE_DIRECTORIES
153 "${NETCDFF_DIR}/include")
154 add_dependencies(netcdf::Fortran netcdf-fortran)