From eccbd64d559b959cdf214a141942b3d0df69143b Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 17 Jan 2024 15:22:21 +0000 Subject: [PATCH 01/13] CMake: Move pnetcdf detection to `FindPNETCDF` cmake module Also: - add back call to `include_directories` for PnetCDF - ensure `MPI` is found for PnetCDF with serial HDF5 --- CMakeLists.txt | 66 ++++-------------------------------- cmake/FindPNETCDF.cmake | 73 ++++++++++++++++++++++++++++++++++++++++ cmake/dependencies.cmake | 28 ++++++++------- 3 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 cmake/FindPNETCDF.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b69ee7a0dd..3a2f28edf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -932,47 +932,14 @@ IF(ENABLE_PARALLEL4 AND ENABLE_HDF5) ENDIF() # Options to enable parallel IO for classic formats with PnetCDF library. -SET(STATUS_PNETCDF "OFF") +SET(STATUS_PNETCDF ${USE_PNETCDF}) IF(ENABLE_PNETCDF) - # Check for ncmpi_create in libpnetcdf, define USE_PNETCDF - # Does the user want to turn on PnetCDF read ability? - SET(USE_PNETCDF ON CACHE BOOL "") - IF(NOT PNETCDF) - MESSAGE(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.") - SET(USE_PNETCDF OFF CACHE BOOL "") - ELSE(NOT PNETCDF) - SET(USE_PARALLEL ON CACHE BOOL "") - - # Check PnetCDF version. Must be >= 1.6.0 - set(pnetcdf_h "${PNETCDF_INCLUDE_DIR}/pnetcdf.h" ) - message(STATUS "PnetCDF include file ${pnetcdf_h} will be searched for version") - file(STRINGS "${pnetcdf_h}" pnetcdf_major_string REGEX "^#define PNETCDF_VERSION_MAJOR") - string(REGEX REPLACE "[^0-9]" "" pnetcdf_major "${pnetcdf_major_string}") - file(STRINGS "${pnetcdf_h}" pnetcdf_minor_string REGEX "^#define PNETCDF_VERSION_MINOR") - string(REGEX REPLACE "[^0-9]" "" pnetcdf_minor "${pnetcdf_minor_string}") - file(STRINGS "${pnetcdf_h}" pnetcdf_sub_string REGEX "^#define PNETCDF_VERSION_SUB") - string(REGEX REPLACE "[^0-9]" "" pnetcdf_sub "${pnetcdf_sub_string}") - set(pnetcdf_version "${pnetcdf_major}.${pnetcdf_minor}.${pnetcdf_sub}") - message(STATUS "Found PnetCDF version ${pnetcdf_version}") - - if(${pnetcdf_version} VERSION_GREATER "1.6.0") - SET(STATUS_PNETCDF "ON") - INCLUDE_DIRECTORIES(${PNETCDF_INCLUDE_DIR}) - SET(HAVE_LIBPNETCDF ON) - # PnetCDF => parallel - SET(STATUS_PARALLEL ON) - SET(USE_PARALLEL ON) - MESSAGE(STATUS "Using PnetCDF Library: ${PNETCDF}") - ELSE() - MESSAGE(WARNING "ENABLE_PNETCDF requires version 1.6.1 or later; found version ${pnetcdf_version}. PnetCDF is disabled") - ENDIF() - + set(STATUS_PARALLEL ON) ### - # Generate pnetcdf test. + # Generate pnetcdf test ### - CONFIGURE_FILE("${netCDF_SOURCE_DIR}/nc_test/run_pnetcdf_tests.sh.in" + configure_file("${netCDF_SOURCE_DIR}/nc_test/run_pnetcdf_tests.sh.in" "${netCDF_BINARY_DIR}/nc_test/run_pnetcdf_tests.sh") - ENDIF(NOT PNETCDF) ENDIF() # Options to enable use of fill values for elements causing NC_ERANGE @@ -995,19 +962,12 @@ ENDIF(ENABLE_ERANGE_FILL) SET(ENABLE_ZERO_LENGTH_COORD_BOUND ON) # check and conform with PnetCDF settings on ERANGE_FILL and RELAX_COORD_BOUND -IF(STATUS_PNETCDF) - file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL") - string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}") - IF("x${erange_fill_pnetcdf}" STREQUAL "x1") - SET(erange_fill_pnetcdf "ON") - ELSE() - SET(erange_fill_pnetcdf "OFF") - ENDIF() +IF(USE_PNETCDF) IF(ENABLE_ERANGE_FILL STREQUAL "AUTO") # not set on command line - SET(ENABLE_ERANGE_FILL "${erange_fill_pnetcdf}") + SET(ENABLE_ERANGE_FILL "${PNETCDF_ERANGE_FILL}") ELSE() # user explicitly set this option on command line - IF(NOT ENABLE_ERANGE_FILL STREQUAL "${erange_fill_pnetcdf}") + IF(NOT ENABLE_ERANGE_FILL STREQUAL "${PNETCDF_ERANGE_FILL}") IF(ENABLE_ERANGE_FILL) MESSAGE(FATAL_ERROR "Enabling erange-fill conflicts with PnetCDF setting") ELSE() @@ -1015,18 +975,6 @@ IF(STATUS_PNETCDF) ENDIF() ENDIF() ENDIF() - - file(STRINGS "${pnetcdf_h}" relax_coord_bound_pnetcdf REGEX "^#define PNETCDF_RELAX_COORD_BOUND") - string(REGEX REPLACE "[^0-9]" "" relax_coord_bound "${relax_coord_bound_pnetcdf}") - IF("x${relax_coord_bound}" STREQUAL "x1") - SET(relax_coord_bound_pnetcdf "ON") - ELSE() - SET(relax_coord_bound_pnetcdf "OFF") - ENDIF() - # pnetcdf must have relaxed coord bounds to build with netCDF-4 - IF(NOT ENABLE_ZERO_LENGTH_COORD_BOUND STREQUAL "${relax_coord_bound_pnetcdf}") - MESSAGE(FATAL_ERROR "Pnetcdf must be built with relax-coord-bound enabled") - ENDIF() ENDIF() IF(ENABLE_ERANGE_FILL) diff --git a/cmake/FindPNETCDF.cmake b/cmake/FindPNETCDF.cmake new file mode 100644 index 0000000000..64d5413abd --- /dev/null +++ b/cmake/FindPNETCDF.cmake @@ -0,0 +1,73 @@ +# FindPNETCDF +# ----------- +# +# Find parallel IO library for classic netCDF files +# +# This module will define the following variables: +# +# :: +# +# PNETCDF_FOUND +# PNETCDF_INCLUDE_DIRS +# PNETCDF_LIBRARIES +# PNETCDF_VERSION +# PNETCDF_ERANGE_FILL - True if PnetCDF was built with ``NC_ERANGE`` support` +# +# The ``PNETCDF::pnetcdf`` target will also be exported + +include(FindPackageHandleStandardArgs) + +find_path(PNETCDF_INCLUDE_DIR NAMES pnetcdf.h) +find_library(PNETCDF_LIBRARY NAMES pnetcdf) + +if (PNETCDF_INCLUDE_DIR) + set(pnetcdf_h "${PNETCDF_INCLUDE_DIR}/pnetcdf.h" ) + message(STATUS "PnetCDF include file ${pnetcdf_h} will be searched for version") + file(STRINGS "${pnetcdf_h}" pnetcdf_major_string REGEX "^#define PNETCDF_VERSION_MAJOR") + string(REGEX REPLACE "[^0-9]" "" pnetcdf_major "${pnetcdf_major_string}") + file(STRINGS "${pnetcdf_h}" pnetcdf_minor_string REGEX "^#define PNETCDF_VERSION_MINOR") + string(REGEX REPLACE "[^0-9]" "" pnetcdf_minor "${pnetcdf_minor_string}") + file(STRINGS "${pnetcdf_h}" pnetcdf_sub_string REGEX "^#define PNETCDF_VERSION_SUB") + string(REGEX REPLACE "[^0-9]" "" pnetcdf_sub "${pnetcdf_sub_string}") + set(pnetcdf_version "${pnetcdf_major}.${pnetcdf_minor}.${pnetcdf_sub}") + message(STATUS "Found PnetCDF version ${pnetcdf_version}") +endif() + +if (PNETCDF_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ]" + " PNETCDF_ROOT = ${PNETCDF_ROOT}" + " PNETCDF_INCLUDE_DIR = ${PNETCDF_INCLUDE_DIR}" + " PNETCDF_LIBRARY = ${PNETCDF_LIBRARY}" + " PNETCDF_VERSION = ${PNETCDF_VERSION}" + ) +endif() + +file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL") +string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}") +if("${erange_fill_pnetcdf}" STREQUAL "1") + set(PNETCDF_ERANGE_FILL ON CACHE BOOL "") +else() + set(PNETCDF_ERANGE_FILL OFF CACHE BOOL "") +endif() + +mark_as_advanced(PNETCDF_INCLUDE_DIR PNETCDF_LIBRARY PNETCDF_ERANGE_FILL) + +file(STRINGS "${pnetcdf_h}" relax_coord_bound_pnetcdf REGEX "^#define PNETCDF_RELAX_COORD_BOUND") +string(REGEX REPLACE "[^0-9]" "" relax_coord_bound "${relax_coord_bound_pnetcdf}") +# pnetcdf must have relaxed coord bounds to build with netCDF-4 +if(NOT "${relax_coord_bound}" STREQUAL "1") + message(FATAL_ERROR "Pnetcdf must be built with relax-coord-bound enabled") +endif() + +find_package_handle_standard_args(PNETCDF + REQUIRED_VARS PNETCDF_LIBRARY PNETCDF_INCLUDE_DIR + VERSION_VAR PNETCDF_VERSION + ) + +if (PNETCDF_FOUND AND NOT TARGET PNETCDF::PNETCDF) + add_library(pnetcdf::pnetcdf UNKNOWN IMPORTED) + set_target_properties(pnetcdf::pnetcdf PROPERTIES + IMPORTED_LOCATION "${PNETCDF_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${PNETCDF_INCLUDE_DIR}" + ) +endif() diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6c9e9a62c5..1acf70c3a1 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -627,23 +627,25 @@ IF(ENABLE_LIBXML2) ENDIF() ENDIF(ENABLE_LIBXML2) -################################ -# MPI -################################ -IF(ENABLE_PARALLEL4 OR HDF5_PARALLEL) - FIND_PACKAGE(MPI REQUIRED) -ENDIF() - ################################ # parallel IO ################################ IF(ENABLE_PNETCDF) - FIND_LIBRARY(PNETCDF NAMES pnetcdf) - FIND_PATH(PNETCDF_INCLUDE_DIR pnetcdf.h) - IF(NOT PNETCDF) - MESSAGE(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.") - SET(USE_PNETCDF OFF CACHE BOOL "") + find_package(PNETCDF 1.6.0) + IF(PNETCDF_FOUND) + set(USE_PNETCDF ON CACHE BOOL "") + else() + message(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.") + set(USE_PNETCDF OFF CACHE BOOL "") ENDIF() + include_directories(${PNETCDF_INCLUDE_DIR}) +ENDIF() + +################################ +# MPI +################################ +IF(ENABLE_PARALLEL4 OR HDF5_PARALLEL OR ENABLE_PNETCDF) + FIND_PACKAGE(MPI REQUIRED) ENDIF() ################################ @@ -651,4 +653,4 @@ ENDIF() ################################ IF(ENABLE_DOXYGEN) FIND_PACKAGE(Doxygen REQUIRED) -ENDIF() \ No newline at end of file +ENDIF() From 20954a7e1b2d008cee334b7275e9f5357c043a29 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 17 Jan 2024 16:01:02 +0000 Subject: [PATCH 02/13] CMake: Remove unused `#cmakedefine` --- config.h.cmake.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/config.h.cmake.in b/config.h.cmake.in index f10a3a91a5..5f9e38206b 100644 --- a/config.h.cmake.in +++ b/config.h.cmake.in @@ -307,9 +307,6 @@ are set when opening a binary file on Windows. */ /* Define to 1 if you have the `mfhdf' library (-lmfhdf). */ #cmakedefine HAVE_LIBMFHDF 1 -/* Define to 1 if you have the `pnetcdf' library (-lpnetcdf). */ -#cmakedefine HAVE_LIBPNETCDF 1 - /* Define to 1 if you have the libxml2 library. */ #cmakedefine ENABLE_LIBXML2 1 From 425d38ac4f39511023eb8067b302145cc71795cf Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 17 Jan 2024 16:19:19 +0000 Subject: [PATCH 03/13] CMake: Require pnetcdf if requested --- cmake/dependencies.cmake | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 1acf70c3a1..3c894bcbfe 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -631,13 +631,8 @@ ENDIF(ENABLE_LIBXML2) # parallel IO ################################ IF(ENABLE_PNETCDF) - find_package(PNETCDF 1.6.0) - IF(PNETCDF_FOUND) - set(USE_PNETCDF ON CACHE BOOL "") - else() - message(STATUS "Cannot find PnetCDF library. Disabling PnetCDF support.") - set(USE_PNETCDF OFF CACHE BOOL "") - ENDIF() + find_package(PNETCDF 1.6.0 REQUIRED) + set(USE_PNETCDF ON CACHE BOOL "") include_directories(${PNETCDF_INCLUDE_DIR}) ENDIF() From e728555beb3228d606cd9c23451c64b086e28242 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 17 Jan 2024 16:19:57 +0000 Subject: [PATCH 04/13] CMake: Simplify setting some cache variables for pnetcdf --- CMakeLists.txt | 4 +++- cmake/dependencies.cmake | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a2f28edf8..94c8a65e20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -932,9 +932,11 @@ IF(ENABLE_PARALLEL4 AND ENABLE_HDF5) ENDIF() # Options to enable parallel IO for classic formats with PnetCDF library. -SET(STATUS_PNETCDF ${USE_PNETCDF}) +set(STATUS_PNETCDF ${ENABLE_PNETCDF}) +set(USE_PNETCDF ${ENABLE_PNETCDF}) IF(ENABLE_PNETCDF) set(STATUS_PARALLEL ON) + set(USE_PARALLEL ON CACHE BOOL "") ### # Generate pnetcdf test ### diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 3c894bcbfe..6ea3bc4c0d 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -632,7 +632,6 @@ ENDIF(ENABLE_LIBXML2) ################################ IF(ENABLE_PNETCDF) find_package(PNETCDF 1.6.0 REQUIRED) - set(USE_PNETCDF ON CACHE BOOL "") include_directories(${PNETCDF_INCLUDE_DIR}) ENDIF() From fd6421d5c907bc9c0df6c234003b61d8fdcc9c45 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 17 Jan 2024 17:17:59 +0000 Subject: [PATCH 05/13] CMake: Don't use `include_directories` for pnetcdf --- cmake/dependencies.cmake | 1 - libdispatch/CMakeLists.txt | 4 ++++ liblib/CMakeLists.txt | 5 ++--- libsrcp/CMakeLists.txt | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6ea3bc4c0d..a2aef770e8 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -632,7 +632,6 @@ ENDIF(ENABLE_LIBXML2) ################################ IF(ENABLE_PNETCDF) find_package(PNETCDF 1.6.0 REQUIRED) - include_directories(${PNETCDF_INCLUDE_DIR}) ENDIF() ################################ diff --git a/libdispatch/CMakeLists.txt b/libdispatch/CMakeLists.txt index 1d867369b8..e0ce0601d7 100644 --- a/libdispatch/CMakeLists.txt +++ b/libdispatch/CMakeLists.txt @@ -36,6 +36,10 @@ IF(STATUS_PARALLEL) target_link_libraries(dispatch PUBLIC MPI::MPI_C) ENDIF(STATUS_PARALLEL) +if (ENABLE_PNETCDF) + target_link_libraries(dispatch PUBLIC pnetcdf::pnetcdf) +endif() + IF(ENABLE_NCZARR) target_include_directories(dispatch PUBLIC ../libnczarr) ENDIF(ENABLE_NCZARR) diff --git a/liblib/CMakeLists.txt b/liblib/CMakeLists.txt index 4e54e00815..14227738ae 100644 --- a/liblib/CMakeLists.txt +++ b/liblib/CMakeLists.txt @@ -139,11 +139,10 @@ IF(USE_HDF4) SET(TLL_LIBS ${HDF4_MFHDF_LIB} ${HDF4_DF_LIB} ${TLL_LIBS}) ENDIF() -IF(ENABLE_PNETCDF AND PNETCDF) - SET(TLL_LIBS ${TLL_LIBS} ${PNETCDF}) +IF(ENABLE_PNETCDF) + SET(TLL_LIBS ${TLL_LIBS} pnetcdf::pnetcdf) ENDIF() - IF(ENABLE_S3) IF(ENABLE_S3_AWS) TARGET_LINK_DIRECTORIES(netcdf PUBLIC ${AWSSDK_LIB_DIR}) diff --git a/libsrcp/CMakeLists.txt b/libsrcp/CMakeLists.txt index adf1d34136..f9e5c52c31 100644 --- a/libsrcp/CMakeLists.txt +++ b/libsrcp/CMakeLists.txt @@ -8,5 +8,6 @@ SET(libsrcp_SOURCES ncpdispatch.c) add_library(netcdfp OBJECT ${libsrcp_SOURCES}) +target_link_libraries(netcdfp PUBLIC pnetcdf::pnetcdf) ADD_EXTRA_DIST(${libsrcp_SOURCES} CMakeLists.txt) From e632818b40775977d8a856381f083b0ae8c036bf Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Thu, 18 Jan 2024 15:07:26 +0000 Subject: [PATCH 06/13] CMake: Move `FindPNETCDF` to `cmake/modules` --- cmake/{ => modules}/FindPNETCDF.cmake | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmake/{ => modules}/FindPNETCDF.cmake (100%) diff --git a/cmake/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake similarity index 100% rename from cmake/FindPNETCDF.cmake rename to cmake/modules/FindPNETCDF.cmake From a689a536f8ed8549ad631354690b44671e487c4e Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 24 Jan 2024 10:05:38 +0000 Subject: [PATCH 07/13] CMake: Use `message(DEBUG)` in `FindPNETCDF` --- cmake/modules/FindPNETCDF.cmake | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cmake/modules/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake index 64d5413abd..b2bbae5a25 100644 --- a/cmake/modules/FindPNETCDF.cmake +++ b/cmake/modules/FindPNETCDF.cmake @@ -22,7 +22,7 @@ find_library(PNETCDF_LIBRARY NAMES pnetcdf) if (PNETCDF_INCLUDE_DIR) set(pnetcdf_h "${PNETCDF_INCLUDE_DIR}/pnetcdf.h" ) - message(STATUS "PnetCDF include file ${pnetcdf_h} will be searched for version") + message(DEBUG "PnetCDF include file ${pnetcdf_h} will be searched for version") file(STRINGS "${pnetcdf_h}" pnetcdf_major_string REGEX "^#define PNETCDF_VERSION_MAJOR") string(REGEX REPLACE "[^0-9]" "" pnetcdf_major "${pnetcdf_major_string}") file(STRINGS "${pnetcdf_h}" pnetcdf_minor_string REGEX "^#define PNETCDF_VERSION_MINOR") @@ -30,17 +30,15 @@ if (PNETCDF_INCLUDE_DIR) file(STRINGS "${pnetcdf_h}" pnetcdf_sub_string REGEX "^#define PNETCDF_VERSION_SUB") string(REGEX REPLACE "[^0-9]" "" pnetcdf_sub "${pnetcdf_sub_string}") set(pnetcdf_version "${pnetcdf_major}.${pnetcdf_minor}.${pnetcdf_sub}") - message(STATUS "Found PnetCDF version ${pnetcdf_version}") + message(DEBUG "Found PnetCDF version ${pnetcdf_version}") endif() -if (PNETCDF_DEBUG) - message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ]" - " PNETCDF_ROOT = ${PNETCDF_ROOT}" - " PNETCDF_INCLUDE_DIR = ${PNETCDF_INCLUDE_DIR}" - " PNETCDF_LIBRARY = ${PNETCDF_LIBRARY}" - " PNETCDF_VERSION = ${PNETCDF_VERSION}" - ) -endif() +message(DEBUG "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ]" + " PNETCDF_ROOT = ${PNETCDF_ROOT}" + " PNETCDF_INCLUDE_DIR = ${PNETCDF_INCLUDE_DIR}" + " PNETCDF_LIBRARY = ${PNETCDF_LIBRARY}" + " PNETCDF_VERSION = ${PNETCDF_VERSION}" +) file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL") string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}") From 4835e43f331615957d75143b6a36ce50fad575b0 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 24 Jan 2024 10:07:46 +0000 Subject: [PATCH 08/13] CMake: Consistent casing of PNETCDF target --- cmake/modules/FindPNETCDF.cmake | 6 +++--- libdispatch/CMakeLists.txt | 2 +- liblib/CMakeLists.txt | 2 +- libsrcp/CMakeLists.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/modules/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake index b2bbae5a25..0bba33560a 100644 --- a/cmake/modules/FindPNETCDF.cmake +++ b/cmake/modules/FindPNETCDF.cmake @@ -63,9 +63,9 @@ find_package_handle_standard_args(PNETCDF ) if (PNETCDF_FOUND AND NOT TARGET PNETCDF::PNETCDF) - add_library(pnetcdf::pnetcdf UNKNOWN IMPORTED) - set_target_properties(pnetcdf::pnetcdf PROPERTIES + add_library(PNETCDF::PNETCDF UNKNOWN IMPORTED) + set_target_properties(PNETCDF::PNETCDF PROPERTIES IMPORTED_LOCATION "${PNETCDF_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${PNETCDF_INCLUDE_DIR}" - ) + ) endif() diff --git a/libdispatch/CMakeLists.txt b/libdispatch/CMakeLists.txt index 462aaad6f3..497dc6c351 100644 --- a/libdispatch/CMakeLists.txt +++ b/libdispatch/CMakeLists.txt @@ -50,7 +50,7 @@ IF(STATUS_PARALLEL) ENDIF(STATUS_PARALLEL) if (ENABLE_PNETCDF) - target_link_libraries(dispatch PUBLIC pnetcdf::pnetcdf) + target_link_libraries(dispatch PUBLIC PNETCDF::PNETCDF) endif() IF(ENABLE_NCZARR) diff --git a/liblib/CMakeLists.txt b/liblib/CMakeLists.txt index 14227738ae..86953ac5bd 100644 --- a/liblib/CMakeLists.txt +++ b/liblib/CMakeLists.txt @@ -140,7 +140,7 @@ IF(USE_HDF4) ENDIF() IF(ENABLE_PNETCDF) - SET(TLL_LIBS ${TLL_LIBS} pnetcdf::pnetcdf) + SET(TLL_LIBS ${TLL_LIBS} PNETCDF::PNETCDF) ENDIF() IF(ENABLE_S3) diff --git a/libsrcp/CMakeLists.txt b/libsrcp/CMakeLists.txt index f9e5c52c31..9bcbda3d2c 100644 --- a/libsrcp/CMakeLists.txt +++ b/libsrcp/CMakeLists.txt @@ -8,6 +8,6 @@ SET(libsrcp_SOURCES ncpdispatch.c) add_library(netcdfp OBJECT ${libsrcp_SOURCES}) -target_link_libraries(netcdfp PUBLIC pnetcdf::pnetcdf) +target_link_libraries(netcdfp PUBLIC PNETCDF::PNETCDF) ADD_EXTRA_DIST(${libsrcp_SOURCES} CMakeLists.txt) From e88dc9c8e6c06b81bac0ad2b0e917a91108e87c0 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 24 Jan 2024 10:39:06 +0000 Subject: [PATCH 09/13] CMake: Ensure pnetcdf links to MPI, libm --- cmake/dependencies.cmake | 14 +++++++------- cmake/modules/FindPNETCDF.cmake | 7 +++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index f0b649eaf5..2057a513a7 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -615,6 +615,13 @@ if(ENABLE_LIBXML2) endif() endif(ENABLE_LIBXML2) +################################ +# MPI +################################ +if(ENABLE_PARALLEL4 OR HDF5_PARALLEL) + find_package(MPI REQUIRED) +endif() + ################################ # Parallel IO ################################ @@ -622,13 +629,6 @@ if(ENABLE_PNETCDF) find_package(PNETCDF 1.6.0 REQUIRED) endif() -################################ -# MPI -################################ -if(ENABLE_PARALLEL4 OR HDF5_PARALLEL OR ENABLE_PNETCDF) - find_package(MPI REQUIRED) -endif() - ################################ # Doxygen ################################ diff --git a/cmake/modules/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake index 0bba33560a..a147494db5 100644 --- a/cmake/modules/FindPNETCDF.cmake +++ b/cmake/modules/FindPNETCDF.cmake @@ -63,9 +63,16 @@ find_package_handle_standard_args(PNETCDF ) if (PNETCDF_FOUND AND NOT TARGET PNETCDF::PNETCDF) + find_package(MPI REQUIRED) add_library(PNETCDF::PNETCDF UNKNOWN IMPORTED) set_target_properties(PNETCDF::PNETCDF PROPERTIES + IMPORTED_LINK_INTERFACE_LIBRARIES MPI::MPI_C IMPORTED_LOCATION "${PNETCDF_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${PNETCDF_INCLUDE_DIR}" ) + find_library(MATH_LIBRARY m) + if (MATH_LIBRARY) + set_target_properties(PNETCDF::PNETCDF PROPERTIES + IMPORTED_LINK_INTERFACE_LIBRARIES ${MATH_LIBRARY}) + endif() endif() From ff80ee4f9f16e706b02e2189c54e9e603aad5694 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 24 Jan 2024 10:44:33 +0000 Subject: [PATCH 10/13] CMake: Set feature variable rather than erroring in `FindPNETCDF` Enables potential reuse of module outside of netCDF --- cmake/dependencies.cmake | 3 +++ cmake/modules/FindPNETCDF.cmake | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 2057a513a7..d011800f43 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -627,6 +627,9 @@ endif() ################################ if(ENABLE_PNETCDF) find_package(PNETCDF 1.6.0 REQUIRED) + if(NOT PNETCDF_HAS_RELAXED_COORD_BOUND) + message(FATAL_ERROR "Pnetcdf must be built with relax-coord-bound enabled") + endif() endif() ################################ diff --git a/cmake/modules/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake index a147494db5..ec74a64dd7 100644 --- a/cmake/modules/FindPNETCDF.cmake +++ b/cmake/modules/FindPNETCDF.cmake @@ -12,6 +12,7 @@ # PNETCDF_LIBRARIES # PNETCDF_VERSION # PNETCDF_ERANGE_FILL - True if PnetCDF was built with ``NC_ERANGE`` support` +# PNETCDF_HAS_RELAXED_COORD_BOUND - True if PnetCDF was built with relaxed coordinate bounds # # The ``PNETCDF::pnetcdf`` target will also be exported @@ -52,9 +53,10 @@ mark_as_advanced(PNETCDF_INCLUDE_DIR PNETCDF_LIBRARY PNETCDF_ERANGE_FILL) file(STRINGS "${pnetcdf_h}" relax_coord_bound_pnetcdf REGEX "^#define PNETCDF_RELAX_COORD_BOUND") string(REGEX REPLACE "[^0-9]" "" relax_coord_bound "${relax_coord_bound_pnetcdf}") -# pnetcdf must have relaxed coord bounds to build with netCDF-4 -if(NOT "${relax_coord_bound}" STREQUAL "1") - message(FATAL_ERROR "Pnetcdf must be built with relax-coord-bound enabled") +if ("${relax_coord_bound}" STREQUAL "1") + set(PNETCDF_HAS_RELAXED_COORD_BOUND ON CACHE BOOL "") +else() + set(PNETCDF_HAS_RELAXED_COORD_BOUND OFF CACHE BOOL "") endif() find_package_handle_standard_args(PNETCDF From 4aa6d38bc4a7425bc5cf620301f754b5f0484bad Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Wed, 24 Jan 2024 10:45:10 +0000 Subject: [PATCH 11/13] CMake: Consistent name for feature variable --- CMakeLists.txt | 4 ++-- cmake/modules/FindPNETCDF.cmake | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b528d1c19..17cb033aac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -916,10 +916,10 @@ set(ENABLE_ZERO_LENGTH_COORD_BOUND ON) # check and conform with PnetCDF settings on ERANGE_FILL and RELAX_COORD_BOUND if(USE_PNETCDF) if(ENABLE_ERANGE_FILL STREQUAL "AUTO") # not set on command line - set(ENABLE_ERANGE_FILL "${PNETCDF_ERANGE_FILL}") + set(ENABLE_ERANGE_FILL "${PNETCDF_HAS_ERANGE_FILL}") else() # user explicitly set this option on command line - if(NOT ENABLE_ERANGE_FILL STREQUAL "${PNETCDF_ERANGE_FILL}") + if(NOT ENABLE_ERANGE_FILL STREQUAL "${PNETCDF_HAS_ERANGE_FILL}") if(ENABLE_ERANGE_FILL) message(FATAL_ERROR "Enabling erange-fill conflicts with PnetCDF setting") else() diff --git a/cmake/modules/FindPNETCDF.cmake b/cmake/modules/FindPNETCDF.cmake index ec74a64dd7..473773249b 100644 --- a/cmake/modules/FindPNETCDF.cmake +++ b/cmake/modules/FindPNETCDF.cmake @@ -11,7 +11,7 @@ # PNETCDF_INCLUDE_DIRS # PNETCDF_LIBRARIES # PNETCDF_VERSION -# PNETCDF_ERANGE_FILL - True if PnetCDF was built with ``NC_ERANGE`` support` +# PNETCDF_HAS_ERANGE_FILL - True if PnetCDF was built with ``NC_ERANGE`` support` # PNETCDF_HAS_RELAXED_COORD_BOUND - True if PnetCDF was built with relaxed coordinate bounds # # The ``PNETCDF::pnetcdf`` target will also be exported @@ -44,9 +44,9 @@ message(DEBUG "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ]" file(STRINGS "${pnetcdf_h}" enable_erange_fill_pnetcdf REGEX "^#define PNETCDF_ERANGE_FILL") string(REGEX REPLACE "[^0-9]" "" erange_fill_pnetcdf "${enable_erange_fill_pnetcdf}") if("${erange_fill_pnetcdf}" STREQUAL "1") - set(PNETCDF_ERANGE_FILL ON CACHE BOOL "") + set(PNETCDF_HAS_ERANGE_FILL ON CACHE BOOL "") else() - set(PNETCDF_ERANGE_FILL OFF CACHE BOOL "") + set(PNETCDF_HAS_ERANGE_FILL OFF CACHE BOOL "") endif() mark_as_advanced(PNETCDF_INCLUDE_DIR PNETCDF_LIBRARY PNETCDF_ERANGE_FILL) From 77df436b0d0f1f98fb1a9d5cc46e1513633f3211 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Tue, 12 Mar 2024 09:44:28 +0000 Subject: [PATCH 12/13] CI: Fix version of HDF5 used in one-off test --- .github/workflows/run_tests_ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_tests_ubuntu.yml b/.github/workflows/run_tests_ubuntu.yml index e0412bc17c..a6a17bf8a0 100644 --- a/.github/workflows/run_tests_ubuntu.yml +++ b/.github/workflows/run_tests_ubuntu.yml @@ -223,7 +223,7 @@ jobs: strategy: matrix: - hdf5: [ 1.14.0 ] + hdf5: [ 1.14.3 ] steps: - uses: actions/checkout@v3 From 83e184bc7588988e9e5d7c15b84ce069e99da980 Mon Sep 17 00:00:00 2001 From: Peter Hill Date: Tue, 12 Mar 2024 09:59:30 +0000 Subject: [PATCH 13/13] Link `nc_test` against third-party libraries Ensures pnetcdf include directory is in path --- nc_test/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/nc_test/CMakeLists.txt b/nc_test/CMakeLists.txt index ba9c9f6d30..f24d791a86 100644 --- a/nc_test/CMakeLists.txt +++ b/nc_test/CMakeLists.txt @@ -33,6 +33,7 @@ TARGET_INCLUDE_DIRECTORIES(nc_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) TARGET_LINK_LIBRARIES(nc_test netcdf ${HAVE_LIBM} + ${ALL_TLL_LIBS} ) ##