Repository: Unidata/netcdf-c (c)

Issue:
4.8.0 prep branch fails to build when linking against hdf5 1.12.0
Compiling when linking against hdf5 `1.12.0` fails with an undefined symbol error.  `_H5Literate` referenced from `_rec_read_metadata` in `_hdf5open.c`.  Checking now.

Pull request:
4.8.0 wellspring.wif
* Fixes #1965 

Move updates back upstream into `main` development branch.

Patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 804be33f0..57467304c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,18 +26,18 @@ set(PACKAGE "netCDF" CACHE STRING "")
 
 SET(NC_VERSION_MAJOR 4)
 SET(NC_VERSION_MINOR 8)
-SET(NC_VERSION_PATCH 0)
+SET(NC_VERSION_PATCH 1)
 SET(NC_VERSION_NOTE "-development")
 SET(netCDF_VERSION ${NC_VERSION_MAJOR}.${NC_VERSION_MINOR}.${NC_VERSION_PATCH}${NC_VERSION_NOTE})
 SET(VERSION ${netCDF_VERSION})
 SET(NC_VERSION ${netCDF_VERSION})
-SET(netCDF_LIB_VERSION 18)
-SET(netCDF_SO_VERSION 18)
+SET(netCDF_LIB_VERSION 19)
+SET(netCDF_SO_VERSION 19)
 SET(PACKAGE_VERSION ${VERSION})
 
 # Version of the dispatch table. This must match the value in
 # configure.ac.
-SET(NC_DISPATCH_VERSION 2)
+SET(NC_DISPATCH_VERSION 3)
 
 # Get system configuration, Use it to determine osname, os release, cpu. These
 # will be used when committing to CDash.
@@ -163,8 +163,6 @@ SET(EXTRA_DEPS "")
 # Set CTest Properties
 ################################
 
-
-
 ENABLE_TESTING()
 INCLUDE(CTest)
 
@@ -262,6 +260,7 @@ ENDIF()
 #####
 # System inspection checks
 #####
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/oc2)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libsrc)
@@ -748,7 +747,7 @@ IF(USE_HDF5)
     SET(CMAKE_REQUIRED_LIBRARIES ${SZIP_LIBRARY} ${CMAKE_REQUIRED_LIBRARIES})
     MESSAGE(STATUS "HDF5 has szip.")
   ENDIF()
-  
+
   # Find out if HDF5 was built with parallel support.
   # Do that by checking for the targets H5Pget_fapl_mpiposx and
   # H5Pget_fapl_mpio in ${HDF5_LIB}.
@@ -766,11 +765,39 @@ IF(USE_HDF5)
 
   #Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
   CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_all_coll_metadata_ops "" HDF5_HAS_COLL_METADATA_OPS)
-  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_libver_bounds "" HAVE_H5PSET_LIBVER_BOUNDS)
   CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5free_memory "" HAVE_H5FREE_MEMORY)
   CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5allocate_memory "" HAVE_H5ALLOCATE_MEMORY)
   CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5resize_memory "" HAVE_H5RESIZE_MEMORY)
 
