1- # based on: https://github.com/Kitware/VTK/blob/master/CMake/FindNetCDF.cmake
2- # in general, NetCDF requires C compiler even if only using Fortran
1+ # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2+ # file Copyright.txt or https://cmake.org/licensing for details.
3+
4+ #[=======================================================================[.rst:
5+ FindNetCDF
6+ ----------
7+
8+ Find NetCDF4 library
9+
10+ based on: https://github.com/Kitware/VTK/blob/master/CMake/FindNetCDF.cmake
11+ in general, NetCDF requires C compiler even if only using Fortran
12+
13+ Imported targets
14+ ^^^^^^^^^^^^^^^^
15+
16+ This module defines the following :prop_tgt:`IMPORTED` target:
17+
18+ ``NetCDF::NetCDF_C``
19+ NetCDF C / C++ libraries
20+
21+ ``NetCDF::NetCDF_Fortran``
22+ NetCDF Fortran libraries
23+
24+ Result Variables
25+ ^^^^^^^^^^^^^^^^
26+
27+ This module defines the following variables:
28+
29+ ``NetCDF_FOUND``
30+ NetCDF4 is found (also ``NetCDF_C_FOUND`` and ``NetCDF_Fortran_FOUND``)
31+ ``NetCDF_C_LIBRARIES`` and ``NetCDF_Fortran_LIBRARIES
32+ uncached list of libraries (using full path name) to link against
33+ ``NetCDF_C_INCLUDE_DIRS`` and ``NetCDF_Fortran_INCLUDE_DIRS``
34+ uncached list of libraries (using full path name) to include
35+
36+ Search details:
37+
38+ 1. look for CMake-build config files (for C / C++ only)
39+ 2. CMake manual search optionally using pkg-config (this step always needed for Fortran, and for C if step 1 fails)
40+
41+ #]=======================================================================]
342
443function (netcdf_c)
544
6- pkg_check_modules(pc_nc netcdf QUIET ) # C / CXX
45+ pkg_check_modules(pc_nc netcdf QUIET )
746
8- find_path (NetCDF_INCLUDE_DIR
47+ find_path (NetCDF_C_INCLUDE_DIR
948 NAMES netcdf.h
1049 HINTS ${pc_nc_INCLUDE_DIRS}
11- DOC "NetCDF include directories " )
50+ DOC "NetCDF C include directory " )
1251
13- if (NOT NetCDF_INCLUDE_DIR )
52+ if (NOT NetCDF_C_INCLUDE_DIR )
1453 return ()
1554endif ()
1655
@@ -24,20 +63,17 @@ if(NOT NetCDF_C_LIBRARY)
2463endif ()
2564
2665set (NetCDF_C_FOUND true PARENT_SCOPE)
27- set (NetCDF_INCLUDE_DIR ${NetCDF_INCLUDE_DIR } PARENT_SCOPE)
28- set (NetCDF_LIBRARY ${NetCDF_C_LIBRARY} PARENT_SCOPE)
66+ set (NetCDF_C_INCLUDE_DIR ${NetCDF_C_INCLUDE_DIR } PARENT_SCOPE)
67+ set (NetCDF_C_LIBRARY ${NetCDF_C_LIBRARY} PARENT_SCOPE)
2968
3069endfunction (netcdf_c)
3170
3271
3372function (netcdf_fortran)
3473
35- if (NOT CMAKE_Fortran_COMPILER)
36- return ()
37- endif ()
38-
3974pkg_check_modules(pc_nc netcdf-fortran QUIET )
40- if (NOT pc_nc_FOUND) # homebrew
75+ if (NOT pc_nc_FOUND)
76+ # homebrew
4177 pkg_check_modules(pc_nc netcdf QUIET )
4278endif ()
4379
@@ -60,28 +96,76 @@ if(NOT NetCDF_Fortran_LIBRARY)
6096endif ()
6197
6298set (NetCDF_Fortran_FOUND true PARENT_SCOPE)
63- set (NetCDF_INCLUDE_DIR ${NetCDF_INCLUDE_DIR} ${NetCDF_Fortran_INCLUDE_DIR} PARENT_SCOPE)
64- set (NetCDF_LIBRARY ${NetCDF_LIBRARY} ${NetCDF_Fortran_LIBRARY} PARENT_SCOPE)
99+ set (NetCDF_Fortran_INCLUDE_DIR ${NetCDF_Fortran_INCLUDE_DIR} PARENT_SCOPE)
100+ set (NetCDF_Fortran_LIBRARY ${NetCDF_Fortran_LIBRARY} PARENT_SCOPE)
65101
66102endfunction (netcdf_fortran)
67103
68104#============================================================
69- find_package (PkgConfig)
70-
71- netcdf_c()
105+ # main program
106+
107+ # 1. CMake-built NetCDF.
108+ find_package (netCDF CONFIG QUIET )
109+ if (netCDF_FOUND)
110+ set (NetCDF_C_FOUND "${netCDF_FOUND} " )
111+ set (NetCDF_C_INCLUDE_DIR "${netCDF_INCLUDE_DIR} " )
112+ set (NetCDF_C_LIBRARY "${netCDF_LIBRARIES} " )
113+ set (NetCDF_VERSION "${NetCDFVersion} " )
114+
115+ add_library (NetCDF::NetCDF_C INTERFACE IMPORTED )
116+ if (TARGET "netCDF::netcdf" )
117+ # 4.7.3
118+ set_target_properties (NetCDF::NetCDF_C PROPERTIES
119+ INTERFACE_LINK_LIBRARIES "netCDF::netcdf" )
120+ elseif (TARGET "netcdf" )
121+ set_target_properties (NetCDF::NetCDF_C PROPERTIES
122+ INTERFACE_LINK_LIBRARIES "netcdf" )
123+ else ()
124+ set_target_properties (NetCDF::NetCDF_C PROPERTIES
125+ INTERFACE_LINK_LIBRARIES "${netCDF_LIBRARIES} " )
126+ endif ()
127+ set_target_properties (NetCDF::NetCDF_C PROPERTIES
128+ INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_C_INCLUDE_DIR} " )
129+ endif (netCDF_FOUND)
130+
131+ # 2. manual search for Fortran (and C if needed) using optional pkg-config
132+ find_package (PkgConfig QUIET )
133+ if (NOT NetCDF_C_FOUND)
134+ netcdf_c()
135+ endif ()
136+ set (_ncdf_req ${NetCDF_C_LIBRARY} )
72137
73- if (NetCDF_LIBRARY AND Fortran IN_LIST NetCDF_FIND_COMPONENTS)
138+ if (Fortran IN_LIST NetCDF_FIND_COMPONENTS)
74139 netcdf_fortran()
140+ list (APPEND _ncdf_req ${NetCDF_Fortran_LIBRARY} )
75141endif ()
76- mark_as_advanced (NetCDF_LIBRARY NetCDF_INCLUDE_DIR)
77142
143+ mark_as_advanced (NetCDF_C_INCLUDE_DIR NetCDF_Fortran_INCLUDE_DIR NetCDF_C_LIBRARY NetCDF_Fortran_LIBRARY)
78144
79145include (FindPackageHandleStandardArgs)
80146find_package_handle_standard_args(NetCDF
81- REQUIRED_VARS NetCDF_LIBRARY NetCDF_INCLUDE_DIR
147+ REQUIRED_VARS _ncdf_req
82148 HANDLE_COMPONENTS)
83149
84150if (NetCDF_FOUND)
85- set (NetCDF_INCLUDE_DIRS ${NetCDF_INCLUDE_DIR} )
86- set (NetCDF_LIBRARIES ${NetCDF_LIBRARY} )
151+ set (NetCDF_C_INCLUDE_DIRS ${NetCDF_C_INCLUDE_DIR} )
152+ set (NetCDF_C_LIBRARIES ${NetCDF_C_LIBRARY} )
153+
154+ if (NetCDF_Fortran_FOUND)
155+ set (NetCDF_Fortran_INCLUDE_DIRS ${NetCDF_Fortran_INCLUDE_DIR} )
156+ set (NetCDF_Fortran_LIBRARIES ${NetCDF_Fortran_LIBRARY} )
157+ if (NOT TARGET NetCDF::NetCDF_Fortran)
158+ add_library (NetCDF::NetCDF_Fortran INTERFACE IMPORTED )
159+ set_target_properties (NetCDF::NetCDF_Fortran PROPERTIES
160+ INTERFACE_LINK_LIBRARIES "${NetCDF_Fortran_LIBRARY} "
161+ INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_Fortran_INCLUDE_DIR} " )
162+ endif ()
163+ endif ()
164+
165+ if (NOT TARGET NetCDF::NetCDF_C)
166+ add_library (NetCDF::NetCDF_C INTERFACE IMPORTED )
167+ set_target_properties (NetCDF::NetCDF_C PROPERTIES
168+ INTERFACE_LINK_LIBRARIES "${NetCDF_C_LIBRARY} "
169+ INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_C_INCLUDE_DIR} " )
170+ endif ()
87171endif ()
0 commit comments