Repository: Unidata/netcdf-c
Pull request #2934 (2024-06-11 17:21:50)

Add stanza for Release Candidate 1 in Release Notes
Wellspring for release candidate 1, for a subset of release files to be merged back into developer branch. We are going to put out a release candidate to allow for testing of functionality, while working on the documentation around ncZarr and other changes. 


Patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 891088789..e1ecf7ffb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,27 @@ project(netCDF
   VERSION 4.9.3
 )
 
+#####
+# Version Info:
+#
+# Release Version
+# Library Version
+# SO Version
+#
+# SO Version is computed from library version. See:
+# http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
+#####
+
+set(NC_VERSION_NOTE "-rc1")
+set(netCDF_VERSION ${PROJECT_VERSION}${NC_VERSION_NOTE})
+set(VERSION ${netCDF_VERSION})
+set(NC_VERSION ${netCDF_VERSION})
+set(PACKAGE_VERSION ${VERSION})
+
+# These values should match those in configure.ac
+set(netCDF_LIB_VERSION 22)
+set(netCDF_SO_VERSION 22)
+
 #Add custom CMake Module
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" "${PROJECT_SOURCE_DIR}/cmake")
 
@@ -51,26 +72,7 @@ endif()
 add_library(netcdf)
 add_library(netCDF::netcdf ALIAS netcdf)
 
-#####
-# Version Info:
-#
-# Release Version
-# Library Version
-# SO Version
-#
-# SO Version is computed from library version. See:
-# http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
-#####
-
-set(NC_VERSION_NOTE "-development")
-set(netCDF_VERSION ${PROJECT_VERSION}${NC_VERSION_NOTE})
-set(VERSION ${netCDF_VERSION})
-set(NC_VERSION ${netCDF_VERSION})
-set(PACKAGE_VERSION ${VERSION})
 
-# These values should match those in configure.ac
-set(netCDF_LIB_VERSION 19)
-set(netCDF_SO_VERSION 19)
 
 # Version of the dispatch table. This must match the value in
 # configure.ac.
@@ -736,13 +738,18 @@ if(NOT WIN32)
 endif()
 
 # Options for S3 Support
-option(NETCDF_ENABLE_S3 "Enable S3 support." OFF)
+#option(NETCDF_ENABLE_S3 "Enable S3 support." OFF)
+option(NETCDF_ENABLE_S3_AWS "Enable S3 support via AWS-CPP-SDK" OFF)
 option(NETCDF_ENABLE_S3_INTERNAL "Enable S3 Internal support." OFF)
-option(NETCDF_ENABLE_NCZARR_S3 "Enable NCZarr S3 support; Deprecated in favor of NETCDF_ENABLE_S3" OFF)
+
+cmake_dependent_option(NETCDF_ENABLE_S3 "Enable S3 Support" ON "NETCDF_ENABLE_S3_AWS OR NETCDF_ENABLE_S3_INTERNAL" OFF)
+
+option(NETCDF_ENABLE_NCZARR_S3 "Enable NCZarr S3 support; Deprecated in favor of NETCDF_ENABLE_S3" ${NETCDF_ENABLE_S3})
 
 if(NOT NETCDF_ENABLE_REMOTE_FUNCTIONALITY)
   set(NETCDF_ENABLE_S3 OFF CACHE BOOL "" FORCE)
   set(NETCDF_ENABLE_S3_INTERNAL OFF CACHE BOOL "" FORCE)
+  set(NETCDF_ENABLE_S3_AWS OFF CACHE BOOL "" FORCE)
   set(NETCDF_ENABLE_NCZARR_S3 OFF CACHE BOOL "" FORCE)
 endif()
 
@@ -1531,10 +1538,7 @@ endif()
 # STATIC_DEFINE netcdf_BUILT_AS_STATIC
 #)
 
-#####
-# Build doxygen documentation, if need be.
-#####
-add_subdirectory(docs)
+
 
 ##
 # Brute force, grab all of the dlls from the dependency directory,