+  ##
+  # Starting with libhdf5 1.12.0, we need to specify the option
+  # `--with-default-api-version=v18` when configuring libhdf5. Otherwise,
+  # the symbol H5Literate is not found.  Check for this and return an error if it's not found.
+  #
+  # We first check for the symbol in the library, for versions 1.8.x and 1.10.x.  If this fails,
+  # we must then check for its usage as a macro (version 1.12.x).
+  ##
+
+  CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Literate "" HAVE_H5Literate)
+
+  IF(NOT HAVE_H5Literate)
+  CHECK_C_SOURCE_COMPILES("#include <H5public.h>
+   #if !(H5Literate_vers == 1)
+   #error
+   #endif
+   int main() {int x = 1;}" HAVE_H5Literate_Macro)
+  ELSE()
+   SET(HAVE_H5Literate_Macro 1)
+  ENDIF(NOT HAVE_H5Literate)
+
+  IF(NOT HAVE_H5Literate_Macro)
+      MESSAGE(FATAL_ERROR "${HDF5_C_LIBRARY_hdf5} does not contain symbol '_H5Literate'.  Please recompile your libhdf5 install using '--with-default-api-version=v18'.")
+  ENDIF(NOT HAVE_H5Literate_Macro)
+
+  ##
+  # End H5Literate checks
+  ##
+
   IF(HDF5_PARALLEL)
 	SET(HDF5_CC h5pcc)
   ELSE()
@@ -2206,6 +2233,13 @@ configure_file(
   ${netCDF_SOURCE_DIR}/include/netcdf_meta.h.in
   ${netCDF_BINARY_DIR}/include/netcdf_meta.h @ONLY)
 
+#####
+# Create 'netcdf_dispatch.h' include file.
+#####
+configure_file(
+  ${netCDF_SOURCE_DIR}/include/netcdf_dispatch.h.in
+  ${netCDF_BINARY_DIR}/include/netcdf_dispatch.h @ONLY NEWLINE_STYLE LF)
+
 #####
 # Build test_common.sh
 #####
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 5a4a6221c..64aff044a 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -5,8 +5,9 @@ Release Notes       {#RELEASE_NOTES}
 
 This file contains a high-level description of this package's evolution. Releases are in reverse chronological order (most recent first). Note that, as of netcdf 4.2, the `netcdf-c++` and `netcdf-fortran` libraries have been separated into their own libraries.
 
-## 4.8.0 - TBD
+## 4.8.0 - March 30, 2021
 
+* [Enhancement] Bump the NC_DISPATCH_VERSION from 2 to 3, and as a side effect, unify the definition of NC_DISPATCH_VERSION so it only needs to be defined in CMakeLists.txt and configure.ac. See [Github #1945](https://github.com/Unidata/netcdf-c/pull/1945) for more information.
 * [Enhancement] Provide better cross platform path name management. This converts paths for various platforms (e.g. Windows, MSYS, etc.) so that they are in the proper format for the executing platform. See [Github #1958](https://github.com/Unidata/netcdf-c/pull/1958) for more information.
 * [Bug Fixes] The nccopy program was treating -d0 as turning deflation on rather than interpreting it as "turn off deflation". See [Github #1944](https://github.com/Unidata/netcdf-c/pull/1944) for more information.
 * [Enhancement] Add support for storing NCZarr data in zip files. See [Github #1942](https://github.com/Unidata/netcdf-c/pull/1942) for more information.
diff --git a/config.h.cmake.in b/config.h.cmake.in
index 7ed01bf64..b7a4c0bfe 100644
--- a/config.h.cmake.in
+++ b/config.h.cmake.in
@@ -256,9 +256,6 @@ are set when opening a binary file on Windows. */
 /* Define to 1 if you have the `gettimeofday' function. */
 #cmakedefine HAVE_STRUCT_TIMESPEC 1
 
-/* if true, netcdf4 file properties will be set using H5Pset_libver_bounds */
-#cmakedefine HAVE_H5PSET_LIBVER_BOUNDS 1
-
 /* Define to 1 if you have the `H5Z_SZIP' function. */
 #cmakedefine HAVE_H5Z_SZIP 1
 
@@ -463,6 +460,9 @@ with zip */
 /* Add extra properties to _NCProperties attribute */
 #cmakedefine NCPROPERTIES_EXTRA ${NCPROPERTIES_EXTRA}
 
+/* Idspatch table version */
+#cmakedefine NC_DISPATCH_VERSION ${NC_DISPATCH_VERSION}
+
 /* no IEEE float on this platform */
 #cmakedefine NO_IEEE_FLOAT 1
 
diff --git a/configure.ac b/configure.ac
index 1ff05a88c..b6bc4fea8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,7 +10,7 @@
 AC_PREREQ([2.59])
 
 # Initialize with name, version, and support email address.
-AC_INIT([netCDF], [4.8.0-development], [support-netcdf@unidata.ucar.edu], [netcdf-c])
+AC_INIT([netCDF], [4.8.1-development], [support-netcdf@unidata.ucar.edu], [netcdf-c])
 
 ##
 # Prefer an empty CFLAGS variable instead of the default -g -O2.
@@ -21,7 +21,7 @@ AC_INIT([netCDF], [4.8.0-development], [support-netcdf@unidata.ucar.edu], [netcd
 
 AC_SUBST([NC_VERSION_MAJOR]) NC_VERSION_MAJOR=4
 AC_SUBST([NC_VERSION_MINOR]) NC_VERSION_MINOR=8
-AC_SUBST([NC_VERSION_PATCH]) NC_VERSION_PATCH=0
+AC_SUBST([NC_VERSION_PATCH]) NC_VERSION_PATCH=1
 AC_SUBST([NC_VERSION_NOTE]) NC_VERSION_NOTE="-development"
 
 #####
@@ -1216,7 +1216,20 @@ if test "x$enable_hdf5" = xyes; then
 
    # H5Pset_fapl_mpiposix and H5Pget_fapl_mpiposix have been removed since HDF5 1.8.12.
    # Use H5Pset_fapl_mpio and H5Pget_fapl_mpio, instead.
-   AC_CHECK_FUNCS([H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory H5resize_memory H5allocate_memory H5Pset_libver_bounds H5Pset_all_coll_metadata_ops])
+
+   AC_CHECK_FUNCS([H5Pget_fapl_mpio H5Pset_deflate H5Z_SZIP H5free_memory H5resize_memory H5allocate_memory H5Pset_all_coll_metadata_ops H5Literate])
+
+   # Check to see if HDF5 library has H5Literate (HDF5 1.8.x, 1.10.x)
+   if test "x$ac_cv_func_H5Literate" = xno; then
+      AC_MSG_CHECKING([for H5Literate macro])
+      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include "H5public.h"],
+      [[#if !(H5Literate_vers == 1)
+      # error
+      #endif]
+      ])], [], [AC_MSG_RESULT(no); AC_MSG_ERROR([HDF5 was not built with API compatibility version v18. Please recompile your libhdf5 install using '--with-default-api-version=v18'.])])
+      AC_MSG_RESULT(yes)
+   fi
+
 
    # Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
    if test "x$ac_cv_func_H5Pset_all_coll_metadata_ops" = xyes; then
@@ -1689,7 +1702,9 @@ AX_SET_META([NC_HAS_MULTIFILTERS],[$has_multifilters],[yes])
 # applications like PIO can determine whether they have an appropriate
 # dispatch table to submit. If this is changed, make sure the value in
 # CMakeLists.txt also changes to match.
-AC_SUBST([NC_DISPATCH_VERSION], [2])
+
+AC_SUBST([NC_DISPATCH_VERSION], [3])
+AC_DEFINE_UNQUOTED([NC_DISPATCH_VERSION], [${NC_DISPATCH_VERSION}], [Dispatch table version.])
 
 #####
 # End netcdf_meta.h definitions.
@@ -1723,6 +1738,7 @@ AC_CONFIG_FILES([Makefile
                  libnetcdf.settings
                  postinstall.sh
                  include/netcdf_meta.h
+                 include/netcdf_dispatch.h
                  include/Makefile
                  h5_test/Makefile
                  hdf4_test/Makefile
diff --git a/docs/Doxyfile.developer b/docs/Doxyfile.developer
index 903df5aa9..5cc154762 100644
--- a/docs/Doxyfile.developer
+++ b/docs/Doxyfile.developer
@@ -38,7 +38,7 @@ PROJECT_NAME           = netCDF-C
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 4.8.0-development
+PROJECT_NUMBER         = 4.8.1-development
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -2083,7 +2083,7 @@ HAVE_DOT               = YES
 # Minimum value: 0, maximum value: 32, default value: 0.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_NUM_THREADS        = 4
+DOT_NUM_THREADS        = 0
 
 # When you want a differently looking font n the dot files that doxygen
 # generates you can specify the font name using DOT_FONTNAME. You need to make
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
index 522d4dc9f..05063d414 100644
--- a/docs/Doxyfile.in
+++ b/docs/Doxyfile.in
@@ -786,7 +786,6 @@ INPUT = \
     @abs_top_srcdir@/libdispatch/derror.c \
     @abs_top_srcdir@/libdispatch/dv2i.c \
     @abs_top_srcdir@/libdispatch/dcopy.c \
-    @abs_top_srcdir@/libhdf5/hdf5file.c \
     @abs_top_srcdir@/libsrc4/nc4var.c \
     @abs_top_srcdir@/libhdf5/nc4hdf.c \
     @abs_top_srcdir@/libsrc4/nc4internal.c \
@@ -796,8 +795,8 @@ INPUT = \
     @abs_top_srcdir@/libsrc4/nc4dim.c \
     @abs_top_srcdir@/libsrc4/nc4attr.c \
     @abs_top_srcdir@/libhdf5/nc4info.c \
-    @abs_top_srcdir@/libhdf5/hdf5cache.c \
     @abs_top_srcdir@/libsrc4/nc4dispatch.c \
+    @abs_top_srcdir@/libnczarr/zarr.c \
     @abs_top_srcdir@/examples/C/simple_xy_wr.c \
     @abs_top_srcdir@/examples/C/simple_xy_rd.c \
     @abs_top_srcdir@/examples/C/sfc_pres_temp_wr.c \
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index aa4d502ce..2ffcf5562 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -28,7 +28,7 @@ INSTALL(FILES ${netCDF_SOURCE_DIR}/include/netcdf_filter.h
     DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
     COMPONENT headers)
 
-INSTALL(FILES ${netCDF_SOURCE_DIR}/include/netcdf_dispatch.h
+INSTALL(FILES ${netCDF_BINARY_DIR}/include/netcdf_dispatch.h
     DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
     COMPONENT headers)
 
diff --git a/include/Makefile.am b/include/Makefile.am
index cf7723b67..77b97a0bb 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -29,4 +29,4 @@ if ENABLE_BYTERANGE
 noinst_HEADERS += nchttp.h
 endif
 
-EXTRA_DIST = CMakeLists.txt XGetopt.h netcdf_meta.h.in
+EXTRA_DIST = CMakeLists.txt XGetopt.h netcdf_meta.h.in netcdf_dispatch.h.in
diff --git a/include/ncdispatch.h b/include/ncdispatch.h
index 1219027e7..262603673 100644
--- a/include/ncdispatch.h
+++ b/include/ncdispatch.h
@@ -80,9 +80,6 @@
 #define ATOMICTYPEMAX3 NC_DOUBLE
 #define ATOMICTYPEMAX5 NC_UINT64
 
-/* Define an alias for int to indicate an error return */
-typedef int NCerror;
-
 #if !defined HDF5_PARALLEL && !defined USE_PNETCDF
 typedef int MPI_Comm;
 typedef int MPI_Info;
diff --git a/include/nchttp.h b/include/nchttp.h
index e239ae4b9..f5dd96314 100644
--- a/include/nchttp.h
+++ b/include/nchttp.h
@@ -23,7 +23,7 @@ typedef struct NC_HTTP_STATE {
     char errbuf[1024]; /* assert(CURL_ERROR_SIZE <= 1024) */
 } NC_HTTP_STATE;
 
-extern int nc_http_open(const char* objecturl, NC_HTTP_STATE** state, size64_t* lenp);
+extern int nc_http_open(const char* objecturl, NC_HTTP_STATE** state, long long* lenp);
 extern int nc_http_size(NC_HTTP_STATE* state, const char* url, size64_t* sizep);
 extern int nc_http_read(NC_HTTP_STATE* state, const char* url, size64_t start, size64_t count, NCbytes* buf);
 extern int nc_http_close(NC_HTTP_STATE* state);
diff --git a/include/ncpathmgr.h b/include/ncpathmgr.h
index 8a92f647d..44a8b8b49 100644
--- a/include/ncpathmgr.h
+++ b/include/ncpathmgr.h
@@ -94,6 +94,8 @@ This means it is ok to call it repeatedly with no harm.
 */
 EXTERNL char* NCpathcvt(const char* path);
 
+EXTERNL int NChasdriveletter(const char* path);
+
 /* Canonicalize and make absolute by prefixing the current working directory */
 EXTERNL char* NCpathabsolute(const char* name);
 
@@ -154,7 +156,7 @@ EXTERNL int NCclosedir(DIR* ent);
 #define NCPD_UNKNOWN 0
 #define NCPD_NIX 1
 #define NCPD_MSYS 2
-#define NCPD_CYGWIN 3 
+#define NCPD_CYGWIN 3
 #define NCPD_WIN 4
 #define NCPD_REL 5 /* actual kind is unknown */
 
diff --git a/include/netcdf_dispatch.h b/include/netcdf_dispatch.h.in
similarity index 99%
rename from include/netcdf_dispatch.h
rename to include/netcdf_dispatch.h.in
index a91b251ec..9b90cc342 100644
--- a/include/netcdf_dispatch.h
+++ b/include/netcdf_dispatch.h.in
@@ -25,7 +25,9 @@
 
 /* This is the version of the dispatch table. It should be changed
  * when new functions are added to the dispatch table. */
-#define NC_DISPATCH_VERSION 3
+#ifndef NC_DISPATCH_VERSION
+#define NC_DISPATCH_VERSION @NC_DISPATCH_VERSION@
+#endif /*NC_DISPATCH_VERSION*/
 
 /* This is the dispatch table, with a pointer to each netCDF
  * function. */
diff --git a/libdap2/dapincludes.h b/libdap2/dapincludes.h
index 6275b662b..fd96d79d7 100644
--- a/libdap2/dapincludes.h
+++ b/libdap2/dapincludes.h
@@ -32,6 +32,7 @@
 #include "oc.h"
 
 #include "ncdap.h"
+#include "nccommon.h"
 #include "dapdebug.h"
 #include "daputil.h"
 
@@ -47,7 +48,6 @@ struct NCsegment;
 
 /**************************************************/
 
-#include "nccommon.h"
 #include "getvara.h"
 #include "constraints.h"
 
diff --git a/libdap2/daputil.c b/libdap2/daputil.c
index e61461db0..bdf533d45 100644
--- a/libdap2/daputil.c
+++ b/libdap2/daputil.c
@@ -435,7 +435,7 @@ simplepathstring(NClist* names,  char* separator)
 /* Define a number of location tests */
 
 /* Is node contained (transitively) in a sequence ? */
-BOOL
+int
 dapinsequence(CDFnode* node)
 {
     if(node == NULL || node->container == NULL) return TRUE;
@@ -446,7 +446,7 @@ dapinsequence(CDFnode* node)
 }
 
 /* Is node contained (transitively) in a structure array */
-BOOL
+int
 dapinstructarray(CDFnode* node)
 {
     if(node == NULL) return TRUE;
@@ -459,7 +459,7 @@ dapinstructarray(CDFnode* node)
 }
 
 /* Is node a map field of a grid? */
-BOOL
+int
 dapgridmap(CDFnode* node)
 {
     if(node != NULL && node->container != NULL
@@ -471,7 +471,7 @@ dapgridmap(CDFnode* node)
 }
 
 /* Is node an array field of a grid? */
-BOOL
+int
 dapgridarray(CDFnode* node)
 {
     if(node != NULL && node->container != NULL
@@ -482,7 +482,7 @@ dapgridarray(CDFnode* node)
     return FALSE;
 }
 
-BOOL
+int
 dapgridelement(CDFnode* node)
 {
     return dapgridarray(node)
@@ -490,7 +490,7 @@ dapgridelement(CDFnode* node)
 }
 
 /* Is node a top-level grid node? */
-BOOL
+int
 daptopgrid(CDFnode* grid)
 {
     if(grid == NULL || grid->nctype != NC_Grid) return FALSE;
@@ -498,7 +498,7 @@ daptopgrid(CDFnode* grid)
 }
 
 /* Is node a top-level sequence node? */
-BOOL
+int
 daptopseq(CDFnode* seq)
 {
     if(seq == NULL || seq->nctype != NC_Sequence) return FALSE;
@@ -506,7 +506,7 @@ daptopseq(CDFnode* seq)
 }
 
 /* Is node a top-level node? */
-BOOL
+int
 daptoplevel(CDFnode* node)
 {
     if(node->container == NULL
diff --git a/libdap2/nccommon.h b/libdap2/nccommon.h
index 4b9b734fe..cdcb37ae3 100644
--- a/libdap2/nccommon.h
+++ b/libdap2/nccommon.h
@@ -9,14 +9,14 @@
 #include "dapincludes.h"
 
 /* Mnemonics */
-#ifndef BOOL
-#define BOOL int
-#endif
 #ifndef TRUE
 #define TRUE 1
 #define FALSE 0
 #endif
 
+/* Define an alias for int to indicate an error return */
+typedef int NCerror;
+
 #ifndef nullfree
 #define nullfree(m) {if((m)!=NULL) {free(m);} else {}}
 #endif
@@ -206,7 +206,7 @@ typedef struct NCD2alignment {
 } NCD2alignment;
 
 typedef struct NCtypesize {
-    BOOL             aligned; /*  have instance and field been defined? */
+    int             aligned; /*  have instance and field been defined? */
     NCD2alignment      instance; /* Alignment, etc for instance data */
     NCD2alignment      field; /* Alignment, etc WRT to parent */
 } NCtypesize;
@@ -232,13 +232,13 @@ typedef struct CDFnode {
     int              ncid;          /* relevant NC id for this object*/
     unsigned long    maxstringlength;
     unsigned long    sequencelimit; /* 0=>unlimited */
-    BOOL	     usesequence;   /* If this sequence is usable */
-    BOOL             elided;        /* 1 => node does not partipate in naming*/
+    int	     usesequence;   /* If this sequence is usable */
+    int             elided;        /* 1 => node does not partipate in naming*/
     struct CDFnode*  basenode;      /* derived tree map to pattern tree */
-    BOOL	     invisible;     /* 1 => do not show to user */
-    BOOL	     zerodim;       /* 1 => node has a zero dimension */
+    int	     invisible;     /* 1 => do not show to user */
+    int	     zerodim;       /* 1 => node has a zero dimension */
     /* These two flags track the effects on grids of constraints */
-    BOOL             nc_virtual;       /* node added by regrid */
+    int             nc_virtual;       /* node added by regrid */
     struct CDFnode* attachment;     /* DDS<->DATADDS cross link*/
     struct CDFnode* pattern;       /* temporary field for regridding */
     /* Fields for use by libncdap4 */
@@ -249,8 +249,8 @@ typedef struct CDFnode {
     char*            vlenname;      /* for sequence types */
     int              singleton;     /* for singleton sequences */
     unsigned long    estimatedsize; /* > 0 Only for var nodes */
-    BOOL             whole;         /* projected as whole node */
-    BOOL             prefetchable;  /* eligible to be prefetched (if whole) */
+    int             whole;         /* projected as whole node */
+    int             prefetchable;  /* eligible to be prefetched (if whole) */
 } CDFnode;
 
 /**************************************************/
diff --git a/libdap4/ncd4.h b/libdap4/ncd4.h
index 8ab23b17f..6f60a7d85 100644
--- a/libdap4/ncd4.h
+++ b/libdap4/ncd4.h
@@ -71,18 +71,6 @@ extern int dsp_close(ND4dsp* dsp);
 /* DSP API */
 extern int dsp_open(const char* path, ND4dsp** dspp);
 
-/*
-extern NCerror dapbuildvaraprojection(CDFnode*,
-		     const size_t* startp, const size_t* countp, const ptrdiff_t* stridep,
-		     struct DCEprojection** projectionlist);
-
-extern NCerror NCD4_getvarx(int ncid, int varid,
-	    const size_t *startp,
-	    const size_t *countp,
-	    const ptrdiff_t *stridep,
-	    void *data,
-	    nc_type dsttype0);
-*/
 #endif
 
 /**************************************************/
diff --git a/libdispatch/dhttp.c b/libdispatch/dhttp.c
index 815e1c895..e21cadaa6 100644
--- a/libdispatch/dhttp.c
+++ b/libdispatch/dhttp.c
@@ -71,7 +71,7 @@ Trace(const char* fcn)
 */
 
 int
-nc_http_open(const char* objecturl, NC_HTTP_STATE** statep, size64_t* filelenp)
+nc_http_open(const char* objecturl, NC_HTTP_STATE** statep, long long* filelenp)
 {
     int stat = NC_NOERR;
     int i;
diff --git a/libdispatch/dinfermodel.c b/libdispatch/dinfermodel.c
index 2b7ff2185..c4eec924f 100644
--- a/libdispatch/dinfermodel.c
+++ b/libdispatch/dinfermodel.c
@@ -44,7 +44,7 @@ struct MagicFile {
     struct NCURI* uri;
     int omode;
     NCmodel* model;
-    fileoffset_t filelen;
+    long long filelen;
     int use_parallel;
     void* parameters; /* !NULL if inmemory && !diskless */
     FILE* fp;
@@ -937,7 +937,7 @@ check_file_type(const char *path, int omode, int use_parallel,
     if((status = openmagic(&magicinfo))) goto done;
 
     /* Verify we have a large enough file */
-    if(magicinfo.filelen < MAGIC_NUMBER_LEN)
+    if(magicinfo.filelen < (long long)MAGIC_NUMBER_LEN)
 	{status = NC_ENOTNC; goto done;}
     if((status = readmagic(&magicinfo,0L,magic)) != NC_NOERR) {
 	status = NC_ENOTNC;
diff --git a/libhdf5/hdf5create.c b/libhdf5/hdf5create.c
index f04319361..2e73756b8 100644
--- a/libhdf5/hdf5create.c
+++ b/libhdf5/hdf5create.c
@@ -163,15 +163,19 @@ nc4_create_file(const char *path, int cmode, size_t initialsz,
 	     nc4_chunk_cache_preemption));
     }
 
-#ifdef HAVE_H5PSET_LIBVER_BOUNDS
 #if H5_VERSION_GE(1,10,2)
-    if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, H5F_LIBVER_V18) < 0)
+    /* lib versions 1.10.2 and higher */
+    if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_V18, H5F_LIBVER_LATEST) < 0)
 #else
-        if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST,
-                                 H5F_LIBVER_LATEST) < 0)
+#if H5_VERSION_GE(1,10,0)
+    /* lib versions 1.10.0, 1.10.1 */
+    if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, H5F_LIBVER_LATEST) < 0)
+#else
+    /* all HDF5 1.8 lib versions */
+    if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
 #endif
-            BAIL(NC_EHDFERR);
 #endif
+        BAIL(NC_EHDFERR);
 
     /* Create the property list. */
     if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0)
diff --git a/liblib/Makefile.am b/liblib/Makefile.am
index a1577b68c..8415756a6 100644
--- a/liblib/Makefile.am
+++ b/liblib/Makefile.am
@@ -18,7 +18,7 @@ lib_LTLIBRARIES = libnetcdf.la
 # for information regarding incrementing `-version-info`.
 ##
 
-libnetcdf_la_LDFLAGS = -version-info 18:0:0
+libnetcdf_la_LDFLAGS = -version-info 19:0:0
 
 libnetcdf_la_CPPFLAGS = ${AM_CPPFLAGS}
 libnetcdf_la_LIBADD =
diff --git a/libnczarr/zwalk.c b/libnczarr/zwalk.c
index 3e16f7b2d..3374b2509 100644
--- a/libnczarr/zwalk.c
+++ b/libnczarr/zwalk.c
@@ -206,8 +206,9 @@ NCZ_transfer(struct Common* common, NCZSlice* slices)
 		  common, &chunkodom)))
 	goto done;
 
-    if(wdebug >= 4)
+    if(wdebug >= 4) {
 	fprintf(stderr,"allprojections:\n%s",nczprint_allsliceprojections(common->rank,common->allprojections)); fflush(stderr);
+    }
 
     wholechunk = iswholechunk(common,slices);
 
diff --git a/ncdump/tst_nccopy4.sh b/ncdump/tst_nccopy4.sh
index ac81cd0f2..525982b30 100755
--- a/ncdump/tst_nccopy4.sh
+++ b/ncdump/tst_nccopy4.sh
@@ -109,9 +109,11 @@ test "x$STORAGE" = 'xtas:_Storage="chunked";'
 CHUNKSIZES=`cat tmppds.cdl | sed -e '/tas:_ChunkSizes/p' -ed | tr -d '\t \r'`
 test "x$CHUNKSIZES" = 'xtas:_ChunkSizes=10,15,20;'
 
+set -x
+
 echo "*** Test that nccopy -F var1,none works as intended "
 ${NCGEN} -4 -b -o tst_nofilters.nc $srcdir/ref_tst_nofilters.cdl
-${NCCOPY} -M0 -4 -F var1,none -c / tst_nofilters.nc tmp_nofilters.nc
+${NCCOPY} -M0 -4 -F var1,none -c // tst_nofilters.nc tmp_nofilters.nc
 ${NCDUMP} -hs tmp_nofilters.nc > tmp_nofilters.cdl
 STORAGE=`cat tmp_nofilters.cdl | sed -e '/var1:_Storage/p' -ed | tr -d '\t \r'`
 test "x$STORAGE" = 'xvar1:_Storage="contiguous";'
@@ -120,4 +122,3 @@ test "x$FILTERS" = 'x'
 
 echo "*** All nccopy tests passed!"
 exit 0
-
diff --git a/ncdump/tst_netcdf4.sh b/ncdump/tst_netcdf4.sh
index fecf1db15..6214d27cb 100755
--- a/ncdump/tst_netcdf4.sh
+++ b/ncdump/tst_netcdf4.sh
@@ -14,7 +14,7 @@ cleanncprops() {
   rm -f $dst
   cat $src \
   | sed -e '/:_Endianness/d' \
-  | sed -e 's/_SuperblockVersion = 1/_SuperblockVersion = 0/' \
+  | sed -e 's/_SuperblockVersion = [12]/_SuperblockVersion = 0/' \
   | sed -e 's/\(netcdflibversion\|netcdf\)=.*|/\1=NNNN|/' \
   | sed -e 's/\(hdf5libversion\|hdf5\)=.*"/\1=HHHH"/' \
   | grep -v '_NCProperties' \
diff --git a/ncdump/tst_netcdf4_4.sh b/ncdump/tst_netcdf4_4.sh
index 52d7f6c96..e0b8f296c 100755
--- a/ncdump/tst_netcdf4_4.sh
+++ b/ncdump/tst_netcdf4_4.sh
@@ -14,7 +14,7 @@ cleanncprops() {
   rm -f $dst
   cat $src \
   | sed -e '/:_Endianness/d' \
-  | sed -e 's/_SuperblockVersion = 1/_SuperblockVersion = 0/' \
+  | sed -e 's/_SuperblockVersion = [12]/_SuperblockVersion = 0/' \
   | sed -e 's/\(netcdflibversion\|netcdf\)=.*|/\1=NNNN|/' \
   | sed -e 's/\(hdf5libversion\|hdf5\)=.*"/\1=HHHH"/' \
   | grep -v '_NCProperties' \


Test patch:
diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml
index 0669fbe6c..d36177322 100644
--- a/.github/workflows/run_tests.yml
+++ b/.github/workflows/run_tests.yml
@@ -14,7 +14,7 @@ jobs:
 
     strategy:
       matrix:
-        hdf5: [ 1.8.21, 1.10.7 ]
+        hdf5: [ 1.8.21, 1.10.1, 1.10.7 ]
 
     steps:
 
@@ -62,7 +62,7 @@ jobs:
 
     strategy:
       matrix:
-        hdf5: [ 1.8.21, 1.10.7 ]
+        hdf5: [ 1.8.21, 1.10.1, 1.10.7 ]
         use_nc4: [ nc3, nc4 ]
         use_dap: [ dap_off, dap_on ]
         use_nczarr: [ nczarr_off, nczarr_on ]
@@ -160,7 +160,7 @@ jobs:
 
     strategy:
       matrix:
-        hdf5: [ 1.8.21, 1.10.7 ]
+        hdf5: [ 1.8.21, 1.10.1, 1.10.7 ]
         use_nc4: [ nc3, nc4 ]
         use_dap: [ dap_off, dap_on ]
         use_nczarr: [ nczarr_off, nczarr_on ]
diff --git a/h5_test/tst_h_atts3.c b/h5_test/tst_h_atts3.c
index 924967ef7..48693768d 100644
--- a/h5_test/tst_h_atts3.c
+++ b/h5_test/tst_h_atts3.c
@@ -209,11 +209,7 @@ main()
       hid_t file_typeid1[NUM_OBJ_1], native_typeid1[NUM_OBJ_1];
       hid_t file_typeid2, native_typeid2;
       hsize_t num_obj;
-#if H5_VERSION_GE(1,12,0)
-      H5O_info2_t obj_info;
-#else
       H5O_info_t obj_info;
-#endif
       char obj_name[STR_LEN + 1];
       hsize_t dims[1] = {ATT_LEN}; /* netcdf attributes always 1-D. */
 
diff --git a/nc_test4/tst_filter.sh b/nc_test4/tst_filter.sh
index 814380cb8..53d347994 100755
--- a/nc_test4/tst_filter.sh
+++ b/nc_test4/tst_filter.sh
@@ -3,6 +3,8 @@
 if test "x$srcdir" = x ; then srcdir=`pwd`; fi
 . ../test_common.sh
 
+set -e
+
 # Which test cases to exercise
 API=1
 NG=1
@@ -209,13 +211,13 @@ if ! test -f unfiltered.nc ; then
 fi
 ${NCCOPY} "-F/g/var,307,4|40000" unfiltered.nc nccopyF.nc
 ${NCDUMP} -hs nccopyF.nc > ./nccopyF.cdl
-sclean nccopyF.cdl nccopyFs.cdl 
+sclean nccopyF.cdl nccopyFs.cdl
 diff -b -w ${srcdir}/ref_nccopyF.cdl ./nccopyFs.cdl
 echo "*** ncgen with multiple filters"
 ${NCGEN} -4 -lb -o ncgenF.nc ${srcdir}/ref_nccopyF.cdl
 # Need to fix name using -n
 ${NCDUMP} -hs -n nccopyF ncgenF.nc > ./ncgenF.cdl
-sclean ncgenF.cdl ncgenFs.cdl 
+sclean ncgenF.cdl ncgenFs.cdl
 diff -b -w ${srcdir}/ref_nccopyF.cdl ./ncgenFs.cdl
 echo "*** Pass: multiple filters"
 fi
@@ -256,7 +258,6 @@ rm -f test_bzip2.c
 rm -f multifilter.nc multi.cdl smulti.cdl
 rm -f nccopyF.nc nccopyF.cdl ncgenF.nc ncgenF.cdl
 rm -f ncgenFs.cdl  nccopyFs.cdl
-#rm -f crfilterorder.txt rdfilterorder.txt
+rm -f crfilterorder.txt rdfilterorder.txt
 
 exit 0
-
diff --git a/nczarr_test/run_nccopyz.sh b/nczarr_test/run_nccopyz.sh
index 69d00ec63..3bef9cc8f 100755
--- a/nczarr_test/run_nccopyz.sh
+++ b/nczarr_test/run_nccopyz.sh
@@ -39,7 +39,7 @@ ${NCCOPY} -M0 -c dim0/,dim1/1,dim2/,dim3/1,dim4/,dim5/1,dim6/ tmp_chunks3.nc "$f
 ${NCDUMP} -sh -n tmp "$fileurl" > tmp_chunked.cdl
 verifychunking tmp_chunked.cdl "ivar:_ChunkSizes=7,1,2,1,5,1,9;" "fvar:_ChunkSizes=9,1,5,1,2,1,7;"
 chunkclean tmp.cdl tmpx.cdl
-chunkclean tmp_chunked.cdl tmp_chunkedx.cdl 
+chunkclean tmp_chunked.cdl tmp_chunkedx.cdl
 diff tmpx.cdl tmp_chunkedx.cdl
 
 # Note that unchunked means that there is only one chunk
@@ -48,15 +48,15 @@ fileargs tmp_unchunked
 ${NCCOPY} -M0 -c dim0/,dim1/,dim2/,dim3/,dim4/,dim5/,dim6/ "$SRC" "$fileurl"
 ${NCDUMP} -sh -n tmp "$fileurl" > tmp_unchunked.cdl
 verifychunking tmp_unchunked.cdl "ivar:_ChunkSizes=7,4,2,3,5,6,9;" "fvar:_ChunkSizes=9,6,5,3,2,4,7;"
-chunkclean tmp_unchunked.cdl tmp_unchunkedx.cdl 
+chunkclean tmp_unchunked.cdl tmp_unchunkedx.cdl
 diff tmpx.cdl tmp_unchunkedx.cdl
 
 # Test -c /
 fileargs tmp_unchunked2
-${NCCOPY} -M0 -c "/" "$SRC" "$fileurl"
+${NCCOPY} -M0 -c "//" "$SRC" "$fileurl"
 ${NCDUMP} -sh -n tmp "$fileurl" > tmp_unchunked2.cdl
 verifychunking tmp_unchunked.cdl "ivar:_ChunkSizes=7,4,2,3,5,6,9;" "fvar:_ChunkSizes=9,6,5,3,2,4,7;"
-chunkclean tmp_unchunked.cdl tmp_unchunkedx.cdl 
+chunkclean tmp_unchunked.cdl tmp_unchunkedx.cdl
 diff tmpx.cdl tmp_unchunkedx.cdl
 
 echo "*** Test that nccopy -c dim/n is used "
@@ -80,4 +80,3 @@ if test "x$FEATURE_S3TESTS" = xyes ; then testcase s3; fi
 
 echo "*** All nccopy nczarr tests passed!"
 exit 0
-