1# Copyright (c) 2020 - 2024 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 -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"
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
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}"
97 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"
99 set_if_not_present(ENV{PATH} "$ENV{PATH}" "${NETCDF_DIR}/bin")
101 add_library(netcdf::C INTERFACE IMPORTED)
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")
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")
119 ExternalProject_Data_Add(
121 DEPENDS netcdf-c ${netcdf-fortran_revision}
123 CMAKE_ARGS ${cmake_params}
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}
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
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")
149 add_library(netcdf::Fortran INTERFACE IMPORTED)
151 TARGET netcdf::Fortran
152 PROPERTY INTERFACE_LINK_LIBRARIES ${NETCDFF_DIR}/lib/libnetcdff.a
154 set_property(TARGET netcdf::Fortran PROPERTY INTERFACE_INCLUDE_DIRECTORIES
155 "${NETCDFF_DIR}/include")
156 add_dependencies(netcdf::Fortran netcdf-fortran)