@@ -1805,6 +1809,12 @@ set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}")
 set(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}")
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test_common.in ${CMAKE_CURRENT_BINARY_DIR}/test_common.sh @ONLY NEWLINE_STYLE LF)
 
+#####
+# Build doxygen documentation, if need be.
+# This must come after setting top_builddir, etc.
+#####
+add_subdirectory(docs)
+
 ####
 # Build s3cleanup.sh and s3gc.sh
 #####
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 12bfa7bda..a04a12e66 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -7,7 +7,10 @@ This file contains a high-level description of this package's evolution. Release
 
 ## 4.9.3 - TBD
 
+### Release Candidate 1 - July 26, 2024
+
 * Convert NCZarr V2 to store all netcdf-4 specific info as attributes. This improves interoperability with other Zarr implementations by no longer using non-standard keys. The price to be paid is that lazy attribute reading cannot be supported. See [Github #2836](https://github.com/Unidata/netcdf-c/issues/2936) for more information.
+
 * Cleanup the option code for NETCDF_ENABLE_SET_LOG_LEVEL\[_FUNC\] See [Github #2931](https://github.com/Unidata/netcdf-c/issues/2931) for more information.
 * Fix duplicate definition when using aws-sdk-cpp. See [Github #2928](https://github.com/Unidata/netcdf-c/issues/2928) for more information.
 * Cleanup various obsolete options and do some code refactoring. See [Github #2926](https://github.com/Unidata/netcdf-c/issues/2926) for more information.
diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake
index 3a35106de..6aaf3d862 100644
--- a/cmake/dependencies.cmake
+++ b/cmake/dependencies.cmake
@@ -429,7 +429,7 @@ endif ()
 # because for some reason this screws up if we unconditionally test for sdk
 # and it is not available. Fix someday
 if(NETCDF_ENABLE_S3)
-  if(NOT NETCDF_ENABLE_S3_INTERNAL)
+  if(NETCDF_ENABLE_S3_AWS)
     # See if aws-s3-sdk is available
     find_package(AWSSDK REQUIRED COMPONENTS s3;transfer)
     if(AWSSDK_FOUND)
@@ -441,7 +441,7 @@ if(NETCDF_ENABLE_S3)
     else(AWSSDK_FOUND)
       set(NETCDF_ENABLE_S3_AWS OFF CACHE BOOL "S3 AWS" FORCE)
     endif(AWSSDK_FOUND)
-  else(NOT NETCDF_ENABLE_S3_INTERNAL)
+  else(NETCDF_ENABLE_S3_INTERNAL)
     # Find crypto libraries required with testing with the internal s3 api.
     #find_library(SSL_LIB NAMES ssl openssl)
     find_package(OpenSSL REQUIRED)
@@ -454,7 +454,7 @@ if(NETCDF_ENABLE_S3)
     #  message(FATAL_ERROR "Can't find a crypto library, required by S3_INTERNAL")
     #endif(NOT CRYPTO_LIB)
 
-  endif(NOT NETCDF_ENABLE_S3_INTERNAL)
+  endif(NETCDF_ENABLE_S3_AWS)
 else()
   set(NETCDF_ENABLE_S3_AWS OFF CACHE BOOL "S3 AWS" FORCE)
 endif()
diff --git a/configure.ac b/configure.ac
index d223c19f8..290513512 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.9.3-development],[support-netcdf@unidata.ucar.edu],[netcdf-c])
+AC_INIT([netCDF],[4.9.4-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.9.3-development],[support-netcdf@unidata.ucar.edu],[netcdf-c
 
 AC_SUBST([netCDF_VERSION_MAJOR]) netCDF_VERSION_MAJOR=4
 AC_SUBST([netCDF_VERSION_MINOR]) netCDF_VERSION_MINOR=9
-AC_SUBST([netCDF_VERSION_PATCH]) netCDF_VERSION_PATCH=3
+AC_SUBST([netCDF_VERSION_PATCH]) netCDF_VERSION_PATCH=4
 AC_SUBST([NC_VERSION_NOTE]) NC_VERSION_NOTE="-development"
 
 ##
@@ -29,7 +29,7 @@ AC_SUBST([NC_VERSION_NOTE]) NC_VERSION_NOTE="-development"
 # See http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning
 # for information regarding incrementing `-version-info`.
 # These values should match those in CMakeLists.txt
-AC_SUBST([netCDF_SO_VERSION]) netCDF_SO_VERSION=21:2:2
+AC_SUBST([netCDF_SO_VERSION]) netCDF_SO_VERSION=22:0:0
 
 #####
 # Set some variables used to generate a libnetcdf.settings file,
diff --git a/docs/.gitignore b/docs/.gitignore
index e69de29bb..afe7bb1c1 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -0,0 +1,6 @@
+Doxyfile
+custom_style.css
+latex_main
+man
+Doxyfile.bak
+
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
index 50f9285c1..8469ec732 100644
--- a/docs/CMakeLists.txt
+++ b/docs/CMakeLists.txt
@@ -34,7 +34,9 @@ IF(NETCDF_ENABLE_DOXYGEN)
 
   # Generate User Documentation
   ADD_CUSTOM_TARGET(doc_all ALL
-    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+    COMMAND ${DOXYGEN_EXECUTABLE} -u ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+    COMMAND ${DOXYGEN_EXECUTABLE} -w html ${CMAKE_CURRENT_BINARY_DIR}/header.html ${CMAKE_CURRENT_BINARY_DIR}/footer.html ${CMAKE_CURRENT_BINARY_DIR}/custom_stylesheet.html ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile  
+    COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
     COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/auth.html ${CMAKE_CURRENT_BINARY_DIR}/html
     COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/obsolete/fan_utils.html ${CMAKE_CURRENT_BINARY_DIR}/html
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
diff --git a/docs/Doxyfile.developer b/docs/Doxyfile.developer
index e384408a1..4d8761780 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.9.3-development
+PROJECT_NUMBER         = 4.9.4-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
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
index c93fe1a9c..f13636e04 100644
--- a/docs/Doxyfile.in
+++ b/docs/Doxyfile.in
@@ -945,6 +945,7 @@ INPUT                  = @abs_top_srcdir@/docs/mainpage.dox \
                          @abs_top_srcdir@/docs/windows-binaries.md \
                          @abs_top_srcdir@/docs/inmemory.md \
                          @abs_top_srcdir@/docs/byterange.md \
+                         @abs_top_srcdir@/docs/auth.md \
                          @abs_top_srcdir@/docs/nczarr.md \
                          @abs_top_srcdir@/docs/cloud.md \
                          @abs_top_srcdir@/docs/notes.md \
@@ -1352,7 +1353,7 @@ HTML_FILE_EXTENSION    = .html
 # of the possible markers and block names see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_HEADER            = @abs_top_srcdir@/docs/header.html
+HTML_HEADER            = @abs_top_builddir@/docs/header.html
 
 # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
 # generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1362,7 +1363,7 @@ HTML_HEADER            = @abs_top_srcdir@/docs/header.html
 # that doxygen normally uses.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_FOOTER            = @abs_top_srcdir@/docs/footer.html
+HTML_FOOTER            = @abs_top_builddir@/docs/footer.html
 
 # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
 # sheet that is used by each HTML page. It can be used to fine-tune the look of
diff --git a/docs/Makefile.am b/docs/Makefile.am
index ba3e41cbb..8f1c886b3 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -56,7 +56,11 @@ endif
 # includes them in the documentation.
 
 doxyfile.stamp:
-	$(DOXYGEN) Doxyfile && cp $(top_srcdir)/docs/auth.md $(top_srcdir)/docs/obsolete/fan_utils.html html
+	$(DOXYGEN) -u $(top_builddir)/docs/Doxyfile && \
+	$(DOXYGEN) -w html $(top_builddir)/docs/header.html \
+		$(top_builddir)/docs/footer.html $(top_builddir)/docs/custom_style.css $(top_builddir)/docs/Doxyfile && \
+	$(DOXYGEN) $(top_builddir)/docs/Doxyfile && \
+	cp $(top_srcdir)/docs/auth.md $(top_srcdir)/docs/obsolete/fan_utils.html html
 
 CLEANFILES = doxyfile.stamp
 
diff --git a/docs/auth.md b/docs/auth.md
index dfb49b326..a08e2b460 100644
--- a/docs/auth.md
+++ b/docs/auth.md
@@ -1,21 +1,18 @@
 NetCDF Authorization Support
-======================================
+====================================
 
 <!-- double header is needed to workaround doxygen bug -->
 
-NetCDF Authorization Support {#auth}
-====================================
-
 [TOC]
 
-## Introduction {#auth_intro}
+## Introduction {#auth}
 
 netCDF can support user authorization using the facilities provided by the curl
 library. This includes basic password authentication as well as
 certificate-based authorization.
 At the moment, this document only applies to DAP2 and DAP4 access.
 
-With some exceptions (e.g. see the section on <a href="#REDIR">redirection</a>)
+With some exceptions (e.g. see the section on <a href="#auth_redir">redirection</a>)
 The libcurl authorization mechanisms can be accessed in two ways
 
 1. Inserting the username and password into the url, or
@@ -33,7 +30,7 @@ This username and password will be used if the server asks for
 authentication. Note that only simple password authentication
 is supported in this format.
 
-Specifically note that [redirection-based](#REDIR)
+Specifically note that [redirection-based](#auth_redir)
 authorization may work with this but it is a security risk.
 This is because the username and password
 may be sent to each server in the redirection chain.
@@ -137,7 +134,7 @@ This is an alternative to setting it in the url.
 The value must be of the form "username:password".
 See the <a href="#USERPWDESCAPE">password escaping</a> section
 to see how this value must escape certain characters.
-Also see <a href="#REDIR">redirection authorization</a>
+Also see <a href="#auth_redir">redirection authorization</a>
 for important additional information.
 
 The pair of keys
@@ -146,7 +143,7 @@ can be used as an alternative to HTTP.CREDENTIALS.USERPASSWORD
 to set the simple password authentication.
 If present, they take precedence over HTTP.CREDENTIALS.USERPASSWORD.
 The values do not need to be escaped.
-See <a href="#REDIR">redirection authorization</a>
+See <a href="#auth_redir">redirection authorization</a>
 for important additional information.
 
 ### Cookie Jar
@@ -157,7 +154,7 @@ to read cookies (CURLOPT_COOKIEJAR) and also
 the file into which to store cookies (CURLOPT_COOKIEFILE).
 The same value is used for both CURLOPT values.
 It defaults to in-memory storage.
-See [redirection authorization](#REDIR)
+See [redirection authorization](#auth_redir)
 for important additional information.
 
 ### Certificate Authentication
@@ -191,7 +188,7 @@ deprecated; use HTTP.PROXY.SERVER
 HTTP.NETRC
 specifies the absolute path of the .netrc file,
 and causes it to be used instead of username and password.
-See [redirection authorization](#REDIR)
+See [redirection authorization](#auth_redir)
 for information about using *.netrc*.
 
 ## Password Escaping {#auth_userpwdescape}
@@ -289,7 +286,7 @@ machine urs.earthdata.nasa.gov login <user> password <password>
 
 Some systems, notably ESG (Earth System Grid), requires
 the use of client-side certificates, as well as being
-[re-direction based](#REDIR).
+[re-direction based](#auth_redir).
 This requires setting the following entries:
 
 - HTTP.COOKIEJAR &mdash; a file path for storing cookies across re-direction.
@@ -306,7 +303,7 @@ Note that the first two are there to support re-direction based authentication.
 1. https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
 2. https://curl.haxx.se/docs/ssl-compared.html
 
-## Appendix A. All RC-File Keys {#auth_allkeys}
+## Authorization Appendix A. All RC-File Keys {#auth_allkeys}
 
 For completeness, this is the list of all rc-file keys.
 If this documentation is out of date with respect to the actual code,
@@ -333,21 +330,21 @@ the code is definitive.
 <tr><td>HTTP.NETRC</td><td>CURLOPT_NETRC,CURLOPT_NETRC_FILE</td>
 </table>
 
-## Appendix B. URS Access in Detail {#auth_ursdetail}
+## Authorization Appendix B. URS Access in Detail {#auth_ursdetail}
 
 It is possible to use the NASA Earthdata Login System (URS)
 with netcdf by using using the process specified in the
-[redirection based authorization section](#REDIR).
+[redirection based authorization section](#auth_redir).
 In order to access URS controlled datasets, however, it is necessary to
 register as a user with NASA at this website (subject to change):
 
     https://uat.urs.earthdata.nasa.gov/
 
-## Appendix C. ESG Access in Detail {#auth_esgdetail}
+## Authorization Appendix C. ESG Access in Detail {#auth_esgdetail}
 
 It is possible to access Earth Systems Grid (ESG) datasets
 from ESG servers through the netCDF API using the techniques
-described in the section on [Client-Side Certificates](#CLIENTCERTS).
+described in the section on [Client-Side Certificates](#auth_clientcerts).
 
 In order to access ESG datasets, however, it is necessary to
 register as a user with ESG and to setup your environment
@@ -430,7 +427,7 @@ named "truststore"
 
 ### Running the C Client
 
-Refer to the section on [Client-Side Certificates](#CLIENTCERTS).
+Refer to the section on [Client-Side Certificates](#auth_clientcerts).
 The keys specified there  must be set in the rc file to support ESG access.
 
 - HTTP.COOKIEJAR=~/.dods_cookies
diff --git a/docs/footer.html b/docs/footer.html
index 5b4894060..efa3357e5 100644
--- a/docs/footer.html
+++ b/docs/footer.html
@@ -1,21 +1,17 @@
-<!-- HTML footer for doxygen 1.8.17-->
-<!-- start footer part -->
-<!--BEGIN GENERATE_TREEVIEW-->
-<div id="nav-path" class="navpath"> <!-- id is needed for treeview function! -->
-<!--END GENERATE_TREEVIEW-->
-<!--BEGIN !GENERATE_TREEVIEW-->
-<div> <!-- id unnecessary if treeview is not used -->
-<!--END !GENERATE_TREEVIEW-->
-  <hr size="2" />
-  <address style="text-align: center;">
-    <a href="https://www.unidata.ucar.edu/software/netcdf/">Return to the Main Unidata NetCDF page.</a><br>
-    <img src="./$relpath^/uniLogo.png">
-  </address>
-
-  <address style="text-align: right;"><small>
-    Generated on $datetime for $projectname. NetCDF is
-    a <a href="https://www.unidata.ucar.edu/">Unidata</a> library.</small>
-  </address>
-</div>
-</body>
-</html>
+<!-- HTML footer for doxygen 1.9.1-->
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+  <ul>
+    $navpath
+    <li class="footer">$generatedby <a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion </li>
+  </ul>
+</div>
+<!--END GENERATE_TREEVIEW-->
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small>
+$generatedby&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="$relpath^doxygen.svg" width="104" height="31" alt="doxygen"/></a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/docs/header.html b/docs/header.html
index af3a75a09..9c4751e63 100644
--- a/docs/header.html
+++ b/docs/header.html
@@ -1,88 +1,54 @@
-<!-- HTML header for doxygen 1.10.0-->
+<!-- HTML header for doxygen 1.9.1-->
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
 <meta name="generator" content="Doxygen $doxygenversion"/>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
 <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
-<!--BEGIN PROJECT_ICON-->
-<link rel="icon" href="$relpath^$projecticon" type="image/x-icon" />
-<!--END PROJECT_ICON-->
 <link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
-<!--BEGIN DISABLE_INDEX-->
-  <!--BEGIN FULL_SIDEBAR-->
-<script type="text/javascript">var page_layout=1;</script>
-  <!--END FULL_SIDEBAR-->
-<!--END DISABLE_INDEX-->
 <script type="text/javascript" src="$relpath^jquery.js"></script>
 <script type="text/javascript" src="$relpath^dynsections.js"></script>
-<!--BEGIN COPY_CLIPBOARD-->
-<script type="text/javascript" src="$relpath^clipboard.js"></script>
-<!--END COPY_CLIPBOARD-->
 $treeview
 $search
 $mathjax
-$darkmode
 <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
 $extrastylesheet
-<html> 
-    <head>
-        <!-- ... other metadata & script includes ... -->
-        <script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
-        <script type="text/javascript">
-            DoxygenAwesomeDarkModeToggle.init()
-        </script>
-    </head>
-    <body>
-
 </head>
 <body>
-<!--BEGIN DISABLE_INDEX-->
-  <!--BEGIN FULL_SIDEBAR-->
-<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
-  <!--END FULL_SIDEBAR-->
-<!--END DISABLE_INDEX-->
-
 <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
 
 <!--BEGIN TITLEAREA-->
 <div id="titlearea">
 <table cellspacing="0" cellpadding="0">
  <tbody>
- <tr id="projectrow">
+ <tr style="height: 56px;">
   <!--BEGIN PROJECT_LOGO-->
-  <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"$logosize/></td>
+  <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
   <!--END PROJECT_LOGO-->
   <!--BEGIN PROJECT_NAME-->
-  <td id="projectalign">
-   <div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber">&#160;$projectnumber</span><!--END PROJECT_NUMBER-->
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">$projectname
+   <!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
    </div>
    <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
   </td>
   <!--END PROJECT_NAME-->
   <!--BEGIN !PROJECT_NAME-->
    <!--BEGIN PROJECT_BRIEF-->
-    <td>
+    <td style="padding-left: 0.5em;">
     <div id="projectbrief">$projectbrief</div>
     </td>
    <!--END PROJECT_BRIEF-->
   <!--END !PROJECT_NAME-->
   <!--BEGIN DISABLE_INDEX-->
    <!--BEGIN SEARCHENGINE-->
-     <!--BEGIN !FULL_SIDEBAR-->
-    <td>$searchbox</td>
-     <!--END !FULL_SIDEBAR-->
+   <td>$searchbox</td>
    <!--END SEARCHENGINE-->
   <!--END DISABLE_INDEX-->
  </tr>
-  <!--BEGIN SEARCHENGINE-->
-   <!--BEGIN FULL_SIDEBAR-->
-   <tr><td colspan="2">$searchbox</td></tr>
-   <!--END FULL_SIDEBAR-->
-  <!--END SEARCHENGINE-->
  </tbody>
 </table>
 </div>
diff --git a/docs/nczarr.md b/docs/nczarr.md
index ee41e4ffe..e3db2016e 100644
--- a/docs/nczarr.md
+++ b/docs/nczarr.md
@@ -320,17 +320,18 @@ Note that this is different from zlib.
 
 ## Addressing Style
 
-The notion of "addressing style" may need some expansion.
-Amazon S3 accepts two forms for specifying the endpoint for accessing the data
-(see the document "quickstart_path).
+The notion of "addressing style" may need some expansion. Amazon S3 accepts two forms for specifying the endpoint for accessing the data (see the document "quickstart_path").
 
 1. Virtual -- the virtual addressing style places the bucket in the host part of a URL.
 For example:
+
 ```
 https://<bucketname>.s2.&lt;region&gt.amazonaws.com/
 ```
+
 2. Path -- the path addressing style places the bucket in at the front of the path part of a URL.
 For example:
+
 ```
 https://s3.&lt;region&gt.amazonaws.com/<bucketname>/
 ```
@@ -537,6 +538,7 @@ Then the following options must be specified for cmake.
 -DAWSSDK_ROOT_DIR=${AWSSDK_ROOT_DIR}
 -DAWSSDK_DIR=${AWSSDK_ROOT_DIR}/lib/cmake/AWSSDK
 ````
+
 # Appendix B. Amazon S3 Imposed Limits {#nczarr_s3limits}
 
 The Amazon S3 cloud storage imposes some significant limits that are inherited by NCZarr (and Zarr also, for that matter).
diff --git a/docs/static-pages/software.html b/docs/static-pages/software.html
index 9e65dcaf4..347993002 100644
--- a/docs/static-pages/software.html
+++ b/docs/static-pages/software.html
@@ -197,6 +197,9 @@
       <li>
         <a href="#ncregrid" >ncregrid</a>
       </li>
+      <li>
+        <a href="#ncstat" >NCSTAT (A collection for complex statistical processing and analysis of huge climate model outputs and datasets).</a>
+      </li>
       <li>
         <a href="#nctoolbox" >nctoolbox (a MATLAB common data model interface)</a>
       </li>
@@ -1914,6 +1917,20 @@ or using ECMWF reanalysis on a reduced grid
     </p>
     <p></p>
 
+    <h2><a id="ncstat" name="ncstat">ncstat</a></h2>
+    <p>
+      The NCSTAT software is a collection of many operators for complex statistical processing and analysis of huge climate model outputs and datasets. NCSTAT is an open-source parallel, multithreaded software written in Fortran 2003 based on the OpenMP standard, using the NetCDF Fortran90 interface of the NetCDF library for input/output data transfer and the STATPACK library (also multithreaded and Fortran 2003) for numerical computations.<br><br>
+
+      The NCSTAT software is freely available here:<br><br>
+
+      <a href="https://pagesperso.locean-ipsl.upmc.fr/terray/ncstat2.2/index.html">https://pagesperso.locean-ipsl.upmc.fr/terray/ncstat2.2/index.html</a><br><br>
+
+      The STATPACK library is also freely available here:<br><br>
+
+      <a href="https://pagesperso.locean-ipsl.upmc.fr/terray/statpack2.3/index.html">https://pagesperso.locean-ipsl.upmc.fr/terray/statpack2.3/index.html</a>
+
+    </p>
+    <p></p>
     <h2><a id="nctoolbox" name="nctoolbox">nctoolbox (a MATLAB common data model interface)</a></h2>
 
     <p>


Test patch:
diff --git a/nczarr_test/CMakeLists.txt b/nczarr_test/CMakeLists.txt
index 382b46d91..ee95c64a8 100644
--- a/nczarr_test/CMakeLists.txt
+++ b/nczarr_test/CMakeLists.txt
@@ -175,7 +175,7 @@ IF(NETCDF_ENABLE_TESTS)
     if(LARGE_FILE_TESTS)
       BUILD_BIN_TEST(test_readcaching)
       BUILD_BIN_TEST(test_writecaching)
-      BUILD_BIN_TEST(test_chunkcases ${TSTCOMMONSRC})
+      build_bin_test_with_util_lib(test_chunkcases test_utils)
       add_sh_test(nczarr_test run_cachetest)
       add_sh_test(nczarr_test run_chunkcases)
     ENDIF()
diff --git a/nczarr_test/test_writecaching.c b/nczarr_test/test_writecaching.c
index a1d6b3e8b..d4238185f 100644
--- a/nczarr_test/test_writecaching.c
+++ b/nczarr_test/test_writecaching.c
@@ -87,11 +87,11 @@ main(void)
   {
     size_t mbused = getPeakRSS() / (1024 * 1024);
     printf("Max mem: %zu MB\n", mbused);
-    if(mbused > 100) {
-      printf("*** Failed: used: %luMB expected: < 100MB\n",mbused);
+    if(mbused > 128) {
+      printf("*** Failed: used: %luMB expected: < 128\n",mbused);
       return (1);
     } else {
-      printf("*** Passed: used: %luMB (< 100MB)\n",mbused);
+      printf("*** Passed: used: %luMB (< 128)\n",mbused);
       return 0;
     }
   }